数値解析におけるオイラー法
📂数値解析数値解析におけるオイラー法
メソッド
D⊂R2 で定義された連続関数について、初期値問題が{y′=f(x,y)y(x0)=Y0で与えられている。区間(a,b)をa≤x0<x1<⋯<xn<⋯xN≤bのようなノードポイントで分けたとする。特に十分小さいh>0に対してxj=x0+jhとしたとき、初期値y0≃Y0に対して
yn+1=yn+hf(xn,yn)
説明
オイラーメソッドは概念的に非常にシンプルな方法だが、数値解析の核心的なアイデアを示している。もちろん今では様々な問題が多いが、逆に言えば改善の余地も多い手法である。だからといって、オイラーメソッド自体が重要というわけではなく、導出過程をしっかりと理解することが必要だ。
導出
テイラー展開
Y(xn+1)をxnに対して2項までテイラー展開すると
Y(xn+1)=Y(xn)+(xn+1−xn)y′(xn)+2(xn+1−xn)2Y’’(ξn)
整理すると
Y(xn+1)=Y(xn)+hy′(xn)+2h2Y’’(ξn)
ここで、誤差項2h2Y’’(ξn)を無視すると
yn+1=yn+hf(xn,yn)
■
テイラー展開を用いた導出から直ちに分かることは、hが小さくなると誤差も減少するということだ。また、テイラー近似がどうして2次でなければならないという特別な理由はないため、次数を上げれば誤差が減少するということだ。
数値積分
[xn,xn+1]からY’(t)=f(t,Y(t))の定積分は
∫xnxn+1f(t,Y(t))dt=Y(xn+1)−Y(xn)
少しの誤差はあるが、数値積分によって∫xnxn+1f(t,Y(t))dt≃hf(xn,Y(xn))であるため、
yn+1−yn=hf(xn,yn)
■
分割積分の考え方からして、hが小さくなればなるほど誤差も小さくなると推測できる。図からわかるように、実際の積分値と数値的に計算された値の差はかなり大きいが、台形公式やシンプソン法を使えば誤差が減少するだろう。
実装
以下は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]