数値のシンボリックへの変換
このトピックでは、Symbolic Math Toolbox™ における数値のシンボリック型への変換方法を説明します。シンボリック演算と数値演算の概要については、数値演算またはシンボリック演算の選択を参照してください。
数値入力をシンボリック型に変換するには、sym コマンドを使用します。既定の設定では、sym は数値式の有理近似を返します。
t = 0.1; sym(t)
ans =
sym では、倍精度値 0.1 は厳密なシンボリック値 を近似すると判断します。一般的に、sym では、厳密なシンボリック型を返すために浮動小数点入力の丸め誤差の訂正を試みます。具体的には、sym では、、、、 および という形式に一致する数値入力の丸め誤差を訂正します。ここで、 と は適度なサイズの整数です。
これらの形式について、sym が浮動小数点入力を厳密なシンボリック型に変換していることを示します。最初に、、 および を数値的に近似します。
N = [1/7 pi 1/sqrt(2)]
N = 1×3
0.1429 3.1416 0.7071
数値近似を厳密なシンボリック型に変換します。sym により丸め誤差が訂正されます。
S = sym(N)
S =
入力を引用符で囲むことで、入力をそのまま受け取るよう sym に強制できます。前の入力 0.142857142857143 でこの動作を示します。関数 sym はこの入力を 1/7 に変換しません。
sym('0.142857142857143')ans =
大きい数値を変換する場合、引用符を使用してその数値を正確に表現します。sym(133333333333333333333) と sym('133333333333333333333') を比較してこの動作を示します。
sym(1333333333333333333)
ans =
sym('1333333333333333333')ans =
sym で浮動小数点数を変換するために使用する手法は 2 番目のオプション引数で指定できます。これは、'f'、'r'、'e'、'd' のいずれかになります。既定のフラグは 'r' で、有理数型を示します。
有理シンボリック型への変換
'r' フラグを指定して sym を呼び出し、入力を厳密な有理数型に変換します。これは、フラグを指定せずに sym を呼び出すときの既定の動作です。
t = 0.1;
sym(t,'r')ans =
浮動小数点展開を使用した変換
フラグ 'f' を指定して sym を呼び出すと、sym によって倍精度浮動小数点数が を使用した数値に変換されます。ここで および はそれぞれ指数と仮数です。
浮動小数点展開を使用して t を変換します。
sym(t,'f')ans =
誤差項を使用した有理数シンボリック型への変換
'e' フラグを指定して sym を呼び出すと、sym は t の有理数型と、推定される t の厳密な値とその浮動小数点表現の間の誤差を返します。この誤差はeps (浮動小数点相対精度) で表現されます。
t をシンボリック型に変換します。推定されるシンボリック型とその浮動小数点値の間の誤差を返します。
sym(t,'e')ans =
誤差項 eps/40 は sym('0.1') と sym(0.1) の差です。
小数点形式への変更
フラグ 'd' を指定して sym を呼び出すと、sym は入力の小数部を展開した形式で返します。関数digitsは、使用する有効桁数を指定します。digits の既定値は 32 です。
sym(t,'d')ans =
digits を使用して有効桁数を変更します。
digitsOld = digits(7);
sym(t,'d')ans =
計算を続けるため、digits の古い値に戻します。
digits(digitsOld)
可変精度への変換
可変精度の浮動小数点演算を使用してシンボリック数を作成するには、vpaを使用します。既定では、vpa は有効桁数 32 桁まで値を計算します。
piVpa = vpa(pi)
piVpa =
vpa を log(2) などの数値入力に対して使用すると、まず有効桁数が 32 桁未満である倍精度 (MATLAB® の既定の精度) の数値としてその数値式が評価されます。次に、vpa がその倍精度の数値に適用されますが、この精度はあまり高くない可能性があります。より正確な結果が必要な場合は、sym を使用して数値式をシンボリック式に変換し、vpa を使用して可変精度で結果を評価します。たとえば、log(2) を 17 桁の精度と 20 桁の精度で求めます。
vpaOnDouble = vpa(log(2))
vpaOnDouble =
vpaOnSym_17 = vpa(log(sym(2)),17)
vpaOnSym_17 =
vpaOnSym_20 = vpa(log(sym(2)),20)
vpaOnSym_20 =
大きい数値を変換する場合、引用符を使用してその数値を正確に表現します。
inaccurateNum = vpa(123456789012345678)
inaccurateNum =
accurateNum = vpa('123456789012345678')accurateNum =