에르미트 보간법

수치해석학에서 에르미트 보간법(Hermite interpolation)은 프랑스의 수학자 에르미트의 이름을 딴 보간법이다. 다항함수 형태로 보간된다. 뉴턴 보간법과 달리, 에르미트 보간법은 자료 점들을 값과 1차 미분값을 대응시킨다. 즉 n차 미분값들 ( x 0 , y 0 ′ ) , … , ( x n − 1 , y n − 1 ′ ) {\displaystyle (x_{0},y_{0}'),\ldots ,(x_{n-1},y_{n-1}')} 이 n 자료 점들 ( x 0 , y 0 ) , … , ( x n − 1 , y n − 1 ) {\displaystyle (x_{0},y_{0}),\ldots ,(x_{n-1},y_{n-1})} 에 추가로 주어져야만 한다. 뉴턴 다항식이 최대 자유도 n − 1을 가지는 반면, 이 보간법의 다항식 결과는 대부분 2n − 1의 자유도를 가지게 된다. 함수 f의 에르미트 다항식을 계산하기 위해 분할차(divided difference)들을 사용할 때, 첫단계는 각 점들을 복제하는 것이다. 그러므로 우리가 보간하기 원하는 함수 f에 대해 n + 1 자료점들 x 0 , x 1 , x 2 , … , x n {\displaystyle x_{0},x_{1},x_{2},\ldots ,x_{n}} 과 값들, f ( x 0 ) , f ( x 1 ) , … , f ( x n ) {\displaystyle f(x_{0}),f(x_{1}),\ldots ,f(x_{n})} 과 f ′ ( x 0 ) , f ′ ( x 1 ) , … , f ′ ( x n ) {\displaystyle f'(x_{0}),f'(x_{1}),\ldots ,f'(x_{n})} 이 주어지면 다음과 같은 새로운 자료집합을 만든다. z 0 , z 1 , … , z 2 n + 1 {\displaystyle z_{0},z_{1},\ldots ,z_{2n+1}} z 2 i = z 2 i + 1 = x i {\displaystyle z_{2i}=z_{2i+1}=x_{i}} 이제 지점들 z 0 , z 1 , … , z 2 n + 1 {\displaystyle z_{0},z_{1},\ldots ,z_{2n+1}} 에 대한 분할차 표를 만든다. 하지만 몇몇 분할차들은 정의되지 않았다. z i = z i + 1 ⟹ f [ z i , z i + 1 ] = f ( z i + 1 ) − f ( z i ) z i + 1 − z i = 0 0 {\displaystyle z_{i}=z_{i+1}\implies f[z_{i},z_{i+1}]={\frac {f(z_{i+1})-f(z_{i})}{z_{i+1}-z_{i}}}={\frac {0}{0}}} 이 경우 분할차를 f ′ ( z i ) 1 {\displaystyle {\frac {f'(z_{i})}{1}}} 로 대체한다. 나머지 것들은 정상적으로 계산된다. 이제, 이 과정은 더 고차(高次) 미분값들의 에르미트 보간이 가능하도록 일반화될 수 있다. 각 점이 같은 개수의 미분값들을 가져야 한다는 요구가 없더라도, 각 점들에 대해 k차 미분값들이 주어졌다고 하자. 그러면 자료집합 z 0 , z 1 , … , z k n − 1 {\displaystyle z_{0},z_{1},\ldots ,z_{kn-1}} 은 각 자료점들이 k개 복제되면서 만들어진다. 그러면 n 자료점들에 대해 각도가 대부분 ( k + 1 ) n − 1 {\displaystyle (k+1)n-1} 인 다항식 하나가 생성될 것이다. 이제 동일한 값들 m개의 분할차는 f ( m − 1 ) ( x i ) ( m − 1 ) ! {\displaystyle {\frac {f^{(m-1)}(x_{i})}{(m-1)!}}} 으로 대체된다. 예를 들면, f [ x i , x i , x i , x i ] = f ( 3 ) ( x i ) 6 {\displaystyle f[x_{i},x_{i},x_{i},x_{i}]={\frac {f^{(3)}(x_{i})}{6}}} 과 f [ x i , x i , x i ] = f ( 2 ) ( x i ) 2 {\displaystyle f[x_{i},x_{i},x_{i}]={\frac {f^{(2)}(x_{i})}{2}}} 등이다. 함수 f ( x ) = x 8 + 1 {\displaystyle f(x)=x^{8}+1} 의 경우를 생각해보자. x ∈ { − 1 , 0 , 1 } {\displaystyle x\in \{-1,0,1\}} 에서 함수를 두번 미분하면서 다음 자료를 얻는다. 두 미분값들을 가지고 집합 { z i } = { − 1 , − 1 , − 1 , 0 , 0 , 0 , 1 , 1 , 1 } {\displaystyle \{z_{i}\}=\{-1,-1,-1,0,0,0,1,1,1\}} 를 구성한다. 분할차표는 다음과 같다. z 0 = − 1 f [ z 0 ] = 2 f ′ ( z 0 ) 1 = − 8 z 1 = − 1 f [ z 1 ] = 2 f ″ ( z 1 ) 2 = 28 f ′ ( z 1 ) 1 = − 8 f [ z 3 , z 2 , z 1 , z 0 ] = − 21 z 2 = − 1 f [ z 2 ] = 2 f [ z 3 , z 2 , z 1 ] = 7 15 f [ z 3 , z 2 ] = − 1 f [ z 4 , z 3 , z 2 , z 1 ] = − 6 − 10 z 3 = 0 f [ z 3 ] = 1 f [ z 4 , z 3 , z 2 ] = 1 5 4 f ′ ( z 3 ) 1 = 0 f [ z 5 , z 4 , z 3 , z 2 ] = − 1 − 2 − 1 z 4 = 0 f [ z 4 ] = 1 f ″ ( z 4 ) 2 = 0 1 2 1 f ′ ( z 4 ) 1 = 0 f [ z 6 , z 5 , z 4 , z 3 ] = 1 2 1 z 5 = 0 f [ z 5 ] = 1 f [ z 6 , z 5 , z 4 ] = 1 5 4 f [ z 6 , z 5 ] = 1 f [ z 7 , z 6 , z 5 , z 4 ] = 6 10 z 6 = 1 f [ z 6 ] = 2 f [ z 7 , z 6 , z 5 ] = 7 15 f ′ ( z 7 ) 1 = 8 f [ z 8 , z 7 , z 6 , z 5 ] = 21 z 7 = 1 f [ z 7 ] = 2 f ″ ( z 7 ) 2 = 28 f ′ ( z 8 ) 1 = 8 z 8 = 1 f [ z 8 ] = 2 {\displaystyle {\begin{matrix}z_{0}=-1&f[z_{0}]=2&&&&&&&&\\&&{\frac {f'(z_{0})}{1}}=-8&&&&&&&\\z_{1}=-1&f[z_{1}]=2&&{\frac {f''(z_{1})}{2}}=28&&&&&&\\&&{\frac {f'(z_{1})}{1}}=-8&&f[z_{3},z_{2},z_{1},z_{0}]=-21&&&&&\\z_{2}=-1&f[z_{2}]=2&&f[z_{3},z_{2},z_{1}]=7&&15&&&&\\&&f[z_{3},z_{2}]=-1&&f[z_{4},z_{3},z_{2},z_{1}]=-6&&-10&&&\\z_{3}=0&f[z_{3}]=1&&f[z_{4},z_{3},z_{2}]=1&&5&&4&&\\&&{\frac {f'(z_{3})}{1}}=0&&f[z_{5},z_{4},z_{3},z_{2}]=-1&&-2&&-1&\\z_{4}=0&f[z_{4}]=1&&{\frac {f''(z_{4})}{2}}=0&&1&&2&&1\\&&{\frac {f'(z_{4})}{1}}=0&&f[z_{6},z_{5},z_{4},z_{3}]=1&&2&&1&\\z_{5}=0&f[z_{5}]=1&&f[z_{6},z_{5},z_{4}]=1&&5&&4&&\\&&f[z_{6},z_{5}]=1&&f[z_{7},z_{6},z_{5},z_{4}]=6&&10&&&\\z_{6}=1&f[z_{6}]=2&&f[z_{7},z_{6},z_{5}]=7&&15&&&&\\&&{\frac {f'(z_{7})}{1}}=8&&f[z_{8},z_{7},z_{6},z_{5}]=21&&&&&\\z_{7}=1&f[z_{7}]=2&&{\frac {f''(z_{7})}{2}}=28&&&&&&\\&&{\frac {f'(z_{8})}{1}}=8&&&&&&&\\z_{8}=1&f[z_{8}]=2&&&&&&&&\\\end{matrix}}} 그리고 뉴턴 다항식을 생성할 때처럼, 분할차표의 대각선 계수들을 가져와서 k번째 계수에 ∏ i = 0 k − 1 ( x − z i ) {\displaystyle \prod _{i=0}^{k-1}(x-z_{i})} 를 곱하면 다음과 같은 다항식을 생성할 수 있다. P ( x ) = 2 − 8 ( x + 1 ) + 28 ( x + 1 ) 2 − 21 ( x + 1 ) 3 + 15 x ( x + 1 ) 3 − 10 x 2 ( x + 1 ) 3 + 4 x 3 ( x + 1 ) 3 − 1 x 3 ( x + 1 ) 3 ( x − 1 ) + x 3 ( x + 1 ) 3 ( x − 1 ) 2 = 2 − 8 + 28 − 21 − 8 x + 56 x − 63 x + 15 x + 28 x 2 − 63 x 2 + 45 x 2 − 10 x 2 − 21 x 3 + 45 x 3 − 30 x 3 + 4 x 3 + x 3 + x 3 + 15 x 4 − 30 x 4 + 12 x 4 + 2 x 4 + x 4 − 10 x 5 + 12 x 5 − 2 x 5 + 4 x 5 − 2 x 5 − 2 x 5 − x 6 + x 6 − x 7 + x 7 + x 8 = x 8 + 1. {\displaystyle {\begin{aligned}P(x)&=2-8(x+1)+28(x+1)^{2}-21(x+1)^{3}+15x(x+1)^{3}-10x^{2}(x+1)^{3}\\&\quad +4x^{3}(x+1)^{3}-1x^{3}(x+1)^{3}(x-1)+x^{3}(x+1)^{3}(x-1)^{2}\\&=2-8+28-21-8x+56x-63x+15x+28x^{2}-63x^{2}+45x^{2}-10x^{2}-21x^{3}\\&\quad +45x^{3}-30x^{3}+4x^{3}+x^{3}+x^{3}+15x^{4}-30x^{4}+12x^{4}+2x^{4}+x^{4}\\&\quad -10x^{5}+12x^{5}-2x^{5}+4x^{5}-2x^{5}-2x^{5}-x^{6}+x^{6}-x^{7}+x^{7}+x^{8}\\&=x^{8}+1.\end{aligned}}} 마이크로소프트사의 다이렉트 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 보간법을 사용하면서도 에르미트 보간법이라고 통칭하는 경우도 많다. 입방 에르미트 스플라인 차분 다항식 보간 라그랑주 다항식 베른슈타인 다항식 중국인의 나머지 정리