미드포인트 메소드
📂수치해석미드포인트 메소드
메소드
D⊂R2 에서 정의된 연속함수 f 에 대해 초기값 문제 {y′=f(x,y)(y(x0),y(x1))=(Y0,Y1) 가 주어져 있다. 구간 (a,b) 를 a≤x0<x1<⋯<xn<⋯xN≤b 와 같은 노드 포인트들로 쪼갰다고 하자. 특히 충분히 작은 h>0 에 대해 xj=x0+jh 이라고 하면 초기값 y0=Y0 에 대해
yn+1:=yn−1+2hf(xn,yn)
유도
Y’(t) 를 xn 에 대해 테일러 전개하면
Y’(t)=y′(xn)+(t−xn)Y’’(xn)+2(t−xn)2Y(3)(ξn)
를 만족하는 ξn∈[xn−1,xn] 이 존재한다. 양변에 t=xn−1 부터 xn+1 까지의 정적분을 취하면
∫xn−1xn+1Y’(t)dt=∫xn−1xn+1[y′(xn)+(t−xn)Y’’(xn)+2(t−xn)2Y(3)(ξn)]dt
xn−1=xn−h 이고 xn+1=xn+h 이므로
∫xn−1xn+1Y’(t)dt=(xn+h−(xn−h))y′(xn)+6h3−(−h3)Y(3)(ξn)
미적분학의 기본정리에 의해
Y(xn+1)−Y(xn−1)=2hy′(xn)+3h3Y(3)(ξn)
가정에서 Y’=f 고, 3h3Y(3)(ξn) 을 탈락시키면
yn+1=yn−1+2hf(xn,yn)
■
오일러 메소드와의 비교
오차 분석
오일러 메소드와 비교하자면 두 개의 데이터를 사용하니까 계산은 많아지겠지만 오차가 더 작을 것이라고 짐작할 수 있다. 실제로 오일러 메소드의 오차는 조건이 많이 주어져 있어도 O(h) 에 바운드되어있을 뿐이다.
반면 미드포인트 메소드는 멀티 포인트 메소드로써 그 오차를 계산하면
x0≤xn≤bmax∣Y(xn)−yh(xn)∣≤e2K(b−x0)η(h)+[2Ke2K(b−x0)−1][31h2∣Y(3)∣∞]
여기서 초기오차는 η(h)=max{∣Y0−y0∣,∣Y(x1)−yh(x1)∣} 인데, y0=Y0 이므로 사실 η(h)=∣Y(x1)−yh(x1)∣ 이 된다. Y 를 테일러 전개하면
Y(x1)=Y(x0)+hY(x0)+2h2Y’’(ζ)=y0+hf(x0,y0)+2h2Y’’(ζ)
이때 오일러 메소드에 따라 y0+hf(x0,y0)=y1 이므로,
Y(x1)−yh(x1)=2h2Y’’(ζ)=O(h2)
결과적으로 미드포인트 메소드는 O(h2) 에 바운드되어 오일러 메소드보다 정확도 면에서 나은 점이 있다고 말할 수 있다.
안정성 이슈
하지만 미드포인트 메소드는 치명적인 결점이 있다. 다음은 R 로 미드포인트 메소드를 구현한 코드다.
Midpoint<-function(f,Y\_0,Y\_1=NA,a,b,h=10^(-3))
{
Y <- t(Y\_0)
if(is.na(Y\_1))
{
Y<-rbind(Y,Y[1,]+h*f(a,Y[1,]))
}
else
{
Y<-rbind(Y,Y\_1)
}
node <- seq(a,b,by=h)
for(x in node[-1])
{
Y<-rbind(Y,Y[length(Y[,1])-1,]+2*h*f(x,Y[length(Y[,1]),]))
}
return(Y)
}
f<-function(x,y) {1/(1+x^2) + - 2*(y^(2))}
out<-Midpoint(f,seq(0,0,len=1),0,2,h=0.1)
out[,1]
g<-function(x,y) {x-y^2}
out<-Midpoint(g,seq(0,0,len=1),0,3.25,h=0.25)
out[,1]
실행시켜보면 함수 f()
와 달리 g()
는 솔루션이 제대로 구해지지 않는데, 이는 미드포인트 메소드의 안정성Stability에 문제가 있음을 보여주는 예시다.
