Кубічні сплайни Ерміта

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Інтерполяція Ерміта.

Кубічні сплайни Ерміта — кубічні сплайни, що використовують інтерполювання поліномами методом Ерміта. Цей метод інтерполювання використовує дві контрольні точки та два вектори напрямків.

Названі на честь французького математика Шарля Ерміта.

Інтерполяція на інтервалі[ред.ред. код]

Інтерполяція на інтервалі (0,1)[ред.ред. код]

f(t) f(0) f(1) f'(0) f'(1)
\ h_{00}(t) 1 0 0 0
\ h_{01}(t) 0 1 0 0
\ h_{10}(t) 0 0 1 0
\ h_{11}(t) 0 0 0 1
\mathbf{p}(t) \mathbf{p_0} \mathbf{p_1} \mathbf{m_0} \mathbf{m_1}

Задано початкову точку p_0 з початковим вектором m_0 при t=0 та кінцеву точку p_1 з кінцевим вектором m_1 при t=1.

Для кубічного полінома та його похідної

\mathbf{p}(t) = a_0 + a_1t + a_2t^2 + a_3t^3
\mathbf{p}\prime(t) = a_1 + 2a_2t + 3a_3t^2

виразимо коефіцієнти a_0, a_1, a_2, a_3 через \mathbf{p}(0), \mathbf{p}(1), \mathbf{p}\prime(0), \mathbf{p}\prime(1):


\begin{cases}
\mathbf{p}(0) = a_0 \\
\mathbf{p}(1) = a_0 + a_1 + a_2 + a_3 \\
\mathbf{p}\prime(0) = a_1 \\
\mathbf{p}\prime(1) = a_1 + 2a_2 + 3a_3
\end{cases}
\Rightarrow
\begin{cases}
a_0 = \mathbf{p}(0) \\
a_1 = \mathbf{p}\prime(0) \\
a_2 = 3(\mathbf{p}(1) - \mathbf{p}(0)) - 2\mathbf{p}\prime(0) - \mathbf{p}\prime(1) \\
a_3 = \mathbf{p}\prime(0) + \mathbf{p}\prime(1) - 2(\mathbf{p}(1) - \mathbf{p}(0))
\end{cases}

Підставивши значення полінома та його похідної із таблиці справа, отримаємо чотири базові ермітові поліноми:

Базис для кубічних ермітових сплайнів.
\begin{matrix}
h_{00}(t) & = & 2t^3-3t^2+1 & = &( 1 - t)^2 (1 + 2 t) \\
h_{01}(t) & = & -2t^3+3t^2 & = & t^2 (3 - 2 t) \\
h_{10}(t) & = & t^3-2t^2+t  & = & t ( 1 - t)^2 \\
h_{11}(t) & = & t^3-t^2 & = & t^2 (t - 1) \\
\end{matrix}

Тоді інтерполяційний поліном визначається як лінійна комбінація чотирьох базових:

\mathbf{p}(t) = h_{00}(t)\mathbf{p_0} + h_{10}(t)\mathbf{m_0} + h_{01}(t)\mathbf{p_1} + h_{11}(t)\mathbf{m_1}, \qquad t \in [0, 1]

Існують такі властивості симетрії:

\ h_{00}(t) + h_{01}(t) = 1 — симетрія відносно осі y=1/2,
\ h_{00}(t) = h_{01}(1-t) — симетрія відносно осі x=1/2,
\ h_{10}(t) = -h_{11}(1-t) — симетрія відносно точки (0, 1/2).

Інтерполяція на інтервалі (x_k \,, \; x_{k+1})[ред.ред. код]

Інтерполяція на цьому інтервалі задається формулою

\mathbf{p}(x) = h_{00}(t)\mathbf{p_0} + h_{10}(t)h\mathbf{m_0} + h_{01}(t)\mathbf{p_1} + h_{11}(t)h\mathbf{m_1},
\qquad h = x_{k+1}-x_k, \qquad t = (x-x_k)/h.

Зв'язок з кривими Без'є[ред.ред. код]

Чотири базові ермітові поліноми легко виразити через поліноми Бернштейна, що є базисними для кривих Без'є

\begin{matrix}
h_{00}(t) & = & ( 1 - t)^2 (1 + 2 t) & = & ( 1 - t)^3  + 3t( 1 - t)^2 & = & \mathbf{b}_{0,3}(t) + \mathbf{b}_{1,3}(t) \\
h_{01}(t) & = & t^2 (3 - 2 t) & = &  t^3 + 3t^2 (1 - t) & = & \mathbf{b}_{3,3}(t) + \mathbf{b}_{2,3}(t) \\
h_{10}(t) & = & t ( 1 - t)^2 & = & & & \mathbf{b}_{1,3}(t) / 3 \\
h_{11}(t) & = & t^2 (t - 1) & = &  & & -\mathbf{b}_{2,3}(t) / 3\\
\end{matrix}

Тому кубічний сплайн Ерміта з параметрами

\mathbf{\left( p_0, p_1, m_0, m_1 \right)}

аналогічний кубічній кривій Без'є з опорними вершинами

\mathbf{\left( p_0, p_1, p_0+\frac{m_0}3, p_1-\frac{m_1}3 \right)}.

Інтерполяція сплайном[ред.ред. код]

Інтерполяції набору точок (x_k,\boldsymbol{p}_k) для \ k=1,\ldots ,n, здійснюється для кожного інтервалу, і параметри для однієї точки в різних інтервалах вибираються одинаковими. Інтерполяційний сплайн отримується неперервно-диференційовним на \ (x_1, x_n).

Існують декілька способів задання параметрів.

Кінцеві різниці[ред.ред. код]

Найпростіший спосіб із застосуванням трьох контрольних точок:

\boldsymbol{m}_k = \frac{\boldsymbol{p}_{k+1}-\boldsymbol{p}_{k}}{2(x_{k+1}-x_{k})} + \frac{\boldsymbol{p}_{k}-\boldsymbol{p}_{k-1}}{2(x_{k}-x_{k-1})}

для індексів k=2,\ldots,n-1, і односторонні різниці на кінцях.

Кардинальні сплайни[ред.ред. код]

 \boldsymbol{m}_k = (1-c)\frac{\boldsymbol{p}_{k+1}-\boldsymbol{p}_{k-1}}{2}

Параметр c \in (0,1).

Сплайни Кетмал-Рома[ред.ред. код]

\boldsymbol{m}_k = \frac{\boldsymbol{p}_{k+1} - \boldsymbol{p}_{k-1}}{2}