偏微分:多変数関数の微分
Maxima での偏微分は(常微分と同様の書き方ですが)以下のように書きます。
$\displaystyle \frac{\partial}{\partial x} f(x, y) = $ diff(f(x, y), x);
$\displaystyle \frac{\partial}{\partial y} f(x, y) = $ diff(f(x, y), y);
Maxima-Jupyter では偏微分の表示が $\displaystyle \frac{\partial}{\partial x}$ や $\displaystyle \frac{\partial}{\partial y}$ ではなく,$\displaystyle \frac{d}{dx}$ や $\displaystyle \frac{d}{dy}$ となってしまいますが,ご了承ください。
diff(f(x, y), x);
diff(f(x, y), y);
例題
次の関数 $z$ の偏導関数を求めよ。
(1) $ z = x^3 – 4 x^2 y + x y + 3 y^2$
z: x**3 - 4 * x**2 * y + x * y + 3 * y**2;
diff(z, x);
diff(z, y);
(2) $\displaystyle z = \tan^{-1} \frac{y}{x} $
z: atan(y/x);
diff(z, x);
diff(z, y);
偏微分はしてくれましたが,分母はもうちょっとがんばって簡単化していただきたいところ。
ratsimp()
関数で「簡単化」してみます。
dzdx: diff(z, x)$
dzdx = ratsimp(dzdx);
dzdy: diff(z, y)$
dzdy = ratsimp(dzdy);
全微分
2変数関数 $z = f(x, y)$ の全微分 $dz$ とは
$$ dz = df(x,y) = \frac{\partial f}{\partial x} dx + \frac{\partial f}{\partial y} dy$$
Maxima で全微分を求めるときは $df(x,y) = $ diff(f(x, y));
と書きます。
例題
次の関数 (z) の全微分を求めよ。
(1) $ z = \sqrt{x^2 – y^2} $
(2) $ z = x y^2 $
z: sqrt(x**2 - y**2)$
'diff(z) = diff(z);
z: x * y**2$
'diff(z) = diff(z);
高階偏導関数
Maxima が2階偏導関数に関して
$$ \frac{\partial^2 f}{\partial x \partial y} = \frac{\partial^2 f}{\partial y \partial x} $$
のように,偏微分の順序を変えてもよいことを知っているか確認。
diff(diff(f(x, y), y), x) - diff(diff(f(x, y), x), y);
テイラー展開(2変数)
1変数関数 $f(x)$ のテイラー展開の復習
$f(x)$ を $x = a$ のまわりで $n = 5$ 次($x^5$)まで展開するときは,Maxima では
taylor(f(x), x, a, 5);
のように書く。
例として,$f(x) = e^{x}$ を $x = 0$ まわりで $5$ 次まで展開してみる。
f(x):= exp(x);
taylor(f(x), x, 0, 5);
Maxima-Jupyter ではなぜかテイラー展開の結果表示が項の順番が降べきになっている。昇べきの順に表示させたいときは,trunc()
を使って…
trunc(taylor(f(x), x, 0, 5));
2変数関数 $f(x, y)$ のテイラー展開
本題である2変数関数 $f(x, y)$ のテイラー展開も taylor()
関数を使って書く。 $f(x, y)$ を$x = a, y = b$ のまわりで$3$次まで展開するときは,
taylor(f(x, y), [x, y], [a, b], [3, 3]);
のように。
例として,$\displaystyle f(x, y) = \frac{1-y}{1 + \sin x}$ を $x = 0, y = 0$ のまわりで $2$ 次まで展開してみる。
f(x,y):= (1-y)/(1 + sin(x));
trunc(taylor(f(x, y), [x, y], [0, 0], [2, 2]));
合成関数の偏微分
例題
\begin{eqnarray}
z &=& f(x, y) = x y \\
x &=& x(u, v) = u\cos v \\
y &=& y(u, v) = u \sin v \\
\therefore\ \ z &=& f\left(x(u, v), y(u, v)\right) = z(u, v)
\end{eqnarray}
について,以下を求める。
$$ 1. \ \frac{\partial z}{\partial u} \quad 2. \ \frac{\partial z}{\partial v} $$
x: u * cos(v);
y: u * sin(v);
z: x * y;
$\displaystyle \frac{\partial z}{\partial u}$ を計算すると…
diff(z, u);
/* 上の結果を簡単化。*/
/* trigreduce() は三角関数の積をなるべく減らして簡単化します。*/
trigreduce(%);
同様にして,$\displaystyle \frac{\partial z}{\partial v}$ を計算すると…
diff(z, u)
は $\displaystyle \frac{\partial z}{\partial u}$ ですが,Maxima は $\partial $ とは書けないようです。計算そのものはちゃんと偏微分しています。
'diff(z, v) = diff(z, v);
/* 上の結果の右辺 rhs を簡単化。*/
/* trigreduce() は三角関数の積をなるべく減らして簡単化します。*/
trigreduce(rhs(%));
陰関数定理
/* これまでの x, y の定義を念のために消去。*/
kill(x, y, z)$
例題
$f(x, y) = x^2 + y^2 -1 = 0$ を満たす陰関数 $y=y(x)$ の微分を求める。
陰関数定理を使って解く
陰関数定理より,
$$ \frac{dy}{dx} = – \frac{\frac{\partial f}{\partial x}}{\frac{\partial f}{\partial y}}$$
これを Maxima で導いてみます。
まず,$f(x, y) = 0$ より $y$ は $x$ の(陰)関数となるので,$y(x)$。
これを Maxima で表現するには,y
は x
に依存する (depends()
) という意味で以下のように書きます。
depends(y, x);
depends(y, x);
$y$ の $x$ 依存性を宣言した上で,$f(x, y) = x^2 + y^2 -1 = 0$ を $x$ で微分します。
f(x, y):= x**2 + y**2 - 1;
$f(x, y) = 0$ の両辺を $x$ で微分し,変数 df
に代入します。
df: diff(f(x, y) = 0, x);
上式を $\displaystyle \frac{dy}{dx}$ について解きます。
ans: solve(df, diff(y,x));
陽関数として表して微分する
別解として,陽関数として表して解く場合。
$f(x, y) = x^2 + y^2 – 1 = 0$ を $y$ について解く。
Maxima では,solve(f(x, y) = 0, y);
と書く。解を sol
に代入。
sol: solve(f(x, y) = 0, y);
1つ目の解は sol[1]
のように取り出す。
sol[1];
そしてそれを微分すると…
dy1: 'diff(y, x) = diff(rhs(sol[1]), x);
微分した結果 (dy1
)の右辺 (rhs()
) の分母を $\sqrt{1-x^2} = -y$ を代入して評価 (ev()
) する。
dai1: -rhs(sol[1]) = -lhs(sol[1]);
lhs(dy1) = ev(rhs(dy1), dai1);
2つ目の解 sol[2]
についても同様に。
sol[2];
dy2: 'diff(y, x) = diff(rhs(sol[2]), x);
dai2: rhs(sol[2])=lhs(sol[2]);
lhs(dy2) = ev(rhs(dy2), dai2);
以上のことから,1つ目の解 sol[1]
についても2つ目の解 sol[2]
についても,
$$\frac{dy}{dx} = – \frac{x}{y}$$
となることがわかる。これは陰関数定理で求めた解と一致する。
例題
$f(x,y) = x^2 + y^2 -1 = 0$ を満たす陰関数 $y = y(x)$ の極大値と極小値を求めよ。
極値を求めるには $\displaystyle \frac{dy}{dx}$ と極大・極小(上に凸・下に凸)を判断するために $\displaystyle \frac{d^2y}{dx^2}$ が必要。
陰関数の1階微分
すでに,$\displaystyle \frac{dy}{dx} = – \frac{x}{y}$ は求めていて,変数 ans[1]
に格納している。
ans[1];
陰関数の2階微分
ans[1]
をもう1階 $x$ で微分して $\displaystyle \frac{d^2y}{dx^2}$ を求める。
ddy: diff(ans[1], x);
上式の右辺に ans[1]
つまり $\displaystyle \frac{dy}{dx} = – \frac{x}{y}$ を代入して評価(ev()
)してやると…
ddy: ev(ddy, ans[1]);
極値となりそうな $x$ の値は
$\displaystyle \frac{dy}{dx} = – \frac{x}{y} = 0$ より $x = 0$.
そのときの $y$ の値は連立方程式 $x = 0, \ f(x, y)=0$ を解いて…
sols: solve([x = 0, f(x, y) = 0], [x, y]);
sols[1]
つまり $(x, y) = (0, -1)$ のとき,$\displaystyle \frac{d^2y}{dx^2}$ つまり ddy
の右辺の値を評価すると…
rddy: rhs(ddy)$
lhs(ddy) = ev(rddy, sols[1]);
… となり,$\displaystyle \frac{d^2y}{dx^2} = 1 > 0$ だからここでは下に凸,つまり極小値(最小値)。
同様に sols[2]
つまり $(x, y) = (0, 1)$ の場合は…
lhs(ddy) = ev(rddy, sols[2]);
… となり,$\displaystyle \frac{d^2y}{dx^2} = -1 < 0$ だからここでは上に凸,つまり極大値(最大値)。
参考:陰関数のグラフ
Maxima では $f(x, y) = 0$ という陰関数表示のままでグラフを描くことができる。
/* plot2d() で描く場合 */
plot2d(f(x, y) = 0,
[x, -1.2, 1.2], [y, -1.2, 1.2],
[same_xy],
[title, "f(x, y) = 0"]
)$
/* draw2d() で描く場合 */
/* 冗長だがいろいろ設定が可能 */
draw2d(
/* 滑らかにするために ip_grid を多めに
ip_grid = [200, 200], */
/* 縦横比 */
proportional_axes = xy, yrange = [-1.2, 1.5],
/* x 軸 y 軸の表示 */
xaxis = true, yaxis = true,
title = "f(x, y) = 0",
implicit(f(x, y) = 0, x, -1.2, 1.2, y, -1.2, 1.2),
point_type = 7, point_size = 0.7,
key = "y(x) の最大値",
color = "red",
points([[0,1]]),
key = "y(x) の最小値",
color = "blue",
points([[0,-1]])
)$