ドキュメンテーション

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

微分

Symbolic Math Toolbox™ ソフトウェアを使って、微分を得る方法を示すために、最初にシンボリック式を作成します。

syms x
f = sin(5*x);

次のコマンド

diff(f)

により fx で微分すると、次の結果が得られます。

ans =
5*cos(5*x)

他の例として、次のものを考えましょう。

g = exp(x)*cos(x);

ここで、exp(x)ex を示します。g を微分すると、次の結果が得られます。

y = diff(g)
y =
exp(x)*cos(x) - exp(x)*sin(x)

与えられた値 x について g の微分を求めるには、subs を使用して x をその値に置き換え、vpa を使用して数値を返します。x = 2 における g の微分を求めます。

vpa(subs(y,x,2))
ans =
-9.7937820180676088383807818261614

g の 2 次導関数を計算するために、以下のように入力します。

diff(g,2)
ans =
-2*exp(x)*sin(x)

この導関数を 2 回計算しても、同じ結果を得ることができます。

diff(diff(g))
ans =
-2*exp(x)*sin(x)

この例の中で、MATLAB® ソフトウェアは、自動的に解を単純化しています。しかし、MATLAB が解を単純化しない場合もあり、その場合は simplify コマンドを使用できます。このような単純化の例については、その他の例を参照してください。

定数を微分する場合、まず定数をシンボリック式として定義しなければならないことに注意してください。たとえば、次のように入力します。

c = sym('5');
diff(c)

は以下を返します。

ans =
0

次のように入力すると、

diff(5)

MATLAB では、以下が返されます。

ans =
     []

これは、5 がシンボリック式でないためです。

複数の変数からなる式の導関数

複数のシンボリック変数からなる式を微分するには、どの変数で微分するかを設定します。その後、diff コマンドはその変数で式の偏導関数を計算します。たとえば、次のシンボリック式を考えます。

syms s t
f = sin(s*t);

次のコマンド

diff(f,t)

により、偏導関数 f/t が計算されます。結果は次のようになります。

ans = 
s*cos(s*t)

f を変数 s で微分するには、次のように入力します。

diff(f,s)

次の値が返されます。

ans =
t*cos(s*t)

どの変数で微分するかを指定しない場合、MATLAB は既定の変数を選択します。既定の変数はアルファベット順で x に最も近い文字になるのが規則です。規則については、既定のシンボリック変数の検索を参照してください。前の例を考えると、diff(f) は、ft で微分します。これは、ts よりもアルファベット上で x に近い位置に存在するからです。MATLAB が微分する既定の変数を確認するには、symvar を使います。

symvar(f, 1)
ans = 
t

t について f の 2 次導関数を次のように計算します。

diff(f, t, 2)

このコマンドでは、以下が返されます。

ans =
-s^2*sin(s*t)

t が既定の変数であるため、diff(f, 2) によっても同じ解が返されることに注意してください。

その他の例

diff コマンドについて詳しく説明するため、次のように入力して MATLAB ワークスペースで abxnttheta を定義します。

syms a b x n t theta

以下の表は、diff(f) を入力した結果について説明しています。

f

diff(f)

syms x n
f = x^n;
diff(f)
ans =
n*x^(n - 1)
syms a b t
f = sin(a*t + b);
diff(f)
ans =
a*cos(b + a*t)
syms theta
f = exp(i*theta);
diff(f)
ans =
exp(theta*1i)*1i

第 1 種ベッセル関数 besselj(nu,z)z について微分するには、以下のように入力します。

syms nu z
b = besselj(nu,z);
db = diff(b)

次の値が返されます。

db =
(nu*besselj(nu, z))/z - besselj(nu + 1, z)

関数 diff は、その入力としてシンボリック行列を与えることもできます。この場合、微分は要素単位に行われます。例を考えてみましょう。

syms a x
A = [cos(a*x),sin(a*x);-sin(a*x),cos(a*x)]

次の値が返されます。

A =
[  cos(a*x), sin(a*x)]
[ -sin(a*x), cos(a*x)]

次のコマンド

diff(A)

は以下を返します。

ans =
[ -a*sin(a*x),  a*cos(a*x)]
[ -a*cos(a*x), -a*sin(a*x)]

ベクトルの引数についてベクトル関数の微分を実行することもできます。ユークリッド座標 (x, y, z) から x=rcosλcosφy=rcosλsinϕ および z=rsinλ で与えられる球座標 (r,λ,φ) に変換することを考えます。λ は仰角または緯度に相当し、φ は方位角または経度に相当します。

この変換のヤコビ行列 J を計算するために、関数 jacobian を使います。 J を数学的に表記します。

J=(x,y,z)(r,λ,φ).

ツールボックスの構文では、λ の代わりに l を、φ の代わりに f を使用します。コマンド

syms r l f
x = r*cos(l)*cos(f);
y = r*cos(l)*sin(f);
z = r*sin(l);
J = jacobian([x; y; z], [r l f])

は、次のヤコビアンを返します。

J =
[ cos(f)*cos(l), -r*cos(f)*sin(l), -r*cos(l)*sin(f)]
[ cos(l)*sin(f), -r*sin(f)*sin(l),  r*cos(f)*cos(l)]
[        sin(l),         r*cos(l),                0]

コマンド

detJ = simplify(det(J))

は以下を返します。

detJ = 
-r^2*cos(l)

関数 jacobian の引数は列ベクトルまたは行ベクトルです。また、ヤコビアンはかなり複雑な三角関数式なので、simplify を使って三角関数の置換や簡約 (単純化) が可能です。

次の表は、diff および jacobian をまとめています。

数学演算子

MATLAB コマンド

dfdx

diff(f) または diff(f, x)

dfda

diff(f, a)

d2fdb2

diff(f, b, 2)

J=(r,t)(u,v)

J = jacobian([r; t],[u; v])