0.1 Splines cubiques

Transcription

0.1 Splines cubiques
0.1. SPLINES CUBIQUES
1
f (x2 )
f (x4 )
f (x1 )
f (x3 )
f (x0 )
x0
x1
x2
x3
x4
Figure 1 – Interpolation linéaire par morceaux
0.1
Splines cubiques
Dans bon nombre d’applications, il est impératif d’obtenir des courbes très régulières passant par un grand nombre de points. C’est le cas en conception assistée
par ordinateur (CAO), où l’on cherche à représenter des objets aux formes lisses.
Nous avons déjà constaté que l’utilisation de polynômes de degré élevé est délicate
et mène parfois à des oscillations de grande amplitude. Les polynômes de degré élevé
sont alors peu adéquats.
On peut mesurer la régularité d’une fonction par le biais de ses dérivées. En effet,
plus une fonction est différentiable, plus la courbe qui lui est associée est lisse et plus
la fonction est régulière. Le problème, lorsque l’on utilise des polynômes de faible
degré, provient du fait qu’il faut en utiliser plusieurs pour relier tous les points. C’est
le cas de l’interpolation linéaire par morceaux, illustrée à la figure 1, qui consiste à
relier chaque paire de points par un segment de droite. On utilise aussi l’appellation
splines linéaires. On imagine assez mal comment une telle courbe pourrait permettre
de faire la conception d’une carrosserie de voiture ou d’une aile d’avion. Il faut donc
être plus prudent à la jonction des différents segments de courbe. La spline linéaire
est continue mais n’est pas dérivable et nous allons maintenant montrer que l’on
peut faire beaucoup mieux.
Les splines cubiques représentent un compromis très intéressant entre la régularité de la courbe obtenue et le degré des polynômes utilisés. Nous étudierons dans
un premier temps les courbes de la forme y = f (x) et par la suite nous verrons
comment aborder les courbes paramétrées.
0.1.1
Courbes de la forme y = f (x)
On considère donc, ici encore, (n + 1) points d’interpolation (xi , f (xi )), i =
0, 1, 2, · · · , n par lesquels on souhaite faire passer une courbe autant de fois diffé-
2
p2 (x)
p1 (x)
f (x2 )
f (x3 )
f (x4 )
p3 (x)
p0 (x)
f (x1 )
f (x0 )
x0
x1
x2
x3
x4
Figure 2 – Splines cubiques : n polynômes de degré 3
rentiable que possible. Dans chaque intervalle [xi , xi+1 ] (de longueur hi = xi+1 − xi ),
nous allons utiliser un polynôme de degré 3 de la forme :
pi (x) = fi + fi0 (x − xi ) +
fi00
f 000
(x − xi )2 + i (x − xi )3
2!
3!
pour i = 0, 1, 2, · · · , n − 1 (1)
et relier ces différents polynômes de façon à ce que la courbe résultante soit deux fois
différentiable. La situation est décrite à la figure 2 pour n = 4. C’est l’interpolation
par splines cubiques. On remarque que chacun de ces polynômes se présente commme
un développement de Taylor autour du point xi . Ce n’est nullement obligatoire mais
cette forme permet d’interpréter plus facilement les coefficients à déterminer fi ,
fi0 , fi00 et fi000 qui sont alors respectivement les valeurs de la spline et de ses trois
premières dérivées en xi . On constate en effet facilement que pi (xi ) = fi , p0i (xi ) = fi0
000
p00i (xi ) = fi00 et enfin p000
i (xi ) = fi .
Puisque l’on a (n + 1) points d’interpolation, il y a n intervalles [xi , xi+1 ] qui
résultent en 4n coefficients inconnus (fi , fi0 , fi00 et fi000 pour i = 0, 1, 2, · · · , n − 1).
Ces 4n coefficients doivent être déterminés le plus efficacement possible pour que la
méthode reste attrayante. Comme nous allons le constater, une résolution astucieuse
conduit à un système linéaire tridiagonal de dimension (n + 1) qui pourra être résolu
par l’algorithme décrit à la section ??. Nous allons en effet exprimer toutes ces
inconnues en fonction des dérivées secondes fi00 aux noeuds. On complète donc notre
ensemble d’inconnues en introduisant la dérivée seconde fn00 au noeud xn de sorte que
nous aurons un grand total de 4n + 1 inconnues que nous réduirons en un système
de dimension n + 1.
Voyons combien de conditions ou d’équations nous pouvons imposer à ces 4n + 1
coefficients. Ces équations proviennent des conditions de régularité que l’on souhaite
imposer à la courbe résultante.
– On définit tout d’abord que fn00 est tout simplement la dérivée seconde de la
0.1. SPLINES CUBIQUES
3
spline en xn . On a ainsi une première équation :
00
000
00
000
fn00 = p00n−1 (xn ) = fn−1
+ fn−1
(xn − xn−1 ) = fn−1
+ fn−1
hn−1
qui peut aussi s’écrire :
00
fn00 − fn−1
hn−1
000
fn−1
=
(2)
– À sa première extrémité, le polynôme pi (x) passe (xi , f (xi )), c’est-à-dire :
pi (xi ) = fi = f (xi ) pour i = 0, 1, 2, · · · , n − 1
ce qui nous donne n équations ;
– De même, on obtient n nouvelles équations en regardant à la deuxième extrémité de chaque sous-intervalle. Pour i = 0, 1, 2, · · · , n − 1 :
pi (xi+1 ) = f (xi+1 ) = fi + fi0 (xi+1 − xi ) +
= f (xi ) + fi0 hi +
fi00
f 000
(xi+1 − xi )2 + i (xi+1 − xi )3
2!
3!
fi00 2 fi000 3
h +
h
2! i
3! i
On peut ainsi isoler fi0 pour obtenir :
fi0 =
f (xi+1 ) − f (xi ) fi00
f 000
f 00
f 000
−
hi − i h2i = f [xi , xi+1 ] − i hi − i h2i
hi
2!
3!
2!
3!
(3)
– On impose maintenant la continuité des dérivées secondes aux (n − 1) noeuds
intérieurs xi+1 , i = 0, 1, · · · , n − 2, c’est-à-dire n − 1 nouvelles équations :
p00i+1 (xi+1 ) = p00i (xi+1 )
ou encore :
00
fi+1
= fi00 + fi000 (xi+1 − xi ) = fi00 + fi000 hi
et en isolant fi000 , on trouve :
fi000 =
00 − f 00
fi+1
i
hi
(4)
Cette relation n’est a priori vraie que pour i = 0, 1, · · · n − 2. En vertu de
l’équation 2, elle est également vraie pour i = n − 1 de sorte que l’on peut
remplacer dans l’équation 3 qui devient :
µ 00
¶
fi+1 − fi00
fi00
0
fi = f [xi , xi+1 ] −
hi −
hi
2!
3!
et par la suite :
fi0 = f [xi , xi+1 ] −
00
hi fi00 hi fi+1
−
3
6
(5)
4
– Il ne reste plus qu’à imposer la continuité de la dérivée première aux mêmes
(n − 1) points intérieurs ((n − 1) nouvelles équations) :
p0i+1 (xi+1 ) = p0i (xi+1 )
ou encore :
fi000 2
h
2 i
On peut ensuite utiliser les expressions 4 et 5 pour tout exprimer en fonction des
inconnues fi00 . On a alors :
µ 00
¶
00
00
00
hi+1 fi+1
hi+1 fi+2
fi+1 − fi00
hi fi00 hi fi+1
00
f [xi+1 , xi+2 ]−
−
= f [xi , xi+1 ]−
−
+fi hi +
hi
3
6
3
6
2
0
fi+1
= fi0 + fi00 hi +
qui devient, en regroupant les termes :
00
00
hi fi00 + 2(hi + hi+1 )fi+1
+ hi+2 fi+2
= 6(f [xi+1 , xi+2 ] − f [xi , xi+1 ])
Une dernière simplification est possible si l’on divise chaque terme de cette dernière
équation par :
hi + hi+1 = xi+1 − xi + xi+2 − xi+1 = xi+2 − xi
ce qui donne :
hi+1
hi
00
fi00 + 2fi+1
+
f 00
= 6f [xi , xi+1 , xi+2 ]
(hi + hi+1 )
(hi + hi+1 ) i+2
(6)
pour i = 0, 1, 2, · · · , n − 2
On remarque que le terme de droite fait intervenir les deuxièmes différences divisées
que nous avons définies à la section ??. Dans le cas où les abscisses sont équidistantes,
c’est-à-dire hi = h quel que soit i, la matrice du système linéaire 6 se trouve simplifiée
de beaucoup :
1 00
1 00
00
fi + 2fi+1
+ fi+2
2
2
= 6f [xi , xi+1 , xi+2 ]
(7)
pour i = 0, 1, 2, · · · , n − 2
En effet, on obtient alors une matrice tridiagonale dont la diagonale principale ne
contient que des 2, tandis que les deux autres diagonales sont constituées de coefficients valant 12 . Cette matrice ne dépend donc pas de la valeur de h, qui n’affecte
que le terme de droite
Nous avons donc imposé un total de 4n − 1 contraintes à nos 4n + 1 inconnues de
départ. Nous avons également exprimé toutes les inconnues du système en fonction
des dérivées secondes fi00 de la spline et de fait il ne reste que n + 1 inconnues
pour les n − 1 équations du système 6. On doit donc ajouter, de façon plus ou moins
arbitraire, deux équations supplémentaires pour compléter le système et avoir autant
d’équations que d’inconnues. Nous présentons maintenant quelques possibilités dont
le choix précis dépend du problème et de la connaissance que l’on a de ce qui se
passe aux extrémités de la courbe.
0.1. SPLINES CUBIQUES
5
– La manière la plus simple de compléter le système d’équations consiste à imposer les valeurs des dérivées secondes aux deux extrémités soit p000 (x0 ) = a et
p00n−1 (xn ) = b :
f000 = a et fn00 = b
(8)
Cela supppose bien entendu que l’on connaı̂t les valeurs a et b de la dérivée
seconde aux extrémités de la courbe. Si a = b = 0, on qualifie de spline
naturelle la courbe qui en résulte. Ces deux équations s’ajoutent aisément au
système 6.
– Un autre choix possible consiste à imposer que :
½
f000 = f100 ou encore f000 − f100 = 0
(9)
00
00
fn−1 = fn00 ou encore fn−1
− fn00 = 0
ce qui revient à imposer une courbure constante dans le premier et dans le dernier intervalle. Ces contraintes s’ajoutent aussi aux équations 6 et complètent
ainsi le système de (n + 1) équations en (n + 1) inconnues.
– On peut aussi imposer les dérivées premières p00 (x0 ) = a et p0n−1 (xn ) = b aux
deux extrémités (en supposant toujours que nous les connaissions). En x0 , on
utilise directement la relation 5 :
f00 = f [x0 , x1 ] −
qui devient :
2f000 + f100 =
h0 f000 h0 f100
−
=a
3
6
6
(f [x0 , x1 ] − a)
h0
En xn cependant, on ne peut utiliser directement la relation 5 puisqu’elle n’est
définie que pour i allant de 0 à n − 2. Cependant, de la définition de pn−1 (x) :
0
00
p0n−1 (xn ) = fn−1
+ fn−1
hn−1 +
000
fn−1
h2
2 n−1
0
000
ce qui fait qu’en développant fn−1
et fn−1
à l’aide des formules 5 et 2, on
trouve :
hn−1 00
p0n−1 (xn ) = f [xn−1 , xn ] +
(fn−1 + 2fn00 )
(10)
6
Imposer b = p0n−1 (xn ) revient alors à :
00
fn−1
+ 2fn00 =
6
hn−1
(b − f [xn−1 , xn ])
et on doit donc ajouter au système 6 les équations :



2f000 + f100


=



00
 fn−1
+ 2fn00 =
6
(f [x0 , x1 ] − a)
h0
6
hn−1
(b − f [xn−1 , xn ])
(11)
6
– Une autre avenue intéressante est la condition dite « not-a-knot » en anglais.
Cela consiste à éliminer, mais de manière virtuelle seulement, les noeuds d’interpolation x1 et xn−1 . Pour ce faire, on impose en ces deux noeuds la continuité de la troisième dérivée soit :
000
000
000
p000
0 (x1 ) = p1 (x1 ) ainsi que pn−2 (xn−1 ) = pn−1 (xn−1 )
ce qui revient à :
000
000
f0000 = f1000 et fn−2
= fn−1
et enfin, en utilisant 4 :
00
00
f 00 − fn−2
f 00 − fn−1
f100 − f000
f 00 − f100
= 2
ainsi que n−1
= n
h0
h1
hn−2
hn−1
On doit donc ajouter au système 6 les équations :
h1 f000 − (h0
00
hn−1 fn−2 − (hn−2
+ h1 )f100 + h0 f200
= 0
00
+ hn−1 )fn−1
+ hn−2 fn00 = 0
(12)
Au noeud x1 , les polynômes p0 (x) et p1 (x) coı̈ncident ainsi que leurs trois
premières dérivées. Puisque ce sont des polynômes de degré 3, ils sont donc
identiques et il n’y a en fait qu’un seul polynôme de degré 3 dans les deux
premiers intervalles. C’est pourquoi on dit que le noeud x1 n’est pas vraiment
un noeud (« not-a-knot » ). Il en est de même pour les polynômes pn−2 (x) et
pn−1 (x) adjacents au noeud xn−1 .
– Une dernière situation intéressante et fréquemment utile concerne la représentation de fonctions périodiques. Dans ce cas, on doit vérifier dès le départ que
f (x0 ) = f (xn ) mais cela ne suffit pas à imposer la périodicité de la spline. On
doit aussi imposer la périodicité des dérivées première et deuxième soit f00 = fn0
et f000 = fn00 . Cette dernière équation est facilement intégrée au système tandis
que pour la première, on a en vertu des équations 5 et 10 :
f [x0 , x1 ] −
h0 f000 h0 f100
hn−1 00
−
= f [xn−1 , xn ] +
(fn−1 + 2fn00 )
3
6
6
On doit donc imposer les deux conditions suivantes pour avoir la périodicité :

= 0
f000 − fn00


(13)

 h0 f 00 + h0 f 00 + hn−1 f 00 + hn−1 f 00 = f [x , x ] − f [x
0 1
n−1 , xn ]
3 0
6 1
6 n−1
3 n
Remarque 0.1
D’autres choix sont possibles. Tout dépend de l’information disponible pour un problème donné. On remarque de plus que pour les deux derniers type de conditions
aux extrémités, les systèmes linéaires obtenus ne sont plus tridiagonaux. ¨
Remarque 0.2
0.1. SPLINES CUBIQUES
7
Pour effectuer une interpolation à l’aide des splines cubiques, il faut en premier
lieu calculer les dérivées secondes fi00 en résolvant le système 6 complété par les
conditions aux extrémités 8, 9, 11, 12 ou encore 13. Par la suite, on doit déterminer
l’intervalle dans lequel se situe le point d’interpolation x et calculer le polynôme
dans cet intervalle en utilisant la formule 1 dans laquelle on remplace :

fi = f (xi )


00


hi fi00 hi fi+1
−
fi0 = f [xi , xi+1 ] −
(14)
3
6

00 − f 00

f

i
i+1
 f 000 =
i
hi
¨
Remarque 0.3
Bien que l’expression 1 de la spline cubique ne fasse intervenir les troisièmes dérivées,
nous n’avons à aucun moment imposé la continuité de la dérivée troisième (sauf pour
la condition « not-a-knot » ). Par conséquent, la courbe résultante n’est que deux
fois différentiable. ¨
Exemple 0.1
Soit les 4 points suivants : (1 , 1), (2 , 4), (4 , 9), (5 , 11). On trouve toute
l’information nécessaire au calcul de la spline cubique dans la table suivante.
Données pour le calcul de la spline
i xi f (xi ) f [xi , xi+1 ] f [xi , xi+1 , xi+2 ] hi
0 1
1
1
3
1 2
4
− 16
2
2
4
9
5
2
2
3
5
− 16
1
11
La première équation (i = 1) du système 6 devient :
µ ¶
µ ¶
µ ¶
1
2
1
00
00
00
f0 + 2f1 +
f2 = 6 −
3
3
6
et la deuxième équation (i = 2) s’écrit :
µ ¶
µ ¶
µ ¶
2
1
1
00
00
00
f1 + 2f2 +
f3 = 6 −
3
3
6
Pour obtenir la spline naturelle

1 0
 13 2

 0 2

3
0 0
(f000 = f300 = 0), on résout le système :

  00  
0
f0
0 0
2
  00   −1 
3 0   f1 



 00  = 
2 13 
  f2   −1 
0
f300
0 1
8
dont la solution est f000 = 0, f100 = −3/8, f200 = −3/8 et f300 = 0.
Pour obtenir l’équation de la spline dans le premier intervalle, on doit utiliser les
relations 1 et 14. On obtient :
f0
= 1
f00
= f [x0 , x1 ] −
h0 f000 h0 f100
(1)(0) (1)(−3/8)
49
−
=3−
−
=
3
6
3
6
16
3
f100 − f000
=−
h0
8
f0000 =
et on a :
49
0
3
(x − 1) + (x − 1)2 − (x − 1)3
16
2
48
Ce polynôme n’est défini que dans l’intervalle [1 , 2]. On peut par exemple l’évaluer
en x = 1,5 pour obtenir 2,523 4375.
De même, si l’on a besoin de la valeur de la spline en x = 3, qui est situé dans le
deuxième intervalle (soit [2 , 4]), on peut obtenir l’équation de la spline dans cet
intervalle en posant i = 1 dans l’équation 1. On a alors :
p0 (x) = 1 +
f1
= 4
f10
= f [x1 , x2 ] −
f1000 =
5 (2)(−3/8) (2)(−3/8)
23
h1 f100 h1 f200
−
= −
−
=
3
6
2
3
6
8
f200 − f100
=0
h1
et on a :
23
3
(x − 2) − (x − 2)2
8
16
La valeur de la spline en x = 3 est donc 6,6875. La spline complète est illustrée à la
figure 3. J
p1 (x) = 4 +
Exemple 0.2
Si l’on reprend l’exemple où la vitesse d’un véhicule est mesurée toutes les 5 secondes,
on obtient la spline de la figure ??. On remarque immédiatement que les fortes
oscillations observées à la figure ?? avec un polynôme de degré 9 ont maintenant
disparu. On peut alors interpoler la valeur de la vitesse du véhicule partout dans
l’intervalle [0 , 45] sans risque d’obtenir des valeurs aberrantes. J
0.1.2
Splines paramétrées
Les logiciels de conception assistée par ordinateur (CAO) doivent fréquemment
relier des points que l’utilisateur spécifie à l’écran en cliquant à l’aide de la souris. La
courbe résultante n’est pas forcément de la forme y = f (x) en ce sens qu’elle peut
0.1. SPLINES CUBIQUES
9
11
9
4
1
1
2
4
x
5
Figure 3 – Spline passant par 4 points
75
Vitesse
(km/h)
70
65
60
55
50
45
40
35
30
25
20
0
5
10
15
20
25
30
35
40
Temps (s)
Figure 4 – Spline cubique associée à la vitesse d’un véhicule
45
10
contenir des boucles et prendre des formes tout à fait quelconques. Nous ne pouvons donc pas utiliser directement la méthodologie que nous venons de développer.
Comme nous le verrons, il suffit cependant d’une très légère modification.
On souhaite ainsi, à l’aide de quelques points donnés dans un plan ou dans
l’espace à 3 dimensions, construire des trajectoires complexes permettant de faire
la conception d’objets de formes très diverses. Pour y arriver, on peut avoir recours
aux splines cubiques paramétrées que nous allons maintenant décrire.
La paramétrisation d’une courbe s’obtient par une équation de la forme :
~γ (t) = (γ1 (t), γ2 (t), γ3 (t)),
t ∈ [a, b]
On décrit la courbe en faisant varier le paramètre t entre a et b. Pour construire
une courbe paramétrée passant par les points (xi1 , xi2 , xi3 ) pour i = 0, 1, 2, · · · , n, il
faut d’abord construire la suite ti des valeurs du paramètre t de telle sorte que :
~γ (ti ) = (xi1 , xi2 , xi3 )
Le choix le plus simple est bien sûr ti = i, mais il ne tient aucun compte des distances
respectives entre les points (xi1 , xi2 , xi3 ). Un choix plus judicieux consiste à prendre
t0 = 0 et :
ti = ti−1 + ||~xi − ~xi−1 ||2 pour i ≥ 1
(15)
La distance entre les valeurs du paramètre t est ainsi variable et dépend directement de la distance entre les points d’interpolation, ce qui assure un meilleur
équilibre de la courbe résultante.
Pour obtenir la spline paramétrée passant par n points donnés, il suffit de calculer
les 3 splines passant respectivement par les points (ti , xi1 ), (ti , xi2 ) et (ti , xi3 ) (en
dimension 2, on laisse tomber la troisième spline). Il suffit donc de suivre les étapes
suivantes :
– créer le vecteur t contenant les valeurs des ti suivant l’équation 15. On notera
tmax la valeur maximale du vecteur t. Les ti étant croissants, on a tmax = tn ;
– créer un vecteur tt qui varie entre 0 et tmax , mais avec une partition beaucoup
plus fine que celle de t. En effet, la spline paramétrée sera évaluée entre les
points d’interpolation et c’est ce qui assurera une courbe plus lisse. Typiquement, le vecteur tt variera également entre 0 et tmax et contiendra jusqu’à 10
fois plus de points que le vecteur t ;
– calculer les 3 splines différentes passant par les points (ti , xi1 ), (ti , xi2 ) et (ti , xi3 ).
On fera en sorte d’évaluer ces splines à tous les points du vecteur tt ;
– tracer la spline paramétrée passant par les points du vecteur tt.
Pour illustrer ce processus, considérons (en dimension 2) les points (xi1 , xi2 ) sui-
0.1. SPLINES CUBIQUES
11
0,8
x2
0,6
0,4
0,2
0
−0,2
−0,4
−0,6
−0,8
0
0,5
1
1,5
2
2,5
3
3,5
4
x1
Figure 5 – Points reliés par des segments de droite
vants :
xi1
4,00
2,25
1,00
0,25
0,00
Points de
xi2
−0,666 667
+0,375 000
+0,666 667
+0,458 333
−0,458 333
la spline
xi1
xi2
0,25 −0,458 333
1,00 −0,666 667
2,25 −0,375 000
4,00 +0,666 667
et qui sont illustrés à la figure 5. Les points ainsi reliés par des segments de droite,
la courbe qui en résulte n’est pas très élégante et ne permettrait pas une conception
harmonieuse. Le vecteur t résultant de l’équation 15 est de longueur 9 et prend les
valeurs :
t = [0 , 2,0366 , 3,3201 , 4,0985 , 4,6206 , 5,1427 , 5,9211 , 7,2047 , 9,2412]
On a alors tmax = 9,2412. Le vecteur tt est tout simplement une partition de l’intervalle [0 , tmax ] par incréments d’environ 0,5. On calcule alors les 2 splines passant
par les points (ti , xi1 ) et (ti , xi2 ) qui sont illustrées à la figure 6. On constate donc
que chacune de ces splines est de la forme étudiée à la section 0.1.1. Si l’on trace, à la
figure 7, la spline paramétrée, on constate une courbe très lisse (2 fois différentiable).
12
4
x1
3
2
1
0
-1
0
1
2
3
4
5
6
7
8
9
10
9
10
t
1
x2
0,5
0
−0,5
-1
0
1
2
3
4
5
6
7
8
t
Figure 6 – Splines passant par les points (ti , xi1 ) et (ti , xi2 )
0,8
x2
0,6
0,4
0,2
0,0
−0,2
−0,4
−0,6
−0,8
−0,5
0,0
0,5
1,0
1,5
2,0
2,5
3,0
x1
Figure 7 – Spline paramétrée
3,5
4,0