수치해석학에서 **에르미트 보간법**(Hermite interpolation)은 프랑스의 수학자 에르미트의 이름을 딴 보간법이다. 다항함수 형태로 보간된다.

개요
--

뉴턴 보간법과 달리, 에르미트 보간법은 자료 점들을 값과 1차 미분값을 대응시킨다.
즉 *n*차 미분값들 {\displaystyle (x\_{0},y\_{0}'),\ldots ,(x\_{n-1},y\_{n-1}')}이 *n* 자료 점들 {\displaystyle (x\_{0},y\_{0}),\ldots ,(x\_{n-1},y\_{n-1})}에 추가로 주어져야만 한다.
뉴턴 다항식이 최대 자유도 *n* − 1을 가지는 반면, 이 보간법의 다항식 결과는 대부분 2*n* − 1의 자유도를 가지게 된다.

사용
--

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

{\displaystyle z\_{0},z\_{1},\ldots ,z\_{2n+1}}
{\displaystyle z\_{2i}=z\_{2i+1}=x\_{i}}
이제 지점들 {\displaystyle z\_{0},z\_{1},\ldots ,z\_{2n+1}}에 대한 분할차 표를 만든다. 하지만 몇몇 분할차들은 정의되지 않았다.

{\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}}}
이 경우 분할차를 {\displaystyle {\frac {f'(z\_{i})}{1}}}로 대체한다. 나머지 것들은 정상적으로 계산된다.

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

예를 들면, {\displaystyle f[x\_{i},x\_{i},x\_{i},x\_{i}]={\frac {f^{(3)}(x\_{i})}{6}}}과 {\displaystyle f[x\_{i},x\_{i},x\_{i}]={\frac {f^{(2)}(x\_{i})}{2}}} 등이다.

예시
--

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

| *x* | *ƒ*(*x*) | *ƒ*'(*x*) | *ƒ*''(*x*) |
| --- | --- | --- | --- |
| −1 | 2 | −8 | 56 |
| 0 | 1 | 0 | 0 |
| 1 | 2 | 8 | 56 |

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

{\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*번째 계수에 {\displaystyle \prod \_{i=0}^{k-1}(x-z\_{i})}를 곱하면 다음과 같은 다항식을 생성할 수 있다.

{\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 보간법을 사용하면서도 에르미트 보간법이라고 통칭하는 경우도 많다.