에르미트 보간법

testwiki
둘러보기로 이동 검색으로 이동

틀:위키데이터 속성 추적 수치해석학에서 에르미트 보간법(틀:Lang)은 프랑스의 수학자 에르미트의 이름을 딴 보간법이다. 다항함수 형태로 보간된다.

개요

뉴턴 보간법과 달리, 에르미트 보간법은 자료 점들을 값과 1차 미분값을 대응시킨다. 즉 n차 미분값들 (x0,y0),,(xn1,yn1)n 자료 점들 (x0,y0),,(xn1,yn1)에 추가로 주어져야만 한다. 뉴턴 다항식이 최대 자유도 n − 1을 가지는 반면, 이 보간법의 다항식 결과는 대부분 2n − 1의 자유도를 가지게 된다.

사용

함수 f의 에르미트 다항식을 계산하기 위해 분할차(divided difference)들을 사용할 때, 첫단계는 각 점들을 복제하는 것이다. 그러므로 우리가 보간하기 원하는 함수 f에 대해 n + 1 자료점들 x0,x1,x2,,xn과 값들, f(x0),f(x1),,f(xn)f(x0),f(x1),,f(xn)이 주어지면 다음과 같은 새로운 자료집합을 만든다.

z0,z1,,z2n+1
z2i=z2i+1=xi

이제 지점들 z0,z1,,z2n+1에 대한 분할차 표를 만든다. 하지만 몇몇 분할차들은 정의되지 않았다.

zi=zi+1f[zi,zi+1]=f(zi+1)f(zi)zi+1zi=00

이 경우 분할차를 f(zi)1로 대체한다. 나머지 것들은 정상적으로 계산된다.

이제, 이 과정은 더 고차(高次) 미분값들의 에르미트 보간이 가능하도록 일반화될 수 있다. 각 점이 같은 개수의 미분값들을 가져야 한다는 요구가 없더라도, 각 점들에 대해 k차 미분값들이 주어졌다고 하자. 그러면 자료집합 z0,z1,,zkn1은 각 자료점들이 k개 복제되면서 만들어진다. 그러면 n 자료점들에 대해 각도가 대부분 (k+1)n1인 다항식 하나가 생성될 것이다. 이제 동일한 값들 m개의 분할차는 f(m1)(xi)(m1)!으로 대체된다.

예를 들면, f[xi,xi,xi,xi]=f(3)(xi)6f[xi,xi,xi]=f(2)(xi)2 등이다.

예시

함수 f(x)=x8+1의 경우를 생각해보자. x{1,0,1}에서 함수를 두번 미분하면서 다음 자료를 얻는다.

x ƒ(x) ƒ'(x) ƒ''(x)
−1 2 −8 56
0 1 0 0
1 2 8 56

두 미분값들을 가지고 집합 {zi}={1,1,1,0,0,0,1,1,1}를 구성한다. 분할차표는 다음과 같다.

z0=1f[z0]=2f(z0)1=8z1=1f[z1]=2f(z1)2=28f(z1)1=8f[z3,z2,z1,z0]=21z2=1f[z2]=2f[z3,z2,z1]=715f[z3,z2]=1f[z4,z3,z2,z1]=610z3=0f[z3]=1f[z4,z3,z2]=154f(z3)1=0f[z5,z4,z3,z2]=121z4=0f[z4]=1f(z4)2=0121f(z4)1=0f[z6,z5,z4,z3]=121z5=0f[z5]=1f[z6,z5,z4]=154f[z6,z5]=1f[z7,z6,z5,z4]=610z6=1f[z6]=2f[z7,z6,z5]=715f(z7)1=8f[z8,z7,z6,z5]=21z7=1f[z7]=2f(z7)2=28f(z8)1=8z8=1f[z8]=2

그리고 뉴턴 다항식을 생성할 때처럼, 분할차표의 대각선 계수들을 가져와서 k번째 계수에 i=0k1(xzi)를 곱하면 다음과 같은 다항식을 생성할 수 있다.

P(x)=28(x+1)+28(x+1)221(x+1)3+15x(x+1)310x2(x+1)3+4x3(x+1)31x3(x+1)3(x1)+x3(x+1)3(x1)2=28+28218x+56x63x+15x+28x263x2+45x210x221x3+45x330x3+4x3+x3+x3+15x430x4+12x4+2x4+x410x5+12x52x5+4x52x52x5x6+x6x7+x7+x8=x8+1.

그래픽스 응용

마이크로소프트사의 다이렉트 X SDK에서는 D3DXVecHermite라는 함수로 에르미트 보간법을 이용할 수 있다. D3DXVecHermite 함수의 정의는 다음과 같다.

D3DXVECTOR3* WINAPI D3DXVecHermite( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pT1,
CONST D3DXVECTOR3 *pV2, CONST D3DXVECTOR3 *pT2, FLOAT s );

위에서 각 인수의 의미는 다음과 같다.

  • pV1: 시작점의 좌표(0,0,0에서 이 점까지의 벡터값)
  • pT1: 시작점에서 다음 지점까지의 벡터값(= pV2 - pV1)
  • pV2: 다음 지점의 좌표(0,0,0에서 이 점까지의 벡터값)
  • pT2: 다음 지점에서 그 다음지점의 벡터값(= pV3 - pV2)
  • s: 0.0f ~ 0.1f의 상수

아래와 같이 사용할 수 있다.

D3DXVECTOR3 pOut(0,0,0), pV1(-2.0f,-2.0f,-2.0f), pT1, pV2(1.0f,1.0f,1.0f), pT2, pV3(2.0f,1.5f,3.0f);
FLOAT s;
pT1 *= 0.0f;
pT2 *= 0.0f;
pT1 = pV2 - pV1;
pT2 = pV3 - pV2;
s = 0.5f;
D3DXVecHermite(&pOut, &pV1, &pT1, &pV2, &pT2, s);

pOut.x , pOut.y, pOut.z는 에르미트 보간법에 의하여 발생된 곡선의 0.5f 지점(중앙지점)의 3차원 좌표값을 알려준다. 이것은 모노레일, 게임, 수로건설, 철도건설, 항로계산등의 실제적인 업무에 사용되기도 한다.

이후 더 부드러운 곡선을 만들어 내는 방법인 Catmull-Rom 보간법이 개발되었기에, 현재는 에르미트 보간법을 대신하여 많이 사용되고 있다. 하지만, 이러한 방식을 처음 고안한 사람이 에르미트이기에, 실제로는 Catmull-Rom 보간법을 사용하면서도 에르미트 보간법이라고 통칭하는 경우도 많다.

같이 보기

틀:전거 통제