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

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

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

もとの関数 1階導関数、2階導関数
h(t)=const. h(t)=0,h(t)=0
h(t)=t h(t)=1,h(t)=0
h(t)=f1(t)±f2(t) h(t)=f1(t)±f2(t),h(t)=f1(t)±f2(t)
h(t)=f1(t)f2(t) h(t)=f1(t)f2(t)+f1(t)f2(t),h(t)=f1(t)f2(t)+2f1(t)f2(t)+f1(t)f2(t)
h(t)=f1(t)f2(t) h(t)=f1(t)f2(t)f1(t)f2(t)f2(t)2,h(t)=f1(t)f2(t)2f1(t)f2(t)f2(t)2f1(t)f2(t)f2(t)2+2f1(t)f2(t)2f2(t)3
h(t)=g(f(t)) h(t)=g(f(t))f(t),h(t)=g(f(t))f(t)2+g(f(t))f(t)
h(t)=g(f1(t),f2(t)) h(t)=gx(f1(t),f2(t))f1(t)+gy(f1(t),f2(t))f2(t),h(t)=gxx(f1(t),f2(t))f1(t)2+2gxy(f1(t),f2(t))f1(t)f2(t)+gyy(f1(t),f2(t))f2(t)2+gx(f1(t),f2(t))f1(t)+gy(f1(t),f2(t))f2(t)

2階微分の自動微分では、「値」「1階の微分係数」「2階の微分係数」の3つの値を保持する必要があるので、実装するには R×R×R に適切な演算を入れれば良い。上の表の f(t),f(t),f(t)R×R×R の成分で置き換えると、R×R×R に入れるべき演算が分かる。すなわち、(x,x,x)±(y,y,y)=(x±y,x±y,x±y)(x,x,x)(y,y,y)=(xy,xy+xy,xy+2xy+xy)(x,x,x)(y,y,y)=(xy,xyxyy2,xy2xyy2xyy2+2xy2y3),g:RR(微分可能) に対し、g((x,x,x))=(g(x),g(x)x,g(x)x2+g(x)x),g:R×RR(微分可能) に対し、g((x,x,x),(y,y,y))=(g(x,y),gx(x,y)x+gy(x,y)y,gxx(x,y)x2+2gxy(x,y)xy+gyy(x,y)y2+gx(x,y)x+gy(x,y)y),
とすればよい。ただし、変数についている は微分ではなく変数名の一部と考える。関数についている や添字は微分の意である。

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

Spread the love