3次エルミートスプライン

数値解析において、**3次エルミートスプライン**または**3次エルミート補間**は、各部分がエルミート形式で指定される3次多項式、つまり対応する区間の両端の値と1次微分によって指定されるスプラインである

。

3次エルミートスプラインは、通常、与えられる引数値 x_1,x_2,\ldots,x_n で指定される数値データを補間して連続関数を得るために使用される。
データは、各 x_k についての所望の関数値と微分から構成される必要がある（値のみが与えられている場合、微分はそれから推定する必要がある）。
エルミート補間多項式は各区間 (x_k, x_{k+1}) に個別に適用される。
結果のスプラインは連続、かつ、一次微分連続となる。

3次多項式スプラインは他の方法でも指定でき、ベジェ形式が最も一般的である。
しかし、これら2つの方法で得られるスプラインセットは同一であり、ベジェ形式とエルミート形式の間でデータの変換も容易であるため、これらの名称はしばしば同義語のように使用される。

3次多項式スプラインは、コンピュータグラフィックスやにおいて、平面または3次元空間上の指定された点を通過する曲線や運動軌跡を得るために広く用いられている。
これらのアプリケーションでは、平面または空間の各座標は、個別のパラメータ&nbsp;*t* を持つ3次スプライン関数によって個別に補間される。
3次多項式スプラインは、などの構造解析アプリケーションでも広く用いられている。

3次多項式スプラインは、死亡率分析
や死亡率予測
にも応用されている。

3次スプラインは、いくつかの方法で2つ以上のパラメータを持つ関数に拡張できる。
バイキュービックスプライン（バイキュービック補間）は、デジタル画像のピクセル値や地形の高度データなど、規則的な矩形グリッド上のデータを補間するためによく使用される。
バイキュービック曲面パッチ

は、コンピュータグラフィックスにおいて不可欠なツールである。

3次スプラインは、特にコンピュータグラフィックスではしばしば**cspline**と呼ばれる。エルミートスプラインは、シャルル・エルミートにちなんで名付けられた。

## 単一区間の補間
### 単位区間 [0, 1]

単位間隔 [0,1] について、
t = 0 における始点 \boldsymbol{p}_0、t = 1 における終点 \boldsymbol{p}_1、および、
t = 0 における開始接ベクトル \boldsymbol{m}_0、t = 1 における終了接ベクトル \boldsymbol{m}_1 が与えられると、
多項式は次のように定義される。
: \boldsymbol{p}(t) = \left(2t^3 - 3t^2 + 1\right) \boldsymbol{p}_0 + \left(t^3 - 2t^2 + t\right) \boldsymbol{m}_0 + \left(-2t^3 + 3t^2\right) \boldsymbol{p}_1 + \left(t^3 - t^2\right) \boldsymbol{m}_1
ただし *t* ∈ [0, 1] である。

### 任意区間の補間
任意の区間 (x_k, x_{k+1}) 内の x での補間は、アフィン（1次）変数変換により区間を [0, 1] にマッピングすることで行われる。
式は次のようになる。
: \boldsymbol{p}(x) = h_{00}(t) \boldsymbol{p}_k + h_{10}(t) (x_{k+1} - x_k)\boldsymbol{m}_k + h_{01}(t) \boldsymbol{p}_{k+1} + h_{11}(t)(x_{k+1} - x_k)\boldsymbol{m}_{k+1}
ただし t = (x - x_k)/(x_{k+1} - x_k) と h は、以下に定義される基底関数を参照。
なお接ベクトルの長さは、単位区間の方程式に対し x_{k+1} - x_k 倍にスケーリングされる。

### 一意性
上記の式は、指定された接ベクトルを持つ2点間の、一意の3次多項式の経路を示す。

#### 証明
P, Q は、与えられた境界条件を満たす2つの3次多項式とする。R = Q - P とすると、
: R(0) = Q(0) - P(0) = 0
: R(1) = Q(1) - P(1) = 0
である。
Q と P はいずれも3次多項式であるので、R は最大で3次の多項式である。
そのため、R は以下の式でなければならない。
: R(x) = ax(x - 1)(x - r)
導関数を計算すると、
: R'(x) = ax(x - 1) + ax(x - r) + a(x - 1)(x - r)

さらに、以下が明らかである。
: R'(0) = Q'(0) - P'(0) = 0,

: R'(1) = Q'(1) - P'(1) = 0,

式 () と () を合わせると、a = 0 が導かれ、したがって R = 0、よって P = Q となる。

### 表現

単位区間上の補間多項式は次のように書ける（任意区間については、上記再スケール版を参照）。
\boldsymbol{p}(t) = h_{00}(t)\boldsymbol{p}_0 + h_{10}(t)\boldsymbol{m}_0 + h_{01}(t)\boldsymbol{p}_1 + h_{11}(t)\boldsymbol{m}_1
ただし h_{00}, h_{10}, h_{01}, h_{11} はエルミート基底関数である。
これらは様々な方法で記述することができ、それぞれ異なる性質を示す。

「展開」列は上記の定義で使用された表現を示している。
「因数分解」列は、h_{10} と h_{11} が端点でゼロであることを直接示している。
さらに、h_{01} と h_{11} は0で重複度2の零点を持ち、h_{00} と h_{10} は1で重複度2の零点を持つため、それら端点で傾きが0になると言える。
「バーンスタイン」列は、エルミート基底関数を3次のバーンスタイン多項式に分解したものを示しており、
: B_k(t) = \binom{3}{k} \cdot t^k \cdot (1 - t)^{3-k}
である。

この関係を利用すると、3次エルミート補間を 3次ベジェ曲線の形式で、次の4つの値 \boldsymbol{p}_0, \boldsymbol{p}_0 + \frac{1}{3} \boldsymbol{m}_0, \boldsymbol{p}_1 - \frac{1}{3} \boldsymbol{m}_1, \boldsymbol{p}_1 によって表現でき、ド・カステリョのアルゴリズムを用いてエルミート補間を行うことができる。
これは、3次ベジェ曲線

において、補間曲線の両端点における接ベクトルが、中間の2つの制御点により決定されることを示している。

この多項式は次の標準形式で記述することもできる：
\boldsymbol{p}(t) = \left(2\boldsymbol{p}_0 + \boldsymbol{m}_0 - 2\boldsymbol{p}_1 + \boldsymbol{m}_1\right) t^3 + \left(-3\boldsymbol{p}_0 + 3\boldsymbol{p}_1 - 2\boldsymbol{m}_0 - \boldsymbol{m}_1\right) t^2 + \boldsymbol{m}_0 t + \boldsymbol{p}_0
ただし、制御点と接ベクトルが係数である。
この形式では係数が一定となり、一度計算して再利用できるため、*t* の様々な値について多項式を効率的に評価できる。

行列形式では
\boldsymbol{p}(t) = 
\begin{bmatrix}
t^3 & t^2 & t & 1
\end{bmatrix}
\begin{bmatrix}
2 & 1 & -2 & 1 \\
-3 & -2 & 3 & -1 \\
0 & 1 & 0 & 0 \\
1 & 0 & 0 & 0
\end{bmatrix}
\begin{bmatrix}
\boldsymbol{p}_0 \\
\boldsymbol{m}_0 \\
\boldsymbol{p}_1 \\
\boldsymbol{m}_1
\end{bmatrix}

となる。

### ベジェ曲線への変換
3次ベジェ曲線の行列形式は

\boldsymbol{p}(t)=
\begin{bmatrix}
t^3 & t^2 & t & 1
\end{bmatrix}
\begin{bmatrix}
-1 & 3 & -3 & 1 \\
3 & -6 & 3 & 0 \\
-3 & 3 & 0 & 0 \\
1 & 0 & 0 & 0
\end{bmatrix}
\begin{bmatrix}
{\boldsymbol{p_{bz}}}_0 \\
{\boldsymbol{p_{bz}}}_1 \\
{\boldsymbol{p_{bz}}}_2 \\
{\boldsymbol{p_{bz}}}_3
\end{bmatrix}

であることから、3次エルミートスプラインと等しくなる3次ベジェ曲線の制御点は

\begin{bmatrix}
{\boldsymbol{p_{bz}}}_0 \\
{\boldsymbol{p_{bz}}}_1 \\
{\boldsymbol{p_{bz}}}_2 \\
{\boldsymbol{p_{bz}}}_3
\end{bmatrix}
=
\begin{bmatrix}
-1 & 3 & -3 & 1 \\
3 & -6 & 3 & 0 \\
-3 & 3 & 0 & 0 \\
1 & 0 & 0 & 0
\end{bmatrix}
^{-1}
\begin{bmatrix}
2 & 1 & -2 & 1 \\
-3 & -2 & 3 & -1 \\
0 & 1 & 0 & 0 \\
1 & 0 & 0 & 0
\end{bmatrix}
\begin{bmatrix}
\boldsymbol{p}_0 \\
\boldsymbol{m}_0 \\
\boldsymbol{p}_1 \\
\boldsymbol{m}_1
\end{bmatrix}
=
\begin{bmatrix}
\boldsymbol{p}_0 \\
\boldsymbol{p}_0 + \frac{\boldsymbol{m}_0}{3} \\
\boldsymbol{p}_1 - \frac{\boldsymbol{m}_1}{3} \\
\boldsymbol{p}_1
\end{bmatrix}

である。

## データセットの補間
あるデータセット (x_k,\boldsymbol{p}_k)（k=1,\ldots,n）は、各区間に上記手順を適用することで補間できる。ただし、接ベクトルを適切な方法で選択する、つまり端点を共有する区間どうしで接線を等しくする。
補間された曲線は区分3次エルミートスプラインで構成され、(x_1, x_n) において大域的に連続して微分可能である。

接ベクトルの選択は一意ではなく、いくつかのオプションが利用可能である。

### 有限差分

最も単純な選択肢は3点差分であり、一定間隔のデータ点を必要としない。
内部の点 k = 2, \dots, n - 1 に対しては、
:
: \boldsymbol{m}_k = \frac{1}{2} \left(\frac{\boldsymbol{p}_{k+1} - \boldsymbol{p}_k}{x_{k+1} - x_k} + \frac{\boldsymbol{p}_k - \boldsymbol{p}_{k-1}}{x_k - x_{k-1}}\right)
とし、データ集合の端点では片側差分とする。

### カーディナルスプライン

: \boldsymbol{m}_k = (1 - c) \frac{\boldsymbol{p}_{k+1} - \boldsymbol{p}_{k-1}}{x_{k+1} - x_{k-1}}
を用いて接ベクトルを計算すると、**カーディナルスプライン**（英語: cardinal spline）が得られる

。なお、カーディナルスプラインは**正準スプライン**（英語: canonical spline）と呼ばれることもある

。
パラメータ  は*テンション*パラメータであり、 の範囲でなければならない。
ある意味では、これは接ベクトルの「長さ」と解釈できる。
 を選択するとすべての接ベクトルがゼロになり、 を選択すると一様パラメータ化（英語: uniform parameterization）Catmull-Romスプラインになる。

### Catmull–Romスプライン

接ベクトルとして
: \boldsymbol{m}_k = \frac{\boldsymbol{p}_{k+1} - \boldsymbol{p}_{k-1}}{2}
を選択することによりカーディナルスプラインの特殊な場合のひとつである**Catmull-Romスプライン**が得られる。
「一様な」パラメータ間隔を前提とする。

### Kochanek–Bartelsスプライン

Kochanek–Bartels スプラインは、データ ポイント \boldsymbol{p}_{k-1}, \boldsymbol{p}_k, \boldsymbol{p}_{k+1} が与えられた場合に接ベクトルを選択する方法をさらに一般化したものであり、テンション、バイアス、連続性の3つのパラメータを指定できる。

### 単調3次補間

上記のいずれかのタイプの3次エルミートスプラインを単調データセットの補間に使用する場合、補間された関数は必ずしも単調にはならないが、接ベクトルを調整することで単調性を維持できる。

## 端点の微分が一致する単位区間の補間
点 \boldsymbol{p}_{n-1}, \boldsymbol{p}_n, \boldsymbol{p}_{n+1}, \boldsymbol{p}_{n+2} のひとつの座標成分を、
整数座標 *x*&nbsp;= *n*&nbsp;−&nbsp;1, *n*, *n*&nbsp;+&nbsp;1, *n*&nbsp;+&nbsp;2 で関数 *f*(*x*) が取る値とすると、
: p_n = f(n) \quad \forall n \in \mathbb{Z}
と表すことができる。

さらに、端点における接ベクトルは、隣接点の中心差分 m_n = \frac{f(n + 1) - f(n - 1)}{2} = \frac{p_{n+1} - p_{n-1}}{2} \quad \forall n \in \mathbb{Z}. で定義されると仮定する。

実数値 *x* における補間値 *f*(*x*) を評価するには、まず *x* を整数部 *n* と小数部 *u* に分離する。

: x = n + u,
: n = \lfloor x \rfloor = \operatorname{floor}(x),
: u = x - n = x - \lfloor x \rfloor,
: 0 \le u 

ここで \lfloor x \rfloor は床関数を表し、*x* 以下の最大の整数を返すものとする。

Catmull-Romスプラインは
  
\begin{align}
 f(x) = f(n + u) &= \text{CINT}_u(p_{n-1}, p_n, p_{n+1}, p_{n+2}) \\
 &=
  \begin{bmatrix}
   1 & u & u^2 & u^3
  \end{bmatrix}
  \begin{bmatrix}
   0 & 1 & 0 & 0 \\
   -\tfrac12 & 0 & \tfrac12 & 0 \\
   1 & -\tfrac52 & 2 & -\tfrac12 \\
   -\tfrac12 & \tfrac32 & -\tfrac32 & \tfrac12
  \end{bmatrix}
  \begin{bmatrix}
   p_{n-1} \\
   p_n \\
   p_{n+1} \\
   p_{n+2}
  \end{bmatrix} \\
 &= \frac 12
  \begin{bmatrix}
   -u^3 +2u^2 - u \\
   3u^3 - 5u^2 + 2 \\
   -3u^3 + 4u^2 + u \\
   u^3 - u^2
  \end{bmatrix}^\mathrm{T}
  \begin{bmatrix}
   p_{n-1} \\
   p_n \\
   p_{n+1} \\
   p_{n+2}
  \end{bmatrix} \\
 &= \frac 12
  \begin{bmatrix}
   u\big((2 - u)u - 1\big) \\
   u^2(3u - 5) + 2 \\
   u\big((4 - 3u)u + 1\big) \\
   u^2(u - 1)
  \end{bmatrix}^\mathrm{T}
  \begin{bmatrix}
   p_{n-1} \\
   p_n \\
   p_{n+1} \\
   p_{n+2}
  \end{bmatrix} \\
 &= \tfrac12 \Big(\big(u^2(2 - u) - u\big) p_{n-1} + \big(u^2(3u - 5) + 2\big) p_n + \big(u^2(4 - 3u) + u\big) p_{n+1} + u^2(u - 1) p_{n+2}\Big) \\
 &= \tfrac12 \big((-u^3 + 2u^2 - u) p_{n-1} + (3u^3 - 5u^2 + 2) p_n + (-3u^3 + 4u^2 + u) p_{n+1} + (u^3 - u^2) p_{n+2}\big) \\
 &= \tfrac12 \big((-p_{n-1} + 3p_n - 3p_{n+1} + p_{n+2}) u^3 + (2p_{n-1} - 5p_n + 4p_{n+1} - p_{n+2})u^2 + (-p_{n-1} + p_{n+1}) u + 2p_n\big) \\
 &= \tfrac12 \Big(\big((-p_{n-1} + 3p_n - 3p_{n+1} + p_{n+2}) u + (2p_{n-1} - 5p_n + 4p_{n+1} - p_{n+2})\big)u + (-p_{n-1} + p_{n+1})\Big)u + p_n,
\end{align}
ただし、\mathrm{T} は行列の転置を表す。
最後の式はホーナー法を用いた計算手法を示す。

この記述はトリキュービック補間（1回の最適化につき、同じ *u* と異なる *p* を使用して CINT*u* を16回計算する必要がある）にも関連する。

## 関連項目

* バイキュービック補間、2次元への一般化
* 、3次元への一般化
* 
* 
* 
* 

## 脚注
### 訳注

### 出典

## 外部リンク
* Spline Curves, Prof. Donald H. House Clemson University
* Multi-dimensional Hermite Interpolation and Approximation, Prof. Chandrajit Bajaj, Purdue University
* Introduction to Catmull–Rom Splines, MVPs.org
* Interpolating Cardinal and Catmull–Rom splines
* Interpolation methods: linear, cosine, cubic and hermite (with C sources)
* Common Spline Equations