7.4.3 自動微分

導関数の利用は重要である。

記号的な微分は、 複雑な式に対しては難しく、 また Maple や Mathematica などのパッケージでは可能ではあるが、 しばしば評価に時間のかかる膨大な式を出力する。

しばしば使われる代替手段は差分 (数値微分)であり、 導関数の式を求める問題を解決するが、 打切り誤差、丸め誤差の問題が発生し、 それらはしばしば不正確な結果を招く。

もう一つの手段は、 合成関数の連鎖律を用いて導関数を計算する、 自動微分を使うことである。 この方法では、丸め誤差以外は正確な結果を得ることが出来る。 しかし、変数が区間である場合、真の導関数の包み込みを計算するために、 区間演算を用いることが出来る。

$ f(x)$, $ x=(x_1,\dots,x_m)$

(1) \begin{displaymath}\begin{array}[tb]{ll} & t_i(x)=g_i(x)=x_i\quad\text{($i=1,\cd...
...\dots,t_{i-1}(x)) \quad\text{($i=m+1,\cdots,\ell$)} \end{array}\end{displaymath}

$ f(x):=t_\ell$ ということか?

ここで自動微分を少し調べる。結構驚くようなことがあった。

それでは、 $ f(x):=2x^2+\sin x$$ 1$ における関数値 $ f(1)$ と、 導関数値 $ f'(1)$ を計算してみよう。

$ f(1)=2+\sin 1 =2.8414709848078965\cdots$, $ f'(x)=4x+\cos 1=4.5403023058681397\cdots$ である。

関数 f(x) の定義
edit f

f.m
function y=f(x)
  y=2*x^2+sin(x);

>> x=intval(1);
>> x=gradientinit(x);
>> y=f(x)
この結果は
intval gradient value y.x = 
   2.84147098480789
intval gradient derivative(s) y.dx = 
   4.54030230586814
なるほど。 つまりユーザーは関数 f() だけコーディングして、 その導関数はコーディングする必要はない。

自動微分が背景にあったとは…

桂田 祐史
2020-09-03