ドキュメンテーション

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

有効な変数名でなく、数値を定義しない文字列のサポートは将来のリリースでは削除される予定です。文字列の代わりにシンボリック式を使用してください。シンボリック式は、まずシンボリック数とシンボリック変数を作成した後、それらに対し演算を使用して作成します。たとえば、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 桁まで値を計算します。

a = sym(pi);
b = 1/sym(3);
vpa(a)
vpa(a - exp(b))
ans =
3.1415926535897932384626433832795

ans =
1.7459802285037037098345180636769

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

V = [a b];
M = [sin(a) cos(b); exp(b) log(a)];
vpa(V)
vpa(M)
ans =
[ 3.1415926535897932384626433832795, 0.33333333333333333333333333333333]

ans =
[                                 0, 0.94495694631473766438828400767588]
[ 1.3956124250860895286281253196026,  1.1447298858494001741434273513531]

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 では、倍精度値よりも多くの桁数を返すとしても、低下した精度を復元できません。しかし、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

関連する例

入力引数

すべて折りたたむ

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

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

詳細

すべて折りたたむ

ヒント

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

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

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

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

参考

| |

R2006a より前に導入

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