ジョセフの日記

Haskellのこととか日常のこととか

Pythonで自動微分

ザ・車輪の再発明

クラスの使い方がよくわからなかったので練習を兼ねて書きました。改善点がアレば是非ご教示よろしくおねがいします。

二重数と自動微分

\varepsilon^2 = 0なる\varepsilonを用いて、xまわりのテイラー展開より
f(x+\varepsilon) = f(x) + \frac{{\rm d}f}{{\rm d}x}(x)\varepsilon
がわかるので、いくつかの基本的な関数についての規則を書いてやることでいろんな微分ができるようになるという流れです。



なので、書きました。
a+b\varepsilonをタプルで(a,b)と対応させます。
Number型のxについて、
Dual.r2d(x) でDualのx+0\varepsilonをつくり、
Dual.r2d1(x)でDualのx+1\varepsilonをつくります。

Dual.r2d1(x)で作ったxxをなんらか関数fにぶち込むことでfyとしてf(x) + \frac{{\rm d}f}{{\rm d}x}(x)\varepsilonが得られたとします。
Dual.re(fy)でf(x)が、Dual.du(fy)で \frac{{\rm d}f}{{\rm d}x}(x)が取り出せます。