Interpolations polynomiales et cubic splinesAvril 1998Vous pouvez télécharger les fichiers interp.cc et interp.h qui vous permettrons d'expérimenter les méthodes présentées sur cette page.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
double lagrange(const double& u,
const double* x,
const double* y, const int& n)
|
Le problème posé par cette méthode est qu'elle ne permet pas de choisir le degré du polynome. Un degré trop élevé engendrera des oscillations excessives et inversement. Les méthodes travaillant sur les différences et permettent de corriger ce défaut en choisissant un seuil de convergence "acceptable".
Méthodes des différencesLa méthode standard des différences peut donner le même résultat que la méthode de Lagrange, s'il n'est pas possible de trouver un degré polynomiale inférieur à N sans perte de précision excessive. Dans certains cas elle remplacera cependant avantageusement l'interpolation de Lagrange en ajustant un polynome de degré inférieur.
void divdiff_coef(double* dd, const double* x, const double* y, const int& n)
{
double temp1, temp2;
for ( int i=0; i < n; i++ )
dd[i] = y[i];
for ( int j=1; j < n; j++ ) {
temp1 = dd[j-1];}
for ( int k=j; k < n; k++ ) {
temp2 = dd[k];}
dd[k] = (dd[k] - temp1)/(x[k] - x[k-j]);
temp1 = temp2;
}
double divdiff(const double& u, const double* dd, const double* x, const int& n)
{
double interp = 0.0;
for ( int i=(n-1); i>=1; i-- )
interp = (interp + dd[i]) * (u - x[i-1]);interp += dd[0];
return interp;
}
Cubic SplinesA la différence de la méthode précédente, le cubic spline n'est pas une méthode d'interpolation polynomiale à proprement parler. Nous cherchons plutot à lisser une série de points (un peu comme on le ferai avec une moyenne mobile) et non pas à trouver quel polynome représente le mieux ces points. Effectuer une interpolation par un cubic spline revient à résoudre un système tridiagonal. Comme pour la méthode des différences, on recherche tout d'abord les valeurs des coefficients avant de calculer les points interpolés.
L'algorithme utilisé pour rechercher un cubic spline sur une série de points est un peu plus compliqué que les deux précédents. Si vous être intéréssé par une implémentation en C++, vous pouvez downloader enl_interp.cc et enl_interp.h. Elle utilise la résolution d'une matrice tridiagonale proposée par les fameux Numerical Recipies in C.
ComparaisonPour démontrer les différences qui peuvent exister entre une interpolation polynomiale et par les splines, nous avons généré 9 points non équidistants de facon (pseudo) aléatoire. Le cubic spline donne des résultats assez differents de l'interpolation de Lagrange, avec un aspect bien plus lissé (courbe bleue).

Comme vous pourez le constater sur le tableau suivant, la méthode de Lagrange donne bien les mêmes résultats que la méthode des différences.
u Lagrange DivDiff CSpline
0.00 0.0179 0.0179 0.0179
0.03 1.5718 1.5718 0.1476
0.05 2.0489 2.0489 0.2743
0.08 1.9725 1.9725 0.3954
0.10 1.6734 1.6734 0.5079
0.12 1.3428 1.3428 0.6090
0.15 1.0751 1.0751 0.6957
0.17 0.9013 0.9013 0.7653
0.20 0.8149 0.8149 0.8149
0.22 0.7903 0.7903 0.8422
0.25 0.7966 0.7966 0.8479
0.27 0.8061 0.8061 0.8330
0.30 0.7988 0.7988 0.7988
0.33 0.7650 0.7650 0.7472
0.35 0.7044 0.7044 0.6830
0.38 0.6248 0.6248 0.6119
0.40 0.5393 0.5393 0.5393
0.43 0.4632 0.4632 0.4720
0.45 0.4113 0.4113 0.4213
0.48 0.3948 0.3948 0.3997
0.50 0.4196 0.4196 0.4196
0.53 0.4851 0.4851 0.4881
0.55 0.5840 0.5840 0.5913
0.58 0.7029 0.7029 0.7097
0.60 0.8241 0.8241 0.8241
0.63 0.9283 0.9283 0.9172
0.65 0.9969 0.9969 0.9793
0.68 1.0164 1.0164 1.0031
0.70 0.9808 0.9808 0.9808
0.73 0.8947 0.8947 0.9094
0.75 0.7748 0.7748 0.8030
0.78 0.6500 0.6500 0.6801
0.80 0.5592 0.5592 0.5592
0.83 0.5452 0.5452 0.4552
0.85 0.6458 0.6458 0.3692
0.88 0.8789 0.8789 0.2985
0.90 1.2227 1.2227 0.2407
0.93 1.5874 1.5874 0.1930
0.95 1.7806 1.7806 0.1531
0.98 1.4617 1.4617 0.1183
1.00 0.0860 0.0860 0.0860