ディープラーニングG検定の勉強中 その24(全微分)

書籍「最短コースでわかるディープラーニングの数学」の内容に沿って勉強しています。

今回は、全微分を見ていきます。


参考サイト
理系大学生の数学駆け込み寺(全微分の定義と公式【基礎から丁寧に学ぼう!】)

前回は、2変数関数から

式1
4-2-1.png

各変数における偏微分を算出しました。

式2
4-3-1.png

この各偏微分は、それぞれ u 方向、v 方向の傾きを表しています。

このことから、u 方向の傾きと、v 方向の傾きを足すことで、2変数関数の接する面(接平面)の傾きを算出することができます。
この平面の接点の傾きを全微分と言います。

全微分の公式は式3となります。

式3
4-3-2.png

式1を偏微分したあとに全微分すると、式4となります。

式4
4-3-3.png


ちなみに、1変数関数の連続した滑らかな曲線にある接線は、

図1
4-3-7.png

接点の場所を拡大し続けたものと同じになるように、
2変数関数の連続した滑らかな曲面にある接平面は、

図2
4-3-8.png

接点を拡大し続けたものと同じになります。


なお、全微分の公式である式3を一般的な式に直すと式5になります。

式5
4-3-9.png

さらに、全微分は3変数以上の多変数関数でも可能で、式6のときの、

式6
4-3-10.png

多変数関数の全微分の総和∑は、式7となります。

式7
4-3-11.png


それでは、式8の2変数関数を全微分したときの、点(p, q)が接点のグラフをPythonで作成してみます。
p = 1、q = 1 とします。

式8
4-3-4.png

式9 偏微分と全微分の結果
4-3-5.png


参考サイト
Jenga 妄想の大気開放(オライリーの『ゼロから作るDeep Learning』、第4章の偏微分、式4.6 f(x0,x1)=x0^2+x1^2 に接平面を追記する)

--------------------
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

#計算範囲
u = np.arange(-5.0, 6.00, 0.5)
v = np.arange(-5.0, 6.00, 0.5)

u, v = np.meshgrid(u, v)
Z = -(u ** 2) -(v ** 2) # 2変数関数


#与えられたデータから点を打つ
p=[1] # 点p
q=[1] # 点q
dL=[2] # 全微分の解 (p^2+q^2=2)

#接点の描画 (赤い点)
ax.scatter3D(p, q, dL, color="red",marker="o", s=100)

#接平面の描画
ud = np.arange(-3.55, 6.50, 0.7)
vd = np.arange(-3.55, 6.50, 0.7)
ud, vd = np.meshgrid(ud, vd)
PD = -(2*ud) -(2*vd) + 6 # 接平面の方程式 (z-f(p,q)=fu(p,q)(u-p)+fv(p,q)(v-q))
ax.plot_wireframe(ud, vd, PD, color = "orange")

# 軸ラベルの設定
ax.set_xlabel("u-axis")
ax.set_ylabel("v-axis")
ax.set_zlabel("Z-axis")

# 表示範囲の設定
ax.set_xlim(-7, 10)
ax.set_ylim(-8, 5)
ax.set_zlim(-40, 10)

#角度(上下、回転)
ax.view_init(40, -30)

#2変数関数の描画
ax.plot_wireframe(u, v, Z, color = "blue")

plt.show()

--------------------
出力結果
4-3-8.png


多変数関数と接平面の両方の3Dグラフを出す方法を載せたサイトはあまりないので、今回の参考サイトは特に重宝しました。