Main Content

微分

この例では、Symbolic Math Toolbox™ を使って導関数を解析的に求めて評価する方法を説明します。例では、f(x) の 1 次および 2 次の導関数を求め、これらの導関数を使用して局所的最大値、局所的最小値、および変曲点を求めます。

1 次導関数:局所的な最小値および最大値を求める

式の 1 次導関数を計算すると、その式の局所的な最小と最大を求めることができます。シンボリック式を作成する前に、シンボリック変数を宣言します。

syms x

既定の設定では、虚数部の成分を含む解が結果に含まれます。ここで、x が実数であるという仮定を立てることにより、x の実数のみを考えます。

assume(x, 'real')

たとえば、有理式 (つまり、分子と分母が多項式の分数) を作成します。

f = (3*x^3 + 17*x^2 + 6*x + 1)/(2*x^3 - x + 3)
f = 

3x3+17x2+6x+12x3-x+3

この式をプロットすると、式が水平方向および垂直方向の漸近線をもち、-1 ~ 0 の間に局所的最小値、1 ~ 2 の間に局所的最大値をもつことがわかります。

fplot(f)
grid

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

水平方向の漸近線を求めるには、正および負の無限大に近付く x について f の極限を計算します。水平方向の漸近線は y = 3/2 です。

lim_left = limit(f, x, -inf)
lim_left = 

32

lim_right = limit(f, x, inf)
lim_right = 

32

この水平方向の漸近線をプロットに追加します。

hold on
plot(xlim, [lim_right lim_right], 'LineStyle', '-.', 'Color', [0.25 0.25 0.25])

Figure contains an axes object. The axes object contains 2 objects of type functionline, line.

f の垂直方向の漸近線を見つけるには、f の極を求めます。

pole_pos = poles(f, x)
pole_pos = 

-1634-2414324321/3-34-2414324321/3

関数 double を使用して、厳密解を数値的に近似します。

double(pole_pos)
ans = -1.2896

ここで、f の局所的最小値と最大値を求めます。点が局所的極値 (最小または最大) である場合、その点における式の 1 次導関数はゼロに等しくなります。diff を使用して f の導関数を計算します。

g = diff(f, x)
g = 

9x2+34x+62x3-x+3-6x2-13x3+17x2+6x+12x3-x+32

f の局所的極値を求めるには、方程式 g == 0 を解きます。

g0 = solve(g, x)
g0 = 

(σ26σ31/6-σ1-1568σ26σ31/6+σ1-1568)where  σ1=3374916331789396323559826+2198209982639304+2841σ31/3σ2578-9σ32/3σ2-361σ22896σ31/6σ21/4  σ2=2841σ31/31156+9σ32/3+361289  σ3=3178939632355176868+2198209530604

関数 double を使用して、厳密解を数値的に近似します。

double(g0)
ans = 2×1

   -0.1892
    1.2860

f では、x = 1.286 で局所的最大値に、x = -0.189 で局所的最小値になります。subs を使用してこれらの点の関数値を得ます。

f0 = subs(f,x,g0)
f0 = 

(3σ2-17σ5-σ6+15682-σ4+σ1+1134σ6+2σ2-σ5-21968-σ4+17σ6+σ5-15682+3σ3+σ1-1134σ6-2σ3+σ5-21968)where  σ1=σ7σ91/6σ81/4  σ2=σ5-σ6+15683  σ3=σ6+σ5-15683  σ4=σ8σ91/6  σ5=σ76σ91/6σ81/4  σ6=σ86σ91/6  σ7=3374916331789396323559826+2198209982639304+2841σ91/3σ8578-9σ92/3σ8-361σ8289  σ8=2841σ91/31156+9σ92/3+361289  σ9=3178939632355176868+2198209530604

変数 f0 に関数 double を使用して、厳密解を数値的に近似します。

double(f0)
ans = 2×1

    0.1427
    7.2410

グラフの極値に点のマーカーを追加します。

plot(g0, f0, 'ok')

Figure contains an axes object. The axes object contains 3 objects of type functionline, line.

2 次導関数:変曲点を求める

2 次導関数を計算すると、式の変曲点を求めることができます。2 階以上の高階数微分の最も効率の良い計算方法は、微分の階数を指定するパラメーターを使用することです。

h = diff(f, x, 2)
h = 

18x+34σ1-26x2-19x2+34x+6σ12-12xσ2σ12+26x2-12σ2σ13where  σ1=2x3-x+3  σ2=3x3+17x2+6x+1

次に、その結果を単純化します。

h = simplify(h)
h = 

268x6+90x5+18x4-699x3-249x2+63x+1722x3-x+33

f の変曲点を求めるには、方程式 h = 0 の解を求めます。ここでは、数値ソルバー vpasolve を使用して解の浮動小数点近似を計算します。

h0 = vpasolve(h, x)
h0 = 

(0.578718426554417483196010858601961.8651543689917122385037075917613-1.4228127856020972275345064554049-1.8180342567480118987898749770461i-1.4228127856020972275345064554049+1.8180342567480118987898749770461i-0.46088831805332057449182335801198+0.47672261854520359440077796751805i-0.46088831805332057449182335801198-0.47672261854520359440077796751805i)

f の変曲点は x = 1.865x = 0.579 の 2 つです。vpasolve は複素数解も返すことに注意してください。それらを無視します。

h0(imag(h0)~=0) = []
h0 = 

(0.578718426554417483196010858601961.8651543689917122385037075917613)

マーカーをプロットに追加して変曲点を示します。

plot(h0, subs(f,x,h0), '*k')
hold off

Figure contains an axes object. The axes object contains 4 objects of type functionline, line.