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

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

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

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

t = 0.1;
sym(t)
ans =
1/10

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

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

N1 = 1/7
N2 = pi
N3 = 1/sqrt(2)
N1 =
    0.1429
N2 =
    3.1416
N3 =
    0.7071

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

S1 = sym(N1)
S2 = sym(N2)
S3 = sym(N3)
S1 =
1/7
S2 =
pi
S3 =
2^(1/2)/2

入力と推定される厳密な形式の間の誤差を返すには、構文 sym(num,'e') を使用します。誤差項を使用した有理数シンボリック型への変換を参照してください。

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

sym('0.142857142857143')
ans =
0.142857142857143

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

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

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

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

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

sym(t, 'r')
ans =
1/10

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

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

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

sym(t, 'f')
ans =
3602879701896397/36028797018963968

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

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

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

sym(t, 'e')
ans =
eps/40 + 1/10

誤差項 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)