logo

有限差分法 📂数値解析

有限差分法

定義1 2

有限差分法finite difference method, FDMは、微分係数を計算する数値的方法で、短い間隔での平均変化率で微分係数を近似するものである。

説明

公式導出の核心は、テイラー展開だ。

f(x+h)=f(x)+f(x)h+f(x)2!h2+f3!h3+(1) f(x+h) = f(x) + f^{\prime}(x)h + \dfrac{f^{\prime \prime}(x)}{2!}h^{2} + \dfrac{f^{\prime \prime \prime}}{3!}h^{3} + \cdots \tag{1}

導関数だけが左辺に来るように整理すると、

f(x)=f(x+h)f(x)h+f(x)2!h+=f(x+h)f(x)h+O(h)f(x+h)f(x)h \begin{align*} f^{\prime}(x) &= \dfrac{f(x+h) - f(x)}{h} + \dfrac{f^{\prime \prime}(x)}{2!}h + \cdots \\ &= \dfrac{f(x+h) - f(x)}{h} + \mathcal{O}(h) \\ &\approx \dfrac{f(x+h) - f(x)}{h} \end{align*}

ここで、O(h)\mathcal{O}(h)漸近記号だ。hhが十分に小さい場合、右辺は左辺をかなりよく近似するだろう。実際、微分や加速度を初めて学ぶとき、平均変化率の極限として説明されることが多い。

導関数

前進差分

xxでの微分係数をxxと次のタイムステップx+hx+hの平均変化率で近似することを前進差分という。誤差項はO(h)\mathcal{O}(h)だ。

f(x)f(x+h)f(x)h f^{\prime}(x) \approx \dfrac{f(x+h) - f(x)}{h}

後退差分

xxでの微分係数をxxと前のタイムステップxhx-hの平均変化率で近似することを後退差分という。誤差項はO(h)\mathcal{O}(h)だ。

f(x)f(x)f(xh)h f^{\prime}(x) \approx \dfrac{f(x) - f(x-h)}{h}

中央差分

中央差分は、前の二つの方法と違って、誤差項がO(h2)\mathcal{O}(h^{2})である。(1)(1)hhの代わりに±h2\pm\frac{h}{2}を代入すると、

f(x+h/2)=f(x)+f(x)h2+f(x)2!(h2)2+f(x)3!(h2)3+ f(x+h/2) = f(x) + f^{\prime}(x)\frac{h}{2} + \dfrac{f^{\prime \prime}(x)}{2!}\left(\frac{h}{2}\right)^{2} + \dfrac{f^{\prime \prime \prime}(x)}{3!}\left(\frac{h}{2}\right)^{3} + \cdots

f(xh/2)=f(x)f(x)h2+f(x)2!(h2)2f(x)3!(h2)3+ f(x-h/2) = f(x) - f^{\prime}(x)\frac{h}{2} + \dfrac{f^{\prime \prime}(x)}{2!}\left(\frac{h}{2}\right)^{2} - \dfrac{f^{\prime \prime \prime}(x)}{3!}\left(\frac{h}{2}\right)^{3} + \cdots

上の式から下の式を引くと、

f(x+h/2)f(xh/2)=f(x)h+2f(x)3!(h2)3+ f(x+h/2) - f(x-h/2) = f^{\prime}(x)h + 2\dfrac{f^{\prime \prime \prime}(x)}{3!}\left(\frac{h}{2}\right)^{3} + \cdots

f(x)f^{\prime}(x)について整理すると、

f(x)=f(x+h/2)f(xh/2)h+f(x)3!(h2)2+=f(x+h/2)f(xh/2)h+O(h2)f(x+h/2)f(xh/2)h \begin{align*} f^{\prime}(x) &= \frac{f(x+h/2) - f(x-h/2)}{h} + \dfrac{f^{\prime \prime \prime}(x)}{3!}\left(\frac{h}{2}\right)^{2} + \cdots \\ &= \frac{f(x+h/2) - f(x-h/2)}{h} + \mathcal{O}(h^{2}) \\ &\approx \frac{f(x+h/2) - f(x-h/2)}{h} \end{align*}

二階導関数

(1)(1)(1)(1)hhの代わりにh-hを代入した二つの式を足すと、次のようになる。

f(x+h)=f(x)+f(x)h+f(x)2!h2+f3!h3++f(xh)=f(x)f(x)h+f(x)2!h2f3!h3+f(x+h)+f(xh)=2f(x)+f(x)h2+2f4!h4+ \begin{align*} && f(x+h) &= f(x) + f^{\prime}(x)h + \dfrac{f^{\prime \prime}(x)}{2!}h^{2} + \dfrac{f^{\prime \prime \prime}}{3!}h^{3} + \cdots \\ {+} && f(x-h) &= f(x) - f^{\prime}(x)h + \dfrac{f^{\prime \prime}(x)}{2!}h^{2} - \dfrac{f^{\prime \prime \prime}}{3!}h^{3} + \cdots \\ \hline && f(x+h) + f(x-h) &= 2f(x) + f^{\prime \prime}(x)h^{2} + 2\dfrac{f^{\prime \prime \prime \prime}}{4!}h^{4} + \cdots \end{align*}

ff^{\prime \prime}について整理すると、

f(x)=f(x+h)2f(x)+f(xh)h2+2f4!h2+=f(x+h)2f(x)+f(xh)h2+O(h2)f(x+h)2f(x)+f(xh)h2 \begin{align*} f^{\prime \prime}(x) &= \frac{f(x+h) - 2f(x) + f(x-h)}{h^{2}} + 2\dfrac{f^{\prime \prime \prime \prime}}{4!}h^{2} + \cdots \\ &= \frac{f(x+h) - 2f(x) + f(x-h)}{h^{2}} + \mathcal{O}(h^{2}) \\ &\approx \frac{f(x+h) - 2f(x) + f(x-h)}{h^{2}} \end{align*}

誤差項を考慮しなければ、この式はff^{\prime}に前進差分法と後退差分法を順に適用して得られるものでもある。

f(x)f(x+h)f(x)hf(x+h)f(x)hf(x)f(xh)hh=f(x+h)2f(x)+f(xh)h2 \begin{align*} f^{\prime \prime}(x) &\approx \dfrac{f^{\prime}(x+h) - f^{\prime}(x)}{h} \\ &\approx \dfrac{\dfrac{f(x+h)-f(x)}{h} - \dfrac{f(x)-f(x-h)}{h}}{h} \\ &= \dfrac{f(x+h) - 2f(x) + f(x-h)}{h^{2}} \end{align*}

参考


  1. A. Iserles, A First Course in the Numerical Analysis of Differential Equations (2nd, 2009), p139-141 ↩︎

  2. Mykel J. Kochenderfer, Algorithms for Optimization (2019), p23-26 ↩︎