自動微分(3) — 高階導関数の計算

前回まででは、1階の(偏)微分係数を考察した。今度は、高階の導関数の値(微分係数)も計算するように拡張しよう。簡単のため、1変数関数について考えることにする。

高階微分と演算、関数の合成との関係を見る。変数は \(t\) とする。

もとの関数 1階導関数、2階導関数
\(h(t)=\mathrm{const.}\) \(h'(t)=0,\quad h^{\prime\prime}(t)=0\)
\(h(t)=t\) \(h'(t)=1,\quad h^{\prime\prime}(t)=0\)
\(h(t)=f_1(t)\pm f_2(t)\) \(h'(t)=f_1′(t)\pm f_2′(t),\quad h^{\prime\prime}(t)=f_1^{\prime\prime}(t)\pm f_2^{\prime\prime}(t)\)
\(h(t)=f_1(t)f_2(t)\) \(\begin{array}{c}
h'(t)=f_1′(t)f_2(t)+f_1(t)f_2′(t), \\
h^{\prime\prime}(t)=f_1^{\prime\prime}(t)f_2(t)+2f_1′(t)f_2′(t)+f_1(t)f_2^{\prime\prime}(t)
\end{array}\)
\(h(t)=\frac{f_1(t)}{f_2(t)}\) \(\begin{array}{c}
h'(t)=\frac{f_1′(t)}{f_2(t)}-\frac{f_1(t)f_2′(t)}{f_2(t)^2}, \\
h^{\prime\prime}(t)=\frac{f_1^{\prime\prime}(t)}{f_2(t)}-\frac{2f_1′(t)f_2′(t)}{f_2(t)^2}-\frac{f_1′(t)f_2^{\prime\prime}(t)}{f_2(t)^2}+\frac{2f_1(t)f_2′(t)^2}{f_2(t)^3}
\end{array}\)
\(h(t)=g(f(t))\) \(\begin{array}{c}
h'(t)=g'(f(t))f'(t), \\
h^{\prime\prime}(t)=g^{\prime\prime}(f(t))f'(t)^2+g'(f(t))f^{\prime\prime}(t)
\end{array}\)
\(h(t)=g(f_1(t),f_2(t))\) \(\begin{array}{c}
h'(t)=g_x(f_1(t),f_2(t))f_1′(t)+g_y(f_1(t),f_2(t))f_2′(t), \\
h^{\prime\prime}(t)=g_{xx}(f_1(t),f_2(t))f_1′(t)^2+2g_{xy}(f_1(t),f_2(t))f_1′(t)f_2′(t)+g_{yy}(f_1(t),f_2(t))f_2′(t)^2 \\
\quad +g_x(f_1(t),f_2(t))f_1^{\prime\prime}(t)+g_y(f_1(t),f_2(t))f_2^{\prime\prime}(t)
\end{array}\)

2階微分の自動微分では、「値」「1階の微分係数」「2階の微分係数」の3つの値を保持する必要があるので、実装するには \(\mathbf{R}\times\mathbf{R}\times\mathbf{R}\) に適切な演算を入れれば良い。上の表の \(f(t),f'(t),f^{\prime\prime}(t)\) を \(\mathbf{R}\times\mathbf{R}\times\mathbf{R}\) の成分で置き換えると、\(\mathbf{R}\times\mathbf{R}\times\mathbf{R}\) に入れるべき演算が分かる。すなわち、\begin{align*}
(x,x’,x^{\prime\prime})\pm(y,y’,y^{\prime\prime})&=(x\pm y,x’\pm y’,x^{\prime\prime}\pm y^{\prime\prime}) \\
(x,x’,x^{\prime\prime})\cdot(y,y’,y^{\prime\prime})&=(xy,x’y+xy’,x^{\prime\prime}y+2x’y’+xy^{\prime\prime}) \\
\frac{(x,x’,x^{\prime\prime})}{(y,y’,y^{\prime\prime})}&=\left(\frac{x}{y},\frac{x’}{y}-\frac{xy’}{y^2},\frac{x^{\prime\prime}}{y}-\frac{2x’y’}{y^2}-\frac{x’y^{\prime\prime}}{y^2}+\frac{2xy’^2}{y^3}\right),
\end{align*}\(g\colon\mathbf{R}\to\mathbf{R}\)(微分可能) に対し、\[g_*((x,x’,x^{\prime\prime}))=(g(x),g'(x)x’,g^{\prime\prime}(x)x’^2+g'(x)x^{\prime\prime}),\]\(g\colon\mathbf{R}\times\mathbf{R}\to\mathbf{R}\)(微分可能) に対し、\[g_*((x,x’,x^{\prime\prime}),(y,y’,y^{\prime\prime}))=\left(\begin{array}{c}g(x,y), \qquad
g_x(x,y)x’+g_y(x,y)y’, \\
g_{xx}(x,y)x’^2+2g_{xy}(x,y)x’y’+g_{yy}(x,y)y’^2+g_x(x,y)x^{\prime\prime}+g_y(x,y)y^{\prime\prime}\end{array}\right),\]
とすればよい。ただし、変数についている \({}^\prime\) は微分ではなく変数名の一部と考える。関数についている \({}^\prime\) や添字は微分の意である。

これを実際のプログラミング言語で実装するのは容易だろう。