Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

シンボリック計算の実行

シンボリック式の微分

Symbolic Math Toolbox™ ソフトウェアを使用すると、以下を求めることができます。

  • 単変量式の微分

  • 偏導関数

  • 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 階偏微分および混合微分

変数 y についてシンボリック式 f の 2 階微分を求めるには、次のように入力します。

syms x y
f = sin(x)^2 + cos(y)^2;
diff(f, y, 2)
ans =
2*sin(y)^2 - 2*cos(y)^2

同じ結果は、diff(diff(f, y)) のように微分を 2 回行っても得られます。混合微分するには、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^ny でも積分できます。

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 は、積分を計算できない場合、未解決の積分を返します。

syms x
int(sin(sinh(x)))
ans =
int(sin(sinh(x)), x)

方程式の求解

以下を含むさまざまなタイプのシンボリック方程式を解くことができます。

  • シンボリック変数が 1 つの代数方程式

  • 複数のシンボリック変数からなる代数方程式

  • 代数方程式系

微分方程式を含むシンボリック方程式の求解の詳細は、方程式の解法を参照してください。

1 つのシンボリック変数をもつ代数方程式の求解

二重等号 (==) を使用して、方程式を定義します。これで、関数 solve を呼び出して、方程式を解くことができます。たとえば、次の方程式を解きます。

syms x
solve(x^3 - 6*x^2 == 6 - 11*x)
ans =
 1
 2
 3

方程式の右辺を指定しないと、solve はゼロであると仮定します。

syms x
solve(x^3 - 6*x^2 + 11*x - 6)
ans =
 1
 2
 3

複数のシンボリック変数をもつ代数方程式の求解

方程式に複数のシンボリック変数が含まれている場合、この方程式をどの変数について解くかを指定できます。たとえば、y についてこの多変数方程式の解を求めます。

syms x y
solve(6*x^2 - 6*x^2*y + x*y^2 - x*y + y^3 - y^2 == 0, 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

シンボリック式の単純化

Symbolic Math Toolbox には、シンボリック式の出力の操作を可能にする一連の単純化関数が備わっています。たとえば、次の黄金比の多項式 phi

phi = (1 + sqrt(sym(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]

多項式の入れ子 (ホーナー) 表現は、数値評価を行うのに最も効率的です。

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 = 1/3 のときのシンボリック式 f を評価します。

syms x
f = 2*x^2 - 3*x + 1;
subs(f, 1/3)
ans =
2/9

関数 subs は、オリジナルの式 f を変更しません。

f
f =
2*x^2 - 3*x + 1

多変数式への代入

式に複数の変数が含まれている場合、代入する変数を指定できます。たとえば、次のシンボリック式の中に値 x = 3 を代入する場合、

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 コマンドを使用します。

syms x
f = x^3 - 15*x^2 - 24*x + 350;
A = [1 2 3; 4 5 6];
subs(f,A)
ans =
[ 312, 250,  170]
[  78, -20, -118]

要素ごとの代入は、方形行列または正方行列に対して行うことができます。

行列そのものの代入.  行列の標準の乗算規則を使って行列を多項式に代入するには、行列が正方行列でなければなりません。たとえば、魔方陣 A を多項式 f に代入できます。

  1. 多項式を作成します。

    syms x
    f = x^3 - 15*x^2 - 24*x + 350;
  2. 魔方陣の行列を作成します。

    A = magic(3)
    A =
         8     1     6
         3     5     7
         4     9     2
  3. 多項式 f の数値係数を含む行ベクトルを取得します。

    b = sym2poly(f)
    b =
         1   -15   -24   350
  4. 魔方陣の行列 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(b,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]

詳細は、シンボリック行列の要素の置き換えを参照してください。

シンボリック関数のプロット

Symbolic Math Toolbox では、以下のプロット関数が用意されています。

  • fplot - シンボリック式、方程式または関数の直交座標 2 次元プロットを作成。

  • fplot3 - 3 次元のパラメトリック プロットを作成。

  • ezpolar - 極座標プロットを作成。

  • fsurf - 表面プロットを作成。

  • fcontour - 等高線図を作成。

  • fmesh - メッシュ プロットを作成。

陽関数のプロット

fplot を使用して 2 次元ライン プロットを作成します。式 x3-6x2+11x-6 をプロットします。

syms x
f = x^3 - 6*x^2 + 11*x - 6;
fplot(f)

Figure contains an axes object. The axes object contains an object of type functionline.

x 軸および y 軸にラベルを追加します。texlabel(f) を使用してタイトルを生成します。grid on を使用してグリッドを表示します。詳細は、チャートへのタイトルと軸のラベルの追加を参照してください。

xlabel('x')
ylabel('y')
title(texlabel(f))
grid on

Figure contains an axes object. The axes object with title 11 blank x blank - blank 6 blank x Squared baseline blank + blank x Cubed baseline blank - blank 6, xlabel x, ylabel y contains an object of type functionline.

陰関数のプロット

fimplicit を使用して方程式および陰関数をプロットします。

方程式 (x2+y2)4=(x2-y2)2-1<x<1 の区間でプロットします。

syms x y
eqn = (x^2 + y^2)^4 == (x^2 - y^2)^2;
fimplicit(eqn, [-1 1])

Figure contains an axes object. The axes object contains an object of type implicitfunctionline.

3 次元プロット

fplot3 を使用して 3 次元パラメトリック ラインをプロットします。

次のパラメトリック ラインのプロットを

x=t2sin(10t)y=t2cos(10t)z=t.

syms t
fplot3(t^2*sin(10*t), t^2*cos(10*t), t)

Figure contains an axes object. The axes object contains an object of type parameterizedfunctionline.

表面プロットの作成

fsurf を使用して 3 次元表面を作成します。

放物面 z=x2+y2 をプロットします。

syms x y
fsurf(x^2 + y^2)

Figure contains an axes object. The axes object contains an object of type functionsurface.

関連するトピック