logo

複素ステップ微分近似 📂数値解析

複素ステップ微分近似

公式

関数 f:RRf : \mathbb{R} \to \mathbb{R}導関数 f(x)f ' (x) は以下のように複素数を利用して近似することができる。 f(x)Im(f(x+ih))h f ' (x) \approx \frac{\im \left( f \left( x + i h \right) \right)}{h} ここで Im\im は複素数の虚部を表し、hh は十分に小さな実数だ。

説明

やはり複素解析は知るほど面白い。2つ以上の関数値を通じて導関数を近似する有限差分法とは異なり、この方法は特に複素関数ではなかった ff でも、形式的に複素関数のように扱って導関数を近似する。

誘導 1

2つの方法があり、どちらも感嘆するほど面白い。実数 x,yRx, y \in \mathbb{R} に対して複素数を z=x+iyz = x + i y とし、実関数 f:RRf : \mathbb{R} \to \mathbb{R}u,v:CRu, v : \mathbb{C} \to \mathbb{R} に対して f(z)=u(z)+iv(z)f(z) = u(z) + i v(z) のように表そう。

コーシー・リーマン方程式

コーシー・リーマン方程式: 関数 f:ACCf: A \subseteq \mathbb{C} \to \mathbb{C}R\mathscr{R}解析的としよう。もし実関数 u,vu,v に対して f(z)=f(x+iy)=u(x,y)+iv(x,y) f(z) = f(x+iy) = u(x,y) + iv(x,y) ならば u,vu,vx,yx,y に関する一次偏微分関数が存在し、R\mathscr{R} 上のすべての点で以下の連立微分方程式を満たす。 {ux(x,y)=vy(x,y)uy(x,y)=vx(x,y) \begin{cases} u_{x} (x,y) = v_{y} (x,y) \\ u_{y} (x,y) = -v_{x} (x,y) \end{cases}

もし ff が解析的であれば、f=u+ivf = u + i v はコーシー・リーマン方程式を満たさなければならない。 ux=vyuy=vx \begin{align*} {\frac{ \partial u }{ \partial x }} =& {\frac{ \partial v }{ \partial y }} \\ {\frac{ \partial u }{ \partial y }} =& - {\frac{ \partial v }{ \partial x }} \end{align*} uxu_{x} の右辺の vyv_{y} を極限フォームで書き直すと次のようになる。 ux=limh0v(x+i(y+h))v(x+iy)h {\frac{ \partial u }{ \partial x }} = \lim_{h \to 0} {\frac{ v \left( x + i \left( y + h \right) \right) - v \left( x + i y \right) }{ h }} ff をまるで複素関数のように扱ってはいるが、実際には ff は明確に実関数であるので y=0y = 0, v(x)=0v(x) = 0 であり、u(x)u(x)u(x)=f(x)u(x) = f(x) そのものである。ひとつずつ代入してみると y=0y = 0 なので ux=limh0v(x+ih)v(x)h {\frac{ \partial u }{ \partial x }} = \lim_{h \to 0} {\frac{ v \left( x + i h \right) - v \left( x \right) }{ h }} であり、v(x)=0v(x) = 0 なので ux=limh0v(x+ih)h {\frac{ \partial u }{ \partial x }} = \lim_{h \to 0} {\frac{ v \left( x + i h \right) }{ h }} であり、u(x)=f(x)u(x) = f(x) なので fx=limh0v(x+ih)h {\frac{ \partial f }{ \partial x }} = \lim_{h \to 0} {\frac{ v \left( x + i h \right) }{ h }} である。最後に f=u+ivf = u + i v なので Imf=v\im f = v であり、十分に小さな hh に対して次の公式を得る。 fx=limh0Imf(x+ih)hImf(x+ih)h {\frac{ \partial f }{ \partial x }} = \lim_{h \to 0} {\frac{ \im f \left( x + i h \right) }{ h }} \approx {\frac{ \im f \left( x + i h \right) }{ h }}

テイラー展開

テイラー展開: 関数 f(x)f(x)[a,b][a,b]連続であり (a,b)(a,b)nn微分可能ならば次を満たす ξ(a,b)\xi \in (a,b) が存在する。 f(b)=k=0n1(ba)kk!f(k)(a)+(ba)nn!f(n)(ξ)=f(a)+(ba)f(a)++(ba)n1(n1)!f(n1)(a)+(ba)n(n)!f(n)(ξ) \begin{align*} f(b) =& \sum_{k=0}^{n-1} {{(b-a)^{k}\over{k!}}{f^{(k)}( a )}} + {(b-a)^{n}\over{n!}}{f^{(n)}(\xi)} \\ =& {f(a)} + {(b-a)f ' (a)} + \cdots + {(b-a)^{n-1}\over{(n-1)!}}{f^{(n-1)}(a)} + {(b-a)^{n}\over{(n)!}}{f^{(n)}(\xi)} \end{align*}

f(x)f(x)ihi h にテイラー展開してみると次のようになる。 f(x+ih)=f(x)+ihf(x)h2f(x)2!ih3f(x)3!s+ f \left( x + i h \right) = f (x) + i h f ' (x) - h^{2} {\frac{ f '' (x) }{ 2! }} - i h^{3} {\frac{ f ''' (x) }{ 3!s }} + \cdots 我々が関心を持つのは f(x)f ' (x) であるため、虚部だけを見てみると Imf(x+ih)=hf(x)h3f(x)3!s+ \im f \left( x + i h \right) = h f ' (x) - h^{3} {\frac{ f ''' (x) }{ 3!s }} + \cdots であり、hh をキャンセルすると Imf(x+ih)h=f(x)+O(h2) {\frac{ \im f \left( x + i h \right) }{ h }} = f ' (x) + O \left( h^{2} \right) である。同様に、hh が十分に小さい場合、h2h^{2} は無視できるほど小さくなり、次のような近似式を得る。 Imf(x+ih)hf(x) {\frac{ \im f \left( x + i h \right) }{ h }} \approx f ' (x)


  1. Martins, J. R., Sturdza, P., & Alonso, J. J. (2003). The complex-step derivative approximation. ACM Transactions on Mathematical Software (TOMS), 29(3), 245-262. https://dx.doi.org/10.1145/838250.838251 ↩︎