vpa
可変精度の演算 (任意精度の演算)
数値を定義しない文字ベクトルのサポートは削除されました。その代わり、sym
および syms
を使用してまずシンボリック数とシンボリック変数を作成した後、それらに対し演算を使用します。たとえば、vpa('(1 + sqrt(5))/2')
ではなく vpa((1 + sqrt(sym(5)))/2)
を使用します。
説明
例
可変精度の演算を使用したシンボリック入力の評価
可変精度浮動小数点演算を使用してシンボリック入力を評価します。既定では、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
または、digits
を vpa
の 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
の値は、使用する最小有効桁数を指定します。内部的には、vpa
は digits
で指定されたよりも多くの桁数を使用できます。この追加の桁数は、ガード桁と呼ばれます。この桁数によって、その後の計算が丸め誤差から守られるためです。
有効桁数 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
表面的には、a
と b
は等価に見えます。a - b
を求めて等価性をチェックします。
a - b
ans = 0.000000000000000000086736173798840354720600815844403
b
はわずか 10
桁の精度で計算されており、a
よりも大きな丸め誤差を含むため、差はゼロに等しくなりません。a - b
を求めるとき、vpa
は b
を 32 桁で近似します。この動作を示します。
a - vpa(b, 32)
ans = 0.000000000000000000086736173798840354720600815844403
vpa
での一般の倍精度入力の復元
厳密なシンボリック値とは異なり、倍精度値は本質的に丸め誤差を含みます。倍精度入力に対して vpa
を呼び出すとき、vpa
では、倍精度値よりも多くの桁数を返すとしても、低下した精度を復元できません。しかし、vpa
は p/q、pπ/q、(p/q)1/2、2q、および 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
呼び出しの差を求めることで、vpa
が p/q、pπ/q、(p/q)1/2、2q、および 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
入力引数
ヒント
vpa
は分数の指数を浮動小数点に変換しません。たとえば、vpa(a^sym(2/5))
はa^(2/5)
を返します。vpa
は、digits
によって指定される桁数よりも多くの桁数を使用します。この追加の桁数は、その後の計算を丸め誤差から守ります。これはガード桁と呼ばれます。vpa
を1/3
、2^(-5)
、sin(pi/4)
などの数値入力に対して呼び出すとき、数値式は丸め誤差を含む倍精度の数値に評価されます。次に、vpa
がその倍精度の数値に対して呼び出されます。より正確な結果を得るために、sym
で数値式をシンボリック式に変換します。たとえば、exp(1)
を近似するには、vpa(exp(sym(1)))
を使用します。2 番目の引数
d
が整数でない場合、vpa
はround
を使用して引数を最も近い整数に丸めます。vpa
は p/q、pπ/q、(p/q)1/2、2q および 10q という形式に一致する数値入力の精度を復元します。ここで、p および q は適度なサイズの整数です。可変精度演算を使用するアトミック操作が最も近い整数に丸めます。
可変精度演算と IEEE 754 浮動小数点標準との違いは次のとおりです。
計算の中で、ゼロ除算はエラーをスローします。
指数範囲は事前定義されたどの IEEE モードよりも広いです。
vpa
はおよそ10^(-323228496)
までアンダーフローします。非正規化された数値は実装されていません。
ゼロは符号が付きません。
結果の仮数内の 2 進数の数は、可変精度演算と IEEE の事前定義された型とで異なることがあります。
NaN
がただ 1 つ存在します。クワイエットとシグナリングのNaN
の違いは識別されません。浮動小数点数の例外は使用できません。