Construction du spline cubique

Définissons les trois quantitées suivantes :


$\displaystyle h_k$ $\textstyle =$ $\displaystyle x_{k+1} - x_k$ (3.6)
$\displaystyle d_k$ $\textstyle =$ $\displaystyle \frac{y_{k+1}-y_k}{x_{k+1}-x_k}$ (3.7)
$\displaystyle m_k$ $\textstyle =$ $\displaystyle s''(x_k)$ (3.8)

$h_k$ est l'écart entre $x_k$ et $x_{k+1}$, $d_k$ est la pente entre $(x_k,y_k)$ et $(x_{k+1}, y_{k+1})$ et $m_k$ est la dérivée seconde de l'interpolateur en $x_k$.

Il est nécessaire que $s(x)$ soit cubique par morceaux. Ce qui implique que $s'(x)$ soit quadratique par morceaux et que $s''(x)$ soit linéaire par morceaux.

Effectuons l'interpolation linéaire (Lagrange) de la dérivée seconde par morceaux :


$\displaystyle s''_k(x)$ $\textstyle =$ $\displaystyle s''(x_k)\frac{x-x_{k+1}}{x_k-x_{k+1}}+s''(x_{k+1})\frac{x-x_k}{x_{k+1}-x_k}$ (3.9)

En substituant par $m_k$ et $h_k$, l'équation 3.9 devient :


$\displaystyle s''_k(x)$ $\textstyle =$ $\displaystyle \frac{m_k}{h_k}(x_{k+1}-x)+\frac{m_{k+1}}{h_k}(x-x_k) \qquad x \in [x_k,x_{k+1}] et k=0,1,\cdots,n-1$ (3.10)

En intégrant, on obtient l'équation de la dérivée première et de l'interpolateur lui-même :


$\displaystyle s'_k(x)$ $\textstyle =$ $\displaystyle -\frac{m_k}{2h_k}(x_{k+1}-x)^2+\frac{m_{k+1}}{2h_k}(x-x_k)^2 - p_k + q_k$ (3.11)
$\displaystyle s_k(x)$ $\textstyle =$ $\displaystyle \frac{m_k}{6h_k}(x_{k+1}-x)^3+\frac{m_{k+1}}{6h_k}(x-x_k)^3 + p_k(x_{k+1}-x) + q_k(x-x_k)$ (3.12)

Maintenant, évaluons l'interpolateur en $x=x_k$ et en $x=x_{k+1}$ sachant que $s_k(x_k)=y_k$ et $s_k(x_{k+1})=y_{k+1}$ :


$\displaystyle s_k(x_k) = y_k = \frac{m_k}{6h_k}(x_{k+1}-x_k)^3 + p_k(x_{k+1}-x)$ $\textstyle \Rightarrow$ $\displaystyle p_k = \frac{y_k}{h_k}-\frac{m_kh_k}{6}$ (3.13)
$\displaystyle s_k(x_{k+1}) = y_{k+1} = \frac{m_{k+1}}{6h_k}(x_{k+1}-x_k)^3 + q_k(x_{k+1}-x)$ $\textstyle \Rightarrow$ $\displaystyle q_k = \frac{y_{k+1}}{h_k}-\frac{m_{k+1}h_k}{6}$ (3.14)

Donc :


$\displaystyle s_k(x)$ $\textstyle =$ $\displaystyle \frac{m_k}{6h_k}(x_{k+1}-x)^3+\frac{m_{k+1}}{6h_k}(x-x_k)^3$  
  $\textstyle +$ $\displaystyle \Big(\frac{y_k}{h_k}-\frac{m_kh_k}{6}\Big)(x_{k+1}-x) + \Big(\frac{y_{k+1}}{h_k}-\frac{m_{k+1}h_k}{6}\Big)(x-x_k)$ (3.15)

Les seules inconnues qui restent dans les équations sont les $m_k$. La seule contrainte non utilisée est la continuité des dérivés premières (3.4). On peut déterminer les $m_k$ en utilisant les dérivés premières :


$\displaystyle s'_k(x)$ $\textstyle =$ $\displaystyle -\frac{m_k}{2h_k}(x_{k+1}-x)^2+\frac{m_{k+1}}{2h_k}(x-x_k)^2 - (\frac{y_k}{h_k}-\frac{m_kh_k}{6}) + (\frac{y_{k+1}}{h_k}-\frac{m_{k+1}h_k}{6})$ (3.16)

Évaluons $s'_k(x_k)$ et $s'_{k-1}(x_k)$ :


$\displaystyle s'_k(x_k)$ $\textstyle =$ $\displaystyle -\frac{m_kh_k}{2}- \Big(\frac{y_k}{h_k}-\frac{m_kh_k}{6}\Big) + \Big(\frac{y_{k+1}}{h_k}-\frac{m_{k+1}h_k}{6}\Big)$  
  $\textstyle =$ $\displaystyle -\frac{1}{3}m_kh_k-\frac{1}{6}m_{k+1}h_k+d_k \qquad avec \qquad d_k=\frac{y_{k+1}-y_k}{h_k}$ (3.17)
$\displaystyle s'_{k-1}(x_k)$ $\textstyle =$ $\displaystyle \frac{m_kh_{k-1}}{2}-\frac{y_{k-1}}{h_{k-1}}+\frac{m_{k-1}h_{k-1}}{6}+\frac{y_k}{h_{k-1}}-\frac{m_kh_{k-1}}{6}$  
  $\textstyle =$ $\displaystyle \frac{1}{3}m_kh_{k-1}+\frac{1}{6}m_{k-1}h_{k-1}+d_{k-1}$ (3.18)

Ensuite, en éxigeant la continuité des dérivées premières, $s'_k(x_k)=s'_{k-1}(x_k)$ :


$\displaystyle -\frac{1}{3}m_kh_k-\frac{1}{6}m_{k+1}h_k+d_k$ $\textstyle =$ $\displaystyle \frac{1}{3}m_kh_{k-1}+\frac{1}{6}m_{k-1}h_{k-1}+d_{k-1}$ (3.19)

Et en simplifiant :


$\displaystyle h_{k-1}m_{k-1}+2(h_{k-1}+h_k)m_k+h_km_{k+1}$ $\textstyle =$ $\displaystyle 6(d_k-d_{k-1})$ (3.20)

Ce qui donne un système linéaire avec $(n-1)$ équations qui peut être résolu pour les $m_k$ ($n+1$ inconnues). En spécifiant les conditions limites, les coefficients du spline peuvent alors être déterminés.

En divisant par $h_{k-1}+h_k$ et en définissant $\lambda_k=\frac{h_k}{h_{k-1}+h_k}$ et $\rho_k=1-\lambda_k$, on obtient :


$\displaystyle \rho_k m_{k-1}+2m_k+\lambda_k m_{k+1}$ $\textstyle =$ $\displaystyle 6\frac{d_k-d_{k-1}}{h_{k-1}+h_k}$ (3.21)

Notons qu'il y a $(n+1)$ inconnues $(m_k,k=0,1,\cdots,n)$ pour $(n-1)$ équations. Il faut donc spécifier $m_0$ et $m_n$.

On a alors un système linéaire $\mathbf{Mm=b}$, tel que :


\begin{displaymath}
\left( \begin{array}{cccccc}
2 & \lambda_1 & 0 & 0 & \cdots ...
...d_{n-2}}{h_{n-2}+h_{n-1}}-\lambda_{n-1}m_n
\end{array} \right)
\end{displaymath}

La matrice $\mathbf{M}$ est appelée la matrice de poids.

Maintenant, reprenons l'équation 3.1 rappelée ci-dessous :


$\displaystyle s_k(x)$ $\textstyle =$ $\displaystyle s_{k,0} + s_{k,1}(x-x_k) + s_{k,2}(x-x_k)^2 + s_{k,3}(x-x_k)^3 \qquad x \in [x_k,x_{k+1}]$  

Une fois que le système est résolu pour les $m_k$, le spline peut être construit avec les coefficients suivants :


$\displaystyle s_{k,0}$ $\textstyle =$ $\displaystyle y_k$ (3.22)
$\displaystyle s_{k,1}$ $\textstyle =$ $\displaystyle d_k-\frac{h_k}{6}(2m_k+m_{k+1})$ (3.23)
$\displaystyle s_{k,2}$ $\textstyle =$ $\displaystyle \frac{m_k}{2}$ (3.24)
$\displaystyle s_{k,3}$ $\textstyle =$ $\displaystyle \frac{m_{k+1}-m_k}{6h_k}$ (3.25)

Nicolas Daget 2006-03-21