Main Content

vpa

可変精度の演算 (任意精度の演算)

数値を定義しない文字ベクトルのサポートは削除されました。その代わり、sym および syms を使用してまずシンボリック数とシンボリック変数を作成した後、それらに対し演算を使用します。たとえば、vpa('(1 + sqrt(5))/2') ではなく vpa((1 + sqrt(sym(5)))/2) を使用します。

説明

xVpa = vpa(x) は、有効桁数 d 以上の可変精度演算 (任意精度浮動小数点数) を使用してシンボリック入力 x の個々の要素を評価します。ここで、d は関数 digits の値です。digits の既定値は 32 です。

xVpa = vpa(x,d) は、digits の値の代わりに、d 以上の有効桁数を使用します。

すべて折りたたむ

可変精度浮動小数点演算を使用してシンボリック入力を評価します。既定では、vpa は有効桁数 32 桁まで値を計算します。

p = sym(pi);
pVpa = vpa(p)
pVpa = 3.1415926535897932384626433832795
syms x
a = sym(1/3);
f = a*sin(2*p*x);
fVpa = vpa(f)
fVpa = 0.33333333333333333333333333333333sin(6.283185307179586476925286766559x)

可変精度の演算を使用してベクトルまたは行列の要素を評価します。

V = [x/p a^3];
VVpa = vpa(V)
VVpa = (0.31830988618379067153776752674503x0.037037037037037037037037037037037)
M = [sin(p) cos(p/5); exp(p*x) x/log(p)];
MVpa = vpa(M)
MVpa = 

(00.80901699437494742410229341718282e3.1415926535897932384626433832795x0.87356852683023186835397746476334x)

既定では、vpa は有効桁数 32 桁までの入力を評価します。関数 digits を使用して有効桁数を変更できます。

digits を使用して有効桁数 7 桁で式 100001/10001 を近似します。digits(7) で返された digits の古い値を保存します。関数 vpa は有効桁数 5 桁のみを返します。これは、残りの桁がゼロであることを意味する場合があります。

digitsOld = digits(7);
y = sym(100001)/10001;
yVpa = vpa(y)
yVpa = 9.9991

より高精度の値 25 を使用して、残りの桁がゼロかどうかチェックします。この結果は、繰り返されている小数部の残りの桁が実際にはゼロであることを示しています。

digits(25)
yVpa = vpa(y)
yVpa = 9.999100089991000899910009

または、digitsvpa の 1 回の呼び出しでオーバーライドするには、2 番目の引数を指定して精度を変更します。

2 番目の引数を指定して、有効桁数 100 桁まで π を求めます。

pVpa = vpa(pi,100)
pVpa = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068

計算を続けるため、digitsOld の元の精度値に戻します。

digits(digitsOld)

シンボリックな結果は正確ですが、使いやすい形式ではない場合があります。vpa を使用して、正確なシンボリックな結果を数値的に近似できます。

solve を使用して、高次多項式の根を求めます。関数 solve では、高次多項式をシンボリックに解くことも、root を使用して根を表現することもできません。

syms x
y = solve(x^4 - x + 1, x)
y = 

(root(z4-z+1,z,1)root(z4-z+1,z,2)root(z4-z+1,z,3)root(z4-z+1,z,4))

vpa を使用して根を数値的に近似します。

yVpa = vpa(y)
yVpa = 

(0.72713608449119683997667565867496-0.43001428832971577641651985839602i0.72713608449119683997667565867496+0.43001428832971577641651985839602i-0.72713608449119683997667565867496-0.93409928946052943963903028710582i-0.72713608449119683997667565867496+0.93409928946052943963903028710582i)

関数 digits の値は、使用する最小有効桁数を指定します。内部的には、vpadigits で指定されたよりも多くの桁数を使用できます。この追加の桁数は、ガード桁と呼ばれます。この桁数によって、その後の計算が丸め誤差から守られるためです。

有効桁数 4 桁を使用して 1/3 を数値的に近似します。

a = vpa(1/3,4)
a = 0.3333

20 桁を使用して結果 a を近似します。結果には、ツールボックスが a を計算する際、内部的に 4 桁以上を使用したことが示されます。結果の最後の数桁は、丸め誤差のため不正確になっています。

aVpa = vpa(a,20)
aVpa = 0.33333333333303016843

内部での丸め誤差が、結果を予期せぬものにする原因になっています。

1/10 を既定の 32 桁の精度で評価した後、10 桁の精度で評価します。

a = vpa(1/10,32)
a = 0.1
b = vpa(1/10,10)
b = 0.1

表面的には、ab は等価に見えます。a - b を求めて等価性をチェックします。

roundoff = a - b
roundoff = 0.000000000000000000086736173798840354720600815844403

b はわずか 10 桁の精度で計算されており、a よりも大きな丸め誤差を含むため、差はゼロに等しくなりません。a - b を求めるとき、vpab を 32 桁で近似します。この動作を示します。

roundoff = a - vpa(b,32)
roundoff = 0.000000000000000000086736173798840354720600815844403

厳密なシンボリック値とは異なり、倍精度値は本質的に丸め誤差を含みます。倍精度入力に対して vpa を呼び出すとき、vpa では、倍精度値よりも多くの桁数を返すとしても、低下した精度を復元できません。しかし、vpapqpπq(pq)122q、および 10q の形式の式の精度を認識して復元できます。ここで、p および q は適度なサイズの整数です。

まず、vpa では倍精度入力の精度を復元できないことを示します。倍精度結果とそれと同じシンボリックな結果に対して vpa を呼び出します。

dp = log(3);
s = log(sym(3));
dpVpa = vpa(dp)
dpVpa = 1.0986122886681095600636126619065
sVpa = vpa(s)
sVpa = 1.0986122886681096913952452369225
d = sVpa - dpVpa
d = 0.00000000000000013133163257501600766255995767652

予想どおり、倍精度結果は小数第 16 位で厳密な結果と相違します。

倍精度の結果とシンボリック厳密解の結果に対する vpa 呼び出しの差を求めることで、vpapqpπq(pq)122q、および 10q の形式の式の精度を復元することを示します。ここで、p および q は適度なサイズの整数です。差は 0.0 で、vpa が倍精度入力で低下した精度を復元することを示します。

d = vpa(1/3) - vpa(1/sym(3))
d = 0.0
d = vpa(pi) - vpa(sym(pi))
d = 0.0
d = vpa(1/sqrt(2)) - vpa(1/sqrt(sym(2)))
d = 0.0
d = vpa(2^66) - vpa(2^sym(66))
d = 0.0
d = vpa(10^25) - vpa(10^sym(25))
d = 0.0

sin([ππ2π2π3]X) を表すシンボリック式 S を作成します。ここで、X は 2 行 1 列のシンボリック行列変数です。

syms X [2 1] matrix
S = sin(hilb(2)*pi*X)
S = 

sin(Σ1X)where  Σ1=(ππ2π2π3)

可変精度演算を使用して式を評価します。

SVpa = vpa(S)
SVpa = 

(sin(3.1415926535897932384626433832795X1+1.5707963267948966192313216916398X2)sin(1.5707963267948966192313216916398X1+1.0471975511965977461542144610932X2))

入力引数

すべて折りたたむ

評価する入力。数値、ベクトル、行列、多次元配列、シンボリック数、シンボリック ベクトル、シンボリック行列、シンボリック多次元配列、シンボリック式、シンボリック関数、シンボリック文字ベクトル、またはシンボリック行列変数として指定します。

有効桁数。正の整数スカラーとして指定します。d は 1 より大きく、229+1 より小さくなければなりません。

ヒント

  • vpa は分数の指数を浮動小数点に変換しません。たとえば、vpa(a^sym(2/5))a^(2/5) を返します。

  • vpa は、digits によって指定される桁数よりも多くの桁数を使用します。この追加の桁数は、その後の計算を丸め誤差から守ります。これはガード桁と呼ばれます。

  • vpa1/32^(-5)sin(pi/4) などの数値入力に対して呼び出すとき、数値式は丸め誤差を含む倍精度の数値に評価されます。次に、vpa がその倍精度の数値に対して呼び出されます。より正確な結果を得るために、sym で数値式をシンボリック式に変換します。たとえば、exp(1) を近似するには、vpa(exp(sym(1))) を使用します。

  • 2 番目の引数 d が整数でない場合、vparound を使用して引数を最も近い整数に丸めます。

  • vpap/qpπ/q(p/q)1/22q および 10q という形式に一致する数値入力の精度を復元します。ここで、p および q は適度なサイズの整数です。

  • 可変精度演算は、以下の点において IEEE® の浮動小数点規格 754 と異なります。

    • 計算の中で、ゼロ除算はエラーをスローします。

    • 指数範囲は事前定義されたどの IEEE モードよりも広いです。vpa はおよそ 10^(-323228496) までアンダーフローします。

    • 非正規化された数値は実装されていません。

    • ゼロは符号が付きません。

    • 結果の仮数内の "2" 進数の数は、可変精度演算と IEEE の事前定義された型とで異なることがあります。

    • NaN がただ 1 つ存在します。クワイエットとシグナリングの NaN の違いは識別されません。

    • 浮動小数点数の例外は使用できません。

バージョン履歴

R2006a より前に導入

すべて展開する