Symbolic Math Toolbox

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

はじめに

この例では、Symbolic Math Toolbox™ を使ってシンボリック変数とシンボリック式を作成し、使用する方法を示します。

たとえば、ステートメント

x = sym('x');

は、シンボリック変数 x を生成します。

複数のステートメント

a = sym('a'); t = sym('t'); x = sym('x'); y = sym('y');

を関数 "syms" によって 1 つのステートメントにまとめることができます。

syms a t x y

シンボリック変数は、数式で使用したり、さまざまな関数に渡す引数として使用することができます。

r = x^2 + y^2

theta = atan(y/x)

e = exp(i*pi*t)
 
r =
 
x^2 + y^2
 
 
theta =
 
atan(y/x)
 
 
e =
 
exp(pi*t*i)
 

関数 "simplify" を使用して、数式を使いやすい形式に変換することも可能です。

f = cos(x)^2 + sin(x)^2

f = simplify(f)
 
f =
 
cos(x)^2 + sin(x)^2
 
 
f =
 
1
 

微分と積分は、それぞれ関数 "diff" と 関数 "int" によって計算されます。

diff(x^3)

int(x^3)

int(exp(-t^2))
 
ans =
 
3*x^2
 
 
ans =
 
x^4/4
 
 
ans =
 
(pi^(1/2)*erf(t))/2
 

1 つの式に複数の変数が含まれる場合、アルファベット順で x に最も近い変数が微分と積分で使用されます (ただし、他の変数が 2 番目の引数として指定されていない場合に限ります)。以下のベクトルでは、最初の 2 つの要素が x に関する積分を行い、残りの要素が a に関する積分を行います。

[int(x^a), int(a^x), int(x^a,a), int(a^x,a)]
 
ans =
 
[ piecewise([a == -1, log(x)], [a ~= -1, x^(a + 1)/(a + 1)]), a^x/log(a), x^a/log(x), piecewise([x == -1, log(a)], [x ~= -1, a^(x + 1)/(x + 1)])]
 

また、関数 sym を使用してシンボリック定数を作成することもできます。引数として、数値を表す文字列を指定できます。pi = sym('pi') と delta = sym('1/10') のようなステートメントは、浮動小数点による近似値ではなく円周率または 1/10 という有理数として扱うためのシンボリックな数値を作成します。この方法で生成された pi は、同じ名前の組み込み数値関数に一時的に置き換わります。

pi = sym('pi')

delta = sym('1/10')

s = sym('sqrt(2)')
 
pi =
 
pi
 
 
delta =
 
1/10
 
 
s =
 
2^(1/2)
 

浮動小数点値をシンボリック定数に変換する際は、丸め誤差を考慮に入れなければなりません。たとえば、以下のステートメントのいずれかを使用して t に代入される値は、正確に 10 分の 1 というわけではありません。

t = 1/10, t = 0.1
t =

    0.1000


t =

    0.1000

浮動小数点数を変換する方法は、関数 sym への 2 番目の引数 (オプション) によって指定します。この引数の値として、f、r、e、または d を指定できます。既定値は r です。

f は、浮動小数点を表します。すべての値は、(2^e+N*2^(e-52)) または -(2^e+N*2^(e-52)) という形式で表されます。ここで、N と e は整数です。これにより、精度の高い浮動小数点値が得られます。

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

r は、有理数を表します。適切な整数 p と q をとり、p/q、p*pi/q、sqrt(p)、2^q、および 10^q という各形式の式を評価することで得られる浮動小数点を、対応するシンボリック形式に変換します。これにより、元の評価に伴う丸め誤差が効果的に補われますが、浮動小数点値が正確に表されない場合があります。

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

簡単な有理近似を求めることができない場合は、大きい整数 p と q を使用した p*2^q という形式の式から、精度の高い浮動小数点値が得られます。

sym(1+sqrt(5),'r')
 
ans =
 
910872158600853/281474976710656
 

e は、推定誤差を表します。r は、変数 eps を含む項によって補完されます。この変数は、理論的な有理式と実際の浮動小数点値との差を推定します。

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

d は、小数を表します。桁数は、VPA で使用される DIGITS を現在の設定から得られます。16 より小さい桁数よりも、一般に 16 桁以上の方が精度が悪くなります。

digits(15)
sym(t,'d')

digits(25)
sym(t,'d')
 
ans =
 
0.1
 
 
ans =
 
0.1000000000000000055511151
 

25 桁の場合、0 の文字列で終わるのではなく、1/10 に最も近い浮動小数点数の小数表現となります。

MATLAB® 言語のベクトルおよび行列の表記法がシンボリック変数にも適用されます。

n = 4;

A = x.^((0:n)'*(0:n))

D = diff(log(A))
 
A =
 
[ 1,   1,   1,    1,    1]
[ 1,   x, x^2,  x^3,  x^4]
[ 1, x^2, x^4,  x^6,  x^8]
[ 1, x^3, x^6,  x^9, x^12]
[ 1, x^4, x^8, x^12, x^16]
 
 
D =
 
[ 0,   0,   0,    0,    0]
[ 0, 1/x, 2/x,  3/x,  4/x]
[ 0, 2/x, 4/x,  6/x,  8/x]
[ 0, 3/x, 6/x,  9/x, 12/x]
[ 0, 4/x, 8/x, 12/x, 16/x]