シンボリック式の簡略化
Symbolic Math Toolbox には、シンボリック式の出力の操作を可能にする簡略化関数が揃っています。たとえば、次の黄金比の多項式 phi
phi = sym('(1 + sqrt(5))/2'); f = phi^2 - phi - 1
では、以下が返されます。
f = (5^(1/2)/2 + 1/2)^2 - 5^(1/2)/2 - 3/2
次のコマンドを使って、この解を簡略化できます。
simplify(f)
次の簡略化された答えが得られます。
ans = 0
シンボリックの簡略化により、常にこのような単純な答えが得られるわけではありません。汎用的な簡略化関数はありません。その理由は、シンボリック式の最も単純な表現とは何かが明確に定義できないためです。同じ数式でも、問題が異なれば、必要となる形式が異なってきます。特定の問題を解くためにどの形式がより効果的なのかを知って初めて、適切な簡略化関数を選択できます。
たとえば、多項式の次数を表示したり、多項式をシンボリックに微積分したりするには、すべてのかっこを展開してあらゆる同類項をまとめた標準形式の多項式を使用します。多項式を標準形式で書き直すには、関数 expand を使用します。
syms x; f = (x ^2- 1)*(x^4 + x^3 + x^2 + x + 1)*(x^4 - x^3 + x^2 - x + 1); expand(f)
ans = x^10 - 1
簡略化関数 factor は、多項式の根を示します。多項式が有理数で因数分解できない場合、関数 factor の出力は標準形式の多項式になります。たとえば、3 次多項式を因数分解するには、次のように入力します。
syms x; g = x^3 + 6*x^2 + 11*x + 6; factor(g)
ans = (x + 3)*(x + 2)*(x + 1)
多項式の入れ子 (Horner) 表現は、数値評価を行うのに最も効率的です。
syms x; h = x^5 + x^4 + x^3 + x^2 + x; horner(h)
ans = x*(x*(x*(x*(x + 1) + 1) + 1) + 1)
Symbolic Math Toolbox 簡略化関数の一覧については、「簡略化」を参照してください。
ページのトップへ
シンボリック式への代入
シンボリック変数への数の代入
関数 subs を使って、シンボリック変数に数値を代入できます。たとえば、x = 2/3 のときのシンボリック式 f を評価します。
syms x; f = 2*x^2 - 3*x + 1; subs(f, 1/3)
ans = 0.2222
関数 subs は、オリジナルの式 f を変更しません。
f
f = 2*x^2 - 3*x + 1
多変量式への代入
式に複数の変数が含まれている場合、代入する変数を指定できます。たとえば、次のシンボリック式の中に値 x = を代入する場合、
syms x y; f = x^2*y + 5*x*sqrt(y);
次のコマンドを入力します。
subs(f, x, 3)
ans = 9*y + 15*y^(1/2)
シンボリック変数間の置き換え
1 つのシンボリック変数を別のシンボリック変数に置き換えることもできます。たとえば、変数 y を変数 x に置き換えるには、次を入力します。
subs(f, y, x)
ans = x^3 + 5*x^(3/2)
多項式への行列の代入
数値係数をもつシンボリック多項式に行列を代入することも可能です。行列を多項式に代入する方法には、要素ごとに行う方法と行列の乗算の規則に従う方法の 2 通りがあります。
要素ごとの代入- 行列を要素ごとに代入するには、subs コマンドを使用します。
親よりも優れてやりたい貧しい子供たち
A = [1 2 3;4 5 6]; syms x; f = x^3 - 15*x^2 - 24*x + 350; subs(f,A)
ans = 312 250 170 78 -20 -118
要素ごとの代入は、長方形行列または正方行列に対して行うことができます。
行列そのものの代入- 行列の標準の乗算規則を使って行列を多項式に代入するには、行列が正方行列でなければなりません。たとえば、魔方陣 A を多項式 f に代入できます。
多項式を作成します。
syms x; f = x^3 - 15*x^2 - 24*x + 350;
魔方陣の行列を作成します。
A = magic(3)
A = 8 1 6 3 5 7 4 9 2
多項式 f の数値係数を含む行ベクトルを取得します。
b = sym2poly(f)
b = 1 -15 -24 350
魔方陣の行列 A を多項式 f に代入します。行列 A は、多項式内に現れるすべての x を置き換えます。f の定数項は、単位行列 eye(3) を定数倍したものに置き換えられます。
A^3 - 15*A^2 - 24*A + 350*eye(3)
ans = -10 0 0 0 -10 0 0 0 -10
polyvalm コマンドは、同じ結果を得るための簡単な方法を提供します。
polyvalm(sym2poly(f),A)
ans = -10 0 0 0 -10 0 0 0 -10
シンボリック行列の要素への代入
シンボリック行列の一連の要素へ代入する場合も、subs コマンドを使用します。シンボリック循環行列 A の一部の要素を置き換えたいとします。
syms a b c; A = [a b c; c a b; b c a]
A = [ a, b, c] [ c, a, b] [ b, c, a]
A の (2, 1) 要素を beta に置き換え、行列内のすべての変数 b を変数 alpha に置き換えるには、次のように入力します。
alpha = sym('alpha'); beta = sym('beta'); A(2,1) = beta; A = subs(A,b,alpha)
結果は次の行列になります。
A = [ a, alpha, c] [ beta, a, alpha] [ alpha, c, a]
subs コマンドの詳細は、「代入」を参照してください。
ページのトップへ
数値からシンボリックへの変換精度の推定
sym コマンドは、数値のスカラー、または、行列をシンボリック型に変換します。既定の設定では、sym コマンドは数値式の有理近似を返します。たとえば、標準の倍精度変数をシンボリック オブジェクトに変換できます。
t = 0.1; sym(t)
ans = 1/10
浮動小数点数を変換する手法は、2 番目のオプション引数で指定します。'f'、'r'、'e'、'd' のいずれかになります。既定のオプションは 'r' で、有理近似 (「有理シンボリック型への変換」) を意味します。
浮動小数点シンボリック型への変換
sym の 'f' オプションは、倍精度浮動小数点数を 2 つの 2 進数の和に変換します。すべての値は有理数 N*2^e として表されます。ここで、e と N は整数で、N は非負です。たとえば、以下のようになります。
sym(t, 'f')
は、シンボリックな浮動小数点表現を返します。
ans = 3602879701896397/36028797018963968
有理シンボリック型への変換
'r' オプションを使って sym コマンドを呼び出すと、
sym(t, 'r')
有理型の結果が得られます。
学校がいじめを許容するとき何が起こる
ans = 1/10
これは sym コマンドの既定の設定です。オプションを使用しないでこのコマンドを呼び出した場合でも、同じ有理型の結果が得られます。
sym(t)
ans = 1/10
マシン精度をもつ有理シンボリック型への変換
'e' オプションを使って sym コマンドを呼び出すと、t の有理型が、t に対する理論的な有理式と実際の (マシンの) 浮動小数点値との間の eps (浮動小数点相対精度) 表現による差を加えられて返されます。
sym(t, 'e')
ans = eps/40 + 1/10
小数シンボリック型への変換
'd' オプションを使って sym コマンドを呼び出すと、有効桁数まで小数点以下を展開した t が返されます。
sym(t, 'd')
ans = 0.10000000000000000555111512312578
既定の設定では、sym(t,'d') コマンドは有効桁数 32 の数値を返します。有効桁数を変更するには、 digits コマンドを使用します。
digits(7); sym(t, 'd')
ans = 0.1
ページのトップへ
シンボリック式の微分
Symbolic Math Toolbox ソフトウェアを使用すると、以下を求めることができます。
1 変数の式の微分
偏微分
2 階以上の微分
混合微分
シンボリック微分の詳細は、「微分」を参照してください。
1 変数の式
シンボリック式を微分するには、diff コマンドを使用します。次の例は、シンボリック式の 1 階微分の方法を示します。
syms x; f = sin(x)^2; diff(f)
ans = 2*cos(x)*sin(x)
偏微分
多変数式の場合、偏微分を指定できます。変数を指定しない場合、MATLAB は、文字 x またはアルファベット順で最もそれに近い変数を既定の変数として選択します。
syms x y; f = sin(x)^2 + cos(y)^2; diff(f)
ans = 2*cos(x)*sin(x)
既定の変数を選択する際に MATLAB が適用する規則については、「既定のシンボリック変数の確認」を参照してください。
シンボリック式 f を変数 y で微分するには、次のように入力します。
syms x y; f = sin(x)^2 + cos(y)^2; diff(f, y)
ans = -2*cos(y)*sin(y)
2 階偏微分および混合微分
シンボリック式 f を変数 y で 2 階微分するには、次のように入力します。
syms x y; f = sin(x)^2 + cos(y)^2; diff(f, y, 2)
ans = 2*sin(y)^2 - 2*cos(y)^2
同じ結果は、次のように 2 階微分することでも得られます。diff(diff(f, y))。混合微分するには、2 つの微分コマンドを使用します。以下に例を示します。
syms x y; f = sin(x)^2 + cos(y)^2; diff(diff(f, y), x)
ans = 0
ページのトップへ
シンボリック式の積分
以下を含むシンボリック積分を実行できます。
実数パラメーターおよび複素数パラメーターによる積分など、int コマンドの詳細は、「数値積分」を参照してください。
1 変数式の不定積分
シンボリック式を積分したいとします。最初のステップは、シンボリック式を作成することです。
syms x; f = sin(x)^2;
不定積分を求めるには、以下のように入力します。
最低条件を取得する方法
int(f)
ans = x/2 - sin(2*x)/4
多変数式の不定積分
式で複数のシンボリック変数が使用されている場合、積分変数を指定できます。変数を指定しない場合、MATLAB は、文字 x またはアルファベット順で最もそれに近い変数を既定の変数として選択します。
syms x y n; f = x^n + y^n; int(f)
ans = x*y^n + (x*x^n)/(n + 1)
既定の変数を選択する際に MATLAB が適用する規則については、「既定のシンボリック変数の確認」を参照してください。
式 f = x^n + y^n は y でも積分できます。
syms x y n; f = x^n + y^n; int(f, y)
ans = x^n*y + (y*y^n)/(n + 1)
積分変数が n の場合、以下のように入力します。
syms x y n; f = x^n + y^n; int(f, n)
ans = x^n/log(x) + y^n/log(y)
定積分
定積分を求めるには、関数 int の最後の 2 つの引数として積分範囲を渡します。
syms x y n; f = x^n + y^n; int(f, 1, 10)
ans = piecewise([n = -1, log(10) + 9/y],... [n <> -1, (10*10^n - 1)/(n + 1) + 9*y^n])
MATLAB が閉形式の積分を求めることができない場合
関数 int が積分を計算できない場合、MATLAB から警告が発行され、未解決の積分が返されます。
syms x y n; f = sin(x)^(1/sqrt(n)); int(f, n, 1, 10)
Warning: Explicit integral could not be found. ans = int(sin(x)^(1/n^(1/2)), n = 1..10)
ページのトップへ
方程式の解
以下を含むさまざまなタイプのシンボリック方程式を解くことができます。
微分方程式を含むシンボリック方程式の解法の詳細は、「方程式の解」を参照してください。
シンボリック変数が 1 つの代数方程式
次の式が 0 に等しくなる変数 x の値を求めることができます。
syms x; solve(x^3 - 6*x^2 + 11*x - 6)
ans = 1 2 3
既定の設定では、solve コマンドは方程式の左辺が 0 に等しいと仮定します。右辺が非ゼロの方程式を解く場合は、方程式の前後に引用符を使用します。
syms x; solve('x^3 - 6*x^2 + 11*x - 5 = 1')
ans = 1 2 3
複数のシンボリック変数からなる代数方程式
方程式に複数のシンボリック変数が含まれている場合、この方程式をどの変数について解くかを指定できます。たとえば、多変数方程式
syms x y; f = 6*x^2 - 6*x^2*y + x*y^2 - x*y + y^3 - y^2;
をシンボリック変数 y について解くことができます。
solve(f, y)
ans = 1 2*x -3*x
変数を指定しない場合は、変数 x にアルファベット順で最も近い変数について方程式を解きます。既定の変数を選択する際に MATLAB が適用する規則については、「既定のシンボリック変数の確認」を参照してください。
連立代数方程式
連立方程式を解くことができます。以下に例を示します。
syms x y z; [x, y, z] = solve('z = 4*x', 'x = y', 'z = x^2 + y^2')
x = 0 2 y = 0 2 z = 0 8
ページのトップへ
既定のシンボリック変数の確認
代入、微分、積分を実行する際に、使用する変数を指定しない場合、MATLAB は既定の変数を使用します。既定の変数は、基本的に x にアルファベット順で最も近い変数になります。既定の変数として選択されている変数を確認するには、symvar(expression, 1) コマンドを使用します。以下に例を示します。
syms s t; g = s + t; symvar(g, 1)
ans = t
syms sx tx; g = sx + tx; symvar(g, 1)
ans = tx
既定のシンボリック変数の選択の詳細は、symvar コマンドを参照してください。
ページのトップへ
シンボリック関数のプロットの作成
以下を含むさまざまなタイプのグラフを作成できます。
Symbolic Math Toolbox のグラフィックス ツールおよび視覚化ツールの詳細は、「教育的なグラフィカルアプリケーション」を参照してください。
陽関数のプロット
プロットを作成する最も簡単な方法は、ezplot コマンドを使用することです。
syms x; ezplot(x^3 - 6*x^2 + 11*x - 6); hold on;
hold on コマンドにより既存のプロットが保持されるため、新規要素を追加したり、プロットの外観を変更したりできます。たとえば、軸名を変更したり、新しいタイトルやグリッド ラインを追加したりできます。現在のプロットの操作を終了したら、hold off コマンドを入力します。
xlabel('x axis'); ylabel('no name axis'); title('Explicit function: x^3 - 6*x^2 + 11*x - 6'); grid on; hold off
陰関数のプロット
暗黙的に定義された関数をプロットできます。たとえば、定義域 –1 < x < 1 に対する次の陰関数のプロットを作成します。
syms x y; f = (x^2 + y^2)^4 - (x^2 - y^2)^2; ezplot(f, [-1 1]); hold on; xlabel('x axis'); ylabel('y axis'); title('Implicit function: f = (x^2 + y^2)^4 - (x^2 - y^2)^2'); grid on; hold off
3 次元プロット
3 次元グラフィックスは、Symbolic Math Toolbox でも使用できます。3 次元プロットを作成するには、ezplot3 コマンドを使用します。以下に例を示します。
syms t; ezplot3(t^2*sin(10*t), t^2*cos(10*t), t);
表面プロット
表面プロットを作成するには、ezsurf コマンドを使用します。たとえば、放物面 z = x2+ y2 をプロットするには、以下のように入力します。
syms x y; ezsurf(x^2 + y^2); hold on; zlabel('z'); title('z = x^2 + y^2'); hold off
ページのトップへ
0 件のコメント:
コメントを投稿