Loading [MathJax]/jax/output/CommonHTML/jax.js

[수치해석] Divided difference interpolation

반응형
반응형

Largrange interpolation 을 컴퓨터로 실행하게 되면 xixj 를 일일히 계산해야 해서 계산량이 많아져서 비효율적입니다. 이에 대한 계산비용을 줄이고 다양한 방식을 접목하기 위해 기호를 정의해서 계산량을 개선하는 시도입니다.

 

Divided differences

미분을 보면 다음과 같습니다.

 

df(x)dx=f(x)=limh0f(x+h)f(x)h

 

이 식을 해석을 해보면 x와 x+h 사이의 기울기를 h를 줄여가면서 순간 기울기를 구하겠다는 얘기입니다. 

f'(x)를 그림으로 그려보면 다음과 같습니다.

 

즉, tangent line을 그리는 것입니다. 미적분을 공부하면 다 아는 내용이지만 다시 정리를 해보았습니다.

 

이렇게 정의되는 미분을 직접 계산하지 않고 estimate를 하겠습니다. 

데이터셋이 (x0,f0),...,(xn,fn) 이라 할 때, x=xi 에서의 f의 기울기는 f(xi+1)f(xi)xi+1xi 가 됩니다.

오차는 어찌하든 발생하기 마련이니 미분 f'(x)를 기울기로 대체하겠습니다. 

 

f(xi)f(xi+1)f(xi)xi+1xi=f[xi,xi+1]

 

기호화로 f[x_i,x_{i+1}]이라 하겠습니다. 이를 the first_order divided difference of f at x=xi 라 합니다.

이 기호를 확장해서 세점일때는 다음과 같이 씁니다. 이거는 2계미분도 아니고 단순한 기호를 활용한 확장입니다.

 

f[xi,xi+1,xi+2]=f[xi+1,xi+2]f[xi,xi+1]xi+2xi

 

이를 the second-order divied difference of f at x=xi 라 합니다.

 

n+1의 데이터셋에 대해서는 다음과 같이 씁니다. 이름을 붙인다면 Higher-order divided difference of f at x=xk입니다.

f[x0,x1,...,xk1,xk]=f[x1,...,xk]f[x0,...,xk1]xkx0

 

마지막으로 fi=f[xi] 로 표시하고 the divided difference of order zero of f at x=xi 이라 합니다.

 

실질적으로 Lagrange interpolation을 보더라도 f'(x) 하나만 나오고 나머지는 나오지 않으니 큰 무리는 없는 기호화인 듯 합니다.

 

Divided difference polynomial

이제 Lagrange interpolation에 divide difference를 적용해보겠습니다.

 

먼저 linear interpolating polynomial 입니다. 

p1(x)=(xx1x0x1)f0+(xx0x1x0)f1=f0+(f1f0x1x0)(xx0)=f[x0]+f[x0,x1](xx0) 

 

이 방식으로 더해 나가면 pn(x)=pn1(x)+f[x0,...,xn](xx0)...(xxn1) 으로 점화식처럼 표기할 수 있습니다.

정리하면 다음과 같습니다.

pn(x)=f[x0]+nk=1f[x0,...,xk]k1i=0(xxi)

 

이를 Newton divided difference polynomial 이라고 합니다. 

 

예제

Newton divided difference polynomial 과 Lagrange polynomial의 계산비교의 예를 보겠습니다. 이 예제는 Introduction to numerical analysis 라는 책에서 가져왔습니다.

 

데이터셋 (1,0),(-1,-2),(2,3) 에 대한 quardratic polynomial을 만들어보겠습니다.

먼저 Newton divided difference polynomial 입니다.

divided difference를 계산하면 다음과 같이 됩니다.
f[x0}=0, f[x1]=-2, f[x2]=3 

f[x0,x1]=1,  f[x1,x2]= 53

f[x0,x1,x2]= 23 

 

이제 대입만 해주면 됩니다.

 

p2(x)=f[x0]+(xx0)f[x0,x1]+(xx0)(xx1)f[x0,x1,x2]=0+(x1)+23(x1)(x+1)=2x23+x53 

 

 

Lagrange polynomial 입니다. 

 

0(x)=(xx1)(xx2)(x0x1)(x0x2)=(x+1)(x2)(2)(1)=x2+x+22

1(x)=(xx0)(xx2)(x1x0)(x1x2)=(x1)(x2)(2)(3)=x23x+26

2(x)=(xx0)(xx1)(x2x0)(x2x1)=(x1)(x+1)(1)(3)=x213

 

p2(x)=2k=0k(x)fk=00(x)21(x)+32(x)=2x2+3x53

 

비교해보면 계산방법의 차이만 있을 뿐 결과는 같게 나옵니다. 

더 효율적인 Newton divided difference polynomial 을 이용해 계산을 하면 많은 계산비용에서 벗어날 수 있습니다. 

 

관련 포스팅

[수치해석] Lagrange interpolation

 

데이터목장님의
글이 좋았다면 응원을 보내주세요!

Designed by JB FACTORY