수치해석학 에서 에르미트 보간법 (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\}}
에서 함수를 두번 미분하면서 다음 자료를 얻는다.
x
ƒ (x )
ƒ '(x )
ƒ ''(x )
−1
2
−8
56
0
1
0
0
1
2
8
56
두 미분값들을 가지고 집합
{
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 보간법을 사용하면서도 에르미트 보간법이라고 통칭하는 경우도 많다.