Main Content

数値のシンボリックへの変換

このトピックでは、Symbolic Math Toolbox™ における数値のシンボリック型への変換方法を説明します。シンボリック演算と数値演算の概要については、数値演算またはシンボリック演算の選択を参照してください。

数値入力をシンボリック型に変換するには、sym コマンドを使用します。既定の設定では、sym は数値式の有理近似を返します。

t = 0.1;
sym(t)
ans = 

110

sym では、倍精度値 0.1 は厳密なシンボリック値 110 を近似すると判断します。一般的に、sym では、厳密なシンボリック型を返すために浮動小数点入力の丸め誤差の訂正を試みます。具体的には、sym では、pqpπq(pq)122q および 10q という形式に一致する数値入力の丸め誤差を訂正します。ここで、pq は適度なサイズの整数です。

これらの形式について、sym が浮動小数点入力を厳密なシンボリック型に変換していることを示します。最初に、17π および 12 を数値的に近似します。

N = [1/7 pi 1/sqrt(2)]
N = 1×3

    0.1429    3.1416    0.7071

数値近似を厳密なシンボリック型に変換します。sym により丸め誤差が訂正されます。

S = sym(N)
S = 

(17π22)

入力を引用符で囲むことで、入力をそのまま受け取るよう sym に強制できます。前の入力 0.142857142857143 でこの動作を示します。関数 sym はこの入力を 1/7 に変換しません。

sym('0.142857142857143')
ans = 0.142857142857143

大きい数値を変換する場合、引用符を使用してその数値を正確に表現します。sym(133333333333333333333)sym('133333333333333333333') を比較してこの動作を示します。

sym(1333333333333333333)
ans = 1333333333333333248
sym('1333333333333333333')
ans = 1333333333333333333

sym で浮動小数点数を変換するために使用する手法は 2 番目のオプション引数で指定できます。これは、'f''r''e''d' のいずれかになります。既定のフラグは 'r' で、有理数型を示します。

有理シンボリック型への変換

'r' フラグを指定して sym を呼び出し、入力を厳密な有理数型に変換します。これは、フラグを指定せずに sym を呼び出すときの既定の動作です。

t = 0.1;
sym(t,'r')
ans = 

110

浮動小数点展開を使用した変換

フラグ 'f' を指定して sym を呼び出すと、sym によって倍精度浮動小数点数が N2e を使用した数値に変換されます。ここで N および e はそれぞれ指数と仮数です。

浮動小数点展開を使用して t を変換します。

sym(t,'f')
ans = 

360287970189639736028797018963968

誤差項を使用した有理数シンボリック型への変換

'e' フラグを指定して sym を呼び出すと、symt の有理数型と、推定される t の厳密な値とその浮動小数点表現の間の誤差を返します。この誤差はeps (浮動小数点相対精度) で表現されます。

t をシンボリック型に変換します。推定されるシンボリック型とその浮動小数点値の間の誤差を返します。

sym(t,'e')
ans = 

eps40+110

誤差項 eps/40sym('0.1')sym(0.1) の差です。

小数点形式への変更

フラグ 'd' を指定して sym を呼び出すと、sym は入力を小数部を展開した形式で返します。関数digitsは、使用する有効桁数を指定します。digits の既定値は 32 です。

sym(t,'d')
ans = 0.10000000000000000555111512312578

digits を使用して有効桁数を変更します。

digitsOld = digits(7);
sym(t,'d')
ans = 0.1

計算を続けるため、digits の古い値に戻します。

digits(digitsOld)

可変精度への変換

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

piVpa = vpa(pi)
piVpa = 3.1415926535897932384626433832795

vpalog(2) などの数値入力に対して使用すると、まず有効桁数が 32 桁未満である倍精度 (MATLAB® の既定の精度) の数値としてその数値式が評価されます。次に、vpa がその倍精度の数値に適用されますが、この精度はあまり高くない可能性があります。より正確な結果が必要な場合は、sym を使用して数値式をシンボリック式に変換し、vpa を使用して可変精度で結果を評価します。たとえば、log(2) を 17 桁の精度と 20 桁の精度で求めます。

vpaOnDouble = vpa(log(2))
vpaOnDouble = 0.69314718055994528622676398299518
vpaOnSym_17 = vpa(log(sym(2)),17)
vpaOnSym_17 = 0.69314718055994531
vpaOnSym_20 = vpa(log(sym(2)),20)
vpaOnSym_20 = 0.69314718055994530942

大きい数値を変換する場合、引用符を使用してその数値を正確に表現します。

inaccurateNum = vpa(123456789012345678)
inaccurateNum = 123456789012345680.0
accurateNum = vpa('123456789012345678')
accurateNum = 123456789012345678.0

関連するトピック