Splines cubiques — Principe et construction
Objectifs d'apprentissage
À la fin de cette leçon, vous serez en mesure de :
- Comprendre l'origine physique des splines (ruban flexible)
- Écrire la forme générale d'un polynôme cubique par morceaux
- Établir les conditions de continuité pour , et
- Dériver le système d'équations pour les dérivées secondes
Prérequis
- Interpolation polynomiale
- Notion de continuité et dérivabilité
- Résolution de systèmes linéaires
Motivation : dépasser les limites des polynômes
Le problème
Nous avons vu que l'interpolation polynomiale de Lagrange ou Newton-Gregory fonctionne bien avec peu de points. Mais dès que le nombre de points augmente, le degré du polynôme augmente aussi — et avec lui les oscillations parasites (phénomène de Runge). Ajouter des points pour mieux coller aux données empire souvent le résultat.
L'idée des splines
La solution est simple : au lieu d'un seul polynôme de degré élevé, utiliser plusieurs polynômes de degré faible raccordés entre eux. Chaque morceau reste un polynôme cubique (degré 3), ce qui suffit pour avoir une courbe lisse sans oscillation.
Le terme « spline » vient de l'outil des dessinateurs : une lame flexible (ruban de bois ou de métal) que l'on fait passer par des points de contrôle. La forme naturelle de cette lame minimise l'énergie de flexion, ce qui correspond mathématiquement à une spline cubique.
Spline cubique vs Polynôme de Lagrange
La spline évite les oscillations indésirables des polynômes de degré élevé
Polynôme de Lagrange
- Degré 6 (élevé)
- Oscillations près des bords
- Phénomène de Runge
Spline cubique
- 6 morceaux de degré 3
- Pas d'oscillation
- Contrôle local
Définition d'une spline cubique
Structure
Une spline cubique sur points est constituée de polynômes cubiques :
où est défini sur l'intervalle .
Forme des polynômes
Chaque polynôme s'écrit sous la forme :
Cette forme est choisie pour simplifier les calculs aux points de raccord.
Nombre d'inconnues
Chaque polynôme a 4 coefficients : .
Pour polynômes, on a donc inconnues à déterminer.
Les conditions de raccord
Continuité de la fonction (Condition 1)
La spline doit passer par tous les points de données :
pour .
Cela donne équations.
Continuité de la dérivée première (Condition 2)
Aux points intérieurs, les dérivées à gauche et à droite doivent coïncider :
pour .
Cela donne équations.
Continuité de la dérivée seconde (Condition 3)
De même pour les dérivées secondes :
pour .
Cela donne encore équations.
Bilan des équations
| Condition | Nombre d'équations |
|---|---|
| Passage par les points | |
| Continuité de | |
| Continuité de | |
| Total |
On a inconnues et équations.
Il manque 2 équations pour déterminer uniquement la spline. Ces équations supplémentaires sont les conditions aux frontières, que nous étudierons dans la prochaine leçon.
Continuité aux nœuds de la spline
Vérifiez que f, f' et f'' sont continues aux points de raccord
Continuité au nœud x = 2
| Fonction | Limite à gauche | Limite à droite | Différence | Continu ? |
|---|---|---|---|---|
| f(x) | 1.499753 | 1.500253 | 5.00e-4 | ✓ |
| f'(x) | 0.243577 | 0.256423 | 1.28e-2 | ✓ |
| f''(x) | 6.416786 | 6.416786 | 0.00e+0 | ✓ |
Les différences sont de l'ordre de l'erreur numérique (≈ 10⁻¹⁵), confirmant la continuité
Notation et dérivation
Introduction des dérivées secondes
Posons , la dérivée seconde au point .
Puisque est cubique, est linéaire :
où est le pas sur l'intervalle .
Relation avec les coefficients
En comparant avec :
En : , donc :
En : , donc :
Calcul des autres coefficients
Coefficient
La condition donne immédiatement :
Coefficient
La condition permet de trouver .
En développant :
On isole :
Résumé des coefficients
Le système pour les
Condition de continuité de
On veut que la pente soit continue à chaque nœud intérieur : le polynôme qui arrive au nœud doit avoir la même pente que le polynôme qui en repart. Formellement :
Calculons chaque côté séparément.
Pente à gauche — On dérive :
On évalue à , c'est-à-dire avec :
Pente à droite — Le polynôme est évalué à son point de départ , donc :
Substitution des coefficients
On remplace maintenant , , et par leurs expressions en fonction des (trouvées plus haut) :
La condition devient :
Simplification étape par étape
Étape 1 — Simplifions le premier terme :
Étape 2 — Le deuxième terme :
Étape 3 — Regroupons les termes en , et du côté gauche :
Étape 4 — En regroupant par variable :
- Termes en :
- Termes en :
- Termes en :
Équation de raccord finale
En multipliant tout par 6, on obtient l'équation fondamentale :
pour .
Le terme de droite représente 6 fois la différence des pentes entre les segments adjacents. Si les données étaient sur une droite, ce terme serait nul et on aurait partout — courbure nulle, pas de flexion.
Structure du système
De l'équation au système
L'équation de raccord fait intervenir trois consécutifs :
où on note le second membre :
Les se calculent directement à partir des données — ce sont des constantes connues.
En écrivant cette équation pour , on obtient équations. Mais les inconnues sont (soit inconnues). Les valeurs et aux extrémités seront fixées par les conditions frontières (leçon suivante). Pour l'instant, on les traite comme des paramètres connus et on résout pour les intérieurs .
Écriture détaillée des équations
Écrivons explicitement les premières et dernières équations pour comprendre la structure.
Première équation () :
On déplace le terme en vers le second membre :
Deuxième équation () — ici , , sont tous des inconnues intérieures :
Pas de terme à déplacer : le second membre reste tel quel.
Dernière équation () :
On déplace :
Système tridiagonal
Seules la première et la dernière ligne ont un second membre modifié (par les conditions aux bords). Les lignes intermédiaires gardent simplement . Le système complet s'écrit :
Chaque équation ne fait intervenir que 3 inconnues consécutives (). La matrice n'a de valeurs non nulles que sur la diagonale principale et les deux diagonales adjacentes — d'où le nom tridiagonal. Cette structure permettra une résolution très efficace en (algorithme de Thomas, leçon suivante).
Cas du pas constant
Si pour tout , les coefficients se simplifient. La diagonale principale vaut et les sous/sur-diagonales valent . En divisant chaque ligne par :
La matrice devient :
Cette matrice est symétrique définie positive (la diagonale domine strictement : ). Cela garantit l'existence et l'unicité de la solution, ainsi que la stabilité numérique de l'algorithme de résolution.
Interprétation physique
La spline comme ruban flexible
Physiquement, la spline cubique minimise l'énergie de flexion :
Cette propriété explique pourquoi :
- La dérivée seconde représente la courbure
- La continuité de assure une flexion sans à-coup
- Les conditions aux bords influencent le comportement global
Avantages des splines cubiques
| Avantage | Explication |
|---|---|
| Pas d'oscillation | Polynômes de degré 3 seulement |
| Courbe lisse | Continuité de f, f' et f'' |
| Contrôle local | Modifier un point n'affecte que les segments voisins |
| Calcul efficace | Système tridiagonal en O(n) |
Algorithme de construction
import numpy as np
def calculer_coefficients_spline(x, y, S):
"""
Calcule les coefficients a, b, c, d de chaque polynôme cubique
à partir des dérivées secondes S aux noeuds.
Paramètres:
x : abscisses des noeuds (n points)
y : ordonnées des noeuds
S : dérivées secondes aux noeuds
Retourne:
a, b, c, d : tableaux des coefficients (n-1 valeurs chacun)
"""
n = len(x)
h = np.diff(x) # h[i] = x[i+1] - x[i]
a = np.zeros(n - 1)
b = np.zeros(n - 1)
c = np.zeros(n - 1)
d = np.zeros(n - 1)
for i in range(n - 1):
a[i] = (S[i + 1] - S[i]) / (6 * h[i])
b[i] = S[i] / 2
c[i] = (y[i + 1] - y[i]) / h[i] - h[i] * (S[i + 1] + 2 * S[i]) / 6
d[i] = y[i]
return a, b, c, d
def evaluer_spline(x_data, a, b, c, d, x):
"""
Évalue la spline au point x.
Paramètres:
x_data : abscisses des noeuds
a, b, c, d : coefficients des polynômes
x : point d'évaluation
Retourne:
valeur de la spline en x
"""
# Trouver l'intervalle contenant x
n = len(x_data)
for i in range(n - 1):
if x_data[i] <= x <= x_data[i + 1]:
dx = x - x_data[i]
return a[i] * dx**3 + b[i] * dx**2 + c[i] * dx + d[i]
# Extrapolation (à éviter en général)
if x < x_data[0]:
dx = x - x_data[0]
return a[0] * dx**3 + b[0] * dx**2 + c[0] * dx + d[0]
else:
dx = x - x_data[-2]
return a[-1] * dx**3 + b[-1] * dx**2 + c[-1] * dx + d[-1]
# Exemple d'utilisation (les S seront calculés dans la prochaine leçon)
x = np.array([1, 2, 3, 4])
y = np.array([4, -2, 3, 1])
# Pour l'instant, supposons S connu (spline naturelle, exemple)
S = np.array([0, 20.4, -15.6, 0])
a, b, c, d = calculer_coefficients_spline(x, y, S)
print("Coefficients des polynômes cubiques :")
for i in range(len(a)):
print(f" Q_{i+1}(x) : a={a[i]:.2f}, b={b[i]:.2f}, c={c[i]:.2f}, d={d[i]:.2f}")Construction de la spline cubique
Ajoutez les morceaux un par un pour voir comment la spline se construit
Étape 4 : Dernier segment Q₄(x) sur [3, 4]. La spline naturelle est complète (S₀ = S₄ = 0).
Résumé
Dans cette leçon, nous avons établi les fondements des splines cubiques :
- Une spline cubique est constituée de polynômes cubiques raccordés
- Chaque polynôme a la forme
- Les conditions de continuité de , et fournissent équations
- Les coefficients s'expriment en fonction des dérivées secondes aux nœuds
- Le système pour les est tridiagonal et se résout en
Pour aller plus loin
La prochaine leçon présentera les différentes conditions aux frontières qui complètent le système : splines naturelles, paraboliques, et à pentes imposées. Nous verrons également l'algorithme complet de résolution.