オイラー法をわかりやすく解説

オイラー法について,以下の順で解説します。

  1. 問題設定(微分方程式の初期値問題を数値的に解くとは?)
  2. 前進オイラー法・後退オイラー法の意味と例
  3. 前進オイラー法・後退オイラー法の良い点・悪い点

問題設定

dxdt=2x\dfrac{dx}{dt}=-2x のように,dx(t)dt=f(x(t),t)\dfrac{dx(t)}{dt}=f(x(t),t) という形の方程式を考えます。未知関数 x(t)x(t) を求めるのが目標です。ただし,t=t0t=t_0 での xx の値 x0x_0 は分かっているものとします。

例1

dx(t)dt=2x,x(0)=3\dfrac{dx(t)}{dt}=-2x,\:x(0)=3 という方程式の解は,x(t)=3e2tx(t)=3e^{-2t}

  • 未知関数 x(t)x(t) の導関数 dx(t)dt\dfrac{dx(t)}{dt} を含む方程式,つまり微分方程式です。
  • t=t0t=t_0 における値 x0x_0 が分かっているこのような問題を初期値問題と言います。
  • 例1は解けましたが,f(x,t)f(x,t) の形によっては厳密解を書けるとは限りません。そこで,数値的に解く問題を考えます。つまり,いろいろな tt における xx の値をコンピュータでできるだけ正確に計算したいという状況です。

前進オイラー法の意味と例

前進オイラー法

xn+1=xn+hf(xn,t0+nh)x_{n+1}=x_n+hf(x_n,t_0+nh)

という漸化式と x0x_0 に基づいて,x1,x2,x_1,x_2,\dots と順々に計算していく方法。

hh は刻み幅と呼ばれる正の数で,事前に設定しておきます。この漸化式の意味はあとで説明するとして,まずはさきほどの例1で試してみます。

例1(再掲)

dx(t)dt=2x,x(0)=3\dfrac{dx(t)}{dt}=-2x,\:x(0)=3 に前進オイラー法を使ってみる。漸化式は,

xn+1=xn2hxn,x0=3x_{n+1}=x_n-2hx_n,\:x_0=3

であり,これは等比数列。一般項は xn=3(12h)n1x_n=3(1-2h)^{n-1}

つまり,x(nh)3(12h)n1x(nh)\fallingdotseq 3(1-2h)^{n-1} を得る。このように,t=h,2h,3h,t=h,2h,3h,\cdots における xx の値が近似的に計算できた。

※例1では一般項がきれいに書けましたが,多くの場合漸化式は解けません。コンピュータを使って x1,x2,x_1,x_2,\dots と近似値を1つずつ計算していくことになります。

次に,前進オイラー法の漸化式を導出します。

前進オイラー法の導出イメージ
  • t=t0t=t_0 における x(t0)=x0x(t_0)=x_0 は分かっている。

  • t=t0+ht=t_0+h における x(t0+h)x(t_0+h) の近似値 x1x_1 を知りたい。hh が小さいとき,dx(t)dt=f(x,t)\dfrac{dx(t)}{dt}=f(x,t) という微分方程式の左辺を差分 x1x0h\dfrac{x_1-x_0}{h} で近似して,右辺を x=x0,t=t0x=x_0,t=t_0 のときの値で代用しよう。つまり x1x0h=f(x0,t0)\dfrac{x_1-x_0}{h}=f(x_0,t_0) となり,x1x_1 について解くと x1=x0+hf(x0,t0)x_1=x_0+hf(x_0,t_0)

  • t=t0+2ht=t_0+2h における近似値 x2x_2 を知りたい。さきほどと同様に考えると x2=x1+hf(x1,t0+h)x_2=x_1+hf(x_1,t_0+h) となる。

  • 以下,これを繰り返して t=t0+nht=t_0+nh における近似値 xnx_n を計算していく。

後退オイラー法の意味と例

後退オイラー法

xn+1=xn+hf(xn+1,t0+(n+1)h)x_{n+1}=x_n+hf(x_{n+1},t_0+(n+1)h)

という漸化式と x0x_0 に基づいて,x1,x2,x_1,x_2,\dots と順々に計算していく方法。

前進オイラー法:xn+1=xn+hf(xn,t0+nh)x_{n+1}=x_n+hf(x_n,t_0+nh) との違いは,右辺で f(xn,tn)f(x_n,t_n) のかわりに f(xn+1,tn+1)f(x_{n+1},t_{n+1}) を使う点のみです(ただし,tn=t0+nht_n=t_0+nh と置きました)。

導出イメージも前進オイラー法とほぼ同じですが,紫文字の部分が異なります。つまり,右辺を x=xn,t=tnx=x_n,\:t=t_n のときの値で代用するのではなく,x=xn+1,t=tn+1x=x_{n+1},\:t=t_{n+1} のときの値で代用します。

例1(再掲)

dx(t)dt=2x,x(0)=3\dfrac{dx(t)}{dt}=2x,\:x(0)=3 に後退オイラー法を使ってみる。漸化式は,

xn+1=xn2hxn+1,x0=3x_{n+1}=x_n-2hx_{n+1},\:x_0=3

である。変形すると xn+1=xn1+2hx_{n+1}=\dfrac{x_n}{1+2h} となり等比数列。一般項は xn=3(1+2h)n1x_n=\dfrac{3}{(1+2h)^{n-1}}

つまり,x(nh)3(1+2h)n1x(nh)\fallingdotseq \dfrac{3}{(1+2h)^{n-1}} と近似計算できた。

陽解法と陰解法

前進オイラー法の良い点

前進オイラー法は陽解法なので嬉しい。後退オイラー法は陰解法なので残念。

  • 前進オイラー法:xn+1=xn+hf(xn,tn)x_{n+1}=x_n+hf(x_n,t_n) は右辺に xn+1x_{n+1} を含まないので,xnx_n がわかれば右辺を計算することで確実に xn+1x_{n+1} を計算できるので嬉しいです。このような解法を陽解法と言います。前進オイラー法は陽的オイラー法と呼ばれることもあります。

  • 後退オイラー法:xn+1=xn+hf(xn+1,tn+1)x_{n+1}=x_n+hf(x_{n+1},t_{n+1}) は右辺にも xn+1x_{n+1} を含むので,xnx_n がわかっても xn+1x_{n+1} を計算するのに苦労する場合があります。例1では「xn+1=xnx_{n+1}=x_n の式」という形に変形できましたが,一般には方程式を解いて xn+1x_{n+1} を求める必要があります。このような解法を陰解法と言います。後退オイラー法は陰的オイラー法と呼ばれることもあります。

安定性

後退オイラー法の良い点

後退オイラー法は「安定」しているので嬉しい。前進オイラー法は「安定」していないので残念。

「安定」の意味を説明します。

まず,例1における厳密解は x(t)=3e2tx(t)=3e^{-2t} でした。tt\to\inftyx(t)0x(t)\to 0 です。

  • 前進オイラー法による近似解は xn=3(12h)n1x_n=3(1-2h)^{n-1} でした。0<h120<h\leq\dfrac{1}{2} なら xn0x_n\to 0 ですが,h>12h>\dfrac{1}{2} の場合発散してしまいます。より一般に,任意の λ<0\lambda <0 に対して dxdt=λx\dfrac{dx}{dt}=\lambda x の近似解は,刻み幅 hh が大きいと発散してしまうという意味で前進オイラー法は不安定です。

  • 後退オイラー法による近似解は xn=3(1+2h)n1x_n=\dfrac{3}{(1+2h)^{n-1}} です。任意の正の実数 hh に対して xn0x_n\to 0 です。より一般に,λ<0\lambda <0 に対して dxdt=λx\dfrac{dx}{dt}=\lambda x の近似解が刻み幅 hh によらず 00 に収束するという意味で後退オイラー法は安定です。

hh が大きいときでも後退オイラー法は収束しますが,前進オイラー法は発散してしまうわけです。ちなみに例1において,どちらも h0h\to 0 で近似解は厳密解に収束します。以下のように大学入試で出そうな極限計算で確認できます。

証明

前進オイラー法による近似解は,x(nh)3(12h)n1x(nh)\fallingdotseq 3(1-2h)^{n-1}

であった。n=thn=\dfrac{t}{h} と置くと x(t)x(t) の近似値は
xn=3(12h)th1=312h{(12h)12h}2t3e2tx_n=3(1-2h)^{\frac{t}{h}-1}\\ =\dfrac{3}{1-2h}\{(1-2h)^{\frac{1}{-2h}}\}^{-2t}\\ \to 3e^{-2t}

となり厳密解に収束する。

後退オイラー法による近似解は,x(nh)3(1+2h)n1x(nh)\fallingdotseq \dfrac{3}{(1+2h)^{n-1}}

であった。n=thn=\dfrac{t}{h} と置くと x(t)x(t) の近似値は
xn=3(1+2h)th1=3(1+2h){(1+2h)12h}2t3e2tx_n=\dfrac{3}{(1+2h)^{\frac{t}{h}-1}}\\ =3(1+2h)\{(1+2h)^{\frac{1}{2h}}\}^{-2t}\\ \to 3e^{2t}

となり厳密解に収束する。

ただし,hh00 に近いと計算するステップ数が増えてしまうので計算に時間がかかります。

大学3年のときに受けた数値解析の講義を思い出します。楽しかったな~