ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

vpa

構文

R = vpa(A)
R = vpa(A,d)

説明

R = vpa(A) は、d 桁以上の精度をもつ可変精度 (VPA) の演算を使って、A の個々の要素を計算します。d は現在設定されている digits の値です。

R = vpa(A,d) は、digits の現在の設定の代わりに、d 以上の有効桁数 (非ゼロ) を使って評価します。

入力引数

A

シンボリック オブジェクト、文字列または数値式。

d

1 より大きく 未満の整数。

出力引数

R

浮動小数点数を表すシンボリック オブジェクト

以下の式を 25 桁の精度で近似します。

old = digits(25);
q = vpa('1/2')
p = vpa(pi)
w = vpa('(1+sqrt(5))/2')
digits(old)
q =
0.5

p =
3.141592653589793238462643

w =
1.618033988749894848204587
 

次の方程式を解きます。

y = solve('x^2 - 2')
y =
  2^(1/2)
 -2^(1/2)

これらの解を浮動小数点数で近似します。

vpa(y(1))
vpa(y(2))
ans =
1.4142135623730950488016887242097
 
ans =
-1.4142135623730950488016887242097
 

関数 vpa を使って、以下の行列の要素を近似します。

A = vpa(hilb(2), 25)
B = vpa(hilb(2), 5)
A =
[ 1.0,                         0.5]
[ 0.5, 0.3333333333333333333333333]

B =
[ 1.0,     0.5]
[ 0.5, 0.33333]
 

関数 vpa では、現在の digits の設定とは異なる有効桁数 (非ゼロ) を指定できます。たとえば、有効桁数 4 を使って比 1/3 と比 1/3000 を計算します。

vpa(1/3, 4)
vpa(1/3000, 4)
ans =
0.3333
 
ans =
0.0003333
 

関数 vpa または関数 digits で指定する桁数が、最小桁数です。内部的には、ツールボックスは指定されたよりも多くの桁数を使用できます。この追加の桁数は、ガード桁と呼ばれます。たとえば、桁数を 4 に設定し、4 桁を使って 1/3 の浮動小数点近似値を表示します。

old = digits;
digits(4)
a = vpa(1/3, 4)
a =
0.3333

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

vpa(a, 20)
digits(old)
ans =
0.33333333333303016843
 

内部での丸め誤差が、結果を予期せぬものにする原因になっています。たとえば、既定の 32 桁の精度と 10 桁の精度で数 1/10 を計算します。

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

次に、差 a - b を計算します。

a - b
ans =
0.000000000000000000086736173798840354720600815844403

差が 0 にならない理由は、数 b=0.1 がツールボックスで 32 桁を使用して近似された値のためです。この近似により丸め誤差が発生する理由は、浮動小数点数 0.1 が有理数 1/10 とは異なるためです。差 a - b を計算するとき、差は実際にはツールボックスで次のように計算されます。

a - vpa(b, 32)
ans =
0.000000000000000000086736173798840354720600815844403
 

数値をシンボリック オブジェクトに変換し、そのオブジェクトに VPA 演算を実行する場合を考えます。結果は、浮動小数点数をシンボリック オブジェクトに変換するのに使用する変換手法によって異なってきます。変換手法を選択するには、関数 sym で 2 番目のオプション引数に 'r'、'f'、'd'、'e' のいずれかを指定します。既定値は 'r' です。たとえば、定数π=3.141592653589793... をシンボリック オブジェクトに変換します。

r = sym(pi)
f = sym(pi, 'f')
d = sym(pi, 'd')
e = sym(pi, 'e')
r =
pi
 
f =
884279719003555/281474976710656
 
d =
3.1415926535897931159979634685442
 
e =
pi - (198*eps)/359

これらの数値を 4 桁の VPA 精度で計算します。4 つの数値近似のうち、3 つの結果は同じになります。

vpa(r, 4)
vpa(f, 4)
vpa(d, 4)
vpa(e, 4)
ans =
3.142
 
ans =
3.142
 
ans =
3.142
 
ans =
3.142 - 0.5515*eps

次に、VPA 精度を 40 桁に上げます。1/10 の数値近似は、1/10 をシンボリック オブジェクトに変換する際に使用した手法によって異なってきます。

vpa(r, 40)
vpa(f, 40)
vpa(d, 40)
vpa(e, 40)
ans =
3.141592653589793238462643383279502884197
 
ans =
3.141592653589793115997963468544185161591
 
ans =
3.1415926535897931159979634685442
 
ans =
3.141592653589793238462643383279502884197 -...
0.5515320334261838440111420612813370473538*eps

詳細

すべて展開する

ヒント

  • 計算の内部精度は、ツールボックスによって数桁 (ガード桁) 分追加されます。

  • vpa を、1/32^(-5)sin(pi/4) などの数値式に適用する場合、倍精度の数値に評価されます。次に、vpa がその倍精度の数値に適用されます。より正確な結果を得るために、数値式をシンボリック式に変換します。たとえば、exp(1) を近似するには、vpa(sym(exp(1)) を使用します。

  • d が整数でない場合、vpa によって最も近い整数に丸められます。

参考

|

この情報は役に立ちましたか?