logo

数値解析におけるオイラー法 📂数値解析

数値解析におけるオイラー法

メソッド 1

DR2D \subset \mathbb{R}^2 で定義された連続関数について、初期値問題が{y=f(x,y)y(x0)=Y0\begin{cases} y ' = f(x,y) \\ y( x_{0} ) = Y_{0} \end{cases}で与えられている。区間(a,b)(a,b)ax0<x1<<xn<xNba \le x_{0} < x_{1} < \cdots < x_{n} < \cdots x_{N} \le bのようなノードポイントで分けたとする。特に十分小さいh>0h > 0に対してxj=x0+jhx_{j} = x_{0} + j hとしたとき、初期値y0Y0y_{0} \simeq Y_{0}に対して yn+1=yn+hf(xn,yn) y_{n+1} = y_{n} + h f ( x_{n} , y_{n} )

説明

オイラーメソッドは概念的に非常にシンプルな方法だが、数値解析の核心的なアイデアを示している。もちろん今では様々な問題が多いが、逆に言えば改善の余地も多い手法である。だからといって、オイラーメソッド自体が重要というわけではなく、導出過程をしっかりと理解することが必要だ。

導出

テイラー展開

Y(xn+1)Y(x_{n+1} )xnx_{n}に対して22項までテイラー展開すると Y(xn+1)=Y(xn)+(xn+1xn)y(xn)+(xn+1xn)22Y’’(ξn) Y ( x_{n+1} ) = Y ( x_{n} ) + ( x_{n+1} - x_{n}) y ' ( x_{n} ) + {{( x_{n+1} - x_{n})^2} \over {2}} Y’’ ( \xi_{n} ) 整理すると Y(xn+1)=Y(xn)+hy(xn)+h22Y’’(ξn) Y ( x_{n+1} ) = Y ( x_{n} ) + h y ' ( x_{n} ) + {{h^2} \over {2}} Y’’ ( \xi_{n} ) ここで、誤差項h22Y’’(ξn)\displaystyle {{h^2} \over {2}} Y’’ ( \xi_{n} )を無視すると yn+1=yn+hf(xn,yn) y_{n+1} = y_{n} + h f ( x_{n} , y_{n} )

テイラー展開を用いた導出から直ちに分かることは、hhが小さくなると誤差も減少するということだ。また、テイラー近似がどうして22次でなければならないという特別な理由はないため、次数を上げれば誤差が減少するということだ。

数値積分

[xn,xn+1][x_{n} , x_{n+1}]からY(t)=f(t,Y(t))Y’(t) = f (t, Y(t))の定積分は xnxn+1f(t,Y(t))dt=Y(xn+1)Y(xn) \int_{x_{n}}^{x_{n+1}} f(t,Y(t)) dt = Y(x_{n+1}) - Y(x_{n}) 20180910\_093211.png 少しの誤差はあるが、数値積分によってxnxn+1f(t,Y(t))dthf(xn,Y(xn))\displaystyle \int_{x_{n}}^{x_{n+1}} f(t,Y(t)) dt \simeq h f(x_{n} , Y(x_{n}) ) であるため、 yn+1yn=hf(xn,yn) y_{n+1} - y_{n} = h f ( x_{n} , y_{n} )

分割積分の考え方からして、hhが小さくなればなるほど誤差も小さくなると推測できる。図からわかるように、実際の積分値と数値的に計算された値の差はかなり大きいが、台形公式やシンプソン法を使えば誤差が減少するだろう。

実装

以下はRで書かれたコードだ。

Euler<-function(f,Y\_0,a,b,h=10^(-3))
{
  Y <- t(Y\_0)
  node <- seq(a,b,by=h)
  
  for(x in node)
  {
    Y<-rbind(Y,Y[length(Y[,1]),]+h*f(x,Y[length(Y[,1]),]))
  }
  
  return(Y)
}
 
f<-function(x,y) {y}
out<-Euler(f,seq(1,1,len=100),0,2)
out[,1]
 
g<-function(x,y) {1/(1+x^2) + - 2*(y^(2))}
out<-Euler(g,seq(0,0,len=100),0,2,h=0.2)
out[,1]

  1. Atkinson. (1989). 数値解析入門(第2版): p341. ↩︎