ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

vpa

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

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

説明

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

vpa(x,d) は、digits の値の代わりに、d 以上の有効桁数を使って評価します。

可変精度の演算を使用したシンボリック入力の評価

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

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

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

V = [x/p a^3];
M = [sin(p) cos(p/5); exp(p*x) x/log(p)];
vpa(V)
vpa(M)
ans =
[ 0.31830988618379067153776752674503*x, 0.037037037037037037037037037037037]
ans =
[                                        0,   0.80901699437494742410229341718282]
[ exp(3.1415926535897932384626433832795*x), 0.87356852683023186835397746476334*x]

メモ

exp(vpa(200)) のように、すべての内部入力は vpa でラップしなければなりません。そうでない場合、MATLAB® は自動的に入力を double に変換します。

vpa による使用する精度の変更

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

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

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

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

digits(25)
vpa(y)
ans =
9.999100089991000899910009

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

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

vpa(pi,100)
ans =
3.141592653589793238462643383279502884197169...
39937510582097494459230781640628620899862803...
4825342117068

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

digits(digitsOld)

シンボリックな結果の数値的近似

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

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

syms x
y = solve(x^4 - x + 1, x)
y =
 root(z^4 - z + 1, z, 1)
 root(z^4 - z + 1, z, 2)
 root(z^4 - z + 1, z, 3)
 root(z^4 - z + 1, z, 4)

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

yVpa = vpa(y)
yVpa =
   0.72713608449119683997667565867496 - 0.43001428832971577641651985839602i
   0.72713608449119683997667565867496 + 0.43001428832971577641651985839602i
 - 0.72713608449119683997667565867496 - 0.93409928946052943963903028710582i
 - 0.72713608449119683997667565867496 + 0.93409928946052943963903028710582i

vpa でのガード桁使用による精度の維持

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

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

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

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

vpa(a, 20)
ans =
0.33333333333303016843

内部での丸め誤差の回避

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

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

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

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

a - b
ans =
0.000000000000000000086736173798840354720600815844403

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

a - vpa(b, 32)
ans =
0.000000000000000000086736173798840354720600815844403

vpa での一般の倍精度入力の復元

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

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

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

sVpa =
1.0986122886681096913952452369225

d =
0.00000000000000013133163257501600766255995767652

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

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

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

ans =
0.0

ans =
0.0

ans =
0.0

ans =
0.0

入力引数

すべて折りたたむ

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

有効桁数。整数として指定します。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 より前に導入