Cours Université d`Orléans

Transcription

Cours Université d`Orléans
Université d’Orléans
U.F.R. Faculté des Sciences
Licence de Physique
Analyse numérique pour les sciences physiques
Jean-Philippe Grivet, 2005
Chapitre 1
Représentation graphique de
fonctions
L’une des activités les plus fréquentes en informatique scientifique consiste à représenter l’allure
d’une fonction à l’aide d’un dessin, et de très nombreux logiciels peuvent répondre à cette attente
légitime. On peut distinguer deux cas un peu différents en pratique : la fonction est définie par une
ou des formules, ou elle est représentée par un tableau de valeurs. Si le premier cas ne présente
aucune difficulté, le deuxième demande que l’on sache faire lire un fichier de données par le logiciel
considéré, à moins de devoir entrer toutes les valeurs au clavier. J’explique la marche à suivre, pour
quelques logiciels pratiques et faciles d’accès, dans les paragraphes qui suivent.
1.1
Scilab
Scilab est un logiciel gratuit, très puissant et disponible sur le site de l’INRIA. On peut l’utiliser
de façon interactive (comme une calculette) ou préparer, à l’aide d’un éditeur de texte (par exemple
celui qui est incorporé dans Scilab depuis la version 2.7), un programme que l’on fera exécuter
ensuite.
Supposons que je souhaite tracer une sinusoïde amortie, répondant à l’équation
y = exp(−αx) cos(βx),
pour α = 0.3, β = 2 et 0 ≤ x ≤ 10. Les instructions suivantes conviennent.
deff("y = f(x)", "y = exp(-alfa*x)*cos(beta*x)")
alfa = 0.4; beta = 0.4;
x = 0:0.1:10;
fplot2d(x,f)
Le résultat apparaît sur la figure. Ce n’est pas ici le lieu de détailler la syntaxe de Scilab, qui est
très bien expliquée dans l’aide en ligne, dans les manuels et sur divers sites (voir les références en
fin de chapitre) ; je me contenterais de quelques indications. La première ligne définit une fonction
f laquelle dépend d’un seul argument, x ; y est une variable interne à la définition et ne joue
aucun rôle dans la suite. Une définition de ce genre, dite «en-ligne», ne doit pas occuper plus
d’une ligne ! Les points-virgules indiquent à Scilab qu’il ne doit pas afficher à l’écran les valeurs
qui viennent d’être définies. La troisième ligne initialise un vecteur, x, dont les coordonnées sont
x1 = 0, x2 = 0.1, x3 = 0.2, . . . , x101 = 1. Vous pouvez constater qu’il se passe pas mal de choses
«en douce» lors de l’appel de la fonction fplot. Chaque composante du vecteur x est substituée
à l’argument formel x de la «fonction externe» f, la valeur de la fonction est calculée et constitue
2
Chapitre 1. Représentation graphique de fonctions
Fig. 1.1 – Une sinusoïde amortie représentée par Scilab
1.0
0.8
0.6
0.4
0.2
0
−0.2
−0.4
−0.6
−0.8
0
1
2
3
4
5
6
7
8
9
10
une composante d’un vecteur. Le programme interpole ensuite entre composantes successives pour
produire un tracé lisse.
Vous pouvez définir vous-même complètement la suite de points à représenter, comme ceci
alfa = 0.4; beta = 0.4;
x = 0:0.1:10;
y = exp(-alfa*x).*cos(beta*x);
plot2d(x,y)
Ici, y est un vecteur que Scilab calcule composante par composante à partir des coordonnées
du vecteur x. Faites bien attention à l’écriture «.*» (point étoile) qui réalise cette multiplication
composante par composante. Sans le point, y n’est que le produit scalaire (une seule valeur) des
vecteurs exp(-alfa*x) et cos(beta*x).
Les fonctions fplot2d ou plot2d admettent de nombreux paramètres qui permettent de modifier le domaine de variation des coordonnées, la couleur et l’épaisseur des traits, etc. . .
Comment procéder pour tracer la courbe correspondant à un fichier de valeurs numériques ?
C’est une opération très semblable à la précédente. Je suppose que le fichier D:/an_poly/ex112.dta
contient les données qui m’intéressent, à raison de trois par ligne, ces nombres étant séparés par
des espaces ou une tabulation :
1.0 -2.2
.831
-6 123.456
-3
3.1415
2.718281828
-0.3183098
Je procède alors comme suit
M = read("D:/an_poly/ex112.dta", -1,3);
plot2d(M(:,1),M(:,3),-3)
Scilab admet aussi bien les obliques que les contre-obliques dans les noms de fichiers. À la première
ligne, je lis le contenu du fichier et je range les valeurs dans la matrice M. La valeur -1 oblige Scilab
à lire toutes les lignes de D:/an_poly/ex112.dta quelque soit leur nombre et le point-virgule est
là pour l’empêcher d’afficher ces valeurs à l’écran. Je représente ensuite graphiquement tous les
nombres de la troisième colonne de M (ordonnées) en fonction des valeurs correspondantes de la
première colonne (abscisses). Sauf indication contraire, Scilab relie les points par de segments. Pour
empêcher cela, j’ai indiqué un «style» de trait négatif (-3 ici) ; Scilab représente alors des points
isolés à l’aide d’un symbole.
Pour imprimer, on utilise l’option «imprimer» du menu déroulant «fichier» dans la fenêtre qui
contient le graphe.
3
1.2. Maple
Fig. 1.2 – Représentation d’une série de valeurs sous Scilab
2
⊕
1
⊕
0
−1
−2
⊕
−3
−4
−7
1.2
−5
−3
−1
1
3
5
Maple
Le logiciel Maple est orienté vers le calcul algébrique ; il possède cependant des possibilités
graphiques extrêmement puisssantes, dont voici un tout petit aperçu. Le dialogue suivant permet
de tracer une sinusoïde amortie.
>
y := exp(-alpha*x)*cos(beta*x);
>
y := e(−α x) cos(β x)
y1 := subs(alpha = 0.3, beta = 4,y);
y1 := e(−.3 x) cos(4 x)
>
plot(y1,x = 0..10);
Fig. 1.3 – Tracé d’une sinusoïde amortie par Maple
0.5
–6
–4
–2
2
0
–0.5
–1
–1.5
–2
–2.5
–3
J’aurais pu me contenter de l’instruction unique
> plot( exp(-0.3*x)*cos(4*x),x = 0..10) ;
mais la version précédente me permet de définir une quantité y dépendant de deux paramètres dont
je peux modifier la valeur aisément. Le symbole % signifie pour Maple «expression précédente»
(c’est ¨ qui joue ce rôle pour la version V4).
4
Chapitre 1. Représentation graphique de fonctions
La lecture d’un tableau de valeurs externe se fait par l’instruction «readdata» qui admet deux
paramètres obligatoires, le nom du fichier et le nombre de colonnes. On peut aussi préciser s’il
s’agit d’entiers ou de nombres fractionnaires. La manoeuvre est simple dans le cas d’un tableau à
deux colonnes, comme le montre l’exemple ci-dessous. J’ai créé le fichier dont le nom complet est
\"D:\an_poly\ex122.dta\" et dont le contenu est
-2
-3.1
-1.1
-.99
0
1
2.222 3.1415
4
5
Je trace le graphe correspondant à l’aide des instructions
>
M := readdata("C:/an_poly/ex122.dta",2);
M := [[−2., −3.1], [−1.1, −.99], [0., 1.], [2.222, 3.1415], [4., 5.]]
>
plot(M);
Fig. 1.4 – Tracé d’une suite de points par Maple
4
2
–2
–1
1
2
3
4
–2
Les nombres entiers ont été transformés en nombres fractionnaires. Remarquez aussi que les
contre-obliques du nom de fichier sont remplacées par des obliques sous Maple. Il est un peu
plus compliqué d’extraire d’un fichier une colonne d’abscisses et une colonne d’ordonnées. Il faut
procéder comme ceci. Le fichier dont le nom DOS complet est D:\an_poly\ex123.dta contient les
valeurs :
1.0 -2.2
.831
-6 123.456
-3
3.1415 2.718281828
-0.3183098
5
1.3. gnuplot
L’instruction > M := readdata("D:/an_poly/ex123.dta",3); lira ces données et produira le
résultat
M := [[1.0, -2.2, .831],[-6., 123.456, -3.],[3.1415, 2.718281828,
-.3183098]]
Maple considère M comme une liste de listes, chaque liste représentant une ligne. Le code ci-dessous
extrait les nombres de la première colonne (abscisses) et ceux de la troisième colonne(ordonnées),
par exemple, puis reporte les points sur un graphique.
>
restart;
>
with(plots):
>
M := readdata("C:/an_poly/ex112.dta",3);
>
M := [[1.0, −2.2, .831], [−16., 123.456, −3.], [3.1415, 2.718281828, −.3183098]]
points := [seq([M[i,1],M[i,3]],i=1..3)];
>
points := [[1.0, .831], [−16., −3.], [3.1415, −.3183098]]
plot(points,style=POINT,symbol=BOX, thickness=2,symbolsize=20);
Fig. 1.5 – Tracé d’une suite de points par Maple
0.5
–6
–4
–2
2
0
–0.5
–1
–1.5
–2
–2.5
–3
1.3
gnuplot
gnuplot est un autre logiciel gratuit et puissant, disponible pour tous les systèmes d’exploitation ; il a l’avantage d’être assez peu encombrant. Il possède un analyseur syntactique qui connaît
la plupart des fonctions élémentaires. Il est très facile d’accomplir avec gnuplot les deux tâches qui
me servent d’exemples depuis le début. Pour tracer une fonction définie par une formule :
>
>
alfa = 0.3; beta = 4;
plot [0:10] exp(-alfa*x)*cos(beta*x);
La fonction «plot» admet comme premier paramètre l’intervalle de variation de la variable indépendante, laquelle doit s’appeler x, par convention.
Pour afficher un fonction définie comme une suite de valeurs (x, y) :
> plot [-2.5:0] [-3.5:1.5] "D:/an_poly/ex142.dta"
Ici encore, les obliques remplacent les contre-obliques de MS-DOS ; j’ai indiqué l’intervalle de
variation pour x et pour y.
6
Chapitre 1. Représentation graphique de fonctions
Comme gnuplot possède de très nombreuses options, qu’il serait malcommode de préciser à
chaque tracé, il est recommandé d’utiliser un fichier de commande. On peut pour cela créer, à la
main, un tracé simple puis sauvegarder toutes les options en cours dans un fichier par la commande
save <nom_de_fichier>. Ce fichier texte est lisible et modifiable dans n’importe quel éditeur ; on
peut donc, à loisir, ajouter ou modifier des paramètres. On exécute ensuite le fichier modifié par
la commande load <nom_de_fichier>.
La méthode la plus directe pour imprimer sous Windows consiste à cliquer sur l’icone située en
haut à gauche du graphe, puis à choisir options/print.
1.4
Excel
Tous les tableurs comportent des outils graphiques puissants. Dans le cas d’une fonction analytique, ; s’agissant d’un fichier de données, le seul obstacle mineur est la lecture du fichier. Dans
le cas d’une version assez récente d’Excel, par exemple, on clique sur fichier/ouvrir, on indique que
l’on s’intéresse à tous les types de fichiers, on choisit le bon fichier dans la liste déroulante et on
l’ouvre. Il faut alors répondre aux questions simples de «l’assistant d’importation de textes» qui
concernent la disposition des données. Le fichier est ensuite importé dans Excel, ligne par ligne
et colonne par colonne ; il faut parfois retoucher certaines lignes ou colonnes si la disposition des
nombres est très irrégulière. Les logiciels comme Pascal ou C créent des fichiers de résultats où les
nombres fractionnaires sont écrits avec des points, alors que la version francisée d’Excel attend des
virgules. Il est facile, après sélection des cellules concernées, d’utiliser édition/remplacer/remplacer
tout pour corriger ces données. Pour le tracé, on appele «l’assistant graphique» et on répond à ses
questions.
1.5
Logiciels sous Linux
Les utiisateurs du système Linux ont à leur disposition de nombreux autres outils graphiques
gratuits. Je citerais la collection de programmes «Plotutils» (qui se lancent depuis la ligne de
commande), la bibliothèque «pgplot» concue pour s’interfacer facilement avec des programmes en
Fortran et enfin le somptueux «xmgrace» interactif.
1.6
Liens utiles
– Scilab :
http ://scilabsoft.inria.fr/
http ://www.iecn.u-nancy.fr/ pincon/
http ://www.dma.ens.fr/ ldumas/aide.html
www.math-info.univ-paris5.fr/Enseignements/demarre_scilab/demarre_scilab.html
– Maple :
http ://www.maplesoft.com/
lumimath.univ-mrs.fr/ jlm/cours/maple/maple.html
http ://algo.inria.fr/dumas/Maple/
http ://perso.wanadoo.fr/eddie.saudrais/
http ://www-math.math.rwth-aachen.de/MapleAnswers/
– gnuplot :
http ://www.gnuplot.info/
ftp ://ftp.irisa.fr/pub/gnuplot/
– Grace :
http ://plasma-gate.weizmann.ac.il/Grace/
7
1.6. Liens utiles
– plotutils :
www.gnu.org/software/plotutils/
– pgplot :
http ://www.astro.caltech.edu/ tjp/pgplot/
– visualisation 3D http ://www.cmap.polytechnique.fr/ jouve/xd3d/
– un site généraliste http ://ufrmeca.univ-lyon1.fr/formation/ISTIL/OutilsInfo/
– une entrée dans le monde de Linux http ://sal.linet.gr.jp/index.shtml
8
Chapitre 2
Calcul de Fonctions
Sachant qu’un ordinateur ne connaît que les 4 opérations de l’arithmétique (addition, sous√
traction, multiplication et division), comment doit-on s’y prendre pour calculer les valeurs de x,
cos x ou J3 (x) ? On doit faire appel à un algorithme et il existe des algorithmes de calcul pour
chaque fonction. Certains datant de l’antiquité (pour le calcul des racines carrées), d’autres n’ont
que quelques années d’existence. L’utilisateur devrait donc, en principe, écrire un sous-programme
pour calculer la ou les fonctions qui l’intéresse. Une partie du travail est déjà fait ; depuis quelques
années, les microprocesseurs incorporent un opérateur mathématique capable de calculer vite et
bien les fonctions élémentaires. Les compilateurs comportent également des sous-programmes de
calcul de fonctions, plus ou moins nombreux selon le compilateur. Cependant, on rencontre souvent des «fonctions spéciales» telles que les fonctions de Bessel, les polynômes de Legendre ou les
fonctions elliptiques pour lesquelles il n’existe pas de programme immédiatement disponible. On
peut alors rechercher le programme convenable dans les livres ou dans les bibliothèques (voir le
«GAMS», Guide to available mathematical software) ou écrire un programme soi-même.
J’estime qu’il est extrêmement instructif et utile d’apprendre à programmer le calcul d’une
fonction : on doit découvrir le «bon» algorithme, on apprend à se défier des erreurs d’arrondi ou
de troncation, enfin on s’entraîne à rédiger un programme correct. Dans tous les cas simples, la
vérification du programme est immédiate, par comparaison avec le résultat fourni par le compilateur
ou la calculette.
Une catégorie de fonctions se calcule exactement en utilisant uniquement des opérations arithmétiques, ce sont les polynômes et les fractions rationnelles. Ils font l’objet du prochain paragraphe.
2.1
Polynômes et fractions rationnelles
Un polynôme sous forme générale s’écrit
p(x) = a0 + a1 x + a2 x2 + · · · + an−1 xn−1 + an xn .
Les coefficients ak et la variable x sont supposés réels. S’il n’y a aucune difficulté pour calculer la
valeur numérique de p(x0 ), pour la valeur x = x0 de la variable, je peux me demander quelle est
la façon la plus rapide de parvenir au résultat.
La méthode «naïve» consiste à calculer séparément la valeur de chaque puissance de x0 , puis
à multiplier chaque quantité xk0 par le coefficient ak correspondant, puis à faire la somme des
résultats intermédiaires. Pour obtenir ak xk0 , je dois faire k multiplications (n ≥ k ≥ 1) et donc
n(n + 1)/2 multiplications en tout ; il s’y ajoute n additions. L’algorithme naïf demande donc un
nombre d’opérations qui varie comme n2 ; on dit qu’il présente une complexité d’ordre n2 .
Un méthode plus économique est fondée sur la remarque que le calcul de xk0 peut se faire
simplement à partir de la valeur de xk−1
: xk0 = x0 ? xk−1
. On calcule l’ensemble des xk0 , k = 2 . . . n
0
0
9
2.2. Relations de récurrence
en n − 1 multiplications et on garde en mémoire tous les résultats. Il faut ensuite multiplier chaque
puissance de x par le bon coefficient (n − 1 opérations) et faire la somme. Vous vérifierez sans peine
que le nombre total d’opérations varie comme 3n.
L’algorithme de Horner perfectionne le méthode précédente. Il est fondé sur le fait que le
polynôme peut s’écrire
p(x) = ((an ? x + an−1 ) + an−2 ) ? x + · · · + a1 ) ? x + a0 .
Sous cette forme, le calcul de la valeur numérique nécessite n multiplications et n additions, soit
une «complexité» d’ordre 2n. Comment programmer pratiquement ce calcul ? Le polynôme est
représenté en mémoire par le vecteur de ses coefficients, a = [a0 , a1 , . . . , an ]. Si le degré est élevé,
il est fastidieux d’écrire en entier la formule précédente, il vaut mieux utiliser la récurrence
z0 = an
;
zk = xzk−1 + an−k ,
k = 1, 2, . . . , n.
On peut faire ce calcul à la main, en utilisant une disposition comme ci-dessous ; il s’agit de calculer
la valeur de x5 + 2x3 − 3x2 + 4x − 1 pour x = 2.
1
1
0
2
2
6
-3
9
4
22
-1
43
Le premier élément de la deuxième ligne est z0 , il est égal à an ; le deuxième élément (z1 ) vaut
2z0 + an−1 = 2z0 = 2, le troisième est z2 = 2z1 + an−2 = 2 ? 2 + 2 = 6. La valeur de polynôme est
43. Vous voyez qu’il faut tenir compte des coefficients nuls.
Une fraction rationnelle est le quotient de deux polynômes ; il suffit de calculer comme précédemment le numérateur et le dénominateur avant d’effectuer la division.
2.2
Relations de récurrence
Certaines fonctions utiles obéissent à des relations de récurrence, le plus souvent à trois termes.
La fonction cosinus en fournit un exemple élémentaire :
cos(k + 1)x = 2 cos kx cos x − cos(k − 1)x.
On peut utiliser cette relation, avec x «assez petit» pour établir rapidement une table des valeurs
de cos kx.
Exemple. Les polynômes de Legendre obéissent à la relation de récurrence suivante
(n + 1)Pn+1 (x) = (2n + 1)xPn (x) − nPn−1 (x)
qui permet un calcul rapide et précis de Pn (x) pourvu que l’on connaisse P0 = 1 et P1 (x) = x. Les
deux petits fichiers qui suivent permettent le calcul puis l’affichage de Pn sous Scilab.
Remarquez l’instruction pp = ones(x) qui crée un vecteur de la même taille que x et dont
toutes les composantes sont égales à 1. Rappel : la construction «.*» permet de faire le produit
composante par composante de deux vecteurs : si a = {ai } et b = {bi }, alors a. ∗ b = {ai bi }.
On effectuerait de façon analogue une division ou une élévation à la puissance. Ce type de calcul
est beaucoup plus rapide qu’une boucle for. La figure montre le résultat dans le cas n = 9.
10
Chapitre 2. Calcul de Fonctions
Listing 2.1 – polynôme de Legendre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
function y = p o l e g ( n , x )
// polynome de Legendre
select n
case 0 then pp = ones ( x ) ;
case 1 then pp = x
else
pavder = ones ( x ) , pder = x ; i = 1 ;
while i < n
pp = ( ( 2 ∗ n+1)∗x . ∗ pder − n∗ pavder
pavder = pder ; pder = pp ;
i = i + 1;
end
end
y = pp ;
endfunction
) / ( n +1);
g e t f ( "C: \ an_poly \ l e g e n d r e . s c e " ) ;
n = input ( " d e g r e du polynome : " ) ;
x = linspace ( − 1 , 1 , 2 0 0 ) ;
y = poleg (n , x ) ;
xset ( "window" , 0 ) , xbasc ( 0 )
plot2d ( x , y )
2.3
Développement limité
La grande majorité des fonctions que l’on rencontre en sciences physiques admet un développement en série ; il est donc tentant d’utiliser un développement en série tronqué (un polynôme)
pour le calcul numérique d’une telle fonction.
Dans les paragraphes précédents, il n’y avait aucune approximation ; si les résultats n’étaient
pas tout à fait exacts, cela était du aux «erreurs d’arrondi», sur lesquelles je reviendrai à la fin de ce
chapitre. L’utilisation d’un développement en série tronqué au terme de rang n fait apparaître une
autre source d’erreur, liée à la méthode utilisée elle-même : au lieu d’une série infinie, je manipule
un polynôme à n termes, commettent ainsi ce que l’on appelle une «erreur de troncation» (ou
erreur de méthode). Cette erreur est souvent assez facile à borner, à condition de savoir que la
variable indépendante est contenue dans un intervalle défini.
Pour montrer les avantages et inconvénients de cette approche, je choisis l’exemple simple de
la fonction e−x , que je voudrais approcher par son développement en série tronqué, avec une
erreur absolue inférieure au millième, sur l’intervalle [0,10]. Le terme général du développement est
k
uk = (−1)k xk! . La série est absolument convergente quelque soit x, ce qui, malheureusement, n’est
pas synonyme de rapidement convergente. Je peux estimer le nombre de termes nécessaires à partir
du rapport |uk+1 /uk | = x/(k + 1). Ce rapport est plus grand que un (les termes de la série sont
croissants en valeur absolue) tant que k + 1 < |x|. Cela implique qu’au bord de l’intervalle choisi,
il faudra bien plus de 10 termes pour approcher la fonction exponentielle. En fait, pour x = 10,
j’ai trouvé v9 ' −2755, 7 et v10 ' 2755, 7. Plus ennuyeux encore, sachant que e3 ' 20, j’estime que
e−10 ' 5 10−5 . Ceci signifie que pour atteindre une précision absolue du millième, le premier terme
négligé devra être inférieur à 5 10−8 . Le premier terme qui réponde à ce critère est le 39ième ; on
trouve alors e−10 ' 0, 0000454. Il faut remarquer que chacun des 39 termes doit être calculé avec
une précision absolue de 510−8 , soit 12 (douze) chiffres significatifs pour les plus grands d’entre
eux, sous peine de perdre toute précision à cause des erreurs d’arrondi pendant l’addition de termes
11
2.4. Fraction continue
Fig. 2.1 – Le polynôme de Legendre d’ordre 9.
1.0
0.8
0.6
0.4
0.2
0
−0.2
−0.4
−0.6
−0.8
−1.0
−1.0
−0.8
−0.6
−0.4
−0.2
0
0.2
0.4
0.6
0.8
1.0
de signes différents. Cet exemple est certes caricatural ; en pratique, on s’arrangerait pour réduire
l’intervalle de définition de x. Il montre cependant que le calcul à l’aide de développements tronqués
doit faire l’objet d’une attention certaine.
Sans me laisser abattre par les remarques précédentes, j’ai rédigé un programme de calcul de
e−x sous Scilab, que je reproduis ci-dessous. Je calcule chaque terme à partir du précédent (ligne
Listing 2.2 – Développement limité de l’exponentielle
1
2
3
4
5
6
7
8
9
10
11
12
//mon_exp , d e c r o i s s a n t e .
e p s = 1E−8; kmax = 4 0 ;
terme = 1 ; somme = 1 ; k = 1 ;
x = input ( " v a l e u r de x : " ) ;
while ( k<kmax ) & ( abs ( terme ) > e p s )
terme = −x∗ terme /k ;
somme = somme + terme ;
[ r e s ] = [ k , terme , somme ] ;
write(% i o ( 2 ) , r e s ) ;
k = k+1;
end
somme , exp(−x )
6), en évitant soigneusement de former des factorielles ou des puissances de x : ce serait beaucoup
plus long et surtout les résultats intermédiaires déborderaient de la capacité de l’ordinateur. Les
lignes (8,9) affichent, de façon plutôt malcommode, des résultats intermédiaires (il y a bien d’autres
façon de faire).
2.4
Fraction continue
L’objet mathématique représenté ci-dessous est une «fraction continue» :
f = b0 +
a1
b1 +
b2 +
12
a2
b3 +
a3
a4
b4 + · · ·
Chapitre 2. Calcul de Fonctions
Pour simplifier le travail des imprimeurs, j’écrirais plutôt
f = b0 +
a1 a2 a3 a4
···
b1 + b2 + b3 + b4 +
Une expression de ce genre n’a d’intérêt que si les ai et les bi sont des constantes ou des fonctions
simples de x, comme dans la représentation de la fonction tangente :
tg x =
x x2 x2 x2
.
1− 3− 5− 7−
Cette expression converge rapidement et nécessite moins d’opérations que le développement en série
tronqué de la même fonction. Elle souffre cependant d’un inconvénient pratique sérieux : il n’y a
pas moyen de déterminer a priori le nombre de termes à conserver pour obtenir une précision fixée
à l’avance. Il existe en fait un algorithme itératif qui permet le calcul de f «de gauche à droite»
à partir des ai et des bi et que l’on peut interrompre lorsque deux approximations successives
ont suffisamment proches (algorithme de Clenshaw). Sans faire appel à ce perfectionnement, on
peut apprécier ce type d’approximation sur l’exemple de tg x ; si je tronque la fraction continue
précédente après le terme x2 /9, j’obtient, après réduction au même dénominateur
tg x =
x 943 − 105x2 + x4
.
15 63 − 28x2 + x3
Les premiers zéros de numérateur sont ±1,57080 et ceux du dénominateur ±3,153, ce qui est proche
des valeurs exactes.
En fait, une fonction comme tg x, avec ses asymptotes verticales, a un comportement très éloigné
de celui d’un polynôme ; il sera donc malaisé de trouver un développement limité convenable.
Au contraire, une fraction rationnelle peut présenter des branches asymptotiques et pourra plus
facilement approcher tg x.
2.5
Approximant de Padé
D’après la remarque faite à la fin du paragraphe précédent, j’aurais intérêt, pour approcher
une fonction qui n’a pas un comportement polynômial, à essayer une fraction rationnelle. Si la
théorie générale de telles approximations existe, je ne la décrirais pas, mais je présenterais un
cas particulier, connu sous le nom d’approximant de Padé. On peut décrire un approximant de
Padé comme une fraction rationnelle qui obéit à des contraintes très semblables à celles d’un
développement en série.
2.5.1
définition
Dans la suite, je considère une fraction rationnelle Rm,k , quotient d’un polynôme Pm (le numérateur), de degré m et de coefficients aj , 0 ≤ j ≤ m par un polynôme Qm (le dénominateur),
de degré n et de coefficients bj , 0 ≤ j ≤ k. Comme je peux, sans changer la valeur de la fraction,
diviser haut et bas par une même constante, j’impose, sans restreindre la généralité, la condition
b0 = 1. La fraction Rm,k contient donc m + k + 1 coefficients à déterminer.
Rm,k sera, par définition, l’approximant de Padé d’ordre n + 1 de la fonction f (x), au voisinage
du point x = x0 , si Rm,k (x0 ) et ses n premières dérivées coïncident respectivement avec f (x0 ) et
ses n premières dérivées :
(p)
[Rm,k (x)]
≡ f (p) (x0 ), p = 0, 1, 2 . . . , n.
en posant f (0) = f . Je peux toujours, à l’aide d’une translation, me ramener au cas x0 = 0, ce que
je supposerai dans la suite. Comme je dispose de m + n + 1 coefficients inconnus, il me faut, pour
déterminer entièrement la fraction rationnelle, autant de conditions ; il faut donc que m + k = n.
13
2.5. Approximant de Padé
2.5.2
construction
Il est hors de question de calculer les dérivées successives de R et de f pour les identifier, ce
qui serait en général impossible ; plus simplement, je vais identifier les développements limités de
ces deux expressions, au voisinage de l’origine, jusqu’aux termes de rang n + k + 1 (ce qui assure
l’égalité des dérivées). On peut économiser encore des calculs en imposant, ce qui revient au même,
que le développement limité de la quantité R − f commence par un terme en xx+k+1 . Je suppose
que la fonction f admet un développement de MacLaurin
f (x) =
∞
X
cj xj .
j=0
R − f s’écrit
Pm (x) − Qk (x)f (x)
.
Qk (x)
Le développement limité de ce rapport est le quotient des développements du numérateur et du
dénominateur ; ce dernier ne va pas intervenir pour les premières puissances de x, puisqu’il vaut 1
près de l’origine. Le développement du numérateur doit commencer par le terme en xn+1 , ce qui
revient à dire que les coefficients des termes en x0 , x1 · · · xn sont tous nuls. J’en déduis les relations
a0 = b0 c0
a1 = b0 c1 + b1 c0
aj =
s=j
X
(x0 ),
(x1 ),
(xj , j ≤ m).
cs bj−s
s=0
Lorsque tous les coefficients aj disponibles ont été utilisés, je continue sans eux
0=
s=j
X
(xj , j = m + 1, m + 2 . . . , n).
cs bj−s
s=0
Il est commode d’utiliser d’abord la dernière série d’équations, plus simples, pour déterminer
certains des coefficients bi , puis la première série pour les coefficients restants.
On a constaté empiriquement que le choix m = k ± 1 était souvent meilleur que d’autres. Le
raisonnement précédent ne permet pas d’estimer l’erreur d’approximation, mais, là encore, l’expérience montre que l’approximation selon Padé est très bonne.
2.5.3
Exemple
Je cherche l’approximant de Padé R2,2 de ex au voisinage de l’origine. Ici, m = k = 2, n = 4 ; je
dois donc connaître, pour commencer, les 5 premiers termes du développement de l’exponentielle.
Les coefficients correspondants sont
c0 = 1;
c1 = 1;
c2 =
D’autre part, R2,2 s’écrit
R2,2 (x) =
1
;
2
c3 =
1
;
6
c4 =
1
.
24
a0 + a1 x + a2 x2
.
1 + b1 x + b2 x2
0
Je forme maintenant le numérateur de R−ex et j’identifie à zéro les coefficients de x2 , x1 , x2 , x3 , x4 ,
ce qui donne
a0 = 1;
a1 = b1 + 1;
0 = b2 + b1 /2 + 1/6;
a2 = b1 + b2 + 1/2;
0 = b1 /6 + b2 /2 + 1/24.
14
Chapitre 2. Calcul de Fonctions
Fig. 2.2 – Erreur d’approximation de ex par son développement limité (en noir) et par l’approximant de Padé R2,2 (en bleu)
0
−1e−3
−2e−3
−3e−3
−4e−3
−5e−3
−6e−3
−7e−3
−8e−3
−9e−3
−10e−3
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
Je trouve, en résolvant ce système :
b1 = −1/2;
b2 = 1/12;
et donc
R2,2 =
a0 = 1;
a1 = 1/2;
a2 = 1/12
12 + 6x + x2
(x + 6)x + 12
=
.
2
12 − 6x + x
(x − 6)x + 12
Le petit programme Scilab a produit le tracé suivant
1
2
3
4
5
6
x = linspace ( 0 , 1 , 1 0 0 ) ;
p = 1+x+x.^2/2+ x .^3/6+ x . ^ 4 / 2 4 ;
r = ( ( x +6).∗ x + 1 2 ) . / ( ( x −6).∗ x +12);
xset ( "window" , 0 ) , xbasc ( 0 )
x t i t l e ( " a p p r o x i m a t i o n s de exp ( x ) " )
plot2d ( x ’ , [ ( p−exp ( x ) ) ’ , ( r−exp ( x ) ) ’ ] ) ;
Vous constatez que pour x ' 1 l’approximant de Padé est presque trois fois plus précis que le
développement de Taylor.
2.6
Approximation de fonction
J’ai présenté, dans les paragraphes précédents, un certain nombre de recettes ou de procédés destinés à fournir des approximations de fonctions, sans aucunement me soucier de rigueur
mathématique. En réalité,l’approximation des fonctions est un domaine bien établi des mathématiques, qui a connu un grand développement à partir de la fin du 19ème siècle. Dans les lignes qui
suivent, je donne quelques idées générales sur l’approximation, considérée d’un point de vue plus
mathématique.
Le problème se pose en ces termes. Je m’intéresse à une fonction f (x) de la variable réelle x. Soit
je désire connaître ses valeurs en certains points, soit, plus ambitieux, je voudrais pouvoir calculer
les valeurs numériques de sa dérivée ou de son intégrale sur un certain intervalle. Seulement voila, f
est compliquée et longue à calculer et je n’ai pas le temps d’accumuler toutes les valeurs nécessaires
de f . Je décide alors de remplacer f par une approximation f ∗ qui se calcule facilement. Pour savoir
15
2.7. Développement asymptotique
si cette substitution peut avoir un sens, je dois répondre à plusieurs questions : dans quelle catégorie
de fonctions vais-je choisir f ∗ ? Selon quel critère vais-je m’assurer que l’approximation est «bonne»
ou «mauvaise» ? Sur quel intervalle les propriétés précédentes doivent-elles être vérifiées ?
Je me limiterai ici au cas de l’approximation polynômiale, c’est-à-dire que f ∗ sera un polynôme
de degré au plus égal à n (une combinaison linéaire de xk , k = 0, 1, 2, . . . , n). Le théorème suivant,
dû à Weierstrass, affirme l’existence de f ∗ sous des conditions assez générales.
Théorème. Si f (x) est continue sur l’intervalle fini I = [a, b] et si ² est un
nombre positif donné, alors il existe un polynôme f ∗ (x) tel que
sup |f (x) − f ∗ (x)| < ².
x∈I
Remarquez que le théorème ne donne aucune indication sur la construction de f ∗ . Ici, la «distance»
entre f et f ∗ est la «norme infinie» ; on pourrait imaginer d’autre types d’approximation où la
définition de la «distance» serait différenteR ; on pourrait penser par exemple à l’écart quadratique
moyen, qui est défini comme k f − f ∗ k= I |f − f ∗ |2 dx.
Tschebychef et de la Vallée-Poussin ont prolongé les travaux de Weierstrass. Grâce à eux, on
sait qu’un «bon» polynôme f ∗ est tel que l’erreur d’approximation, |f − f ∗ |, présente une série de
maximums assez régulièrement répartis sur I, d’amplitudes identiques et alternativement positifs
et négatifs. Ces polynômes étaient déterminés à l’époque par essais et erreurs, mais on dispose
maintenant d’un algorithme puissant d’approximations successives (second algorithme de Remes).
2.7
Développement asymptotique
Lorsque la variable indépendante devient très grande, il devient évidemment désespéré d’approcher une fonction par un développement construit au voisinage de 0 ; on peut bien sûr faire une
translation d’origine pour chaque valeur particulière, mais cela complique notablement les calculs.
Dans certains cas, on peut avoir recours à une approximation valable lorsque 1/x est petit, ce que
l’on appelle un développement asymptotique et dont voici la définition.
2.7.1
définition
Soit la série infinie
c0 +
c1
c1
+ 2 + ···
x
x
J’appelle Sn la somme partielle des n premiers termes
Sn = c0 +
c1
cn−1
c1
+ 2 + · · · + n−1 .
x
x
x
Habituellement, on s’intéresse à la convergence de la série ou à la limite de la quantité Sn quand
n tend vers l’infini. Ici, je procède différemment ; gardant n fixe, je fait croître x au delà de toute
limite. Je suppose qu’il existe une fonction f (x) telle que la différence |f (x) − Sn (x)| tende vers
1
zéro plus vite que xn−1
quand x −→ ∞. En d’autres termes
lim xn−1 |f (x) − Sn (x)| = 0.
x−→∞
Si ces conditions sont remplies, je dis que la série est un développement asymptotique de la fonction
f.
16
Chapitre 2. Calcul de Fonctions
2.7.2
Exemple
Je considère la fonction définie pour x > 0 par l’intégrale
Z ∞
1 x−t
f (x) =
e dt
t
x
Des intégrations par partie répétées me permettent de transformer cette expression en
1
1
2
(−1)n−1 (n − 1)!
f (x) = − 2 + 3 + · · · +
+ (−1)n n!
x x
x
xn
Z
∞
x
ex−t
dt.
tn+1
Ceci me laisse supposer que la série
1
1
2!
4!
−
+ 3 − 4 ···
x x2
x
x
pourrait représenter le développement asymptotique de f . Pour le prouver, je forme
Z
f (x) − Sn+1 (x) = (−1)n n!
∞
x
ex−t
dt.
tn+1
Dans l’intégrale, l’exponentielle est comprise entre 0 et 1, d’où la majoration
Z ∞
1
1
|f (x) − Sn+1 (x)| < n!
dt = (n − 1)! n ,
n+1
t
x
x
une quantité qui tend évidemment vers zéro lorsque x croit, à n constant. On écrit souvent
Z ∞
1
2!
4!
1 x−t ∼ 1
e dt = − 2 + 3 − 4 · · · .
t
x x
x
x
x
2.8
Représentation des nombres en machine
L’arithmétique des ordinateurs présente des propriétés plus compliquées qu’il n’y parait à première vue. Ces complications sont dues à ce qu’un ordinateur (tout comme un humain) ne manipule
qu’un nombre limité de chiffres ; il s’en suit que beaucoup de nombres concevables ne sont pas ou
sont mal représentés en machine. Les choses se présentent différemment pour les entiers et pour
les nombres fractionnaires. Je commence par examiner les entiers.
2.8.1
Les nombres entiers
J’ai choisi, pour fixer les idées, le compilateur TurboPascal de Borland, mais des considérations
presque identiques s’appliquent à tous les compilateurs. TurboPascal définit cinq types d’entiers,
dont je reproduit ci-dessous les caractéristiques
types entiers
byte
shortint
integer
word
longint
représentation
(nombre d’octets)
1
1
2
2
4
17
intervalle de définition
0 :255
-128 :127
-32768 :32767
0 :65535
-2147483648 :2147483647
2.8. Représentation des nombres en machine
Dans tous les cas, le chiffre binaire le plus à gauche (le plus significatif, de poids le plus grand)
indique le signe : 0 pour les nombres positifs, 1 pour les entiers négatifs.
Ainsi, dans le type shortint, le plus grand nombre positif s’écrit 01111111 ; il vaut 26 + 25 +
4
2 + 23 + 22 + 21 + 20 = 127. Les nombres négatifs sont représentés selon la méthode dite «du
complément à deux», qui prescrit que, si x est négatif (et plus petit en valeur absolue que 27 , sa
représentation, que je note (x), est x+28 . La recette suivante permet de construire facilement (−x)
à partir de (x) : changer tous les «1» en «0» et réciproquement, sauf pour le chiffre le plus à droite.
Si x = 23, (x) = 00010111 et (−23) = 11101001. Vous pouvez vérifier, en appliquant les règles
de l’arithmétique binaire, que (23)+(23) = 100000000 ; la dernière retenue est perdue, puisque les
nombres n’ont que 8 chiffres.
L’ordinateur ne prévient pas lorsque le résultat d’une addition entre entiers est trop grand.
On a par exemple (127)+ (3) = 01111111 + 00000011 = 10000010 = (-124). Cette représentation
fonctionne un peu comme un compteur kilométrique de voiture qui après avoir atteint 99999 repart
de zéro.
La conséquence pratique est que l’amplitude des entiers est très limitée (sauf pour longint). Un
piège classique dans lequel chacun se fait prendre au moins une fois est le calcul de la factorielle.
Avec le type int, 7 ! est calculé correctement, 8 ! est trouvé négatif. Le problème ne se pose pas avec
Scilab qui ne connaît que des nombres fractionnaires, ni avec Maple, qui peut manipuler autant de
chiffres que la mémoire de l’ordinateur le permet.
2.8.2
Nombres fractionnaires
Les nombres décimaux (on dit aussi fractionnaires, flottants, à virgule flottante) sont représentés par une partie fractionnaire et un exposant, comme par exemple 23 −→ 0,23E2. Le nombre
précédent peut aussi bien s’écrire 23E0 ou 0,023E3. Pour éviter ces ambiguïtés, on invoque une
convention de normalisation : la partie fractionnaire devra être comprise entre 0 et 1 par exemple.
Les nombres décimaux définis en Pascal peuvent appartenir à l’un des 4 types ci-dessous.
type
real
single
double
extended
nb équivalent
de chiffres décimaux
11-12
7-8
15-16
19-20
intervalle de définition
taille (octets)
2,910−39 :1.71038
1,510−45 :3.41038
510−324 :1.710308
1.910−4551 :1.1 104932
6
4
8
10
Il est clair que l’intervalle de définition (ou le nombre de chiffres significatifs) dépend du nombre
de chiffres binaires affectés respectivement à la représentation de la partie fractionnaire et de
l’exposant. Les 32 chiffres du type single sont répartis ainsi : 1(signe)+ 8 (exposant) + 23(partie
fractionnaire). Sous Scilab, les nombres sont uniformément du type double. C et C++ calcule
toutes les fonctions élémentaires en double précision.
Les nombres compris entre 0 et la borne inférieure de l’intervalle de définition, de même que
ceux plus grands que la borne supérieure, ne pourront pas être représentés. Tout calcul produisant un nombre répondant à l’une de ces conditions provoquera en principe un message d’erreur ;
en fait, les nombres trop petits sont pris égaux à zéro, ce qui peut être sans conséquence ; les
nombres trop grands interrompent l’exécution du programme et l’apparition du message d’erreur
arithmetic overflow.
Même si un nombre a une taille correcte, son calcul est souvent souvent entaché d’une erreur
d’arrondi. Je suppose que j’utilise un ordinateur fictif fonctionnant en numération décimale. Je
forme 27/13,1 = 2,06106870229..., un nombre fractionnaire dont la représentation décimale ne se
termine jamais et que l’unité centrale calcule avec 20 chiffres significatifs. Si j’ai déclaré que la
variable correspondante était du type «single», lorsque l’ordinateur range cette valeur en mémoire,
il le fait selon la norme du type, soit avec 7 chiffres. Sur certaines machines on conserve la valeur
18
Chapitre 2. Calcul de Fonctions
2,061068 (troncation), sur d’autres, on retient 2,061069 (arrondi). L’erreur est ici minime (inférieure
à 10−7 en valeur absolue), mais il faut être conscient qu’elle peut se répéter des milliards de fois au
cours d’un calcul. Heureusement, le signe de chaque erreur est pratiquement aléatoire, si bien que
celles-ci ne s’ajoutent pas de façon cohérente.
L’erreur relative devient importante lorsque l’on forme la différence de deux nombres voisins. On
ne remarque rien en général, sauf si, par hasard, ce premier résultat est immédiatement multiplié
par un nombre très grand.
Je remarque enfin que l’utilisation, en Pascal, des types single et real, correspond à une
économie de mémoire, mais à une perte de temps. Il en est de même pour le type float en C. En
effet, l’unité centrale calcule avec une très grande précision (80 chiffres binaires pour les Pentiums) ;
les résultats sont ensuite mis aux normes avant d’être rangés en mémoire et cette transformation
prend du temps (une fraction de microseconde). Du point de vue de la vitesse d’exécution, il vaut
mieux travailler avec le type double, qui est très proche du format utilisé par l’unité centrale.
2.9
pour en savoir plus
– FAQ du forum sci.math.num-analysis :
http ://www.mathcom.com/corpdir/techinfo.mdir/scifaq/index.html
– GAMS : http ://gams.nist.org
– histoire des mathématiques, définitions :
http ://www.sciences-en-ligne.com/momo/chronomath/accueil.htm
– histoire des approximations :
http ://www.math.technion.ac.il/hat/papers.html
– : page d’un spécialiste pour des spécialistes : http ://perso.ens-lyon.fr/jean-michel.muller/frenchindex.html
– erreurs d’arrondi (ou autres) catastrophiques http ://www5.in.tum.de/ huckle/bugse.html
19
Chapitre 3
L’interpolation
3.1
Introduction
Dans le chapitre 1, j’ai montré plusieurs méthodes d’approximation d’une fonction. L’interpolation, qui fait l’objet de ce chapitre, poursuit le même but que l’approximation : remplacer une
fonction difficile à calculer par une expression plus simple pour, par exemple, pouvoir la calculer
numériquement vite et souvent, ou pour évaluer sa dérivée ou son intégrale. Le cadre mathématique est aussi assez semblable. Je m’intéresse à une fonction réelle continue f (x) que je vais encore
remplacer par une fonction plus simple f ∗ (x). La différence réside dans la manière d’imposer la
«proximité» de f (x) et de son «substitut» f ∗ (x). Je vais demander que f (x) ≡ f ∗ (x) pour un certain nombre de valeurs de la variable indépendante x. On imposait que l’approximant reste dans
une bande de largeur 2² entourant la fonction ; on impose maintenant que l’interpolant coïncide
avec la fonction pour certaines valeurs de la variable indépendante. On peut ainsi comprendre le
terme «d’approximation exacte» autrefois employé pour désigner l’interpolation.
Dans un passé lointain, alors qu’il n’existait pas d’ordinateur, le calcul d’une fonction compliquée était laborieux. On dressait une table de la fonction pour quelques valeurs de l’argument puis
on interpolait entre ces valeurs. De nos jours, cet usage de l’interpolation a beaucoup régressé, mais
l’interpolation reste un outil théorique important. D’autre part, on a souvent besoin des valeurs
de grandeurs physiques comme la densité, la conductivité électrique ou des chaleurs de réaction,
qui, à leur tour, dépendent de la pression, de la température ou des concentrations. Ces grandeurs
figurent dans des tables, mais seulement pour quelques valeurs des paramètres. Là encore, on est
amené à interpoler pour déterminer les valeurs intéressantes.
L’échelle internationale de température constitue un bon exemple physique d’interpolation. La
température légale est la température thermodynamique, associée à un unique point fixe, le point
triple de l’eau à 273,15 K ; elle se mesure à l’aide d’un thermomètre à gaz à volume constant ou d’un
thermomètre à rayonnement. Ces deux instruments sont malcommodes et impliquent des manipulations longues et compliquées. Aussi, on a choisi une série de «points fixes secondaires» (points
d’ébullition de l’hydrogène, de l’eau, point de fusion du zinc par exemple) dont les températures ont
été mesurées très précisément une fois pour toutes. On a choisi aussi quelques thermomètres «pratiques», comme le thermomètre à résistance de platine. Une fois mesurée la résistance de la sonde
pour chaque point fixe, la valeur d’une température intermédiaire est obtenue par interpolation.
3.2
Définition
J’aborde maintenant le formalisme. Étant donnée une fonction y = f (x) et une fonction
f ∗ (x; a0 , a1 , . . . , an ) dépendant de x et de n + 1 paramètres a0 , a1 , . . . , an , le problème d’inter20
Chapitre 3. L’interpolation
polation consiste à déterminer les ak de telle manière que les n + 1 équations
f (xk ) = f ∗ (xk ; a0 , a1 , . . . , an ),
k = 0, 1, 2, . . . , n
(3.1)
soient vérifiées. Dans la suite, j’utiliserai indifféremment les notations f (xk ) = fk = yk ; chaque
couple de valeurs xk , yk définit un point du plan que l’on appelle un pivot ou un noeud.
Il me faut ensuite décider à quelle classe de fonctions appartient f ∗ ; le critère le plus important
est la façon dont interviennent les paramètres ak . On distingue les cas où f ∗ dépend linéairement
des ak de tous les autres ; l’interpolation polynômiale
f ∗ = a0 + a1 x + a2 x2 + · · · + an xn
et l’interpolation trigonométrique
f ∗ = a0 + a1 eix + a2 e2ix + · · · + an einx
relèvent de ce cas. Par contre, l’interpolation rationnelle
f ∗ (x; a0 , a1 , . . . , am , b0 , b1 . . . , bn ) =
a0 + a1 x + a2 x2 + · · · + am xm
b0 + b1 x + · · · + bn xn
(qui par ailleurs fait appel à m + n + 2 coefficients) dépend non-linéairement des bk . Bien que
l’interpolation rationnelle soit parfois utilisée, je me limiterai ici à l’interpolation polynômiale qui
n’implique que des calculs simples. Les formes trigonométriques seront abordées plus tard.
Vous remarquez qu’à la différence de l’approximation, il ne parait pas urgent de définir un
intervalle dans lequel l’interpolation est valable ; en réalité, cette définition est implicite. Si xmin
est les plus petit des xi et xmax le plus grand, je parle d’interpolation lorsque xmin ≤ x ≤
xmax ; je montrerai comment estimer l’erreur correspondante. Si, au contraire, je m’intéresse à
une valeur de x extérieure à l’intervalle [xmin , xmax ], je pratique une «extrapolation» ; l’examen
de quelques exemples vous montrerait que l’erreur d’extrapolation peut devenir très grande dès
que l’on s’éloigne des pivots. En pratique donc, l’interpolation ne concerne que les valeurs de x
comprises entre la plus petite et la plus grande abscisse des pivots.
3.3
Méthode des coefficients indéterminés
La méthode la plus directe pour trouver les coefficients inconnus ak consiste à identifier, sur
chaque pivot, fonction et polynôme d’interpolation. Je montre le principe de la méthode sur
l’exemple de deux pivots. La fonction f est connue numériquement en deux points, ce qui définit les
deux pivots x0 , f0 , x1 , f1 . La fonction d’interpolation, que je note maintenant p(x), puisqu’il s’agit
d’un polynôme, dépend linéairement de deux paramètres inconnus et s’écrit p = a0 + a1 x. Géométriquement, p(x) représente le droite qui passe par les deux pivots. Les conditions d’interpolation
sont alors
½
a0 + a1 x0 = f0
a0 + a1 x1 = f1
Je dois donc, pour déterminer les {ai }, résoudre un système de deux équations linéaires à deux
inconnues ; la solution est immédiate :
a1 =
f0 − f1
x0 − x1
;
a0 =
x0 f1 − x1 f0
.
x0 − x1
Ce procédé s’étend sans difficulté au cas d’une fonction du second degré, définie par trois paramètres
inconnus ; la courbe représentative de p(x) est une parabole que l’on oblige à passer par trois pivots.
En principe, je peux même considérer le cas d’une fonction d’interpolation polynômiale de degré
21
3.4. Le polynôme d’interpolation de Lagrange
n, dépendant de n + 1 constantes inconnues. Celles-ci seront déterminées en imposant que f et f ∗
coïncident sur n + 1 noeuds :

a0 + a1 x0 + a2 x20 + · · · + an xn0 = y0 ,




 a0 + a1 x1 + a2 x21 + · · · + an xn1 = y1 ,
a0 + a1 x2 + a2 x22 + · · · + an xn2 = y2 ,
(3.2)


·
·
·
=
·
·
·



a0 + a1 xn + a2 x2n + · · · + an xnn = yn .
Il apparaît ici encore un système d’équations linéaires dont les inconnues sont les n + 1 nombres
ai et dont le déterminant s’écrit
¯
¯ 0
¯ x0 x10 x20 · · · xn0 ¯
¯
¯ 0
¯ x1 x11 x21 · · · xn1 ¯
¯
¯ 0
∆ = ¯¯ x2 x12 x22 · · · xn2 ¯¯ .
(3.3)
¯ ··· ··· ··· ··· ··· ¯
¯
¯ 0
¯ xn x1n x2n · · · xnn ¯
∆, que l’on appelle un déterminant de van der Monde, s’annule chaque fois que la condition
xi = xj , i 6= j est remplie ; le développement de ce déterminant contient donc le facteur xi − xj .
En répétant ce raisonnement pour tous les couples possibles de pivots, je montre facilement que
Y
∆=
(xi − xj ).
i<j
Je déduis de ce résultat que ∆ est non nul, et donc que le système admet une solution unique, si
et seulement si les pivots ont des abscisses strictement distinctes. Je ne fait pas d’autre hypothèse
sur les pivots ; en particulier, ceux-ci peuvent être rangés dans un ordre arbitraire.
Je dispose maintenant d’une méthode pour construire le polynôme d’interpolation ; si j’ai pris
soin de choisir des pivots différents, ce polynôme est unique. Dans la pratique, la méthode des
coefficients indéterminés est, en fait, rarement utilisée, car on connaît des algorithmes plus stables
et/ou plus rapides. Ces algorithmes, inventés par des mathématiciens célèbres des siècles passés,
prennent des forment très différentes et produisent des résultats apparemment dissemblables. En
réalité, ils aboutissent tous à former l’unique polynôme d’interpolation à partir des pivots disponibles. La première méthode que je présenterai est due à Lagrange.
3.4
Le polynôme d’interpolation de Lagrange
Dans cette méthode, je fait l’hypothèse (à vérifier) que le polynôme d’interpolation peut s’écrire,
pour n + 1 pivots xi , f (xi )
n
X
p(x) =
Li (x)f (xi ).
(3.4)
i=0
Chaque polynôme élémentaire de Lagrange Li (x) est de degré n et, par conséquent, p est un
polynôme de degré au plus égal à n. Vous voyez que le problème d’interpolation sera résolu si je
peux former des Li répondant aux conditions
Li (xk ) = δi,k ,
i, k = 0, 1, 2, . . . , n.
(3.5)
δi,k est le symbole de Kronecker, qui vaut 1 lorsque ses deux indices sont égaux et qui vaut 0 dans
tous les autres cas. Si, par exemple, x = x2 , alors L0 (x2 ) = L1 (x2 ) = L3 (x2 ) = · · · = Ln (x2 ) = 0
tandis que L2 (x2 ) = 1. Des n+1 termes de p ne subsiste que f2 . Ainsi, pour le pivot x2 , le polynôme
d’interpolation coïncide avec la fonction et il en serait de même pour tout autre noeud.
22
Chapitre 3. L’interpolation
Fig. 3.1 – interpolation polynômiale de Lagrange
11
9
∆
7
∆
5
3
∆
∆
1
−1
−3
−5
−2
−1
0
1
2
3
Le polynôme élémentaire Li s’annule pour tous les pivots sauf xi ; il est donc proportionnel au
polynôme q(x) = (x − x0 )(x − x1 ) · · · (x − xi−1 )(x − xi+1 ) · · · (x − xn ). La constante de proportionnalité s’obtient en formant q(xi ) = (xi − x0 )(xi − x1 ) · · · (xi − xi−1 )(xi − xi+1 ) · · · (xi − xn ) : Li est
égal au polynôme normalisé q(x)/q(xi ). Le polynôme d’interpolation de Lagrange est maintenant
entièrement déterminé ; il s’écrit
p(x) =
n
X
i=0
Li (x)fi =
n
X
i=0
fi
Y
k=0,k6=i
x − xk
.
xi − xk
(3.6)
Le calcul numérique de p(x) se programme aisément à l’aide de deux boucles imbriquées ; il est
bien plus rapide que la résolution du système linéaire du paragraphe précédent. Le fragment de
programme ci-dessous réalise ce calcul. Les deux premières instructions créent deux vecteurs de
Listing 3.1 – construction du polynôme de Lagrange
1
2
3
4
5
6
7
8
9
10
11
12
x = linspace ( xmin , xmax , n p t s ) ;
p l = zeros ( 1 , n p t s ) ;
for i = 1 : 4
L( i , 1 : n p t s ) = ones ( 1 , n p t s ) ;
for k = 1 : 4
i f k <> i
L( i , : ) = L( i , : ) . ∗ ( x−xp ( k ) ) / ( xp ( i )−xp ( k ) ) ;
end
end
L( i , : ) = L( i , : ) ∗ f n ( xp ( i ) ) ;
p l = p l + L( i , : ) ;
end
zéros, qui vont recevoir respectivement les abscisses et les valeurs successives du polynôme d’interpolation. À partir de la ligne 3, je remplis la ligne i de la matrice L par des 1. Le gros du
calcul est fait ligne 7, où je calcule, à l’aide d’une itération, les valeurs du polynôme élémentaire
Li , pour toutes les abscisses simultanément. La figure montre le résultat. J’ai représenté chacune
des quantités Li (x)f (xi ), ainsi que leur somme p(x). Vous pouvez vérifier que les Li (x)f (xi ) passe
par un pivot et un seul, alors que p(x) passe par tous les noeuds. Cependant, il serait pénible de
développer le polynôme de Lagrange et de regrouper les termes pour le mettre sous la forme d’une
23
3.5. le polynôme de Newton
somme ordonnée selon les puissances de x. Si l’on souhaite vraiment obtenir cette forme, il vaut
mieux utiliser un algorithme du à Newton, la méthode des différences divisées.
3.5
3.5.1
le polynôme de Newton
Interpolation linéaire
Il est commode de revenir à l’interpolation linéaire. Lorsque je dis que la fonction f (x) est bien
représentée par une interpolation linéaire dans un certain intervalle, cela signifie que le rapport
f (x1 ) − f (x0 )
x1 − x0
(la pente moyenne de la courbe représentative) est à peu près indépendant de x0 et x1 dans cet
intervalle. Ce rapport s’appelle la différence divisée du premier ordre, relative à x0 et x1 , et se note
généralement
f (x1 ) − f (x0 )
f [x0 , x1 ] ≡
.
(3.7)
x1 − x0
Remarquez que f [x0 , x1 ] = f [x1 , x0 ]. Je peux aussi écrire la relation approchée
ou encore
f [x0 , x] ∼
= f [x0 , x1 ]
(3.8)
f (x) ∼
= f (x0 ) + (x − x0 )f [x0 , x1 ].
(3.9)
Vous reconnaissez, au second membre, le polynôme du premier degré qui interpole f sur les pivots
(x0 , x1 ), une expression que je noterai p0,1 dans la suite. Il est commode d’introduire les notations
p0 (x) ≡ f [x0 ] ≡ f (x0 ),
(3.10)
si bien que f [x0 ] est la différence divisée d’ordre zéro et p0 (x) est le polynôme d’interpolation de
degré zéro qui coïncide avec f en x0 . La formule (3.9) prend alors une forme qu’il sera facile de
généraliser plus tard :
p0,1 = f [x0 ] + (x − x0 )f [x0 , x1 ].
(3.11)
À moins que la fonction f ne soit réellement linéaire en x, la pente de la sécante f [x0 , x1 ] va
dépendre des abscisses x0 et x1 . Si f est du second degré en x, la pente de la sécante joignant les
points d’abscisses x0 et x est elle-même une fonction linéaire de x, à x1 constant. Je m’attend donc
à ce que la quantité
f [x1 , x2 ] − f [x0 , x1 ]
x2 − x0
soit indépendante des trois arguments ; dans le cas général, on appelle ce rapport la différence
divisée d’ordre 2 relative aux abscisses x0 , x1 , x2 et on le note f [x0 , x1 , x2 ]. Cette expression est
encore symétrique par rapport à tous ses arguments. Je peux alors écrire la relation (3.8)
f [x0 , x] − f [x0 , x1 ] = f [x0 , x] − f [x1 , x0 ] = (x − x1 )f [x0 , x1 , x]
d’où je déduis la relation exacte qui remplace (3.11)
f (x) = f (x0 ) + (x − x0 )f [x0 , x1 ] + (x − x0 )(x − x1 )f [x0 , x1 , x].
Telle quelle, cette formule est peu utile, car connaître f [x0 , x1 , x] revient à connaître f (x), ce que
je cherche justement à éviter. Mais l’erreur E(x) commise en remplaçant f (x) par p0,1 est donnée
par
f − p0,1 = (x − x0 )(x − x1 )f [x0 , x1 , x],
un résultat que je généraliserais plus tard.
24
Chapitre 3. L’interpolation
3.5.2
Les différences divisées
Les différences divisées d’ordres 0, 1, 2, . . . , k sont définies par les relations de récurrence
f [x1 , . . . , xk ] − f [x0 , . . . , xk−1 ]
xk − x0
(3.12)
Dans chaque numérateur, les k − 1 premiers arguments du premier terme sont identiques aux k − 1
derniers arguments du deuxième terme et le dénominateur est la différence entre les arguments qui
diffèrent d’un terme à l’autre. Il est possible de démontrer par récurrence que f [x0 , . . . , xk ] est une
fonction totalement symétrique de ses k + 1 arguments ; l’ordre de ceux-ci est donc indifférent. J’en
déduis que f [x0 , x1 , . . . , xk ] peut s’exprimer comme le quotient de la différence de deux différences
divisées d’ordre k − 1 (ayant k − 1 arguments en commun) par la différence entre arguments
différents :
f [x0 ] = f (x0 )
f [x0 , x1 ] =
f [x0 , x1 , x2 , x3 ] =
f [x1 ] − f [x0 ]
x1 − x0
f [x0 , . . . , xk ] =
f [x0 , x1 , x2 ] − f [x1 , x2 , x3 ]
f [x0 , x2 , x3 ] − f [x1 , x2 , x3 ]
=
.
x0 − x3
x0 − x1
Jusqu’à présent, j’ai fait semblant d’ignorer la possibilité que deux abscisses puissent être égales ;
si cela se produit, on peut donner un sens à la différence divisée par passage à la limite :
lim f [x + h, x] = lim
x→0
3.5.3
f (x + h) − f (x)
= f 0 (x).
h
La formule de Newton
D’après la définition (3.12), je peux écrire, en remplaçant à chaque fois un des xi par x
f (x)
f [x0 , x]
···
f [x0 , . . . , xn−1 , x]
=
=
=
=
f [x0 ] + (x − x0 )f [x0 , x],
f [x0 , x1 ] + (x − x1 )f [x0 , x1 , x],
···
f [x0 , . . . , xn ] + (x − xn )f [x0 , . . . , xn , x].
En substituant la première équation dans la seconde, j’obtiens l’expression déjà vue
f (x) = f [x0 ] + (x − x0 )f [x0 , x1 ] + (x − x0 )(x − x1 )f [x0 , x1 , x]
Par des substitutions successives, j’arrive finalement à
f (x) = f [x0 ]
+ (x − x0 )f [x0 , x1 ] + (x − x0 )(x − x1 )f [x0 , x1 , x2 ]
+ (x − x0 )(x − x1 ) · · · (x − xn−1 )f [x0 , x1 , . . . , xn ]
+ (x − x0 )(x − x1 ) · · · (x − xn )f [x0 , x1 , . . . , x].
(3.13)
Je passe de cette expression «formelle» (que je ne peux pas utiliser puisque j’ignore le dernier
terme) à la formule d’interpolation de Newton en négligeant le terme inconnu :
p0,1,2...,n = f [x0 ] + (x − x0 )f [x0 , x1 ] + (x − x0 )(x − x1 )f [x0 , x1 , x2 ]
+ (x − x0 )(x − x1 ) · · · (x − xn−1 )f [x0 , x1 , . . . , xn ]
L’erreur commise en remplaçant f par p vaut
E(x) = (x − x0 )(x − x1 ) · · · (x − xn )f [x0 , x1 , . . . , x].
Je donnerai plus tard une forme plus pratique de cette erreur.
25
(3.14)
3.5. le polynôme de Newton
3.5.4
exemple
Voici un exemple de calcul de différences divisées. J’utilise les mêmes données qu’au paragraphe
précédent ; bien que cela ne soit pas nécessaire, j’ai rangé les abscisses par ordre croissant, ce qui
rend la suite de opérations plus facile à suivre. Les pivots sont numérotés implicitement de 0 à 3.
ordre :
−1
0
0, 367879
1
2
3
1, 280842
1, 5
0, 853895
0, 5
1, 648721
2, 83297
1
1, 5
1, 979073
2, 5
0, 791629
2, 83297
4, 481689
2, 907367
0, 5
5, 814734
2
2, 981766
1, 5
1, 987844
1, 196215
3
0, 398738
7, 389056
La première colonne contient les valeurs de x, la deuxième celles de f , qui sont identiques aux
différences divisées d’ordre zéro. Je donne dans la colonne suivante les valeurs des quantités xi − xj
et fi −fj , dont le quotient fournit la différence divisée d’ordre 1, reportée dans la colonne numérotée
1. Le calcul se poursuit sans difficulté jusqu’à la différence divisée d’ordre 3, la dernière que je puisse
calculer avec les données dont je dispose.
Le polynôme de Newton d’ordre 3 s’écrit alors
p0,1,2,3 = 0, 367879+(x−0, 5)0, 853895+(x−0, 5)(x−1, 5)0, 791629+(x−0, 5)(x−1, 5)(x−2)0, 398738.
Listing 3.2 – construction du polynôme de Newton
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// d i f f e r e n c e s d i v i s e e s de Newton
// c r e a t i o n d ’ une s e r i e de v a l e u r s
x = [ 0 . 5 , −1.0 , 2 . 0 , 1 . 5 ] ;
y = exp ( x ) ;
n e f f = input ( " o r d r e de l i n t e r p o l a t i o n (<= 3 : " ) ;
// c a l c u l d e s d i f f e r e n c e s
f o r i = 1 : n e f f +1
t ( i ) = y( i );
f o r j = i −1: −1:1
t ( j ) = ( t ( j +1) − t ( j ) ) / ( x ( i ) − x ( j ) ) ;
end
a( i ) = t (1);
end
a
z = input ( " v a l e u r de l argument : " ) ;
// c a l c u l du polynome
p o l = a ( n e f f +1);
z = linspace ( − 2 , 3 ) ;
f o r i = n e f f : −1:1
p o l = p o l . ∗ ( z−x ( i ))+ a ( i ) ;
end
rect = [ −3 ,4 ,0 ,10];
plot2d ( z ’ , [ p o l ’ , exp ( z ) ’ ] )
Sa forme, très semblable à celle de Horner, rend le calcul facile pour toute valeur de x. Le
listing ci-dessus montre un programme Scilab qui accomplit la même tâche. La figure illustre le
26
Chapitre 3. L’interpolation
Fig. 3.2 – interpolation par la méthode de Newton
11
9
∆
7
∆
5
3
∆
∆
1
−1
−3
−5
−2
−1
0
1
2
3
résultat ; comme le polynôme d’interpolation est unique, le résultat final est indiscernable de celui
du paragraphe précédent.
3.6
Erreur d’interpolation
Je cherche à majorer l’erreur commise en remplaçant la fonction f (x) par le polynôme de degré
n p(x), lequel satisfait aux n + 1 conditions d’interpolation
p(xi ) = f (xi ) ≡ fi ,
i = 0, 1, 2 . . . , n.
Je définis tout d’abord le polynôme pi(x) de degré n + 1 :
π(x) ≡ (x − x0 )(x − x1 ) · · · (x − xn ) =
n
Y
(x − xi )
0
puis la fonction auxiliaire
F (x) ≡ f (x) − p(x) − Kπ(x),
où K est une constante. Il est possible de choisir la constante K de telle manière que F (X) = 0, X
étant un point quelconque de l’axe réel. J’appelle I le plus petit intervalle contenant X et tous les
xi . Alors la fonction F admet n+2 zéros sur I. En effet, f −p = 0 lorsque x = xi et, simultanément,
π(xi ) = 0. De plus, F s’annulle en X.
Le théorème de Rolle appliqué à la fonction F me permet d’affirmer que la fonction F 0 (x)
présente au moins n + 1 zéros sur ce même intervalle ; en appliquant ce même théorème aux
dérivées successives de F , je démontre que F 00 admet au moins n zéros dans I, que F (3) en admet
au moins n − 1 et finalement que F (n+1) s’annule au moins une fois dans I, à condition que cette
dérivée existe ; j’appelle ξ ce point. La dérivée d’ordre n + 1 de F se calcule aisément ; p(n+1) = 0
puisque p est de degré n. Le terme de degré le plus élevé de π est xn+1 , si bien que la dérivée
cherchée est π (n+1) = (n + 1)!. Je déduis que
F (n+1) (ξ) = f (n+1) (ξ) − K(n + 1)! = 0
ou encore que
K=
f (n+1) (ξ)
(n + 1)!
27
3.6. Erreur d’interpolation
Fig. 3.3 – interpolation de la fonction de Lorentz
1.5
1.3
1.1
♦
0.9
♦
0.7
0.5
♦
0.3
0.1 ♦
♦
♦
♦
♦
♦
♦
♦
♦
−0.1
−0.3
−0.5
−5
−4
−3
−2
−1
0
1
2
3
4
5
d’où je tire que
f (X) − p(X) = Kπ(X) =
π(X) (n+1)
f
(ξ).
(n + 1)!
Je peut donc énoncer le théorème suivant.
Si une fonction f possède une dérivée d’ordre n + 1, alors, pour toute valeur X
de l’argument, il existe un nombre ξ appartenant au plus petit intervalle qui
contient X et tous les pivots xi et satisfaisant à
π(X)f (n+1) (ξ)
(3.15)
.
(n + 1)!
En pratique, comme je ne connais pas le nombre ξ et que je cherche un résultat valable pour
tout l’intervalle I, j’utiliserai un majorant de la valeur absolue du second membre :
f (X) − p0,1,2,...,n (X) =
|f − p| ≤
1
sup |πf (n+1) |.
(n + 1)! x∈I
Cette relation est souvent assez pessimiste. D’autre part, son utilité pratique est assez faible
parce que si f est compliquée (et c’est pour cela que je souhaite la remplacer par un polynôme),
sa dérivée d’ordre n + 1 a toutes les chances d’être impossible à majorer facilement.
On pourrait penser que l’erreur diminue lorsque le nombre de pivots augmente, ou plutôt,
lorsque ceux-ci deviennent de plus en plus serrés. Il n’en est rien ; le théorème de Faber établit au
contraire l’existence de fonctions pour lesquelles l’erreur augmente avec le nombre de noeuds. La
figure ci-dessous vous présente un exemple de cette propriété paradoxale, connue sous le nom de
phénomène de Runge. J’ai interpolé la fonction 1/(1 + x2 ) en utilisant des pivots régulièrement
espacés ; vous voyez que l’erreur d’interpolation devient très grande aux bords de l’intervalle. Je
peux aussi réaliser une interpolation extrêmement précise en choisissant «bien» les pivots. Les
pivots définis par l’instruction Scilab
for k = 1:npiv, xp(k) = 0.5*(xmax - xmin)*cos( (2*k-1)*%pi/(2*npiv) ); end;
sont particulièrement efficaces, comme le montre la figure ci-dessous. L’explication de ce bon comportement est traitée en exercice. Elle tient à ce que ces abscisses sont proportionnelles aux zéros
du polynôme de Tschebychef d’ordre npiv.
28
Chapitre 3. L’interpolation
Fig. 3.4 – interpolation avec des pivots de Tschebychef
1.5
1.3
1.1
0.9
♦
0.7
♦
0.5
♦
0.3
0.1
♦ ♦
♦
−5
−4
♦
♦
♦
♦
♦ ♦
4
5
−0.1
−0.3
−0.5
3.7
−3
−2
−1
0
1
2
3
Interpolation entre pivots équidistants
Supposons que je dispose d’une table des valeurs d’une fonction f (x) calculées pour des valeurs
entières de x et que j’ai besoin de connaître f (3, 4). Je peux utiliser les connaissances acquises
en lisant les paragraphes précédents et interpoler entre les valeurs f (3) et f (4) par exemple. Les
algorithmes de Lagrange ou de Newton s’appliquent sans difficulté, mais ici les données présentent
une caractéristique intéressante : les pivots sont régulièrement espacés. Une telle situation se rencontre fréquemment lorsque l’on calcule à la main et de nombreuses méthodes ont été développées
pour tirer parti au mieux de ce cas particulier. D’autre part, le même formalisme est utilisé pour
résoudre numériquement les équations différentielles et les équations aux dérivées partielles. Ceci
justifie que je consacre quelques pages à l’interpolation entre pivots équidistants.
3.7.1
Les différences finies
Étant donné une fonction f (x) et une constante positive h, je défini la différence latérale ascendante
∆h f (x) ≡ f (x + h) − f (x).
En général, la constante h est définie par le contexte, ce qui me dispense de la faire figurer en indice.
Comme je ne travaillerai, dans la suite, qu’avec des abscisses équidistantes xi = x0 + ih, i =
0, 1, 2, 3, . . ., j’utiliserai la notation plus concise
∆f (xi ) ≡ ∆fi = f (xi+1 ) − f (xi ) ≡ fi+1 − fi .
(3.16)
h s’appelle le pas ou l’intervalle tabulaire et f (xi+1 ) = f (xi +h). Je défini maintenant par récurrence
les différences latérales d’ordre supérieur
∆p+1 f ≡ ∆p f (x + h) − ∆p f (x),
p ≥ 0.
(3.17)
Par convention, ∆0 f (x) ≡ f (x). Ainsi, ∆2 f = f (x + 2h) − 2f (x + h) + f (x). Le calcul pratique des
différences finies se fait commodément à l’aide d’un tableau (semblable à celui utilisé pour former
29
3.7. Interpolation entre pivots équidistants
les différences divisées, mais sans divisions).
xi
x0
fi
f0
x1
f1
∆fi
∆f0
∆f1
x2
f2
f3
x5
3.7.2
2
2
∆ f2
∆f3
x4
∆2 f0
∆ f1
∆f2
x3
∆2 f i
f4
2
∆3 f i
∆3 f0
∆3 f1
∆3 f2
∆ f3
∆f4
..
.
f5
..
.
La formule d’interpolation de Newton
Il existe une relation simple entre le polynôme de Newton (formé à l’aide de différences divisées)
et les différences latérales : pour tout entier k positif,
f [x0 , x1 , x2 , . . . , xk ] =
1
∆k f0 .
k!hk
(3.18)
Cette formule se démontre par récurrence. Elle est manifestement vraie pour k = 0. J’ai, pour
k = 1,
f1 − f0
1
f [x0 , x1 ] =
= ∆f0 ,
x1 − x0
h
ce qui est conforme au résultat proposé. Je suppose maintenant que la formule est vraie pour tout
ordre k ≤ r. Alors, pour k = r + 1, la propriété (3.12)montre que
f [x0 , x1 , . . . , xk+1 ] =
f [x1 , x1 , . . . , xr+1 ] − f [x0 , . . . , xr ]
.
xr+1 − x0
En remplaçant les différences divisées d’ordre r du second membre par leurs expressions, je trouve
·
¸
1
1
1
1
r
r
∆
f
−
∆
f
∆r+1 f0 ,
1
0 =
r
r
(r + 1)h r!h
r!h
(r + 1)!hr+1
ce qui établit le résultat pour k = r + 1. Il reste à utiliser (3.18) pour transformer le polynôme
d’interpolation de Newton. Je défini une variable réduite
µ=
x − x0
.
h
Je trouve ensuite que x − xj = h(µ − j) et que
(x − x0 )(x − x1 ) · · · (x − xk ) = µ(µ − 1) · · · (µ − k)hk+1 .
Insérant ces résultats dans (3.14), j’obtiens
p0,1,...,n (x) = f0 + µh
∆f0
∆2 f 0
∆n f 0
+ µ(µ − 1)h2
+ · · · + µ(µ − 1) · · · (µ − n + 1)
.
2
h
2!h
n!hn
Je peux donner à cette formule une allure plus compacte en introduisant des analogues fractionnaires des coefficients du binôme
Cµk ≡
µ(µ − 1) · · · (µ − k + 1)
.
k!
30
(3.19)
Chapitre 3. L’interpolation
Avec cette définition, le polynôme d’interpolation s’écrit
p0,1,...,n (x) =
n
X
Cµj ∆j f0 .
(3.20)
j=0
Cette formule générale donne, pour n = 1
p0,1 (x) = f0 + µ∆f0
et, pour n = 2,
3.7.3
1
p0,1,2 = f0 + µ∆f0 + µ(µ − 1)∆2 f0 .
2
exemple
Voici un exemple complet d’interpolation par les différences finies et la formule de Newton. J’ai
préparé un tableau de f et de ses différences latérales.
i
0
xi
1
fi
1
1
1, 1 1, 61051
∆f
∆2 f
∆3 f
∆4 f
∆5 f
0, 61051
0, 26730
0, 87781
2
1, 2 2, 48832
0, 0795
0, 3468
1, 22461
3
1, 3 3, 71293
4
1, 4 5, 37824
5
1, 5 7, 59375
0, 0144
0, 0939
0, 4407
1, 66531
0, 0012
0, 0156
0, 1095
0, 5502
2, 21551
Pour cette fonction assez régulière, les différences diminuent lorsque l’ordre croît, mais le nombre
de chiffres significatifs diminue aussi.
Je cherche la valeur de f (1, 25). Je décide d’utiliser toutes les valeurs disponibles, à commencer
par f0 . J’ai donc µ = (1, 25 − 1)/0, 1 = 2, 5. Les termes successifs du polynôme d’interpolation
s’écrivent
f0
1
(2, 5)∆1 f0
1, 526275
(2, 5)(1, 5) 2
∆ f0
2
(2, 5)(1, 5)(0, 5) 3
∆ f0
6
(2, 5)(1, 5)(0, 5)(−0, 5) 4
∆ f0
24
(2, 5)(1, 5)(0, 5)(−0, 5)(−1, 5) 5
∆ f0
120
p(1, 25)
0, 501187
0, 024844
−0, 000563
0, 000014
3, 051758
Il est facile, avec cette méthode, de suivre les «progrès» de l’interpolation : je m’arrête dès que je
rencontre une contribution assez petite.
31
3.8. Interpolation de Hermite
Il existe bien d’autres formules d’interpolation, associées aux noms de Gauss, Bessel et autres ;
certaines seront présentées en exercices.
3.8
Interpolation de Hermite
Dans le but de construire une fonction d’interpolation f ∗ encore plus précise, je peux imposer
à celle-ci des conditions supplémentaires. Hermite a proposé que les dérivées de f ∗ coïncident avec
les dérivées correspondantes de f pour certains pivots. Je vais suivre cette idée, en me limitant
à l’interpolation polynômiale et en ne considérant que la dérivée première. Pour tous les pivots,
j’impose donc que
p(xi ) ≡ fi
p0 (xi ) ≡ f 0 (xi ) = fi0 ,
;
i = 0, 1, 2, . . . , n.
(3.21)
En d’autre termes, p(x) interpole f et p0 (x) interpole f 0 , sur les mêmes pivots. Je suppose que le
polynôme d’interpolation de Hermite, ainsi défini, peut s’écrire sous une forme analogue à celle de
Lagrange
n
n
X
X
¯ i (x)fi0 ,
p(x) =
Hi (x)fi +
H
(3.22)
i=0
i=0
¯ i sont des polynômes réels distincts. Quel en est le degré ? Le polynôme p doit satisfaire
où les Hi , H
aux 2n + 2 conditions (3.21) : il comporte donc 2n + 2 coefficients ajustables et est de degré 2n + 1.
¯ ont donc un degré au plus égal à 2n + 1.
Les polynômes élémentaires H et H
Les polynômes Hi sont tels que p interpole f ; ils obéissent donc à des conditions identiques à
celles que j’ai écrites pour les polynômes élémentaires de Lagrange. Il parait de même raisonnable
¯ 0 soient choisis de façon à ce que p0 interpole f 0 , d’où une nouvelle série
que les polynômes dérivés H
i
de conditions. Mais cela ne suffit pas : il ne faut pas qe les Hi0 viennent perturber l’interpolation
¯ i détruisent l’interpolation de f : ces polynômes doivent être nuls sur les pivots.
de f 0 , ni que les H
J’obtiens ainsi quatre séries de conditions
Hi (xk ) = δi,k
Hi0 (xk ) = 0
¯ i (xk ) = 0
H
¯ i0 (xk ) = δi,k
H
i, k = 0, 1, 2, . . . , n,
i, k = 0, 1, 2, . . . , n,
i, k = 0, 1, 2, . . . , n,
i, k = 0, 1, 2, . . . , n.
(a)
(b)
(c)
(d)
(3.23)
Chaque polynôme élémentaire obéit à 2n + 2 conditions et peut donc être de degré 2n + 1 au plus.
¯ i . Il s’annulle ainsi que sa dérivée sur tous les pivots
Je commence par construire le polynôme H
k 6= i ; il admet donc des racines doubles en ces points et aussi une racine simple en xi . Il s’exprime
facilement à l’aide du polynôme élémentaire de Lagrange Li (x) construit sur les mêmes pivots et
du facteur x − xi :
¯ i (x) = C[Li (x)]2 (x − xi ).
H
¯ 0 (xi ) vaut 1 (condition 3.23(d)), ce qui impose C ≡ 1.
La dérivée H
i
Le polynôme Hi (x) admet tous les pivots sauf xi comme racines doubles. Il peut donc s’écrire
Hi (x) = [Li (x)]2 ti (x),
en désignant par ti un polynôme du premier degré tel que Hi respecte les conditions (3.23a,b) en
xi :
Hi (xi ) = [Li (xi )]2 ti (xi ) = ti (xi ) = 1
Hi0 (xi ) = 2Li (xi )L0i (xi ) + L2i (xi )t0i (xi ) = 0.
;
Un calcul sans difficulté montre que
ti (x) = 1 − 2(x − xi )L0i (xi ).
32
Chapitre 3. L’interpolation
L’erreur d’interpolation s’obtient par un raisonnement calqué sur celui de $3 ; elle s’écrit
f (X) − p(X) =
[π(X)]2 (2n+2
f
(ξ),
(2n + 2)!
(3.24)
l’abscisse ξ appartenant au plus petit intervalle qui contient X et tous les pivots xi .
3.9
Interpolation inverse
Lorsque je dispose d’une table de valeurs d’une fonction f , c’est à dire d’un ensemble de couples
xi , fi , et que je cherche la valeur de l’argument x correspondant à une valeur de f qui ne figure
pas dans la table, je dois effectuer une interpolation inverse. Il s’agit en fait d’interpoler la fonction
inverse f −1 à partir de pivots qui ne sont généralement pas équidistants.
La recherche d’une racine de l’équation f (x) = 0 peut relever de ce formalisme. Si je connais les
valeurs de f pour des abscisses encadrant la racine, j’obtiens une bonne approximation de celle-ci
par interpolation.
Exemple. Je cherche la solution de cos x = x, sachant qu’elle est voisine de 0,7 radian. Je
forme la table suivante
x
cos x − x
0, 5 0, 377583
0, 6 0, 225336
0, 7 0, 064842
0, 8 −0, 103293
0, 9 −0, 278390
La racine est telle que 0, 7 > f −1 (0) > 0, 8 ; j’en trouve une approximation par interpolation linéaire
selon Lagrange :
x∗ = 0, 7
0 − (−0, 103293)
0 − 00, 64842
+ 0, 8
0, 064842 − (−0, 103293)
−0, 103293 − 0, 064842
soit x∗ = 0, 738565 et f (x∗ ) = 0, 00087.
3.10
Interpolation par intervalle
Cherchant à améliorer la qualité de l’interpolation d’une fonction donnée, je suis tenté d’augmenter le nombre n de pivots (ou de noeuds). Comme vous le savez, cette solution est souvent
vouée à l’échec, parce que le terme d’erreur contient deux facteurs, le polynôme π(x) et la dérivée
d’ordre n (ou 2n) de la fonction qui sont vraisemblablement rapidement croissants avec n. Je peux
cependant augmenter à volonté le nombre de pivots, sans faire croître l’ordre d’interpolation. La
figure montre le principe de ce tout petit miracle. Pour interpoler la fonction représentée par la
courbe en noir, j’ai défini 5 pivots (d’abscisses -1,8, -0,5, 0, 0,5, 1,4) et, ce faisant, 4 intervalles. Je
pratique une interpolation du premier degré dans chaque intervalle ; la fonction linéaire correspondante est définie pour tout x : elle est représentée par une ligne pointillée. Cependant, je n’utilise
que la restriction de cette fonction à l’intervalle considéré, c’est-à-dire que j’assimile l’arc de courbe
par le segment représenté en trait épais.
La fonction d’interpolation f ∗ est maintenant plus compliquée : elle admet une définition différente dans chaque intervalle. De plus, sa dérivée n’est plus continue. Ce type d’interpolation peut
être rendu aussi précis que l’on veut en multipliant le nombre d’intervalles. On peut aussi le perfectionner en choisissant une méthode plus précise dans chaque intervalle, interpolation parabolique
ou interpolation de Hermite.
33
3.11. Interpolation «spline»
Fig. 3.5 – principe de l’interpolation par intervalle
×
× ×
×
×
× ×
× ×
×
× ×
× ×
× ×
× ×
×
× ×
× ×
×
× ×
× ×
× ×
×
×
×
×
× ×
×
× ×
× ×
× ×
×
× ×
× ×
× ×
×
× ×
× ×
× ∆
× ×
× ×
× ∆
× ×
∆
× ×
×
× × × ×
×
× ×
×
× ×
× ×
×
× ×
×
× ×
× ×
× ×
×
× ×
× ×
×
×
× ×
×
× ×
× ×
×
×
× ×
×
×
× ×
×
× ×
×
×
∆
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
4
3
2
1
0
×
×
−1
∆
×
×
×
−2
−2
−1
0
1
2
3
Cependant, dans certaines applications, la disparition de la continuité de la dérivée pose problème : imagine-t-on un bureau d’étude qui calcule une coque de bateau formée d’une série de
facettes raccordées par des angles vifs ? Il existe un formalisme qui combine l’avantage d’une interpolation «par morceaux» et la continuité des dérivées de la fonction d’interpolation : c’est la
méthode des splines, que j’explique dans le paragraphe suivant.
3.11
Interpolation «spline»
Le mot «spline» désigne en anglais une règle souple et élastique (une baguette de bois ou une
latte) dont les dessinateurs se servaient pour tracer des courbes lisses (ou régulières) passant par
des points imposés. Le calcul du profil d’un pont ou d’une aile d’avion fournit les coordonnées
d’un ensemble de points ; il appartient ensuite au dessinateur de produire une courbe esthétique
ou aérodynamique mais passant par les points calculés. La forme de la règle souple était ajustée en
y suspendant des poids ou en y attachant des ressorts en des points bien choisis. L’interpolation
spline est la traduction algébriques de ce savoir-faire.
3.11.1
définition d’une spline cubique
Je vais détailler un type particulier de fonctions spline, les splines cubiques, qui sont fréquemment utilisées et sont représentatives de cette catégorie de fonctions. Je me propose d’interpoler la
fonction f (x) sur l’intervalle I = [a, b]. Pour cela, je choisis une partition de I
a ≡ x0 < x1 < x2 < · · · < xn−1 < xn ≡ b.
(3.25)
Ces n + 1 abscisses définissent n sous-intervalles [xi−1 , xi ]. La fonction spline s(x) répond alors aux
contraintes suivantes
– Dans chaque intervalle [xi−1 , xi ], la fonction d’interpolation est un polynôme de degré trois.
– La fonction s, sa dérivée première s0 et sa dérivée seconde s00 sont continues dans I.
– s(x) interpole la fonction f sur [a, b], s(xi ) = fi , i = 0, 1, . . . , n.
Pour que le problème de la détermination de la fonction s soit soluble, il faut au moins que le
nombre d’équations soit égal au nombre d’inconnues. Cela est-il le cas ? Je peux poser
s(x) = ai + bi x + ci x2 + di x3
xi−1 ≤ x ≤ xi
i = 1, 2, . . . , n.
(3.26)
Les inconnues sont les 4n coefficients ai , bi , ci , di . Les conditions d’interpolation fournissent n + 1
contraintes. Les conditions de continuité s’appliquent à chaque frontière entre sous-intervalles ; il
34
Chapitre 3. L’interpolation
y a n − 1 points communs à deux intervalles et 3 séries de conditions, ce qui engendre 3n − 3
contraintes. Je dispose donc en tout de 4n − 2 relations pour déterminer 4n inconnues. Ce léger
déficit n’est pas gênant et j’introduirai bientôt deux conditions supplémentaires qui me permettront
de résoudre entièrement le problème.
3.11.2
construction d’une spline cubique
Plutôt que de faire intervenir directement les coefficients du polynôme s, il est commode d’utiliser, pour la mise en équations, les quantités mi ≡ s00 (xi ), i = 0, 1, 2, . . . , n. Comme s doit être du
troisième degré sur [xi , xi+1 ], sa dérivée seconde est une fonction linéaire de x que j’écris sous une
forme qui minimise les calculs à venir et assure la continuité de s00 :
s00 (x) ≡
1
[(xi+1 − x)mi + (x − xi )mi+1 ],
hi
hi ≡ xi+1 − xi ,
i = 0, 1, 2, . . . , n − 1.
(3.27)
J’intègre maintenant deux fois par rapport à x, ce qui fait apparaître deux constantes arbitraires
Ci et Di
(xi+1 − x)3 mi + (x − xi )3 mi+1
s(x) =
+ Ci (xi+1 − x) + Di (x − xi ).
6hi
J’impose maintenant les conditions d’interpolation pour obtenir les expressions suivantes des
constantes d’intégration
Ci =
fi
hi m i
−
hi
6
Di =
fi+1
hi mi+1
−
.
hi
6
Le polynôme s prend alors une forme assez symétrique
(xi+1 − x)3 mi + (x − xi )3 mi+1
(x
− x)fi + (x − xi )fi+1
+ i+1
6hi
hi
− h6i [(xi+1 − x)mi + (x − xi )mi+1 ],
xi ≤ x ≤ xi+1 , i = 0, 1, 2, . . . , n − 1.
s(x) =
(3.28)
Vous pouvez vérifier que s est bien continue sur [a, b]. Il me reste à prendre en compte la continuité
de s0 ; pour cela, j’exprime cette dérivée dans deux intervalles successifs. Dans [xi , xi+1 ]
s0 =
−(xi+1 − x)2 mi + (x − xi )2 mi+1
fi+1 − fi
(mi+1 − mi )hi
+
−
2hi
hi
6
alors que dans l’intervalle précédent [xi−1 , xi ] : :
s0 =
−(xi − x)2 mi−1 + (x − xi−1 )2 mi
fi − fi−1
(mi − mi−1 )hi−1
+
−
.
2hi−1
hi−1
6
Ces deux expressions doivent vérifier
lim = lim−
x→x+
i
i = 1, 2, . . . , n − 1.
x→xi
Après un peu d’algèbre, je trouve l’équation assez simple suivante
hi−1
hi−1 + hi
hi+1
yi+1 − fi
fi − fi−1
mi−1 +
mi +
mi+1 =
−
,
6
3
6
hi
hi−1
i = 1, 2, . . . , n − 1.
(3.29)
Je viens d’obtenir n − 1 équations linéaires pour les n + 1 inconnues mi . De plus, ces équations ont
une structure simple : chacune ne fait intervenir que trois inconnues.
35
3.11. Interpolation «spline»
3.11.3
conditions aux limites
Je dois maintenant imaginer deux équations supplémentaires. Il est d’usage d’imposer une
condition raisonnable à chaque extrémité (a, b) de l’intervalle. Je peux, par exemple, supposer
connues les pentes du polynôme d’interpolation en ces points :
s0 (x0 ) = f00
s0 (xn ) = fn0 ,
(3.30)
où f00 , fn0 sont des constantes. En utilisant les expressions de s0 vues précédemment, pour i = 0 et
pour i = n − 1, j’obtiens les deux équations manquantes
h0
h0
f1 − f0
m0 + m1 =
− f00 ,
3
6
h0
hn−1
hn−1
fn − fn−1
mn−1 +
mn = fn0 −
.
6
3
hn−1
3.11.4
système linéaire équivalent
L’ensemble des équations définissant les mi peut être mis sous forme matricielle
AM = B
en définissant
·
¸
f1 − f0
f1 − f0
fn − fn−1
fn−1 − fn−2 0
fn − fn−1
T
0 f2 − f1
B ≡
− f0 ,
−
,...,
−
, fn −
,
h0
h1
h0
hn−1
hn−2
hn−1
M T ≡ [m0 , m1 , . . . , mn ],





A=




h0
3
h0
6
0
h0
6
h0 +h1
3
h1
6
0
h1
6
h1 +h2
3
0
..
.
0
···
0
h2
6
..
.
hn−2
6
···
hn−2 +hn−1
3
hn−1
6
hn−1
6
hn−1
3










Ces équations définissent ce que l’on appelle parfois l’interpolant spline «complet». Je suis parvenu
à concilier nombre de pivots arbitraire et continuité des deux premières dérivées, mais il y a un prix
à payer : je dois maintenant résoudre un problème global (représenté par un système d’équations)
et toute modification locale d’une donnée (par exemple de f2 ) se répercutera sur toutes les valeurs
de la fonction spline. Je n’aborderai pas ici l’étude de l’erreur d’interpolation, qui nécessite de trop
longs développements et que l’on trouvera dans les ouvrages spécialisés.
3.11.5
exemple
Le formalisme assez touffu qui précède est entièrement masqué à l’intérieur des deux fonctions de
Scilab splin et interp. Je remarque tout d’abord que Scilab utilise, pour déterminer complètement
les mi , deux conditions qui ne font intervenir aucune donnée supplémentaire. Dans ce logiciel, on
impose en effet la continuité de la dérivée troisième de s pour le deuxième et l’avant-dernier pivot.
Cela revient à dire que s est un interpolant spline pour les noeuds x0 , x2 , x3 , . . . , xn−2 , xn , mais
interpole cependant sur tous les pivots x0 , x1 , x2 , . . . , xn−1 , xn .
Je reprend l’exemple du §3, l’interpolation de la fonction 1/(1 + x2 ). Voici le programme Scilab,
suivi du graphe correspondant.
Le phénomène de Runge a disparu et l’interpolation est parfaitement régulière.
36
Chapitre 3. L’interpolation
Listing 3.3 – construction d’un interpolant spline
1
2
3
4
5
6
7
8
9
10
11
d e f f ( "y = f n ( x ) " , "y = ( 1 . 0 ) . / ( 1 + x . ∗ x ) " ) ;
npts = 200;
np iv = input ( "nombre de p i v o t s : " ) ;
xmin = −5; xmax = 5 ;
x = linspace ( xmin , xmax , n p t s ) ;
xp = linspace ( xmin , xmax , npiv ) ;
xset ( "window" , 0 ) , xbasc ( 0 ) , xset ( "mark s i z e " , 3 )
plot2d ( xp , f n ( xp ) , −4 , r e c t = [ xmin , −0.5 ,xmax , 1 . 5 ] )
s p l 1 = s p l i n ( xp , f n ( xp ) ) ;
s p l 2 = interp ( x , xp , f n ( xp ) , s p l 1 ) ;
plot2d ( x , s p l 2 , 2 , " 000 " )
Fig. 3.6 – interpolation spline
1.5
1.3
1.1
♦
♦
0.9
♦
0.7
0.5
♦
♦
0.3
0.1 ♦
♦
♦
♦
♦
♦
♦
♦
♦
♦
♦
♦
♦
♦
♦
−0.1
−0.3
−0.5
−5
3.12
−4
−3
−2
−1
0
1
2
3
4
5
Interpolation à deux ou plusieurs dimensions
Les algorithmes exposés ci-dessus se généralisent de façon plus ou moins laborieuse à deux
ou plusieurs dimensions. La méthode des éléments finis, utilisée pour résoudre les équations aux
dérivées partielles, fait un usage intensif de l’interpolation à plusieurs variables ; vous trouverez
les meilleures introductions à l’interpolation à plusieurs dimensions dans les livres traitant des
éléments finis. Le graphisme sur ordinateur (CAO, DAO) est un autre «consommateur» important
d’algorithmes d’interpolation.
Je mentionne pour terminer une application classique de l’interpolation à deux variables : le
tracé de courbes de niveau. Soit f (x, y) une fonction définie dans une région du plan. Je peux
représenter cette fonction comme une surface z = f (x, y) (en fait comme une projection sur le
papier ou l’écran de cette surface). Je peux aussi dessiner la courbe du plan xOy définie par
l’équation f (x, y) = C. Les bulletins météo comportent souvent des cartes avec des isobares, lieux
des points où la pression atmosphérique prend une valeur donnée. Pour dessiner automatiquement
une courbe de niveau, je dois d’abord construire un tableau de valeurs de f correspondant à tous les
couples possibles d’abscisses [xi ] et d’ordonnées [yj ], donc en tous points d’un quadrillage couvrant
la région qui m’intéresse. Je repère ensuite, sur les droites horizontales x = xi et sur les verticales
y = yj les points pour lesquels f = C. Enfin, je relie ces points entre eux par une interpolation
bidimensionnelle.
37
Chapitre 4
Résolution d’équations non linéaires
4.1
Introduction
J’expose, dans ce chapitre, quelques méthodes de recherche des racines d’une équation nonlinéaire. Cette équation sera toujours écrite sous la forme conventionnelle
f (x) = 0.
Résoudre l’équation f = 0, chercher les zéros de f ou les pôles de 1/f sont des expressions équivalentes. Ce genre de problème se rencontre souvent, qu’il s’agisse de déterminer le point de fonctionnement d’une diode d’après sa caractéristique, la concentration d’une espèce chimique dans
un mélange réactionnel ou la fréquence de coupure d’un filtre électrique. Je n’envisagerai ici que
des fonctions réelles. On peut être amené à chercher toutes les solutions de f = 0, ou seulement
quelques unes ou une seule, la plus petite par exemple. Un cas particulier important est celui où f
est un polynôme ; on sait alors que les racines sont réelles ou deux à deux complexes conjuguées,
en nombre égal au degré du polynôme.
Il est rare que je puisse écrire une solution analytique de l’équation f = 0 ; en fait, cela ne se
produira que pour les polynômes de degré inférieur ou égal à 4 ou pour quelques fonctions simples.
En conséquence, toutes les méthodes générales de recherche de racine sont des méthodes itératives ;
partant d’une solution approchée, j’obtiendrai une suite d’approximations de plus en plus précises.
Je devrai donc me préoccuper de la convergence de la méthode et de la vitesse de convergence, je
devrai définir un critère d’arrêt des itérations et prévoir le rôle des erreurs d’arrondi inévitables
dans tout calcul numérique. J’insiste sur le fait qu’aucune méthode connue ne fonctionne «en
aveugle» : on doit toujours avoir une connaissance au moins approximative de l’emplacement de
la racine. Je vous recommande vivement de tracer le graphe de la fonction pour avoir une idée du
nombre et de la position des zéros.
4.2
Méthode de bissection ou de dichotomie
Je m’intéresse à une fonction f (x) continue sur l’intervalle I = [a, b] et telle que f (a)f (b) < 0.
Il découle de ces hypothèses que f s’annule au moins une fois dans I et c’est ce zéro que je souhaite
localiser précisément. Le pseudo-code correspondant à l’algorithme de bissection s’écrit
38
Chapitre 4. Résolution d’équations non linéaires
poser xg := a, xd := b, nit := 0 ;
tant que |xg − xd | > T OL et que nit < N IT M AX
faire
poser xm := (xg + xd )/2
si f (xg )f (xm ) < 0 alors xd := xm
sinon xg := xm
incrémenter nit
afficher nit, x∗ = (xg + xm )/2, f (x∗ )
Le principe de la méthode est facile à comprendre. Je calcule la valeur de la fonction au milieu de
l’intervalle [xg , xd ] et j’observe le changement de signe : s’il se produit entre xg et xm , c’est que
la racine se trouve dans cet intervalle ; dans ce cas, je redéfinis la borne droite de l’intervalle et je
recommence ; le raisonnement est semblable si le changement de signe se produit entre xm et xd .
A chaque itération, l’intervalle qui contient la racine voit sa longueur divisée par 2.
Comme dans toute méthode itérative, j’ai du définir un critère d’arrêt, ici le fait que la longueur
du segment [xg , xd ] devienne inférieur à la constante T OL. Il se pourrait que cette condition ne
soit jamais remplie : c’est pourquoi je surveille aussi le nombre d’itérations et j’arrête le calcul si
nit dépasse N IT M AX. J’aurais pu aussi bien choisir la condition f (xm ) < SEU IL comme critère
d’arrêt.
Cette ébauche est incomplète : outre le fait que les constantes T OL et N IT M AX ne sont pas
définies, je n’ai rien prévu pour le cas où f (xm ) = 0. De plus, il est nécessaire que a < b et que
l’intervalle I ne contienne qu’une racine.
Cependant, une fois amélioré, l’algorithme de dichotomie présente de nombreux avantages. La
convergence est certaine dès lors que les conditions précédentes sont remplies ; la programmation
est très simple ; le calcul de f n’a pas besoin d’être très précis, parce que j’utilise en fait le signe de la
fonction et non sa valeur. Le désavantage est que la convergence est assez lente ; comme l’intervalle
où peut se trouver la solution est divisé par deux à chaque itération, je dis que la convergence est
approximativement linéaire.
La figure montre un exemple de recherche de racine de l’équation x2 = cos x réalisé sous Scilab.
4.3
Méthode «Regula falsi»
Ces mots latins (règle des fausses positions, une expression qui date du 17ième siècle) désignent
une variante de la méthode de dichotomie qui utilise une meilleure estimation de la nouvelle abscisse
(xm pour la bissection).
À chaque itération de l’algorithme précédent, je connais deux abscisses, xg et xd , qui encadrent
la racine inconnue x∗ . Les nombres yg = f (xg ) et yd = f (xd ) sont donc de signes contraires si bien
que les deux points G(xg , yg ) et D(xd , yd )sont situés de part et d’autre de l’axe des x. La corde
GD coupe donc cet axe en un point M, lequel sera «assez proche» de x∗ ; je choisirai xm comme
nouvelle borne de l’intervalle contenant la racine, borne gauche si le changement de signe de f se
produit entre xm et xd , borne droite dans le cas contraire. Il me reste à déterminer l’abscisse xm :
xm = xg − yg
xg − xd
xg − xd
= xd − yd
.
yg − yd
yg − yd
La convergence est souvent plus rapide qu’avec la méthode de bissection. J’ai choisi comme exemple
la même équation qu’au paragraphe précédent, qui fait intervenir une fonction à variation régulière
pour laquelle la convergence est très rapide. J’en ai profité pour modifier le critère d’arrêt : le calcul
s’arrête dès que deux estimations successives de la racine sont «assez voisines» : |x(n) − x(n−1) | <
T OL.
39
4.3. Méthode «Regula falsi»
Fig. 4.1 – résolution de x2 = cos x par bissection
0.8
0.6
⊕
0.4
⊕
0.2
⊕
⊕
⊕⊕
0
⊕
−0.2
−0.4
⊕
−0.6
−0.8
−1.0
0.5
0.6
0.7
0.8
0.9
1.0
1.1
Fig. 4.2 – solution de x2 = cos x par regula falsi
0.8
0.6
⊕
0.4
0.2
⊕
0
⊕
⊕
−0.2
−0.4
⊕
−0.6
−0.8
−1.0
0.5
0.6
0.7
0.8
0.9
40
1.0
1.1
Chapitre 4. Résolution d’équations non linéaires
Fig. 4.3 – itération convergente
1.4
1.2
1.0
0.8
0.6
0.4
0.2
0
0
x0
0.2
0.4
x1
0.6
x2
0.8
x3
1.0
1.2
1.4
Fig. 4.4 – itération divergente
1.4
1.2
1.0
0.8
0.6
0.4
0.2
0
0
4.4
0.2
0.4
x3
0.6
0.8
1.0
x2
x1
1.2
x0
1.4
Méthode du point fixe ou d’itération
Je me propose de résoudre l’équation
x = f (x).
(4.1)
Toute solution de cette équation s’appelle un point fixe de l’application f (l’image de x est x
lui-même). Je vais procéder par itérations successives à partir d’une estimation x(0) de la solution :
x(n+1) = f (x(n) ).
(4.2)
L’équation (4.2) admet une interprétation géométrique simple. La solution x∗ de (4.1) est le point
d’intersection de la première bissectrice (droite d’équation y = x) et de la courbe d’équation
y = f (x). L’ordonnée f (x(0) ) est la nouvelle abscisse x(1) ; le point (0,x(1) ) se déduit du point
(x(0) , f (x(0) )) par une symétrie orthogonale par rapport à la droite y = x. Cette construction
se répète pour x(2) , x(3) , · · · En essayant de résoudre (4.1) pour diverses fonctions f , vous verrez
que l’on peut rencontrer deux dispositions de la suite x(0) x(1) , · · ·, correspondant soit à un point
fixe attractif, soit à un point fixe répulsif, comme le montre les figures. D’où la question : à
quelle(s) condition(s) la suite des x(n) converge-t-elle, et vers quelle valeur ? Le raisonnement est
41
4.5. Méthode de Newton
simple et il est représentatif de nombreuses études de convergence. Je suppose que la fonction f
et sa dérivée f 0 sont continues dans un intervalle I = [a, b] entourant la racine x∗ . De plus, f est
telle que a ≤ f (x) ≤ b si x ∈ I. Cette condition implique que tous les x(k) appartiennent à I si
l’approximation initiale x(0) appartient à cet intervalle.
La racine vérifie (4.1) :
x∗ = f (x∗ ).
Je défini l’erreur à l’itération k
ek ≡ x(k) − x∗ .
Je commence par exprimer l’erreur à l’étape k + 1 en fonction de ek
ek+1 = x(k+1) − x∗ = f (x(k) ) − f (x∗ ).
D’après le théorème des accroissements finis, le second membre s’écrit
f (x(k) ) − f (x∗ ) = (x(k) − x∗ )f 0 (ξk )
où ξk est compris entre x∗ et x(k) . La relation cherchée s’écrit
ek+1 = f 0 (ξk )ek .
(4.3)
Pour que l’itération converge, il faut que l’erreur diminue en valeur absolue à chaque tour, ce qui
sera assuré si |f 0 (ξk )| < 1 quelque soit k. D’où le théorème
Théorème. Soit une fonction f continûment dérivable sur [a, b]
et telle que f (x) ∈ [a, b] si x ∈ [a, b]. Soit encore M telle que
M = sup |f 0 (x)| < 1.
a≤x≤b
Pour tout x(0) ∈ [a, b], la suite des itérés x(0) , x(1) , . . . , x(n) , . . .
converge vers la solution de l’équation x = f (x). On a de plus
x∗ − x(n+1)
= f 0 (x∗ ).
n→∞ x∗ − x(n)
lim
Vous voyez que l’erreur est multipliée par un facteur inférieur à un à chaque itération : on dit
que la convergence est linéaire.
La méthode du point fixe est d’application assez générale car beaucoup d’équations peuvent se
mettre sous la forme x = f (x). L’exemple suivant remonte à l’Antiquité. L’équation x2 = a peut
√se
a.
pour
approcher
mettre sous l’une des formes x = a/x ou x = 12 (x + a/x) qui ont été utilisées
√
La figure montre l’application de la méthode du point fixe à l’équation x = cos x ; les conditions
de convergence sont remplies dans [0,1] et, effectivement, la méthode converge vers x∗ = 0, 824132.
4.5
Méthode de Newton
La méthode de Newton s’applique à la résolution d’une équation de la forme f (x) = 0. Son
interprétation géométrique est donnée sur la figure suivante.
42
Chapitre 4. Résolution d’équations non linéaires
Fig. 4.5 – résolution de x2 = cos x par itération
1.4
1.2
1.0
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1.0
1.2
1.4
1.7
1.9
4
3
2
1
0
x3
−1
0.5
0.7
x2
x1
0.9
1.1
x0
1.3
1.5
Je dispose d’une approximation x(0) de la racine ; je construit la tangente à la courbe d’équation
y = f (x) au point d’abscisse x(0) ; cette droite coupe l’axe horizontal en x(1) ; je construit une
nouvelle tangente en cette abscisse, dont l’intersection avec l’axe des x me donne x(2) . Ce procédé
est itéré jusqu”à convergence.
L’équation de la droite de pente f 0 (x(k) ) passant par le point x(k) , f (x(k) ) s’écrit y − f (x(k) ) =
0 (k)
f (x )(x − x(k) ). Cette droite coupe l’axe des x au point d’abscisse
x(k+1) = x(k) −
f (x(k) )
.
f 0 (x(k) )
(4.4)
Cette équation définit l’algorithme de Newton pour la résolution des équations non-linéaires. Vous
constatez immédiatement que la méthode va diverger lorsque que f 0 sera nulle ou même petite. En
effet, si la pente de la courbe est faible, le point d’intersection x(k+1) de la tangente avec l’axe sera
très éloigné du point d’abscisse x(k) et l’algorithme a toutes chances de se perdre.
Je vais maintenant établir la condition de convergence de façon précise ; la théorie devient très
simple si l’on remarque qu’en posant
φ(x) ≡ x −
f (x)
,
f 0 (x)
je mets l’équation (4.4) sous la forme d’une itération vers un point fixe
x(k+1) = φ(x(k) ).
43
4.6. Méthode de la sécante
Cette fonction s’appelle parfois la fonction d’itération de la méthode de Newton. D’après le paragraphe précédent, je sais que la convergence dépend de φ0 (x) ; or
φ0 (x) =
f (x)f 00 (x)
[f 0 (x)]2 2
.
J’appelle encore x∗ la racine que je cherche ; elle vérifie f (x∗ ) = 0 et par conséquent
φ0 (x∗) = 0.
Comme je suppose que f, f 0 , f 00 sont définies et continues dans la région qui m’intéresse, il existe
un intervalle I = [x∗ − δ, x∗ + δ] tel que
|φ0 (x)| ≤ C < 1.
Il me suffit donc de choisir x(0) ∈ I pour assurer la convergence de l’algorithme de Newton.
Pour estimer la vitesse de convergence, je fait un développement de Taylor de φ autour de x∗ :
φ(x(k) ) − φ(x∗ ) =
1 (k)
(x − x∗ )2 φ00 (ηk )
2
où ηk est compris entre x∗ et x(k) . J’en déduis
e(k+1) =
1 (k) 2 00
[e ] φ (ηk ).
2
Lorsque k croit, x(k) et ηk se rapprochent de x∗ , ce que je traduis par l’expression
e(k+1)
1
= φ00 (x∗ ).
(k)
2
k→∞ [e
2
]
lim
Je calcule φ00 (x∗ ) = f 00 (x∗ )/f 0 (x∗ ) d’où le résultat
e(k+1)
f 00 (x∗ )
=
.
k→∞ [e(k) ]2
2f 0 (x∗ )
lim
(4.5)
Je peux donc énoncer le théorème suivant.
Théorème. Si f, f 0 et f 00 sont continues dans un voisinage de
x∗ et si f (x∗ ) = 0 et f 0 (x∗ ) 6= 0, si x(0) est choisi assez près
de x∗ , alors la suite définie par (4.4) converge vers x∗ , avec une
vitesse de convergence donnée par (4.5) ; la convergence est dite
quadratique.
4.6
Méthode de la sécante
La méthode de la sécante est une méthode «à deux points» : connaissant les approximations
x(k−1) et x(k) de la racine, je vais calculer une meilleure approximation x(k+1) . Le principe en est
simple. La corde qui joint les points de coordonnées [x(k−1) , f (x(k−1) )] et [x(k) , f (x(k) )] coupe l’axe
des x en un point d’abscisse x(k+1) . Je trouve facilement l’expression de cette abscisse
x(k+1) = x(k) − f (x(k) )
x(k) − x(k−1)
.
f (x(k) ) − f (x(k−1) )
Ce procédé n’est pas très différent de la méthode de Newton. En effet, la fraction au second
membre peut être considérée comme une approximation de 1/f 0 (x(k) ). L’analyse de la convergence
est cependant un peu plus compliquée et pourra être abordée en exercice.
44
Chapitre 4. Résolution d’équations non linéaires
4.7
Résolution de systèmes d’équations
Je ne ferais qu’effleurer le sujet vaste et compliqué des systèmes d’équations non linéaires à
plusieurs variables. Dans le cas de deux dimensions, je cherche les solutions du système :
½
f (x, y) = 0,
(4.6)
g(x, y) = 0.
Chaque équation définit une courbe du plan (x,y) ; résoudre le système équivaut donc à chercher les points d’intersection de ces deux courbes. Je recommande vivement une étude graphique
sommaire de ces deux équations avant toute recherche de racine par le calcul ; en effet, quelque soit
l’algorithme utilisé, la convergence dépendra fortement de la qualité de l’approximation initiale.
Je vais présenter une généralisation de la méthode de Newton. Je suppose que f , g et leurs
dérivées sont continues dans la région du plan qui m’intéresse. Je suppose connue une approximation
de la solution, soit (x0 , y0 ). Je peux toujours poser :
x = x0 + u ;
y = y0 + v.
Je substitue dans (9.1) et j’effectue un développement de Taylor du premier ordre à deux
variables :
f (x0 + u, y0 + v) = f (x0 , y0 ) + ufx + vfy + · · · = 0,
g(x0 + u, y0 + v) = g(x0 , y0 ) + ugx + vgy + · · · = 0,
où les dérivées partielles fx , fy , gx et gy sont calculées au point (x0 , y0 ). Je suppose que les
variations de f et g soient assez lentes pour que je puisse négliger les termes d’ordre supérieur. En
isolant les termes en u et v, je trouve
½
ufx + vfy = −f (x0 , y0 ),
(4.7)
ugx + vgy = −g(x0 , y0 ).
Les équations (4.7) constituent un système de deux équations linéaires à deux inconnues, u et v,
dont la solution est immédiate. Il est maintenant facile d’imaginer l’algorithme de Newton à deux
dimensions. J’obtiendrais une approximation encore meilleure de la solution en itérant ce procédé
x1 = x0 + u ;
y1 = y0 + v.
À l’étape suivante de l’itération, je remplace (x0 , y0 ) par (x1 ,y1 ) et ainsi de suite, jusqu’à satisfaire
à un critère de convergence.
Ce formalisme se généralise facilement à un nombre quelconque d’équations ; il est alors commode d’utiliser une notation matricielle. Soit f ∈ <n un vecteur de coordonnées fi (r) ; je suppose
aussi que r ∈ <n . Le système d’équations à résoudre s’écrit :
f = 0.
Si r0 est une approximation de la solution, je pose r = r0 + u. La correction u est alors définie
par l’équation
n
X
∂f
=0
f (r0 ) +
ui
∂
ui
1
ou encore, en définissant la "matrice jacobienne" J, d’éléments Jij = ∂fi /∂uj :
u = −J−1 f (r0 )
r1 = r0 + u
45
4.7. Résolution de systèmes d’équations
rn+1 = rn −J−1 f (rn )
La convergence est rapide si le point de départ est proche de la solution ; dans le cas contraire,
nous ne sommes pas assurés de voir l’algorithme converger.
Exemple. Soit le système de deux équations :
f (x, y) = x2 + y 2 − 4 = 0,
g(x, y) = ex + y − 1 = 0.
Il est très simple de construire les deux courbes représentant les équations f = 0 et g = 0 ;
elles se coupent en deux points voisins de (1,-2) et (-2,1) ; il n’y a pas d’autre solution. J’ai écrit
un programme de résolution par la méthode de Newton à deux dimensions, que vous trouverez
ci-dessous.
Listing 4.1 – Méthode de Newton
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// a l g o r i t h m e de newton a deux v a r i a b l e s
function u = f ( x , y )
u = x∗x + y∗y − 4
endfunction
function u = dfdx ( x , y )
u = 2∗ x ;
endfunction
function u = dfdy ( x , y )
u = 2∗ y
endfunction
function u = g ( x , y )
u = exp ( x ) + y − 1 ;
endfunction
function u = dgdx ( x , y )
u = exp ( x )
endfunction
function u = dgdy ( x , y )
u = 1;
endfunction
t o l = 1 e −6; nitmax = 2 0 ;
xmin = −4; xmax = 4 ; ymin = −3; ymax = 3 ;
xset ( "window" , 0 ) , xbasc ( 0 )
xt = − 3 : 0 . 1 : 3 ;
yt1 = 1 − exp ( xt ) ;
plot2d ( xt , yt1 , r e c t =[xmin , ymin , xmax , ymax ] , s t y l e =2)
xpoly ( [ xmin , xmax ] , [ 0 , 0 ] ) , xpoly ( [ 0 , 0 ] , [ ymin , ymax ] )
xt = − 2 : 0 . 0 2 : 2 ;
yt2 = sqrt ( 4 − xt . ^ 2 ) ;
plot2d ( xt , yt2 , 3 , " 000 " ) ;
yt2 = −sqrt ( 4 − xt . ^ 2 ) ;
plot2d ( xt , yt2 , 3 , " 000 " ) ;
for j = 1 : 3
a = input ( " a b s c i s s e i n i t i a l e : " ) ; b = input ( " ordonnee i n i t i a l e : " ) ;
n i t = 1 ; xx ( 1 ) = a ; x = a ; yy ( 1 ) = b ; y = b ;
xset ( "mark s i z e " , 2 ) , plot2d ( a , b , −4)
u = 1; v = 1;
while ( ( ( abs ( u ) > t o l ) | ( abs ( v ) > t o l ) ) & n i t < nitmax )
d e l t a = dfdx ( x , y ) ∗ dgdy ( x , y)− dfdy ( x , y ) ∗ dgdx ( x , y ) ;
u = ( g ( x , y ) ∗ dfdy ( x , y)− f ( x , y ) ∗ dgdy ( x , y ) ) / d e l t a ;
46
Chapitre 4. Résolution d’équations non linéaires
42
43
44
45
46
47
48
v = ( f ( x , y ) ∗ dgdx ( x , y)−g ( x , y ) ∗ dfdx ( x , y ) ) / d e l t a ;
nit = nit + 1
x = x + u, y = y + v,
xx ( n i t ) = x ; yy ( n i t ) = y ;
xarrows ( [ xx ( n i t −1) , xx ( n i t ) ] , [ yy ( n i t −1) , yy ( n i t ) ] , 0 . 0 5 , j )
end
end
La figure montre les itérations successives. La convergence est rapide, bien que le point de
coordonnées(xi , yi ) ait tendance à «explorer» une assez grande région du plan. Comme toujours
avec la méthode de Newton, le comportement dépend très fortement du point de départ. Pour
certains systèmes, on peut montrer que les valeurs initiales qui conduisent à la convergence sont
contenues dans une région du plan dont la frontière est une belle courbe fractale.
Fig. 4.6 – recherche des solutions d’un système non-linéaire
3
♦
2
1
0
♦
−1
−2
♦
−3
−4
4.8
−3
−2
−1
0
1
2
3
4
Racines des polynômes
Soit p(x) un polynôme de degré n à coefficients réels. On désigne parfois une équation comme
p(x) = 0 sous le nom d’équation algébrique. Le théorème fondamental de l’algèbre énonce que p(x)
a n racines, réelles ou complexes conjuguées deux à deux. Pour de nombreuses applications, il est
nécessaire de déterminer toutes les racines de p(x).
4.8.1
Séparation des racines
Avant de chercher les valeurs numériques des zéros d’un polynôme, il est commode d’avoir une
idée de leur localisation. Si [a0 , a1 , . . . , an ] est la suite des coefficients de p(x) supposés réels (certains pouvant être nuls), j’appelle ν le nombre de changements de signe dans la suite des {ai } (en
ignorant les coefficients nuls). Je désigne par k le nombre de zéros réels positifs de p(x), comptés
selon leur multiplicité (une racine double compte pour 2, etc.). Je peux alors énoncer la règle de
Descartes :
k ≤ ν et de plus ν − k doit être pair.
Exemple. Les coefficients de x6 − x − 1 présentent un changement de signe (ν = 1) ; k vaut
donc 0 ou 1, mais la valeur 0 est à rejeter puisqu’alors ν − k = 1. Ce polynôme a donc une racine
réelle positive.
47
4.8. Racines des polynômes
Je peux aussi trouver le nombre de racines réelles négatives : il suffit d’appliquer la règle de
Descartes au polynôme q(x) = p(−x). Le polynôme de l’exemple précédent admet un zéro réel
négatif.
4.8.2
Suites de Sturm
Une localisation plus précise des racines d’un polynôme p(x) de degré n peut être obtenue en
construisant une «suite de Sturm» basée sur p. Je commence donc par définir ce qu’est une suite
de Sturm.
Soit p0 (x), p1 (x), . . . , pm (x) une séquence de polynômes ; elle constitue une suite de Sturm si
–
–
–
–
Les zéros réels de p0 (x) sont simples.
p1 (α)p00 (α) < 0 si α est un zéro réel de p0 .
Pour k = 1, 2 . . . , m − 1, pk−1 (α)pk+1 (α) < 0 si α est un zéro réel de pk (x).
Le dernier polynôme, pm (x) n’a pas de zéros réels.
Comment construire cette suite ? À l’aide de la relation de récurrence assez simple que j’expose
maintenant. Je pose
p0 (x) ≡ p(x)
;
p1 (x) ≡ −p00 (x)
et
pk−1 (x) = qk (x)pk (x) − pk+1 (x) avec deg pk > deg pk+1 .
(4.8)
Si les pk étaient des nombres, vous auriez sûrement reconnu l’algorithme d’Euclide pour la construction du PGCD. Le concept de PGCD se transpose facilement aux polynômes. Comme le degré des
polynômes décroît, l’algorithme s’arrête au bout de m ≤ n étapes :
pm−1 (x) = qm (x)pm (x),
pm (x) 6= 0.
Le dernier polynôme, pm est un plus grand commun diviseur de p0 et p1 . Comme p = p0 n’a
que des zéros simples, p0 et p1 = −p00 n’ont pas de diviseurs communs (ne sont jamais nuls
simultanément) et, par conséquent, pm n’a pas de zéros réels. Si pk (α) = 0, la relation (4.8)
implique que pk−1 (α) = −pk+1 (α). Il pourrait se faire que pk+1 (α) soit nul ; mais alors, toujours
d’après la relation de récurrence, tous les pk (α) seraient nuls, y compris pm , ce qui est contraire
au résultat précédent. En tenant compte des définitions de p0 et p1 , vous vous apercevez que les
{pk } satisfont à toutes les propriétés qui définissent une suite de Sturm.
J’énonce maintenant le théorème de Sturm :
Théorème. Le nombre de racines réelles de p(x) ≡ p0 (x) dans
l’intervalle a ≤ x < b est égal à w(b) − w(a) où w(x) est le nombre
de changements de signe dans la suite p0 (x), p1 (x), . . . , pm (x) au
point x.
Je ne donnerai pas ici la démonstration, simple mais assez longue : il faut examiner en détail
les changements de signe de chaque polynôme au voisinage d’un zéro de l’un d’eux.
Exemple. Soit p(x) = x5 − x3 − x − 1. La suite de Sturm de p est
p0 (x) =
x5 − x3 − x − 1,
p1 (x) =
−5x4 − 3x2 + 1,
2 3 4
x + x + 1,
5
5
25
−13x2 − x − 1,
2
174
385
x−
,
−
338
169
47827
.
148225
p2 (x) =
p3 (x) =
p4 (x) =
p5 (x) =
48
Chapitre 4. Résolution d’équations non linéaires
Ici, m = 5. Je ne considère que les cas x = −∞, 0, ∞ ; je construis un tableau de signes
x
p0
p1
p2
p3
p4
p5
w(x)
−∞
+
+
1
0
+
+
+
3
∞
+
+
+
4
La suite présente un seul changement de signe lorsque x est très grand négatif, trois changements
pour x = 0 et 4 pour x grand positif. Il y a donc deux zéros dans l’intervalle [−∞, 0[ et un dans
[0, ∞[.
4.8.3
Division des polynômes
Je reviens plus en détail, dans ce paragraphe, sur la division des polynômes, qui a été considérée comme bien connue au paragraphe précédent. Étant donné un polynôme p(x) de degré n (le
dividende) et un polynôme b(x) de degré m < n (le diviseur), on sait trouver deux polynômes, le
quotient q(x) et le reste r(x) tels que
p(x) = b(x)q(x) + r(x), avec deg r < deg b.
(4.9)
Remarquez que le degré de q(x) est imposé (n − m) mais ne joue aucun rôle dans la suite. Avec
cette définition, la division des polynômes est très semblable à celle des nombres, pour laquelle le
reste doit être inférieur au diviseur. Je considère maintenant un cas particulier, celui où le diviseur
est de la forme b(x) = x − α. Le reste est alors une constante (polynôme de degré < 1). Je peux
écrire
p(x) = (x − α)q(x) + r
d’où je tire, en faisant x = α,
p(α) = r.
(4.10)
en d’autres termes, la valeur numérique de p en x = α est le reste de la division de p par x − α. Ce
résultat a une conséquence importante. Si a est un zéro de p, donc si p(α) = 0, alors r = 0, ce qui
signifie qu’un polynôme qui s’annule en x = α est divisible par x − α. J’ai déjà expliqué (chapitre
1) comment calculer r ou p(a), mais je reprendrai ce calcul plus bas. Je peux aussi obtenir une
expression simple de la valeur numérique de la dérivée de p. Je sais que
p0 (x) = q(x) + (x − α)q 0 (x)
et, en faisant à nouveau x = α,
p0 (α) = q(α).
(4.11)
Comme vous le verrez, il est facile de calculer q(α). Des équations analogues existent pour les
dérivées d’ordre supérieur.
Je vais maintenant construire le polynôme q(x) par identification. Je note c0 , c1 , . . . , cn−1 les
coefficients des puissances croissantes de x dans q. Ces nombres doivent satisfaire, quelque soit x,
à la relation
an xn + an−1 xn−1 + · · · + a1 x + a0 = (x − α)(cn−1 xn−1 + cn−2 xn−2 + · · · + c1 x + c0 ).
En identifiant les coefficients des puissances successives de x, j’obtiens
an = cn−1
;
an−1 = cn−2 − αcn−1 ; . . .
49
4.8. Racines des polynômes
a1 = c0 − αc1
;
a0 = r − αc0
soit encore :
cn−1
cn−2
···
c0
r
= an
= an−1 + αcn−1 ,
···
= a1 + αc1 ,
= a0 + αc0 .
(4.12)
Vous voyez que r, qui est aussi la valeur numérique de p(α), s’obtient au moyen de n − 1 multiplications. En fait la relation de récurrence précédente est équivalente à la règle suivante. J’écris le
polynôme p(x) sous la forme :
p = (((...(an x + an−1 )x + an−2 )x + .... + a1 )x + a0 ,
(4.13)
puis je fais x = α avant d’effectuer les calculs. La parenthèse intérieure contient alors cn−2 , la
suivante cn−3 , jusqu’à r. Vous avez reconnu la méthode de Horner. Je donne un exemple, qui fait
un peu double emploi avec celui du chapitre 1.
Exemple. Je vais calculer la valeur de p = 2x5 − 71x3 − 8x2 + 12x + 3 pour x = 6, ce qui revient
à diviser p par x − 6.Il est commode de disposer le calcul comme ci-dessous. Seuls les coefficients
des puissances décroissantes de x sont nécessaires, mais il faut les faire figurer tous, mêmes ceux
qui sont nuls.
p 2
q 2
0
6 × 2 + 0 = 12
−71
6 × 12 − 71 = 1
−8
6 × 1 − 8 = −2
12
6 × −2 + 12 = 0
3
6×0+3=3
Le reste est r = 3, le quotient est q = 2x4 + 12x3 + x2 − 2x. La valeur numérique de p0 (6) est q(6)
qui s’obtient par le même procédé.
q
2
12
2 6 × 2 + 12 = 24
1
6 × 24 + 1 = 145
−2
870 − 2 = 868
0
6 × 868 = 5208
ce que vous pouvez vérifier par un calcul direct.
Lorsque l’on traite à la main un seul polynôme, les formes (4.12) et (4.13) sont équivalentes
mais, lorsque l’on doit faire de nombreux calculs, il devient intéressant d’écrire un programme
général. Je donne ci-dessous le squelette d’un programme qui calcule p et p0 à partir du tableau a
des coefficients de p et de la valeur de x.
p = a[n], dp = 0.0;
for i de n-1 à 0
dp = dp*x + p;
p = p*x+a[i];
Lorsque la boucle se termine, p contient la valeur numérique du polynôme (accumulée selon la
méthode de Horner) et dp celle de la dérivée.
4.8.4
La méthode de Newton pour les polynômes
Je dispose maintenant d’un algorithme pratique de calcul des valeurs numériques d’un polynôme et de sa dérivée : c’est tout ce qu’il faut pour mettre en oeuvre la méthode de Newton. En
voici un exemple : la recherche du zéro de p = x3 − x2 + 2x + 5 voisin de -1. Les coefficients ont
été rangés en colonne pour gagner de la place.
50
Chapitre 4. Résolution d’équations non linéaires
x
-1
p
1
-1
2
5
q
1
-2
4
1
p0
1
-3
7
-1,142857
1
-1
2
5
1
-2,142857
4.448979
-0,084546
1
-3,285714
8,204081
-1,132552
1
-1
2
5
1
-2,132552
4,415226
-0.000473
1
-3,265104
8,113126
p/p0
0,142857
-0,010305
-0.000058
-1,132494
Les nombres soulignés sont les valeurs de p, alors que les valeurs de p0 figurent en caractères gras.
On voit que la convergence (caractérisée par le terme correctif (p/p0 ) est très rapide. Il est possible
d’étendre cet algorithme aux racines complexes ou aux polynômes à coefficients complexes.
p est de degré 3 et admet donc 3 zéros ; comment pourrais-je les trouver ? Très simplement :
il suffit de diviser le polynôme de départ par x + 1, 132494. La division doit se faire exactement,
puisque -1,132494 est racine de p(x) ; le polynôme quotient est ici du second degré et ses zéros
s’obtiennent sans problème. Ce procédé s’appelle la déflation. Dans le cas général d’un polynôme
p(x) de degré n, dès que j’ai déterminé une racine x∗ (par la méthode de Newton par exemple),
je divise p(x) par x − x∗ pour obtenir un polynôme de degré n − 1. Je répète ce procédé jusqu’au
degré 2 ou 1. Si n est un tant soit peu grand, les erreurs d’arrondi risquent, en s’accumulant, de
gâcher ce programme : le calcul doit être mené avec toute la précision possible.
51
Chapitre 5
Polynômes orthogonaux
5.1
Introduction
Les suites de polynômes orthogonaux apparaissent fréquemment en physique mathématique en
particulier au cours de la résolution d’équations aux dérivées partielles (Laplace, Schrödinger) par
la méthode de séparation des variables. Elles sont aussi très utilisées en analyse numérique. On
connaît de nombreuses familles de polynômes orthogonaux, qui ont en commun un certain nombre
de propriétés simples, que je vais décrire succinctement.
5.2
Définition, Existence
Soit [a, b] un intervalle (qui peut être fini ou infini) et w(x) une fonction strictement positive
et intégrable sur cet intervalle. On appelle polynômes orthogonaux sur [a, b], par rapport à la
"fonction de poids" w(x), une suite de polynômes G0 (x), G1 (x),. . ., Gn (x),. . .(où Gk est de degré
k) tels que :
Z b
(Gk , Gn ) =
w(x)Gk (x)Gn (x)dx = 0 si k 6= n.
(5.1)
a
Le nombre
Z
(f, g) =
f (x)g(x)w(x)dx
(5.2)
est souvent appelé «produit scalaire» de f par g ; lorsqu’il est nul, on dit que les fonctions f et g
sont «orthogonales». En faisant f = g dans la relation précédente, on obtient le carré de la norme
de f :
Z
k f k2 = (f, f ) =
[f (x)]2 w(x)dx.
(5.3)
On montre facilement que ce produit scalaire est linéaire en f et g, symétrique et qu’il vérifie
l’inégalité de Cauchy-Schwartz :
(f, g) ≤k f kk g k .
Les formules (5.1,5.2) ne définissent pas entièrement les Gn ; il est commode d’imposer les conditions
supplémentaires :
Z b
Z b
2
(Gn , Gn ) =
w[Gn ] dx = 1;
xwGn Gn+1 dx > 1
a
On a alors :
a
Z
(Gk , Gn ) =
b
w(x)Gk (x)Gn (x)dx = δk,n
a
52
Chapitre 5. Polynômes orthogonaux
Les polynômes sont ainsi orthonormés.
Pour prouver l’existence de ces polynômes, je vais les construire par le procédé de GramSchmidt, appliqué à l’ensemble des puissances successives de x. G0 est une constante positive, telle
que (G0 , G0 ) = 1. g1 est une fonction linéaire que je définis comme :
g1 = x − (x, G0 )G0 .
g1 est manifestement orthogonal à G0 . G1 est défini comme g1 normé :
G1 = g1 / k g1 k .
Je procède ensuite par itération de ces relations ; g2 est une fonction quadratique définie par :
g2 = x2 − (x2 , G0 )G0 − (x2 , G1 )G1 ,
G2 = g2 / k g2 k .
En faisant le produit scalaire de g2 successivement par G0 et G1 , je vérifie que cette fonction est
bien orthogonale à G0 et G1 . Je construis ainsi la suite des polynômes Gk , à partir des nombres
(x, G0 ), (x2 , G0 ), . . . , (xk , Gl ). . .
5.3
Relation avec les polynômes habituels
Théorème Tout polynôme de degré n est représentable comme combinaison linéaire de polynômes Gk , avec k ≤ n.
J’ai construit les Gk comme combinaisons linéaires des xp ; un polynôme quelconque Φ(x),
lui-même combinaison linéaire des xp , peut donc s’exprimer comme :
Φ(x) = a0 G0 + a1 G1 + · · · + an Gn .
La détermination des ai est facile : j’effectue en effet le produit scalaire de l’égalité précédente
par Gp (p ≤ n). Il vient :
ap = (Φ, Gp ).
J’ai au contraire (Φ, Gn+1 ) = 0, quelque soit Φ(x) de degré n, puisque Gn+1 est orthogonal
à tous les Gk d’indice inférieur. Par ailleurs, Φ(x) sera identiquement nul si et seulement si :
(Φ, Gp ) = ap ≡ 0; p = 0, 1, . . . , n. J’en déduis le :
Théorème. Le polynôme Gk est orthogonal à tout polynôme de degré inférieur.
Remarque. Le produit scalaire (xGn−1 , Gn ) est encore le produit d’un polynôme de degré n,
xGn−1 , par Gn ; si bn dénote le coefficient de Gn dans le développement de xGn−1 , le produit
scalaire considéré se réduit à :
(xGn−1 , Gn ) = bn (Gn , Gn )
5.4
6= 0.
Zéros de Gn
Les zéros de Gn appartiennent à I et sont tous simples. Pour le prouver, je suppose que Gn
n’admette dans I que p < n racines, toutes simples et je montre que j’aboutis à une contradiction.
Je forme le polynôme Φ de degré p < n qui admet ces mêmes racines. Le produit scalaire (Gn , Φ)
doit être nul puisque deg(Φ) < n ; or ce produit scalaire est en fait l’intégrale :
Z
(Gn , Φ) = w(x)Φ(x)Gn (x)dx
53
5.5. Relation de récurrence
qui ne peut être nulle, puisque l’intégrant garde un signe constant dans I. En effet, le produit ΦGn
admet les racines de Gn (ou de Φ) comme racines doubles et ne peut changer de signe lorsque x
traverse l’une de ces racines ; de plus w(x) > 0 sur I. Il faut donc que p = n.
Je montre maintenant que Gn ne peut avoir de racines multiples. Dans un raisonnement par
l’absurde calqué sur le précédent, je suppose, au contraire, que Gn admet, dans I, n − 2 racines
simples et une racine double. Je prends alors pour Φ le polynôme de degré n−2 qui admet les mêmes
racines simples que Gn . L’intégrale qui exprime le produit scalaire (Φ, Gn ) ≡ 0 ne peut s’annuler,
parce que l’intégrant garde un signe constant dans I. Je pourrais généraliser ce raisonnement en
définissant Φ comme le polynôme de degré < n, qui admet comme racines tous les zéros d’ordre
impair de Gn .
5.5
Relation de récurrence
Je vais montrer l’existence d’une relation de récurrence, de la forme :
αn Gn+1 (x) = (βn x + γn )Gn (x) − δn Gn−1 (x).
où les αn , βn , γn , δn sont des constantes. Soit ck le coefficient de xk dans Gk (terme de plus haut
degré) ; on pose an = cn+1 /cn . Je considère le polynôme F = Gn+1 − an xGn : il est de degré n au
plus et peut donc s’exprimer comme une combinaison linéaire des Gi , i < n + 1 :
F =
n
X
bj Gj .
0
Formons le produit scalaire (F, Gp ) = (Gn+1 , Gp ) − an (xGn , Gp ) = −an (xGn , Gp ), à condition
que p < n + 1. De plus, l’examen de l’intégrale qui définit (xGn , Gp ) montre que : (xGn , Gp ) =
(Gn , xGp ). Comme xGp est de degré au plus p + 1, il est orthogonal à Gn tant que p < n − 1. J’ai
ainsi montré que F était orthogonal à Gp , 0 ≤ p ≤ n − 2. Le développement de F s’écrit alors :
F = Gn+1 − an xGn = bn Gn + bn−1 Gn−1
et
Gn+1 = (an x + bn )Gn + bn−1 Gn−1 .
Cette relation est bien de la forme annoncée, à condition de choisir αn = 1 et δn = −bn . En
manipulant cette relation à l’aide des propriétés d’orthogonalité, on montre que an > 0 et bn > 0.
En posant G−1 = 0, je définis complètement les Gn .
5.6
Disposition des zéros de Gn
Théorème. Les zéros de Gk séparent ceux de Gk+1 .
Ce résultat est vrai pour G0 et G1 ; il se démontre par récurrence dans le cas général. On peut
dire aussi que la suite de Gn forme une suite de Sturm.
5.7
Équation différentielle pour Gn
On peut montrer que chaque Gk obéit à une équation différentielle du second ordre. Il est plus
facile de démontrer une réciproque partielle. Soit l’équation différentielle :
A(x)y 00 + B(x)y 0 + Cn y = 0,
54
Chapitre 5. Polynômes orthogonaux
où Cn est une constante (avec Cn 6= Cp si n 6= p), A(x) et B(x) deux fonctions régulières de x.
Supposons que l’équation admette une solution polynômiale y = Gn (x) de degré n pour chaque
valeur de n.
On peut alors trouver un intervalle [a, b] et une fonction de poids w(x) tels que la suite des Gn
soit orthogonale par rapport à ces éléments. En effet, Gn et Gp satisfont séparément à l’équation
proposée :
AG00n + BG0n + Cn Gn = 0,
AG00p + BG0p + Cp Gp = 0.
Je multiplie la première relation par wGp , la seconde par wGn et je retranche membre à membre ;
il vient
Aw(Gn G00p − Gp G00n ) + Bw(Gn G0p − Gp G0n ) + w(Cp − Cn )Gn Gp = 0
équation qui s’écrit encore :
[Aw(Gn G0p − Gp G0n )]0 + [wB − (wA)0 ](Gn G0p − Gp G0n ) + w(Cp − Cn )Gn Gp = 0.
Je considère l’équation différentielle u(x)B(x) − (u(x)A(x))0 = 0 ; j’appelle encore w(x) la solution
qui obéit aux conditions aux limites Aw|a = Aw|b = 0, ce qui définit la fonction inconnue w(x).
En intégrant terme à terme l’équation (1), avec cette définition de w, j’obtiens :
Z
b
(Cp − Cn )
wGn Gp dx = 0,
a
ce qui signifie que les polynômes Gn sont orthogonaux sur l’intervalle I par rapport à la fonction
de poids w.
5.8
Fonction génératrice
On peut en général trouver une fonction g(u, x) telle que l’on puisse écrire :
g(u, x) =
∞
X
Ck Gk (x)uk
k=0
les Ck étant des constantes et u une variable réelle auxiliaire. Si la fonction g a une forme analytique
«simple» par rapport à u et à x, on l’appelle la fonction génératrice de la suite des Gk .
5.9
Formule d’Olinde Rodrigues
Les Gk sont proportionnels à la dérivée d’ordre k d’une fonction Uk (x) (formule d’Olinde
Rodrigues) :
1 dn
Gn (x) =
Un (x)
w dxn
laquelle est solution d’un problème différentiel :
dn+1 1 dn Un
[
]=0
dxn+1 W dxn
avec les conditions aux limites U = U 0 = U 00 = ..... = U (n−1) = 0 en x = a et x = b.
55
5.10. Identité de Darboux-Christofel
5.10
Identité de Darboux-Christofel
Une démonstration plutôt laborieuse permet d’établir l’identité de Darboux-Christofel :
n
X
Gk (x)Gk (y) =
k=0
1
[Gn+1 (x)Gn (y) − Gn (x)Gn+1 (y)]
(x − y)an
souvent utilisée pour simplifier des expressions impliquant les Gn (la constante an a été définie au
5).
5.11
Polynômes de Legendre
Les polynômes de Legendre (déjà rencontrés dans le premier chapitre) sont orthogonaux sur
[-1,1] par rapport à la fonction de poids w = 1. A partir de P0 = 1, on peut orthogonaliser les
puissances successives de x pour obtenir
P0 = 1
;
P1 = x ;
P2 = (3x2 − 1)/2
P4 = (35x4 − 30x2 + 3)/8 ;
;
P3 = (5x3 − 3x)/2,
P5 = (63x5 − 70x3 + 15x)/8.
Le polynôme Pk a le degré et la parité de k. En intégrant par partie dans la relation d’orthogonalité (Pk , Pl ) = 0, on démontre une relation d’Olinde Rodrigues :
Pn (x) =
1
2n n!
dn 2
(x − 1)n
dxn
avec Pn (1) = 1. Avec ces définitions, les Pn ne sont pas normalisés à 1 mais à (Pn , Pn ) = 2/(2n+1).
Ils admettent la fonction génératrice :
∞
g(ux) = √
X
1
=
Pk (x)uk
2
1 − 2ux + u
k=0
d’où l’on tire la relation de récurrence :
(n + 1)Pn+1 − (2n + 1)xPn + nPn−1 = 0.
Les polynômes de Legendre obéissent à l’équation différentielle :
(x2 − 1)Pn00 + 2xPn0 − n(n + 1)Pn = 0.
56
Chapitre 5. Polynômes orthogonaux
5.12
Polynômes de Hermite
170
130
polynomes de Hermite, n = 1,2,3,4
90
50
10
−30
−70
−110
−150
−2.0
−1.6
−1.2
−0.8
−0.4
0
0.4
0.8
1.2
1.6
2.0
Les polynômes de Hermite sont orthogonaux sur l’intervalle : [−∞, +∞], par rapport à la
fonction de poids : w(x) = exp(−x2 ). Ils satisfont à la relation de récurrence :
Hn+1 − 2xHn + 2nHn−1 = 0
et à l’équation différentielle :
Hn00 − 2xHn0 + 2nHn = 0.
Ils peuvent se déduire de la fonction génératrice :
g(u, x) = exp(2ux − u2 ) =
X
Hk (x)uk /k!
k
On connaît aussi une formule de Rodrigues :
Hn = (−1)n exp(x2 )
dn
exp(−x2 ).
dxn
Les polynômes d’Hermite admette une représentation générale assez simple :
Hn =
n/2
X
0
1
1 1
(2x)n−2p
(− )p
2 p! (n − 2p)!
et les premiers représentants de l’espèce s’écrivent
H0 = 1 ;
H1 = 2x ;
H4 = 16x4 − 48x2 + 12
H2 = 4x2 − 2 ;
;
H3 = 8x3 − 12x;
H5 = 32x5 − 160x3 + 120x.
Vous pouvez constater que Hk a la parité de k.
57
5.13. Polynômes de Laguerre
5.13
Polynômes de Laguerre
On peut les définir à partir d’une formule d’Olinde Rodrigues :
Ln (x) =
1 −x dn ¡ −x n ¢
e
e x ,
n!
dxn
qui me permet d’écrire les premiers membres de la suite :
L0 = 1
;
L1 = −x + 1
;
L2 =
1 2
(x − 4x + 2)
2
;
L3 =
1
(−x3 + 9x2 − 18x + 6).
6
Ces polynômes admettent la fonction génératrice :
µ
¶ X
∞
1
xt
exp −
=
Lk (x)tk .
1−t
1−t
k=0
et la relation de récurrence :
(n + 1)Ln+1 + (x − 2n − 1)Ln + nLn−1 = 0.
Ils satisfont à l’équation différentielle :
xL00n + (1 − x)L0n + nLn = 0.
Ces polynômes sont orthogonaux sur [0, ∞] par rapport à la fonction de poids w = e−x ; ils sont
normalisés à un : (Ln , Ln ) = 1. Grâce au programme ci-dessous, j’ai calculé et tracé les premiers
polynômes de Laguerre.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// polynomes de L a g u e r r e
// ( n+1)L_{n+1} + ( x −2n −1)L_n + nL_{n−1} = 0
function f n = L( n , x )
i f n == 0 , f n = 1 , end
i f n == 1 , f n = 1 − x , end
if n > 1
k = 1 ; Lavder = 1 ; Lder = 1 − x ;
while k < n
L = ( ( 2 ∗ k + 1 − x ) . ∗ Lder − k∗ Lavder ) / ( k +1);
Lavder = Lder ;
Lder = L ;
k = k+1;
end
fn = L ;
end
endfunction
x = 0:0.1:6;
xset ( "window" , 0 ) , xbasc ( 0 )
plot2d ( x , [ L ( 2 , x ) ’ ,L ( 3 , x ) ’ ,L ( 4 , x ) ’ ,L ( 5 , x ) ’ ] )
xsegs ( [ 0 , 6 ] , [ 0 , 0 ] )
xset ( " f o n t s i z e " , 3 )
xstring ( 2 , 6 , " polynomes de Laguerre , n = 1 , 2 , 3 , 4 " )
58
Chapitre 5. Polynômes orthogonaux
7
polynomes de Laguerre, n = 1,2,3,4
5
3
1
−1
−3
−5
0
5.14
1
2
3
4
5
6
Polynômes de Tschebychef
Ces polynômes admettent la définition simple :
Tn (x) = cos[narccos(x)].
On obtient une relation de récurrence entre Tn−1 , Tn et Tn+1 en calculant cos[(n ± 1)x] :
Tn+1 (x) + Tn−1 (x) = 2xTn (x).
J’en déduis les expressions des premiers polynômes
T0 = 1 ;
T1 = x ;
T2 = 2x2 − 1 ;
T3 = 4x3 − 3x;
T4 = 8x4 − 8x2 + 1.
Les Tn obéissent à l’équation différentielle
(1 − x2 )Tn00 − xTn0 + n2 Tn = 0.
Ils sont orthogonaux sur l’intervalle [-1,1] par rapport à la fonction de poids
w= √
1
.
1 − x2
Leur fonction génératrice s’écrit
∞
g(x, u) =
X
1 − ux
uk Tk (x)
=
1 − 2ux + u2
k=0
5.15
Autres polynômes classiques
Voici les définitions de certaines suites moins fréquemment rencontrées.
59
5.15. Autres polynômes classiques
5.15.1
Jacobi
I = [−1, 1] ; w = (1 − x)α (1 − x)β ; α, β > -1
Les polynômes de Jacobi recouvrent plusieurs cas particuliers intéressants : polynômes de Legendre, pour α = β = 0, polynômes de Tschebychef de première espèce (α = β = - 1/2), de
deuxième espèce ( α = β = 1/2), de troisième espèce (α = - β = -1/2), de quatrième espèce (α =
- β = 1/2) et polynômes de Gegenbauer (α = β = λ - 1/2).
5.15.2
Laguerre généralisé
I = [0, ∞] ; w = xα e−t ; α > −1.
Les polynômes de Laguerre habituels sont obtenus en faisant α = 0 dans la définition des
polynômes généralisés.
5.15.3
Fonctions de Legendre associées
Elles sont régies par l’équation différentielle suivante, où m est un entier inférieur ou égal à n
·
¸
m2
(1 − x2 )u00 − 2xu0 + n(n + 1) −
u=0
1 − x2
qui se réduit à l’équation différentielle définissant les polynômes de Legendre habituels quand
m = 0. La solution régulière est u(x) = Pnm (x) et on peut montrer que
Pnm (x) = (1 − x2 )m/2
dm
Pn (x).
dxm
Pnp est un polynôme en x lorsque m est pair. En posant x = cos θ, je met l’équation différentielle
sous une forme qui apparaît souvent dans les problèmes à symétrie sphérique
µ
¶ ·
¸
1 d
dv
m2
sin θ
+ n(n + 1) −
v = 0.
sin θ dθ
dθ
sin2 θ
Les premières fonctions de Legendre associés s’écrivent
p
p
P11 = 1 − x2 = sin θ ; P21 = 3x 1 − x2
P31 =
p
3
(5x2 − 1) 1 − x2
2
;
;
P32 = 15x(1 − x2 )
60
P22 = 3(1 − x2 ) = 3 sin2 θ
;
P33 = 15x(1 − x2 )3/2 .
Chapitre 6
Dérivation et Intégration numériques
6.1
Introduction
Dans ce chapitre, je m’intéresse au calcul numérique de la dérivée en un point d’une fonction et
au calcul (numérique) de l’intégrale d’une fonction sur un intervalle donné. Pour l’une ou l’autre
tâche, il est bon de traiter séparément le cas d’une fonction définie analytiquement (par une formule)
et le cas d’une fonction définie numériquement (par une table de valeurs).
6.2
6.2.1
Dérivée d’une fonction analytique
Théorème de Taylor
Je considère une fonction f définie par une formule ou un algorithme, dérivable dans un intervalle. Cette fonction est trop compliquée pour que le calcul analytique de sa dérivée soit pratique,
mais je souhaite pourtant connaître la valeur numérique de f 0 (x). Le procédé le plus simple s’inspire
de la définition même de la dérivée. Soit f(x) la fonction à dériver, je sais que :
f (x + h) − f (x)
f0 ∼
.
=
h
Comment faut-il choisir h ? Ce paramètre doit être plus grand que le plus petit réel représentable
(environ 10−38 en simple précision), sinon le calcul s’arrête et la machine affiche «Division par
Zéro !». h doit aussi être assez grand pour que f (x) et f (x + h) soit reconnus comme différents
(10−7 en simple précision). Je suppose que h est assez grand pour être à l’abri des erreurs d’arrondi.
Il faut maintenant éviter de tomber de Charybde en Scylla, et garder h assez petit pour que les
erreurs de troncation soient négligeables. Ces dernières sont faciles à estimer. Je peux écrire une
version exacte de la formule précédente, d’après le théorème de Taylor :
f0 =
f (x + h) − f (x) h
+ f ”(x + θh); 0 ≤ θ ≤ 1.
h
2
Vous voyez que l’erreur est O(h), ou encore que la formule est du premier ordre : elle est exacte
pour une fonction linéaire.
En faisant un petit effort d’imagination, je peux construire une formule plus précise, mais
qui ne me coûtera aucun travail supplémentaire (même nombre d’évaluations de la fonction f ).
Appliquons deux fois le théorème de Taylor, pour les points x − h et x + h :
f (x + h) = f (x) + hf 0 (x) +
f (x − h) = f (x) − hf 0 (x) +
61
h2 00
2 f (x)
h2 00
2 f (x)
+ O(h3 )
+ O(h3 )
6.2. Dérivée d’une fonction analytique
Grâce à la parité des termes en h2 , ceux-ci disparaissent de la différence terme à terme des deux
lignes précédentes :
f (x + h) − f (x − h)
f 0 (x) =
+ O(h2 ).
2h
Les erreurs d’arrondi sont les mêmes que précédemment, mais l’erreur de troncation est maintenant
en h2 , la formule est exacte pour les fonctions quadratiques.
Exemple. On a extrait d’une table les valeurs suivantes :
x
0.159
0.160
0.161
ln x
-1.83885
-1.83258
-1.82635
et on demande de calculer la dérivée de ln x en 0.160. J’ai trouvé
f (0.161) − f (0.160)
= 6.23 ;
0.001
f (0.161) − f (0.159)
= 6.25.
0.002
Quelle est la valeur exacte ?
6.2.2
Méthode des coefficients indéterminés
La méthode des coefficients indéterminés permet de retrouver très facilement les formules d’approximation des dérivées, sans toutefois donner d’indications sur le terme d’erreur. Je cherche trois
nombres a− , a0 et a+ tels que l’expression suivante soit «aussi exacte que possible» :
f 0 (x) = a+ f (x + h) + a0 f (x) + a− f (x − h).
Je vais imposer trois conditions : la relation devra être vérifiée pour f = x0 , x1 , et x2 (les trois
premières puissances de x). Ceci s’écrit :
0 = a+ + a0 + a− , 1 = a+ (x + h) + a0 x + a− (x − h), 2x = a+ (x + h)2 + a0 x2 + a− (x − h)2 .
Ce système de trois équations linéaires à trois inconnues se résout facilement. Compte tenu de la
première équation, la deuxième s’écrit :
1/h = a+ + a0 − a− .
Tenant compte de deux premières, la dernière équation devient :
0 = a+ + a− .
D’où je tire facilement
a0 = 0,
a+ = −a− = 1/2h.
L’heureuse disparition de certains termes dans les équations précédentes ne doit rien au hasard.
Ces relations doivent être vérifiées quel que soit x : il faut donc que x ne figure pas dans le système
qui détermine les coefficients a. J’aurais donc pu partir d’une valeur particulièrement commode de
x, comme x = 0. Avec l’habitude, on peut gagner encore un peu de temps en posant h = 1 et en
restaurant h à la fin : f 0 a les dimensions de f /h.
Vous pourrez établir d’autres formules, en nombre limité uniquement par votre patience. Certaines impliqueront un grand nombre de valeurs de f , pour une erreur de troncation moindre,
d’autres pourront être dissymétriques, pour s’approcher sans danger d’une discontinuité : on peut,
par exemple, calculer f00 en fonction de f0 , f1 et f2 . Elles s’obtiennent par la méthode des coefficients indéterminés, par le théorème de Taylor ou à partir des différences latérales (voir plus
loin).
62
Chapitre 6. Dérivation et Intégration numériques
De façon analogue, j’obtiens une approximation de la dérivée seconde en appliquant deux fois
les règles précédentes. Ainsi :
f (x + h) − 2f (x) + f (x − h)
hf 00 (x) ∼
.
= f 0 (x) − f 0 (x − h) =
h
Le terme d’erreur s’obtient aisément à l’aide du théorème de McLaurin : il dépend de h2 f 000 .
Exemple. La dérivée seconde de ln x, au point 0.160, vaut, d’après les données précédentes, -40.
6.2.3
Polynôme d’interpolation
Il existe une autre méthode systématique pour construire des formules d’approximation de f 0 :
il suffit de dériver un polynôme d’interpolation de f . Je vous rappelle la formule de Newton impliquant les différences latérales :
P (x0 + hm) = f0 + m∆f0 +
m(m − 1) 2
∆ f0 + · · ·
2
dont la dérivée (par rapport à x = x0 + hm) est :
P 0 (x0 + hm) =
·
¸
1
1
∆f0 + (2m − 1)∆2 f0 + · · · .
h
2
Au point x0 (m = 0), je trouve :
P00 =
·
¸
1
1
∆f0 − ∆2 f0 + (1/3)∆3 f0 − · · · .
h
2
On peut obtenir les dérivées d’ordre supérieur par cette méthode et pas mal d’algèbre.
6.2.4
Accélération de la convergence
L’extrapolation de Richardson permet d’améliorer la précision d’une approximation en n’utilisant qu’une connaissance qualitative du terme d’erreur. Je commence par estimer la dérivée de f
avec un pas h :
2
∼ f (x + h) − f (x − h) + h f 000 (ξ1 ) ≡ f 0 + C1 h2 ,
f 0 (x) =
1
2h
3
puis avec un pas 2h :
f 0 (x) ∼
=
h2
f (x + 2h) − f (x − 2h)
+ 4 f 000 (ξ2 ) ≡ f20 + 4C2 h2 .
4h
3
À une certaine approximation, je peux considérer que C1 = C2 , si bien qu’en ajoutant 4 fois la
première équation à l’opposée de la seconde, j’obtiens :
f0 ∼
= (4f10 − f20 )/3 = f10 + (f10 − f20 )/3
apparemment sans terme d’erreur. En réalité, l’erreur de troncation n’ôa pas disparue, mais elle est
maintenant d’un ordre plus élevé (lequel ?). L’extrapolation de Richardson peut s’appliquer chaque
fois que l’on utilise une approximation dépendant d’un paramètre lequel tend de façon continue
vers zéro et à condition de connaître l’expression du terme principal de l’erreur.
63
6.3. Dérivée d’une fonction empirique
6.3
Dérivée d’une fonction empirique
Je peux avoir à calculer la dérivée d’une fonction définie par une table de valeurs, soit qu’elle
ait été calculée par quelqu’un d’autre, soit qu’elle résulte de mesures expérimentales. Les méthodes
précédentes se révèlent être malcommodes dans ce cas. D’une part, le pas h est maintenant imposé
et n’est pas forcément adapté au but que je poursuis. De plus, les entrées dans la table ne sont pas
forcément équidistantes. D’autre part (et là, je pense surtout à des résultats expérimentaux), les
inévitables erreurs de mesures vont être amplifiées par la division par h (qui est «petit»). Considérez en effet deux entrées successives prises dans une table de résultats expérimentaux :
variable indépendante
xk
xk+1
variable dépendante
yk + bk
yk+1 + bk+1
J’ai supposé que les valeurs de x étaient connues sans erreur, alors que les valeurs de y étaient
entachées d’une erreur aléatoire (un bruit) b. Une valeur approchée de la dérivée est alors :
yk+1 − yk
bk+1 − bk
y0 ∼
+
.
=
xk+1 − xk
xk+1 − xk
La première fraction est la dérivée cherchée ; sa valeur dépend peu de la différence xk+1 − xk (tant
que l’on respecte les contraintes exposées au début de ce chapitre). La deuxième fraction est une
fluctuation aléatoire d’autant plus grande que l’intervalle tabulaire est petit, tant que les valeurs
succesives de b ne sont pas corrélées.
Une première manière d’éviter ces difficultés consiste à construire un polynôme d’interpolation
s’appuyant sur les points x−m , x−m+1 , . . . , x0 , . . . , xm . En supposant que c’est f00 qui m’intéresse, je
n’ai plus qu’à dériver ce polynôme. Le polynôme de Lagrange ou la fonction spline, avec 2 à 4 pivots,
donnent de bons résultats. Une autre méthode consiste à construire un polynôme d’approximation
au sens des moindres carrés, puis à dériver cette expression. Pour des abscisses équidistantes, le
polynôme et ses dérivées ont des expressions simples (on parle souvent de polynômes de Golay).
C’est la méthode que je recommande.
6.4
Intégration numérique : généralités
Je regarde maintenant vers le calcul numérique d’intégrales (on dit aussi quadrature numérique).
Il importe de distinguer le cas de l’intégrale définie :
Z b
I=
f (x)dx
a
où je cherche un nombre I connaissant un intervalle [a, b] et la fonction f , de celui de l’intégrale
indéfinie :
Z x
J(x) =
f (x)dx
a
où je calcule en fait une suite de nombres, représentant la fonction J(x). Ce dernier cas est généralement abordé comme un problème différentiel :
J 0 = f (x); J(a) = 0.
et ceux-ci seront traités au chapitre suivant.
Je vais donc chercher à approcher numériquement une intégrale définie. Toutes les méthodes
que j’envisagerai peuvent s’écrire sous la forme la forme :
Z b
n
X
I=
f (x)dx =
Hj f (xj ) + E
a
1
64
Chapitre 6. Dérivation et Intégration numériques
où E est l’erreur de troncation, les xj des abscisses (pivots ou noeuds) et les Hj des «poids». Je
décrirai deux sortes d’algorithmes. Pour une première classe (Newton-Cotes), les pivots sont équidistants et les poids sont les seuls paramètres ajustables ; comme il y en a n, je pourrai satisfaire n
contraintes et rendre la méthode exacte pour un polynôme de degré n−1. Dans une deuxième classe
(Gauss), les pivots et les poids seront considérés comme ajustables ; le choix de ces 2n paramètres
nous permettra de rendre la méthode exacte pour un polynôme de degré 2n − 1. Évidemment, les
méthodes de Gauss sont plus performantes que celles de Newton-Cotes, puisqu’elles permettent
une précision plus grande pour un même temps de calcul, au pris d’une théorie plus compliquée et
d’une programmation un peu plus lourde.
6.5
Méthodes de Newton-Cotes
Comme je ne sais pas intégrer analytiquement la fonction f , je la remplace par un polynôme
d’interpolation dont l’intégration est banale. J’appelle h l’intervalle entre pivots. Les diverses méthodes de ce groupe se distinguent par le choix des pivots dans l’intervalle d’intégration, supposé
fini.
6.5.1
Intervalle fermé
Je vais calculer l’intégrale de f (x) sur le segment [a, b], divisé en n intervalles de taille h ; je
pose donc
h = (b − a)/n,
x0 = a,
xn = b,
xj = a + jh.
Le polynôme d’interpolation de Lagrange construit sur les pivots xj , 0 ≤ j ≤ n, s’écrit :
p(x) =
n
X
Lj (x)f (xj )
0
où Lj (x) représente un polynôme élémentaire de Lagrange. L’intégrale de p(x) est une approximation de I :
Z b
n
X
I=
f (x)dx ∼
Hj f j + E
=
a
0
Rb
où j’ai posé fj = f (xj ), Hj = a Lj (x)dx. Une démonstration trop longue pour être exposée
ici permet d’aboutir aux formules ci-dessous pour l’erreur de troncation. Elles proviennent de
l’intégrale du terme d’erreur de la formule de Lagrange. Celle-ci contient un facteur f(n+1) (ξ) ou
f(n+2) (ξ), où ξ est une fonction inconnue de x.
Z
f (n+1) (ξ) n
E=
u(u − 1)(u − 2) · · · (u − n)du, n impair,
(n + 1)! Z0
n
(n+2)
f
(ξ)
E=
u2 (u − 1)(u − 2) · · · (u − n)du, n pair.
(n + 2)! 0
Les «nombres de Cotes» Hj ont été calculés une fois pour toutes pour n ≤ 10. Les formules de
Newton-Cotes les plus courantes sont résumées ci-dessous, avec la notation : Hj = hAWj . C est le
coefficient de hk+1 f (k) dans le terme d’erreur, où k = n + 1 si n est impair et k = n + 2 si n est pair.
n
1
2
3
4
A
1/2
1/3
3/8
2/45
W0
1
1
1
7
W1
1
4
3
32
W2
1
3
12
W3
1
32
W4
7
C
-1/12
-1/90
-3/80
-8/945
65
trapèzes
Simpson
Simpson
Villarceau
6.5. Méthodes de Newton-Cotes
Ces formules se démontrent très facilement par la méthode des coefficients indéterminés, à
condition de ne pas demander l’expression de l’erreur. Je prends l’exemple de la première formule
de Simpson. Je cherche trois nombres W0 , W1 et W2 tels que :
Z
b
f (x)dx = W0 f (a) + W1 f (a + h) + W2 f (a + 2h)
a
où b = a + 2h. Cette relation doit être exacte pour f = x0 , x1 et x2 , ce qui conduit au système :

 2h = W0 + W1 + W2 ,
2ah + 2h2 = aW0 + (a + h)W1 + (a + 2h)W2 ,

(1/3)[6a2 h + 12ah2 + 8h3 ] = W0 a2 + W1 (a + h)2 + W2 (a + 2h)2 .
En substituant la première équation dans la seconde, puis les deux premières dans la troisième, je
trouve :

 2h = W0 + W1 + W2 ,
2h = W1 + 2W2 ,

(8/3)h = W1 + 4W2 .
système dont la solution est : W0 = W2 = h/3, W1 = 4h/3. Ici encore, j’aurais pu poser a = 0 dès
le début, puisque les coefficients doivent être indépendants de l’abscisse initiale.
6.5.2
Intervalles ouverts
Il peut arriver que la fonction à intégrer ne soit pas définie pour l’une des bornes de l’intervalle
d’intégration (ou pour les deux) ou qu’elle y présente une singularité quelconque. Il est alors
souhaitable de ne pas s’approcher «trop» de cette limite, ce qui est impossible avec le découpage
de l’intervalle d’intégration que j’ai choisi (x0 = a, xn = b). Il existe des formules de quadrature
dites «ouvertes» (parce qu’elles impliquent des intervalles ouverts) qui n’utilisent pas les valeurs
de la fonction aux bornes. Elles s’écrivent en général :
Z
b
I=
f (x)dx =
n−1
X
a
Hj f (xj ) + E
1
où les bornes x0 et xn ne figurent pas. La formule «ouvertes» la plus courante, que j’appellerai «formule du point milieu», par analogie avec le terme anglais, est définie (avec les notations
précédentes) par n = 2, A = 2 et W1 = 1, soit encore :
Z
a+2h
I=
f (x)dx = 2hf [(a + b)/2] + (h3 /24)f 00 (ξ).
a
6.5.3
Formules composées
Que faire si la précision d’une intégrale numérique me paraît insuffisante ? Une première possibilité consiste à choisir une formule d’intégration d’ordre plus élevé. Comme dans le cas de l’interpolation polynômiale, cette solution est à rejeter, et pour les mêmes raisons : lorsque l’ordre n devient
grand (quand le degré du polynôme que l’on intègre en lieu et place de la fonction devient grand),
le terme d’erreur peut avoir un comportement anarchique en fonction de ξ. La bonne méthode est
semblable à celle utilisée pour l’interpolation spline : découper l’intervalle d’intégration en plusieurs
«sous-intervalles» et utiliser une méthode d’ordre peu élevé dans chaque sous-intervalle. Comme la
borne droite du sous-intervalle de rang p coïncide avec la limite gauche du sous-intervalle de rang
p + 1, je vais économiser un certain nombre d’évaluations de la fonction.
66
Chapitre 6. Dérivation et Intégration numériques
Je divise par exemple l’intervalle global [a, b] en m sous intervalles et j’applique la méthode de
Newton «fermée» d’ordre un dans chaque sous-intervalle. Il vient :
Z
b
I=
f (x)dx = (h/2)[f0 + f1 + f1 + f2 + · · · + fm−2 + fm−1 + fm−1 + fm ].
a
J’aboutis ainsi à la formule composée (ou composite ou encore étendue) de Newton-Cotes d’ordre
1 (souvent appelée encore méthode des trapèzes) :
Z
b
I=
f (x) = h[f0 /2 + f1 + f2 + · · · + fm−2 + fm−1 + fm /2] + E
a
où tous les termes «intérieurs» ont doublé. L’application du théorème de la moyenne montrerait
que
E = −(h2 /12)(b − a)f 00 (ξ),
x0 ≤ ξ ≤ xm .
Dans la pratique, on programme ce calcul de façon itérative. Supposez que je connaisse I(m),
calculée avec m sous-intervalles, mais que la précision me paraisse encore insuffisante. Je calcule
alors I(2m) à partir de I(m) et des seules nouvelles valeurs de f , aux points intermédiaires,
d’abscisses (i + 1/2)h. Je recommence tant que le critère de convergence n’est pas atteint. Quel
critère d’arrêt vais-je choisir ? Ce peut être la condition que la variation relative de l’intégrale d’une
étape à l’autre est inférieure à un seuil choisi à l’avance : |[I(m + 1) − I(m)]/I(m)| ≤ ε.
On opère de la même manière avec les formules de Newton-Cotes «ouvertes». Cependant,
doubler le nombre d’intervalles n’apporte aucune économie, puisque ceux-ci ne comportent aucun
pivot commun. Je vous suggère de vérifier qu’il faut tripler le nombre d’intervalles à chaque itération
pour économiser des calculs. Il est possible de combiner une formule de Newton-Cotes ouverte avec
m − 1 formules fermées : ceci pourrait servir à éviter une région «dangereuse» autour de x = a.
Comme les termes d’erreur de toutes les méthode de Newton-Cotes sont connus, il est tentant
d’améliorer la précision d’une quadrature, sans trop d’effort, par l’extrapolation de Richardson.
En réalité, cela se fait rarement, car on connaît une généralisation puissante de l’extrapolation de
Richardson : c’est la méthode de Romberg que je vais décrire dans le paragraphe suivant.
Exemple. On demande de calculer l’intégrale de 1/x de 1 à 3 avec deux puis quatre sousintervalles, par la méthode des trapèzes. Je trouve :
·
¸
1
1
∼
m = 2 : I2 = (1) (1) + 1/2 + (1/3) = 7/6 = 1, 166666...;
2
2
m=4:
¸
·
1
1
I4 ∼
= (1/2) (1) + 2/3 + 1/2 + 2/5 + (1/3) = 67/60 = 1, 116666...
2
2
La formule de Richardson donne : I ∼
= I4 +(1/3)(I4 −I2 ) = 11/10 = 1, 1, soit une erreur relative
un peu supérieure à 1/1000.
6.6
Méthode de Romberg
J’utilise la notation Ik,0 = valeur approchée de I, calculée par la méthode des trapèzes en
utilisant m = 2k sous-intervalles. En utilisant une expression du terme d’erreur plus précise que
celle mentionnée (et non démontrée) au paragraphe précédent, je pourrais écrire
Ik,0 = I −
∞
X
·
αj
j=1
67
b−a
2k
¸2j
.
6.6. Méthode de Romberg
Si je répète le même calcul avec des intervalles deux fois plus nombreux et deux fois plus petits,
j’ai
·
¸2j
∞
X
b−a
Ik+1,0 = I −
αj k+1
.
2
j=1
Comme pour une extrapolation de Richardson, je forme :
¸2j
·
∞
X
£
¤
b−a
−1 + 4/22j .
Ik,1 = 4Ik+1,0 − Ik,0 = 3I −
αj
k
2
j=2
Je viens de gagner un ordre dans le développement de l’erreur en fonction des puissances de (b − a).
Le procédé se généralise aisément. Je construis un tableau triangulaire dont la première colonne
est formée des Ik,0 , la deuxième des Ik,1 et dont le terme général s’écrit :
4m Ik+1,m − Ik,m
.
4m − 1
Le gros du travail est effectué lors du calcul des Ik,0 , puisque c’est à ce moment-là que je calcule
la fonction compliquée f ; la suite n’est qu’une série de combinaison linéaires. Si k ≤ K, alors
le dernier élément de la diagonale principale, IK,K , est la meilleure approximation de I que l’on
puisse obtenir en évaluant 2K fois f .
J’ai écrit le programme présenté ci-dessous pour mettre en oeuvre l’algorithme de Romberg. Je
commence par remplir la première colonne d’un tableau J(l,c) par des valeurs calculées selon la
méthode des trapèzes. Vous pouvez constater qu’à chaque étape je ne calcule que les valeurs strictement nécessaires de la fonction. Je garnis ensuite les autres colonnes selon la formule de Romberg.
Ik,m+1 =
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// romberg
function y = f n ( x )
y = exp ( x ) . ∗ cos ( x )
endfunction
lmax = 5 ;
a = 0 ; b = %p i ;
h = b − a;
J ( 1 ,1 ) = 0.5∗ h∗( fn ( a ) + fn (b ) ) ;
f o r l = 2 : lmax
h = h/2;
x = a+h : 2 ∗ h : b−h ;
d i = h∗sum( f n ( x ) )
J ( l , 1 ) = 0 . 5 ∗ J ( l −1) + d i ;
end
f o r c = 2 : lmax
f o r l = c : lmax
J ( l , c ) = ( ( 4 ^ ( c −1))∗ J ( l , c −1)−J ( l −1 , c −1))/(4^( c −1) −1);
end
end
J
Jex = −(exp(% p i )+1)/2
La valeur exacte est −(eπ + 1)/2 = −12.070346 ; voici les résultats obtenus :
-
34.778519
17.389259
13.336023
12.382162
12.148004
0.
- 11.59284
- 11.984944
- 12.064209
- 12.069951
0.
0.
- 12.011084
- 12.069493
- 12.070334
0.
0.
0.
- 12.07042
- 12.070347
68
0.
0.
0.
0.
- 12.070347
Chapitre 6. Dérivation et Intégration numériques
Au prix de quelques opérations arithmétiques, l’erreur finale est passée de 7 10−2 à 10−6 .
6.7
Intégration de Gauss
J’abandonne maintenant l’hypothèse que les pivots sont régulièrement répartis sur l’axe ; je
cherche au contraire à les répartir «au mieux» pour avoir un algorithme aussi exact que possible.
J’aurais toujours
Z b
n
X
f (x)dx =
I=
pj f (aj ) + E.
a
1
Ici, la méthode des coefficients indéterminés est assez malcommode ; lorsque j’impose que la formule
ci-dessus soit exacte pour x0 , x1 , . . . , xk , . . ., j’obtiens un système d’équations non-linéaires ( en aj )
dès que k > 1, système dont la solution est en général inaccessible.
Je vais plutôt utiliser un raisonnement indirect, à partir du polynôme d’interpolation de Hermite. La formule d’interpolation de Hermite s’écrit :
f (x) =
n
X
hj (x)f (aj ) +
1
n
X
h∗j (x)f 0 (aj ) + [π(x)]2
1
f 2n (ξ)
.
(2n)!
Le terme d’erreur disparaît si f est un polynôme de degré 2n − 1 au plus. J’intègre terme à terme
cette relation entre les abscisses a et b :
Z b
n
n
X
X
I=
f (x)dx =
Hj f (aj ) +
Hj∗ f 0 (aj ) + E
a
1
1
où Hj et Hj∗ sont respectivement les intégrales de hj (x) et de h∗j (x) entre les mêmes bornes. Cette
formule d’intégration est exacte pour tout polynôme de degré inférieur à 2n : c’est le mieux que je
puisse faire avec les 2n paramètres Hj , aj .
Pour obtenir la forme annoncée, il faut que les Hj∗ soient tous nuls. Comment parvenir à ce
résultat ? Les seuls paramètres dont je dispose sont les aj . Je dois donc choisir ces nombres de telle
manière que l’intégrale de h∗j soit nulle. Je vous rappelle la forme de ce polynôme (établie dans le
chapitre 2) : h∗j (x) = (x − aj )[Lj (x)]2 , si Lj est le polynôme élémentaire de Lagrange construit sur
les {aj }. En utilisant une fois la relation Lj = π(x)/((x − aj )π 0 (aj )), j’obtiens
Z b
Z b
Lj (x)
Hj∗ =
(x − aj )[Lj (x)]2 =
π(x) 0
dx.
π (aj )
a
a
Je veux que cette intégrale soit nulle ; autrement dit, je veux que les polynômes π(x) et Lj (x)
soient orthogonaux sur le segment [a, b] par rapport à la fonction de poids w ≡ 1.
Vous savez que π(x) (défini en 2.5) est le produit de tous les termes de la forme x − aj : π(x)
est défini (implicitement) par l’ensemble de ses zéros. Il doit être orthogonal aux Lj , polynômes
élémentaires de Lagrange pour n pivots, donc de degré n − 1. Plutôt que d’imposer cette condition
particulière, je vais imposer une condition plus générale : π devra être orthogonal à tout polynôme
de degré n − 1 ou inférieur. Je vous laisse le soin de démontrer la proposition réciproque et j’admets
que la condition nécessaire et suffisante pour que la formule de Gauss soit valable est que π(x) soit
orthogonal à tout polynôme de degré inférieur, pour une fonction de poids égale à l’unité, sur [a, b].
A quelques détails près, vous connaissez des polynômes répondant à cette définition : ce sont
les polynômes de Legendre. Pour que l’identification soit parfaite, il faut ramener l’intervalle d’intégration à [-1, 1] et, si l’on veut être très soigneux, normaliser correctement π(x). Le changement
de variable x = 12 (a + b) − 12 (a − b)t permet d’intégrer sur [-1,1] :
Z
I=
b
f (x)dx =
a
1
(b − a)
2
69
Z
1
f (t)dt.
−1
6.8. Généralisations
Si maintenant je choisis comme pivots aj les zéros du polynôme de Legendre de degré n,
π(x) coïncidera, à un facteur constant près, avec ce polynôme ; sur le segment [-1, 1] il sera donc
orthogonal à tout polynôme de degré inférieur, et en particulier aux Lj (x).
Il reste à calculer les poids, à partir de l’expression des hj (x). On montre assez facilement que
Z
1
Hk =
[Lk (x)]2 .
−1
d’où l’on déduit que
Z
1
Hk =
Lk (x)dx.
−1
Il existe des tables des arguments et des poids pour l’intégration de Gauss, pour n jusqu’à 128.
Pour éviter les erreurs de transcription, il vaut mieux écrire un sous-programme pour les recalculer.
Exemple. Je calcule la même intégrale qu’au paragraphe précédent, avec trois pivots. Les tables
donnent :
aj
0 ±0.774597
Hj 8/9
5/9
Le changement de variable y = x−2 transforme l’intervalle [1,3] en [-1,1] et l’intégrant en 1/(y +2).
Un calcul élémentaire donne alors I ∼
= 1.098039, pour une erreur relative un peu supérieure à
5.10−4 .
6.8
Généralisations
En choisissant un autre intervalle d’intégration et une autre fonction de poids, on peut construire
de nouvelles formules d’intégration de type gaussien. Je sais par exemple que les polynômes de
Laguerre sont orthogonaux sur [0, ∞ ] par rapport à la fonction de poids e−x . Je peux donc écrire :
Z
∞
e−x f (x)dx =
n
X
0
Wj f (aj ) + E,
1
où les aj sont les zéros du polynôme de Laguerre d’ordre n et les Wj des poids calculables facilement.
Chaque famille de polynômes orthogonaux donne ainsi naissance à une formule d’intégration.
Il ne faut pas s’empresser de conclure que l’on peut intégrer n’importe quelle fonction entre
zéro et l’infini, au prix du calcul des valeurs de f en quelques points. Par ailleurs, aucun algorithme
numérique ne pourra transformer une intégrale divergente en intégrale convergente. J’écris quelques
formules pour préciser la question.
Z ∞
Z ∞
Z ∞
−x x
g(x)dx =
e [e g(x)]dx =
e−x f (x)dx
0
0
0
x
où f = e g ; ces relations n’ont rien d’anormal, mais c’est lorsque je tenterai d’appliquer la formule
de Gauss-Laguerre à f que les problèmes apparaîtront. Si g ne décroît pas assez vite à l’infini, le
terme d’erreur, en f (2n) , deviendra rapidement intolérable.
Que faire si la précision sur l’intégrale obtenue par la méthode de Gauss est insuffisante ?
Il existe ici encore deux possibilités : utiliser une formule d’ordre supérieure ou employer une
méthode composée. Comme d’habitude, la première solution est à rejeter. La seconde est assez
simple à mettre en oeuvre. Je divise l’intervalle [a, b] en m sous-intervalles, [xm , xm+1 ]. Pour chaque
sous-intervalle, je fait un changement de variable qui ramène les bornes à -1,1 et j’emploie une
formule de Gauss d’ordre peu élevé. Comme aucun pivot ne coïncide avec les bords des intervalles,
on n’économise aucun calcul, à la différence des méthodes de Newton fermées. Cependant, la
précision est largement supérieure à ce que l’on obtient avec Newton-Cotes ; de plus, l’existence de
discontinuités en a ou b est peu gênante, puisque ces points ne sont pas des pivots.
70
Chapitre 6. Dérivation et Intégration numériques
6.9
Intégrales généralisées
Une intégrale généralisée est mathématiquement bien définie ; l’ennui, c’est que l’ordinateur ne
le sait pas. Par exemple, le calcul analytique de
Z ∞
xn e−x dx
J=
0
est facile, mais, par définition, un algorithme comporte un nombre fini d’opérations. Comment
alors intégrer numériquement jusqu’à +∞ ? Vous connaissez une réponse dans ce cas particulier :
on peut employer la méthode de Gauss-Laguerre.
Pour un intégrant quelconque, je peux calculer certaines intégrales généralisées en faisant un
changement de variable astucieux. Si a > 0, je peux écrire :
Z
Z
∞
1/a
f (x)dx =
a
0
1 1
f ( )dt.
t2 t
Un changement de variable analogue est valable pour a < 0.
Il peut aussi arriver qu’un même changement de variable soit malcommode sur l’ensemble de
l’intervalle d’intégration : il faut alors couper celui-ci en deux ou plusieurs morceaux.
Je suppose maintenant que f (x) est équivalente à (x − a)−1/2 pour x proche de a (a < b). Un
nouveau changement de variable fera disparaître cette singularité intégrable :
Z
√
Z
b
b−a
f (x)dx =
a
6.10
2tf (a + t2 )dt.
0
Intégrales multiples
J’examine, pour fixer les idées, le cas d’une intégrale double ; je cherche l’intégrale de f (x, y)
dans un domaine D. Les valeurs extrêmes de x dans D sont x1 et x2 ; pour une valeur donnée de x,
les valeurs extrêmes de y sont y1 (x) et y2 (x). J’intègre d’abord par rapport à y, puis par rapport
àx:
Z Z
Z
Z
x2
J=
f (x, y)dxdy =
y2 (x)
dx
x1
f (x, y)dy
y1 (x)
Ayant fait le choix d’une méthode numérique pour calculer l’intégrale en y, je peux programmer
une fonction dont la valeur sera :
Z y2
I(x) =
f (x, y)dy
y1
où les bornes y1 et y2 dépendent de x. Je suis maintenant capable de calculer l’intégrale de I(x) :
Z x2
J=
I(x)dx
x1
On remarque que la suite logique des opérations dans l’ordinateur est l’inverse de celle qui vient
d’être décrite. Le programme d’intégration en x «choisit» les pivots dont il a besoin ; pour chaque
pivot, il appelle I(x), qui «décide» pour son propre compte des valeurs de y à utiliser. L’ensemble
est en général plus précis que le calcul a priori de f (x, y) sur un quadrillage régulier de points, suivi
d’intégrations. Dernière remarque : si l’on utilise un sous-programme d’intégration («trapèze» par
exemple), qui sera appelé aussi bien pour calculer I(x) que J, il faut prendre garde à ne pas laisser
croire au programme que l’on utilise une procédure récursive, s’appelant elle-même.
71
Chapitre 7
Problèmes différentiels à conditions
initiales
7.1
Introduction
Beaucoup de phénomènes physiques ou chimiques se traduisent mathématiquement par une ou
plusieurs équations différentielles. D’autre part, les cours de mathématiques sont riches de méthodes
analytiques de résolution des équations différentielles : on pourrait croire que l’analyse numérique
est inutile dans cette partie des mathématiques. La réalité est tout autre : seule une infime minorité
des équations différentielles est analytiquement soluble, particulièrement les équations linéaires. A
mesure que l’on s’écarte des problèmes scolaires pour s’approcher des questions réelles, les équations
différentielles deviennent «de moins en moins» linéaires et de moins en moins solubles. Exemple :
le pendule simple dont le mouvement est décrit, en l’absence de frottement par l’équation exacte :
y 00 + k 2 sin y = 0.
Dans le domaine des équations différentielles, on distingue deux types de problèmes bien différents.
Les problèmes à condition(s) initiale(s) (ou « de Cauchy »), dont un exemple s’écrit :
y 0 = f (x, y) ;
y(a) = Ya
;
x ≥ a,
(7.1)
et les problèmes aux limites, comme par exemple :
y” = g(x, y, y 0 ) ;
y(a) = A ;
y(b) = B
;
a ≤ x ≤ b.
Dans ce chapitre, je ne considère que la première catégorie, les problèmes à condition(s) initiale(s),
que l’on rencontre aussi bien en mécanique qu’en cinétique chimique.
Il est aussi important de bien faire la différence entre équation différentielle et problème différentiel. La première admet diverses solutions, dépendant de paramètres qui sont les conditions
initiales ; on peut parfois la déterminer analytiquement, mais jamais numériquement. Le second
a une seule solution et c’est l’objet de ce chapitre que d’expliquer comment on peut la calculer
numériquement.
Toutes les méthodes de résolution numérique des problèmes différentiels utilisent une discrétisation. Ayant fait choix d’un pas h, on va calculer la solution y pour les valeurs kh de la variable
indépendante, yk = y(kh) et y0 = y(a). Les divers algorithmes se distinguent par les informations
qu’ils utilisent pour calculer yk : certains emploient yk−1 uniquement (on parle de méthode à pas
séparés), d’autres utilisent un certain nombre de valeurs précédentes de y, dont yk−1 (ce sont les
méthodes à pas liés ou à pas multiples).
72
Chapitre 7. Problèmes différentiels à conditions initiales
Je supposerai presque toujours que l’équation différentielle à résoudre est du premier ordre et
qu’elle est résolue en y 0 ; en général, j’appelle x la variable indépendante. Il arrive que l’équation
différentielle ne soit pas résoluble en y 0 : on parle alors de problème algébrodifférentiel, dont l’étude
sort du cadre de ce cours. L’hypothèse d’un problème du premier ordre peut paraître fort éloignée
de la réalité ; c’est tout à fait vrai, mais ce n’est pas trop grave, comme vous allez le voir. Toute
équation différentielle d’ordre supérieur à un peut s’écrire comme un système différentiel d’ordre
un. Soit par exemple l’équation du second ordre :
y” = g(x, y, y 0 ).
(7.2)
J’introduis la variable auxiliaire z = y 0 ; je peux maintenant écrire l’équation précédente sous la
forme équivalente
½ 0
z = g(x, y, z),
(7.3)
y 0 = z.
Je suis maintenant confronté à un système d’équations différentielles (ou système différentiel)
du premier ordre. Plus généralement, un système différentiel du premier ordre à deux fonctions
inconnues s’écrit :
½ 0
z = g(x, y, z),
(7.4)
y 0 = h(x, y, z).
Dans le cas précédent, la fonction h se réduisait à la variable z. Si j’introduis deux vecteurs :
r = {y, z} et s = {h, g}, le système ci-dessus prend la forme :
r0 = s(x, r).
(7.5)
Cette écriture est commode car elle permet d’obtenir sans peine un algorithme de résolution d’un
système différentiel : il suffit de transposer en notation vectorielle l’algorithme valable pour une
équation différentielle (du premier ordre). Les ouvrages classiques d’analyse numérique développent
largement les théories relatives à la résolution des problèmes différentiels à une fonction inconnue,
mais sont discrets quant aux systèmes différentiels ; je suivrai cet exemple et j’admettrai que les
algorithmes développés pour une fonction inconnue sont encore valables pour plusieurs fonctions.
Avant d’aborder les algorithmes purement numériques, je passe en revue quelques méthodes
analytiques qui peuvent servir à des calculs numériques.
7.2
7.2.1
Méthodes analytiques
Développement de Taylor
Je cherche la solution du problème différentiel classique y 0 = f (x, y), y(a) = ya . Le théorème
de Taylor offre, au moins en principe, une solution
1
1
y(x) = y(a) + (x − a)y 0 (a) + (x − a)2 y”(a) + (x − a)3 y 000 (a) + ....
2
6
Je connais y(a) (condition initiale), y 0 (a) (par substitution dans l’équation différentielle), y”(a) et
toutes les dérivées d’ordre supérieur (par dérivation et substitution dans l’équation différentielle !).
Ainsi :
(7.6)
y 00 = [f (x, y)]0 = fx + f fy ,
où fx , fy représentent les dérivées partielles de f par rapport aux variables indiquées. Ensuite :
y 000 = fxx + 2f fxy + f 2 fyy + fx fy + f fy2 .
La méthode est simple mais devient rapidement laborieuse. De plus, j’ai montré (chapitre 1, Calcul et tracé de fonctions) que le développement de Taylor pouvait converger très lentement. En
conséquence, cette méthode ne s’emploie que «localement» : pour calculer yn+1 à partir de yn ou
pour calculer, à l’aide des conditions initiales, les premières valeurs de y dont certains algorithmes
ont besoin pour démarrer et calculer la suite des yk .
73
7.3. Méthode d’Euler et méthodes de Taylor
7.2.2
Méthode des coefficients indéterminés (Frobenius)
Je fais l’hypothèse que y peut s’écrire :
y = c0 + c1 x + c2 x2 + c3 x3 + · · ·
et donc que :
y 0 = c1 + 2c2 x + 3c3 x2 + · · ·
En substituant ces développements dans l’équation différentielle, j’obtiens des relations entre coefficients ci , que je résous de proche en proche, à partir de c0 = ya . Ayant un certain nombre
de coefficients, il est simple de calculer y, à une certaine précision. Cette méthode est aussi assez
laborieuse.
7.2.3
Méthode de Picard, ou d’approximations successives
Je me propose toujours de résoudre le problème de Cauchy (7.1). J’intègre les deux membres
de l’équation différentielle, entre a et x (en renommant u la variable indépendante) :
Z x
Z x
y 0 du = y(x) − y(a) =
f (u, y)du
a
a
Je ne sais bien sûr pas calculer l’intégrale du second membre (ce qui reviendrait à savoir résoudre
l’équation différentielle), aussi vais-je procéder à une approximation brutale : je remplace y par
une «approximation d’ordre zéro», y [0] , que je prends égale à ya ; l’intégrale est alors calculable en
principe ; le résultat me donne l’approximation suivante de y, soit y [1] :
Z x
[1]
y = y(a) +
f (u, y [0] )du
a
J’itère ce procédé, jusqu’à ce qu’un critère de convergence convenable soit atteint :
Z x
[n]
y = y(a) +
f (u, y [n−1] )du.
a
Cette méthode est peut-être encore plus lente que les précédentes !
Depuis quelques années, on trouve dans le commerce des programmes de manipulation algébrique (DERIVE, MAPLE, MATHEMATICA, MACSYMA, MUPAD, etc.) fonctionnant sur
microordinateurs et capables de faire seuls les calculs algébriques des trois méthodes précédentes.
Il est à prévoir que ces algorithmes vont connaître de ce fait une nouvelle jeunesse.
J’aborde maintenant les méthodes véritablement orientées vers l’analyse numérique, en commençant par un cas d’école.
7.3
7.3.1
Méthode d’Euler et méthodes de Taylor
Algorithme d’Euler
La méthode d’Euler n’est jamais employée en pratique (sauf peut-être comme constituant d’une
méthode de résolution d’équations aux dérivées partielles), mais c’est un excellent exemple introductif, généralisable dans plusieurs directions intéressantes. L’algorithme proposé par Euler pour
résoudre (7.1) s’écrit :
yn+1 = yn + hf (xn , yn ) = yn + hfn .
(7.7)
Je peux donner trois interprétations de cette formule.
* Approximation de la dérivée. La dérivée de y au point xn est à peu près yn0 ' (yn+1 − yn )/h ;
en écrivant qu’elle vaut fn , je retrouve la méthode d’Euler.
74
Chapitre 7. Problèmes différentiels à conditions initiales
* Approximation d’une intégrale. J’intègre les deux membres de l’équation (7.1) :
Z xn+1
f [t, , y(t)]dt
y(xn+1 ) − y(xn ) = yn+1 − yn =
xn
Je remplace l’intégrale du second membre par son approximation la plus simple, l’aire d’un rectangle
de base h et de hauteur fn , ce qui donne :
yn+1 − yn = hfn .
* Développement de Taylor. Supposant connu yn , je peux déterminer yn+1 à l’aide du théorème
de Taylor :
y(xn + h) = y(xn ) + hyn0 + O(h2 ).
En négligeant le terme d’erreur et en identifiant y 0 et f , je retrouve la formule d’Euler.
Je termine par un résumé des caractéristiques de la méthode d’Euler. Pour calculer yn+1 ,
j’utilise la valeur de yn et pas celles de yn−1 , yn−2 , ... Il s’agit donc d’une méthode à pas séparés.
Pour passer de yn à yn+1 , je ne calcule f qu’une fois (Les méthodes de Runge-Kutta qui seront
exposées plus loin utilisent plusieurs valeurs de f pour améliorer la précision sur y 0 ). L’algorithme
ne fait appel qu’à f = y 0 et pas à ses dérivées d’ordre supérieur (Certains algorithmes s’appuient
sur un développement de Taylor, et donc sur y [n] , qui dépend des dérivées de f ).
La programmation de l’algorithme d’Euler est des plus simples. Voici une ébauche de programme.
Lire h, x0 , y0 , xmax
Initialiser x à x0 , y à y0
Tant que x < xmax faire :
calculer f = f(x,y)
y := y + hf
x := x + h
imprimer x, y
La généralisation à un système différentiel est immédiate, en principe. La fonction inconnue, sa
valeur initiale et le second membre sont maintenant remplacés par des vecteurs de <n :
Lire h, x0 , xmax , y0
Initialiser x à x0 , y à y0
Tant que x < xmax faire :
calculer :
f = f (x, , y)
y := y + hf
x := x + h
imprimer x, y
Il faut traiter sur un pied d’égalité toutes les coordonnées de chaque vecteur.
Exemple
Le programme ci-dessous résout, par la méthode d’Euler, l’équation différentielle du pendule
simple : y” + sin y = 0. Comme j’ai posé y 0 = z, je résous en fait le système du premier ordre
équivalent
y 0 = z,
z 0 = − sin y.
75
7.3. Méthode d’Euler et méthodes de Taylor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// mouvement du p e n d u l e par E u l e r
function F = smy ( t , y , z )
F = z;
endfunction
function F = smz ( t , y , z )
F = −sin ( y ) ;
endfunction
function [ yf , z f , t f ] = e u l e r ( h , t i , y i , z i )
y f = y i + h∗smy ( t i , y i , z i ) ; z f = z i + h∗smz ( t i , y i , z i ) ;
tf = ti + h;
endfunction
np = 6 0 0 ;
t = zeros ( np , 1 ) ;
y = zeros ( t ) ; z = zeros ( t ) ;
y0 = input ( ’ p o s i t i o n i n i t i a l e : ’ ) ;
z0 = input ( ’ v i t e s s e i n i t i a l e : ’ ) ;
pas = input ( ’ l o n g u e u r du pas : ’ ) ;
t ( 1 ) = 0 ; y ( 1 ) = y0 ; z ( 1 ) = z0 ;
f o r i = 2 : np do
[ y ( i ) , z ( i ) , t ( i ) ] = e u l e r ( pas , t ( i −1) , y ( i −1) , z ( i − 1 ) ) ;
end
plot2d ( t , y )
Les deux seconds membres apparaissent dans le programme sous forme de function smy, function smz ;
la function euler calcule la solution en tf=ti+pas. Ces trois sous-programmes sont inutilement
compliqués : ils contiennent par exemple la variable indépendante (t), sans objet ici, mais ils
peuvent s’adapter facilement au cas d’un pendule soumis à un couple dépendant du temps. Vous
pouvez vérifier que yf,zf sont calculés indépendamment l’un de l’autre, avant incrémentation du
temps.Le programme principal ne fait que lire les paramètres et appeler euler à chaque tour dans
la boucle.
0.4
"D:/an/an_poly-6/pdl_eul.dta"
0.3
0.2
0.1
0
-0.1
-0.2
-0.3
-0.4
-0.5
0
5
10
15
20
25
30
Fig. 7.1 – : Mouvement du pendule simple obtenu par l’algorithme d’Euler. Le pas était de 0,05.
76
Chapitre 7. Problèmes différentiels à conditions initiales
La figure montre le résultat de l’exécution. Comme vous pouvez le constater, la qualité de la
méthode laisse à désirer : l’amplitude augmente nettement avec le temps.
Remarque sur la programmation sous Scilab
Scilab n’est pas un langage de programmation très structuré ; en particulier, il n’est pas nécessaire de déclarer les variables avant de les utiliser. Cependant, on gagne un peu de temps à
l’exécution si l’on déclare à l’avance les tableaux, avec leurs dimensions. Si on ne le fait pas, Scilab
agrandit les tableaux chaque fois que nécessaire.
7.3.2
Méthodes de Taylor
Comme je l’ai indiqué au §2.1, la méthode d’Euler peut être considérée comme une application, à l’ordre 1, du développement de Taylor. J’ai aussi montré comment l’on pouvait utiliser un
développement d’ordre supérieur ((7.6). Je rappelle qu’il faut calculer, jusqu’à l’ordre souhaité, les
dérivées de y, par les relations de récurrence :
y 0 = f (x, y) ;
y” = fx (x, y) + fy (x, y)f ≡ f (1) ,
f (k) = fx(k−1) + fy(k−1) f,
puis déduire yi+1 par :
yi+1
·
¸
hp−1 (p−1)
= yi + h f (xi , yi ) + . . . +
f
(xi , yi )
p!
Cet algorithme n’est intéressant que si les f (k) se calculent facilement.
7.3.3
Erreurs, précision, stabilité
Je n’ai pas la prétention de construire la solution exacte du problème différentiel grâce à l’algorithme d’Euler ; le résultat du calcul pratique, soit yn , est en réalité entaché d’erreurs dont il faut
bien comprendre la nature.
Je suppose d’abord que je peux calculer avec un très grand nombre de chiffres significatifs. Le
résultat yn ne serait pas pour autant exact : il a en effet été obtenu à l’aide d’une approximation.
A l’aide de l’une des interprétations données ci-dessus de l’algorithme d’Euler, je pourrais borner
l’erreur commise en passant de yk à yk+1 (erreur locale de troncation), puis estimer l’erreur de
troncation globale qui sépare yn de la solution exacte évaluée en xn :
tn = yn − y(xn ).
J’imagine maintenant que je dispose d’un algorithme exact capable de calculer yn sans erreur de
troncation. Le résultat a cependant été obtenu par une succession d’opérations arithmétiques, sur
une machine comportant un nombre limité de chiffres significatifs : il présente donc une certaine
erreur d’arrondi :
en = yn − y(xn ).
En pratique, les deux sources d’erreur coexistent. Nous ne développerons pas ici l’étude des erreurs.
Le problème traité fournit parfois lui-même le moyen de contrôler la qualité de l’algorithme.
C’est le cas en particulier pour les problèmes de mécanique sans frottement, pour lesquels l’énergie
est conservée. Il suffit alors de calculer périodiquement l’énergie du système : si la variation d’énergie
dépasse le seuil prévu, on rejette les dernières itérations et on reprend le calcul avec un pas plus
petit.
77
7.4. Méthodes de Runge-Kutta
Une autre propriété importante d’un algorithme de résolution d’équations différentielles est la
stabilité. Dans le cas de l’algorithme d’Euler, il est facile d’apprécier la stabilité en étudiant un
«problème modèle». Je considère le problème différentiel :
y 0 = y; y(0) = 1.
Ici, f ≡ y et l’algorithme d’Euler s’énonce :
yn+1 = yn + hyn = (1 + h)yn .
Il s’agit d’une relation de récurrence (on dit aussi une équation aux différences) pour yn+1 . Comme
y0 = 1, je trouve :
yn = (1 + h)n .
Vous voyez que yn croit indéfiniment pour tout h > 0 : on dit qu’il n’y a pas stabilité «absolue».
Par contre, l’algorithme est «relativement stable», c’est à dire que yn /y → 1 pour h → 0. Pour le
montrer, il suffit de remarquer que x = nh et donc que :
yn = [(1 + h)1/h ]x → ex .
Si c < 0, on a encore yn → e−|c|x . Il y a toujours stabilité relative. Mais yn ne sera uniformément
décroissant (comme la solution exacte) que si |1+hc| < 1. Comme c = −|c|, cela implique h < 2/|c|.
7.4
Méthodes de Runge-Kutta
Les méthodes que nous allons décrire dans ce paragraphe peuvent être considérées comme des
généralisations de celle d’Euler, où l’on calcule f (le second membre) plusieurs fois par pas, pour
réduire l’erreur de troncation. Ce sont aussi probablement les méthodes les plus employées dans la
pratique. Nous exposerons la théorie pour une méthode d’ordre 2, bien que les applications fassent
généralement appel à des méthodes d’ordre 4 ou plus.
7.4.1
Méthodes d’ordre 2
Je cherche toujours la solution du problème représenté par (7.1) en supposant connue la solution
numérique approchée yn au point xn = x0 + nh. Pour cela, je vais construire une « fonction
incrément » Φ(xn , yn , h) telle que :
yn+1 − yn = hΦ(xn , yn , h).
Cette fonction dépend aussi du second membre f . Soit d’autre part la solution exacte z(t) du
problème différentiel :
z 0 (t) = f [t, z(t)] ; z(x) = y.
En termes imagés, z(t) est la solution de l’équation différentielle «qui passe par le point de coordonnées x et y» ; x et y sont ici considérés comme arbitraires mais constants. L’incrément exact
est défini par :
z(x + h) − z(x) = h∆(x, y, h).
La quantité τ (x, y, h) = ∆(x, y, h) − Φ(x, y, h) est une indication de la qualité de l’approximation,
c’est l’erreur locale de troncation de la méthode. Je souhaite bien sûr que τ tende vers 0 avec h,
ce qui est équivalent à la condition :
lim Φ(x, y, h) = f (x, y)
h→0
On dit que la méthode est cohérente si cette condition est vérifiée dans tout le domaine de variation
de x. De plus, on dit que la méthode est d’ordre p si τ (x, y, h) = O(hp ).
78
Chapitre 7. Problèmes différentiels à conditions initiales
Je vais chercher, dans le cas d’une méthode d’ordre 2, une expression de Φ qui coïncide avec
∆ jusqu’aux termes en h2 compris. Je suppose (comme l’on fait Runge et Kutta il y a presque un
siècle) que Φ est de la forme :
Φ(x, y, h) = a1 f (x, y) + a2 f [x + p1 h, y + p2 hf (x, y)]
où les quantités a1 , a2 , p1 et p2 sont des constantes à déterminer. Il me suffit d’imposer que le
développement de Taylor de Φ, à l’ordre 2 en h, coïncide avec celui de ∆ au même ordre. Ils
s’écrivent
1
∆ = f (x, y) + h(fx + f fy ) + O(h2 ),
2
Φ
= (a1 + a2 )f + ha2 p1 fx + ha2 p2 f fy + O(h2 ).
D’où trois conditions à remplir :

 a1 + a2 = 1,
a2 p1 = 1/2,

a2 p2 = 1/2.
Je dispose de quatre paramètres inconnus ; il est d’usage de conserver un paramètre libre et de
déterminer les trois autres à l’aide des relations ci-dessus ; la dernière quantité sera ajustée après
pour obtenir une propriété désirable de l’algorithme (bonne stabilité, erreur d’arrondi faible....).
Je choisis de conserver a2 , rebaptisé α pour la circonstance :

 a1 = 1 − α,
a2 = α,

p1 = p2 = α2 .
J’obtiens ainsi une méthode de Runge-Kutta d’ordre 2 caractérisée par la fonction incrément :
Φ(x, y, h) = (1 − α)f (x, y) + αf [x +
h
h
,y +
f (x, y)].
2α
2α
Parmi toutes les valeurs possibles de α, deux cas sont restés dans l’histoire : α = 1/2 (on parle
alors de méthode de Heun ou d’Euler améliorée) et α = 1 (méthode d’Euler modifiée). Vous vérifiez
facilement que ces algorithmes s’écrivent :
α = 1/2 ;
1
yn+1 = yn + hf (xn , yn ) + f [xn + h, yn + hf (xn , yn )]
2
et
α=1
7.4.2
;
1
yn+1 = yn + hf [xn + h/2, yn + hf (xn , yn )].
2
(7.8)
(7.9)
Exemple.
Je reprends le problème du pendule simple. Il me suffit de remplacer, dans le programme
précédent, la «function euler» par une «function rk2».
1
2
3
4
5
6
7
8
9
10
// mouvement du p e n d u l e par RK−2
function F = smy ( t , y , z )
F = z;
endfunction
function F = smz ( t , y , z )
F = −sin ( y ) ;
endfunction
function [ yf , z f , t f ] = rk2 ( h , t i , y i , z i )
y f = y i + 0 . 5 ∗ h ∗ ( smy ( t i , y i , z i )+smy ( t i+h , y i+h∗smy ( t i , y i , z i ) , z i+h∗smz ( t i , y i , z i ) ) ) ;
z f = z i + 0 . 5 ∗ h ∗ ( smz ( t i , y i , z i )+smz ( t i+h , y i+h∗smy ( t i , y i , z i ) , z i+h∗smz ( t i , y i , z i ) ) ) ;
79
7.4. Méthodes de Runge-Kutta
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
tf = ti + h;
endfunction
np = 6 0 0 ;
t = zeros ( np , 1 ) ;
y = zeros ( t ) ; z = zeros ( t ) ;
y0 = input ( ’ p o s i t i o n i n i t i a l e : ’ ) ;
z0 = input ( ’ v i t e s s e i n i t i a l e : ’ ) ;
pas = input ( ’ l o n g u e u r du pas : ’ ) ;
t ( 1 ) = 0 ; y ( 1 ) = y0 ; z ( 1 ) = z0 ;
f o r i = 2 : np do
[ y ( i ) , z ( i ) , t ( i ) ] = rk2 ( pas , t ( i −1) , y ( i −1) , z ( i − 1 ) ) ;
end
xset ( "window" , 0 )
plot2d ( t , y )
xset ( "window" , 1 )
plot2d ( y , z )
ep = 1−cos ( y ) ;
ec = 0.5∗ z . ∗ z ;
xset ( "window" , 2 )
plot2d ( t , [ ep , ec , ( ep+ec−ep (1) − e c ( 1 ) ) ∗ 1 0 0 0 ] )
Il est clair que ce sous-programme est encore inutilement compliqué. Sachant que smy ≡ y, je
pourrais écrire
smy(ti + h, yi + h ∗ smy(ti, yi, zi), zi + h ∗ smz(ti, yi, zi)) = yi + hyi = yi(1 + h)
On évite pourtant des erreurs en partant de la forme générale que l’on simplifie ensuite. La figure
2 montre la loi du mouvement produite par cet algorithme. Vous pouvez constater que, cette
fois, l’amplitude reste constante, malgré une valeur initiale très grande (presqu’égale à π). Dans
ces conditions, le pendule est un système mécanique non-linéaire, dont le mouvement n’est plus
sinusoïdal ni isochrone. J’ai ajouté à la fin du programme une représentation du mouvement dans
le plan de phase (y, z, fenêtre 1) et un graphique des énergies (fenêtre 2).
4
’c:/an_poly-6/pdl_rk2.dta’
3
2
1
0
-1
-2
-3
-4
0
10
20
30
40
50
60
70
80
Fig. 7.2 – : Mouvement du pendule calculé par la méthode RK2. Le pas était de 0,05.
80
Chapitre 7. Problèmes différentiels à conditions initiales
7.5
Méthode d’ordre 4
Je ne vais pas établir ici les formules de Runge-Kutta d’ordre 3 ou 4 ou plus : en effet, la
longueur des calculs croît très rapidement avec n. La méthode d’ordre 4 est la plus connue ; elle
s’écrit
yn+1 = yn +
h
(k1 + 2k2 + 2k3 + k4 ),
6
(7.10)
avec :
h
hk1
k2 = f (xn + , yn +
),
2
2
k1 = f (xn , yn ),
h
hk2
k3 = f (xn + , yn +
),
2
2
k4 = f (xn + h, yn + hk3 ).
Remarque : Certains auteurs incorporent le facteur h dans la définition des ki , ce qui le fait
disparaître des arguments de la fonction f .
7.5.1
Exemple
Je traite à nouveau le pendule, en remplaçant function rk2 par function rk4, selon le listing
ci-dessous
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// mouvement du p e n d u l e par RK−4
function F = smy ( t , y , z )
F = z;
endfunction
function F = smz ( t , y , z )
F = −sin ( y ) ;
endfunction
function [ yf , z f , t f ] = rk4 ( h , t i , y i , z i )
k1y = smy ( t i , y i , z i ) ;
k1z = smz ( t i , y i , z i ) ;
k2y = smy ( t i+h / 2 , y i+h∗ k1y / 2 , z i+h∗ k1z / 2 ) ;
k2z = smz ( t i+h / 2 , y i+h∗ k1y / 2 , z i+h∗ k1z / 2 ) ;
k3y = smy ( t i+h / 2 , y i+h∗ k2y / 2 , z i+h∗ k2z / 2 ) ;
k3z = smz ( t i+h / 2 , y i+h∗ k2y / 2 , z i+h∗ k2z / 2 ) ;
k4y = smy ( t i+h , y i+h∗ k3y , z i+h∗ k3z ) ;
k4z = smz ( t i+h , y i+h∗ k3y , z i+h∗ k3z ) ;
y f = y i + ( h / 6 ) ∗ ( k1y + 2∗ k2y + 2∗ k3y + k4y ) ;
z f = z i + ( h / 6 ) ∗ ( k1z + 2∗ k2z + 2∗ k3z + k4z ) ;
t f = t i+h ;
endfunction
np = 6 0 0 ;
t = zeros ( np , 1 ) ;
y = zeros ( t ) ; z = zeros ( t ) ;
y0 = input ( ’ p o s i t i o n i n i t i a l e : ’ ) ;
z0 = input ( ’ v i t e s s e i n i t i a l e : ’ ) ;
pas = input ( ’ l o n g u e u r du pas : ’ ) ;
t ( 1 ) = 0 ; y ( 1 ) = y0 ; z ( 1 ) = z0 ;
f o r i = 2 : np do
[ y ( i ) , z ( i ) , t ( i ) ] = rk4 ( pas , t ( i −1) , y ( i −1) , z ( i − 1 ) ) ;
end
plot2d ( t , y )
81
7.6. Algorithme de prédiction-correction
On peut fait les mêmes remarques qu’au paragraphe 7.4 à propos des simplifications possibles de
la fonction smy.
L’espace mémoire disponible avec Scilab est en général confortable, nettement plus grand que
l’espace utilisable sous Pascal. On peut aussi l’augmenter, si la valeur par défaut est trop faible
(fonction stacksize). Si je programmais en Pascal ou en C, j’éviterais de définir des tableaux
t,y,z. J’écrirais au contraire tous les résultats intermédiaires dans un fichier sur disque.
7.5.2
Avantages et inconvénients de méthodes de Runge-Kutta
La méthode RK4 se distingue par sa simplicité de mise en oeuvre ; je la recommande d’ailleurs
pour tous les problèmes courants. Elle ne requiert que quatre évaluations de f par pas. On peut
améliorerP
aisément la précision des calculs (si le langage et le compilateur le permettent) en calculant Φ =
aj kj en double précision, car c’est là que se produisent la plupart des erreurs d’arrondi.
L’algorithme de Runge-Kutta souffre de deux inconvénients liés. On ne dispose d’aucune indication sur l’erreur de troncation en cours de calcul. D’autre part, il y a des problèmes de stabilité
dès que le second membre est grand ou rapidement variable. Une méthode simple (mais coûteuse)
de surveillance de la précision consiste à conduire deux calculs simultanément, l’un avec le pas h,
l’autre avec le pas h/2. Tant que la distance entre les deux résultats reste inférieure à un certain
seuil, on admet que le résultat est valable. Si le seuil est franchi, il faut rejeter la (ou les) dernière(s)
valeur(s) calculée(s) et repartir avec un pas plus petit.
Il existe des algorithmes plus raffinés (qui portent les noms de Runge-Kutta-Fehlberg ou méthodes de Runge-Kutta emboîtées). Dans ce type de méthode, on calcule, par exemple, six fois f
par pas ; on combinant «bien» les résultats, on obtient une estimation précise de yn+1 ; une autre
combinaison des mêmes valeurs fournit une estimation de l’erreur. La seule difficulté réside dans
la forme compliquée des coefficients qui remplacent les aj et bj , mais l’ordinateur n’en a cure.
7.5.3
Organisation d’un programme
Il est commode de construire le programme de résolution sous une forme bien hiérarchisée, qui
permette de changer commodément d’algorithme et d’équation. Le sous-programme de niveau le
plus bas fait avancer la solution de xn à xn+1 ; c’est lui qui renferme les détails de l’algorithme. Ce
«noyau» de niveau zéro est englobé dans un sous-programme qui gère la surveillance de l’erreur
(quand elle existe). Avec un pas h, on calcule yn+1 et une estimation τn+1 de l’erreur locale de
troncation ; si celle-ci est inférieure au seuil, le pas est accepté ; sinon, on rejette le dernier résultat,
on diminue le pas et on recommence. Cet ensemble est à son tour inclus dans un sous-programme
qui conduit l’intégration de xmin à xmax et prend en charge le stockage des résultats intermédiaires.
Celui-ci est un peu délicat si l’on a affaire à des pas de longueur variable : comment concilier cette
démarche avec l’enregistrement des résultats pour des abscisses à peu près régulièrement réparties ?
Il est fréquent, quelque soit l’algorithme d’intégration, que l’on doive utiliser un pas assez petit, ce
qui conduit à calculer de nombreuses valeurs de xn , alors qu’on ne peut ou ne veut conserver qu’un
petit nombre de valeurs (pour les tracés par exemple). On peut concilier ces deux exigences en ne
conservant qu’une valeur de x toutes les p. La couche extérieure du programme est spécifique de
l’application ; elle est destinée à la lecture des paramètres et des valeurs initiales, à l’affichage des
résultats. Les seconds membres sont en général définis dans un sous-programme spécial.
7.6
Algorithme de prédiction-correction
Les méthodes de Runge-Kutta posent parfois des problèmes de stabilité ou de précision. Je vais
maintenant décrire des méthodes plus stables et généralement plus précises ; le prix à payer pour
ces améliorations sera une structure plus compliquée de l’algorithme.
82
Chapitre 7. Problèmes différentiels à conditions initiales
7.6.1
Prédiction
Je vais détailler un algorithme élémentaire de prédiction-correction, en commençant par la partie
la plus simple, l’algorithme de prédiction. Je cherche la solution du problème différentiel (7.1). La
variable indépendante x sera discrétisée avec un pas h. En reprenant l’une des interprétations de
la méthode d’Euler, je remplace y 0 par une forme approchée, mais plus précise que celle utilisée au
§1 :
f (x + h) − f (x − h) h2 000
− f (ξ)
y0 =
2h
6
soit, en reportant dans l’équation différentielle :
yn+1 = yn−1 + 2hfn +
h3 000
f (ξ).
3
À partir de cette relation exacte, j’obtiens une méthode d’intégration en négligeant le terme d’erreur
(qui me fournira l’erreur locale de troncation) :
yn+1 = yn−1 + 2hfn .
(7.11)
Par ailleurs, vous pourrez montrer sans peine que si l’on intègre terme à terme l’équation différentielle et que l’on remplace l’intégrale de f (x, y) par son approximation dite du point milieu, on
retrouve le même algorithme. L’amorçage du calcul suppose connus y0 et y1 , que l’on obtient par
Taylor ou Runge-Kutta d’ordre 2 ou encore par Euler. La figure 3 illustre cet algorithme.
6
5
4
Y^[P]
3
2
1
0
−1.0
−0.6
−0.2
0.2
0.6
1.0
1.4
1.8
2.2
2.6
3.0
3
f[x,y(x)]
2
1
0
x[n−1]
−1
−1.0
−0.6
−0.2
x[n]
0.2
0.6
x[n+1]
1.0
1.4
1.8
2.2
2.6
3.0
Fig. 7.3 – : Étape de prédiction. L’aire du rectangle vert est une approximation de l’aire hachurée ;
[P ]
on l’ajoute à yn−1 pour obtenir yn+1
7.6.2
Correction
La partie « correction » est plus subtile. Cette fois, j’intègre (de façon approchée) l’équation
différentielle entre xn et xn+1 (remarquez les nouvelles limites) par la méthode des trapèzes et je
trouve
h3
1
yn+1 = yn + h(fn + fn+1 ) − y 000 (ξ).
2
12
83
7.6. Algorithme de prédiction-correction
Comme précédemment, je néglige le terme d’erreur pour obtenir une méthode d’intégration du
problème différentiel :
1
yn+1 = yn + h(fn+1 + fn ).
(7.12)
2
Cette méthode est stable et précise. Elle souffre cependant d’un petit défaut : elle est inapplicable en l’état. En effet, la relation ci-dessus est une équation implicite en yn+1 , puisque cette
quantité figure dans fn+1 . Il serait dommage d’échouer si près du but ; en réalité, je peux très bien
résoudre l’équation en yn+1 par approximations successives, à condition de connaître une valeur
initiale y [0] . Il suffit d’appliquer la méthode du point fixe
1
[k+1]
[k]
yn+1 = yn + h[f (xn , yn ) + f (xn+1 , yn+1 )]
2
jusqu’à ce qu’un critère de convergence convenable soit atteint. La dernière valeur calculée est
retenue comme valeur de yn+1 .
[0]
Comment vais-je me procurer la valeur yn+1 ? Vous l’avez deviné : par la méthode de prédiction.
Celle-ci est explicite : elle fournit une valeur approchée de la solution, que j’appelle maintenant la
(P )
valeur «prédite», yn+1 et cette valeur prédite servira à amorcer l’itération du correcteur. L’algorithme complet peut donc s’écrire :
[P ]
yn+1 = yn−1 + 2hfn
,
[P ]
[C]
yn+1 = yn + (h/2)[fn + f (xn+1 , yn+1 )].
(7.13)
L’itération du correcteur peut, en principe, être répétée plusieurs fois. Cela s’avère inutile en
[C]
général : en cas de difficultés, il vaut mieux diminuer le pas. Dans tous les cas, yn+1 devient la
valeur définitive yn+1 . La figure 4 est une représentation graphique de ce calcul.
6
5
4
Y^[C]
3
2
1
0
−1.0
−0.6
−0.2
0.2
0.6
1.0
1.4
1.8
2.2
2.6
3.0
2.6
3.0
3
2
f[x,y^P]
1
0
x[n]
−1
−1.0
−0.6
−0.2
0.2
0.6
x[n+1]
1.0
1.4
1.8
2.2
Fig. 7.4 – : Étape de correction. L’aire du trapèze bleu est une approximation de l’aire hachurée ;
[C]
on l’ajoute à yn pour obtenir yn+1
7.6.3
Convergence du correcteur
On montre que si l’équation différentielle obéit à la condition de Lipschitz et si h est assez
petit, l’itération du correcteur converge. Plus précisément, la condition de Lipschitz s’énonce ainsi.
84
Chapitre 7. Problèmes différentiels à conditions initiales
Il existe une constante positive K telle que, pour toutes valeurs de x, y1 , y2 , on ait
|f (x, y1 ) − f (x, y2 )| ≤ K|y1 − y2 |.
Le pas h devra satisfaire à
Kh/2 < 1.
La qualité de l’itération dépend de la valeur initiale y [0] ; il est recommandé de choisir une formule
de prédiction et une formule de correction présentant des erreurs du même ordre. On montre que,
dans ce cas, une seule itération suffit. Si la valeur initiale provient de la méthode d’Euler (erreur
en h2 ), il faudra au moins deux itérations.
7.6.4
Exemple.
Je résous une fois de plus le problème du pendule simple, à l’aide de l’algorithme de prédictioncorrection. La fonction rk2 est remplacé les trois sous-programmes pred, correc, pc. Il faut aussi
modifier le programme principal, pour utiliser les deux valeurs successives yi−1 , yi pour calculer
yi+1 .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// mouvement du p e n d u l e par PC−2; z = y ’
// i n s t a b l e à p a r t i r de pas = 0 . 0 4 5
function F = smy ( t , y , z )
F = z;
endfunction
function F = smz ( t , y , z )
F = −sin ( y ) ;
endfunction
function [ yf , z f ] = pred ( t , y i , z i )
y f = y i + 2∗ pas ∗smy ( t , y i , z i ) ;
z f = z i + 2∗ pas ∗smz ( t , y i , z i ) ;
endfunction
function [ yf , z f ] = c o r r e c ( t , y i , z i , yp , zp )
y f = y i+ 0 . 5 ∗ pas ∗ ( smy ( t , y i , z i )+smy ( t , yp , zp ) ) ;
z f = z i + 0 . 5 ∗ pas ∗ ( smz ( t , y i , z i )+smz ( t , yp , zp ) ) ;
endfunction
function [ ynp1 , znp1 , tnp1 ] = pc ( tnm1 , ynm1 , znm1 , tn , yn , zn )
[ yp , zp ] = pred ( tnm1 , ynm1 , znm1 ) ;
[ ynp1 , znp1 ] = c o r r e c ( tn , yn , zn , yp , zp ) ;
tnp1 = tn + pas ;
endfunction
np = 2 0 0 0 ;
t = zeros ( np , 1 ) ;
y = zeros ( t ) ; z = zeros ( t ) ;
y0 = input ( ’ p o s i t i o n i n i t i a l e : ’ ) ;
z0 = input ( ’ v i t e s s e i n i t i a l e : ’ ) ;
pas = input ( ’ l o n g u e u r du pas : ’ ) ;
t ( 1 ) = 0 ; y ( 1 ) = y0 ; z ( 1 ) = z0 ;
t ( 2 ) = pas ; y ( 2 ) = y0+pas ∗ z0 +0.5∗ pas ∗ pas ∗ z0 ;
z ( 2 ) = z0+pas ∗ z0 ;
f o r i = 2 : ( np−1) do
[ y ( i +1) , z ( i +1) , t ( i +1)] = pc ( t ( i −1) , y ( i −1) , z ( i −1) , t ( i ) , y ( i ) , z ( i ) ) ;
end
xset ( "window" , 0 )
plot2d ( t , y )
85
7.6. Algorithme de prédiction-correction
7.6.5
Surveillance de l’erreur
Une qualité importante des méthode de prédiction-correction est qu’elles permettent, sans calculs supplémentaires, une surveillance de l’erreur de troncation. La solution exacte Yn+1 de l’équation différentielle en xn+1 est reliée à la valeur prédite par la relation :
h3 000
y (ξp ).
3
Si le correcteur converge, il diffère de la solution exacte par son erreur de troncation :
[P ]
Yn+1 = yn+1 +
h3 000
y (ξc ).
12
Je dispose ainsi d’un encadrement de Y et d’une majoration de l’erreur. Si je suppose en effet que
ξp ∼
= ξc , je peux écrire y 000 ∼
= (12/5h3 )(y [C] − y [P ] )n+1 , d’où une estimation de l’erreur de troncation
au point n (pour le calcul de yn+1 ) :
[C]
Yn+1 = yn+1 −
1 [P ]
(y − y [C] )n+1
5
L’utilisation de ce résultat est évidente. A chaque pas, je calcule |en | ; si cette quantité est supérieure
à un seuil fixé à l’avance, je rejette ce pas, je diminue h et je repars. Je peux augmenter h si |en |
est « très petit ».
[C]
Je pourrais aussi utiliser ma connaissance (approchée) de l’erreur pour améliorer yn+1 . Il suffit
de calculer :
[c]
modif
= yn+1 + (1/5)(y [P ] − y [C] )n+1 .
yn+1
en =
Ce perfectionnement est peu employé, car il nuit à la stabilité.
7.6.6
Formules d’ordre 4
En pratique, on utilise des méthodes du quatrième ordre. Elles peuvent être obtenues de plusieurs façons : par la recette des coefficients indéterminés ou par intégration approchée de l’équation
différentielle, comme je l’ai expliqué à propos de la méthode d’Euler. Si je remplace la fonction compliquée f par un polynôme d’interpolation du second degré (parabole), j’obtiendrai une méthode
d’ordre 4.
Je vais présenter une catégorie particulière de méthodes, celles d’Adams. L’algorithme d’AdamsBashforth est une méthode explicite d’ordre 4 qui s’écrit :
yn+1 = yn + (h/24)(55fn − 59fn−1 + 37fn−2 − 9fn−3 ),
(7.14)
où, comme d’habitude, fn = f (xn , yn ) est la valeur du second membre au point xn . Cette équation
[
va servir à calculer la valeur prédite yn+1 P ]. Le terme d’erreur correspondant est :
251 5 (5)
h y
720
À cette équation de prédiction, j’associe le correcteur d’Adams-Moulton :
+
yn+1 = yn + (h/24)(9fn+1 + 19fn − 5fn−1 + fn−2 ).
(7.15)
(7.16)
Il s’agit encore une fois d’une équation implicite pour yn+1 (qui figure dans fn+1 ). L’erreur de
troncation s’écrit :
19 5 (5)
h y .
−
(7.17)
720
Il est encore possible d’estimer l’erreur de troncation, et donc de la surveiller, à partir de la différence
y [P ] − y [C] , qui vaut, d’après (7.15) et (7.17) :
3 5 (5)
h y
8
L’algorithme d’Adams admet la représentation graphique présentée page suivante.
[P ]
[C]
yn+1 − yn+1 =
86
Chapitre 7. Problèmes différentiels à conditions initiales
7.6.7
Démarrage des méthodes de prédiction-correction
Tous les algorithmes de prédiction-correction utilisent plusieurs valeurs déjà connues de la
fonction pour calculer yn+1 (méthodes à pas multiples ou liés). Ceci complique l’amorçage du
calcul. Considérons le cas particulier de la méthode d’Adams, qui nécessite quatre valeurs de y.
La première sera fournie par la condition initiale, mais les trois suivantes devront être calculée par
un algorithme indépendant : Taylor ou Runge-Kutta. Il est recommandé d’utiliser des formules du
même ordre que pour l’algorithme principal.
7.6.8
Avantages et inconvénients des méthodes à pas multiples
Les méthodes de prédiction-correction sont très appréciées des spécialistes, qui en ont poussé
très loin l’analyse théorique. Leur principal avantage est qu’elles permettent une estimation aisée
de l’erreur de troncation. Leur stabilité est aussi renommée. Nous n’avons pas examiné ce point,
mais l’étude du système modèle y 0 = −ky, montrerait que l’algorithme de correction est stable
quelque soit h, alors l’équation de prédiction peut être instable (mais sans danger puisque elle ne
sert qu’à fournir une valeur intermédiaire et locale).
Les inconvénients des méthodes «p-c» sont dus à la complexité de l’algorithme. Une méthode
d’ordre 4 requiert, pour démarrer, les 3 premières valeurs de y, lesquelles doivent être obtenues sans
"trop" d’erreur, par exemple par Runge-Kutta d’ordre 4. La modification du pas h n’est pas aussi
simple qu’on pourrait le croire. Si je m’aperçois que l’erreur de troncation lors du calcul de yn+1 est
trop grande, je rejette cette valeur et et je divise h par 2. Le calcul peut-il repartir pour autant ?
Pas tout de suite, car l’évaluation de yn+1 demande la connaissance des 4 valeurs précédentes de
y ; or, je ne les connais que pour le pas h et non pour h/2. Il faut donc interpoler entre valeurs de
y pour trouver les précurseurs de yn+1 avec le pas h/2.
7.7
Méthodes pour les équations du second ordre
La physique fournit souvent des équations différentielles du second ordre où y 0 ne figure pas.
C’est le cas en mécanique classique (au moins pour les systèmes à un seul degré de liberté) en l’absence de frottement ; c’est aussi le cas en mécanique quantique pour les problèmes à une dimension.
Il existe plusieurs algorithmes spécialisés et bien adaptés à ce type de problème. J’en décrirai deux.
7.7.1
Algorithme de Verlet ou de saute-mouton
Je note y(t) la fonction inconnue, solution de l’équation différentielle particulière :
y 00 = f (t, y)
(7.18)
où la variable indépendante peut être le temps. La méthode résulte du remplacement de la dérivée
seconde par une approximation bien connue
1
y 00 |n ∼
= 2 [yn+1 − 2yn + yn−1 ],
h
où l’erreur de troncation est O(h2 ). L’algorithme de Stoermer-Verlet s’écrit donc
yn+1 = 2yn − yn−1 + h2 f (t, x).
(7.19)
Par suite de la symétrie de cette formule, les vitesses (et tous les termes impairs en h) ont disparu.
En cas de besoin, je pourrai estimer les vitesses au moyen de la relation
yn0 = vn =
1
[yn+1 − yn−1 ].
2h
87
7.7. Méthodes pour les équations du second ordre
Cet algorithme jouit de plusieurs avantages. Il est rapide, la seule étape coûteuse en temps étant
le calcul du second membre, qui intervient une fois par pas. Le terme d’erreur est petit et une
analyse plus détaillée montrerait que l’énergie totale est conservée à chaque pas, jusqu’aux termes
en h2 . Il est de ce fait presque universellement employé pour les calculs de dynamique moléculaire
où l’on doit suivre les trajectoires de milliers d’atomes simultanément.
Les bonnes performances de la méthode de Verlet en mécanique classique tiennent à la forme
particulière des équations de la dynamique. Celles-ci s’écrivent, sous la forme donnée par Hamilton
p˙ = −
∂H
∂q
;
q˙ =
∂H
.
∂p
(q est une coordonnée généralisée et p une quantité de mouvement généralisée). Ce système différentiel est particulier : c’est la même fonction (l’énergie totale ou le hamiltonien H) qui figure au
second membre. L’algorithme de Verlet respecte bien cette structure et on le qualifie de «symplectique» (entrelacé en grec).
7.7.2
Algorithme de Numerov
C’est à un astronome russe (publiant vers 1935) que l’on doit une méthode d’intégration spécialement adaptée aux équations de la mécanique céleste et qui porte son nom. Je cherche à résoudre
l’équation (7.18), mais avec une précision bien supérieure à celle permise par la méthode de Verlet.
L’algorithme de Numerov est une méthode de prédiction-correction. Je m’intéresse tous d’abord
à la partie «correction», que je vais traiter par la méthode des coefficients indéterminés. Je fais
l’hypothèse que yn+1 peut s’exprimer comme
yn+1 = a0 yn + a1 yn−1 + a2 yn−2 + h2 b−1 fn+1 + b0 fn + b1 fn−1 + b2 fn−2 ).
Le coefficient h2 est là pour que les bi soient des nombres sans dimensions. La présence d’un
coefficient b−1 non nul indique qu’il s’agit d’une méthode implicite (yn+1 est donné en fonction
de fn+1 qui dépend elle-même de yn+1 ). Je dispose de sept paramètres inconnus {ai , bi } entre
lesquels je vais imposer six relations ; j’utiliserai à la fin les résultats de Numerov pour lever
l’indétermination. J’impose donc que la formule précédente soit exacte pour y = 1, x, x2 , x3 , x4 et
x5 . Comme d’habitude, je peux choisir x = 0, puisque les relations obtenues doivent être vérifiées
quel que soit x. Il vient :

1 = a0 + a1 + a2 ,




h = −h(a1 + 2a2 ),


 2
h = h2 (a1 + 4a2 ) + 2h2 (b−1 + b0 + b1 + b2 ),
h3 = −h3 (a1 + 8a2 ) + 6h3 (b−1 − b1 − 2b2 ),




h4 = h4 (a1 + 16a2 ) + 12h4 (b−1 + b1 + 4b2 ),


 5
h = −h5 (a1 + 32a2 ) + 20h5 (b−1 − b1 − 8b2 ).
J’exprime les coefficients en fonction de a2

 a0 = 2 + a2 , a1 = −1 − 2a2 ,
b−1 = −1/12 , b0 = (10 − a2 )/12,

b1 = (1 − 10a2 )/12 , b2 = −a2 /12.
Selon Numerov, le choix a2 = 0 jouit de qualités intéressantes : c’est celui que je retiendrai. La
formule définitive (avec le terme d’erreur que je pourrais obtenir à partir d’un développement de
Taylor des yi ) s’écrit :
yn+1 = 2yn − yn−1 +
h2
h6 y (6) (ξc )
(fn+1 + 10fn + fn−1 ) −
.
12
240
88
(7.20)
Chapitre 7. Problèmes différentiels à conditions initiales
Pour être complet, je cite la formule de prédiction établie par Numerov, que vous pouvez démontrer
par la même méthode des coefficients indéterminés :
yn+1 = 2yn−1 − yn−3 +
4h2
16h6 y (6) (ξp )
(fn + fn−1 + fn−2 ) +
3
240
Vous pourrez aussi trouver l’erreur de troncation en fonction de y [P ] et de y [C] . Je vais particulariser
la formule de correction (la plus précise et la plus stable) pour le cas d’un problème linéaire, où
l’équation différentielle devient :
y 00 = A(x)y + B(x).
Cette hypothèse entraîne une simplification considérable, car le second membre est résoluble en
y et l’équation de correction n’est plus implicite. Je peux donc abandonner l’étape de prédiction
pour écrire :
yn+1 =
1
h2
[2y
−
y
+
[Bn+1 + 10(An yn + Bn ) + An−1 yn−1 + Bn−1 )].
n
n−1
2
12
1− h
A
n+1
12
(7.21)
Cet algorithme est facile à programmer et donne de très bon résultats.
7.8
Équations «raides»
Avant de terminer ce chapitre, je mentionne une difficulté que l’on rencontre aussi bien en
cinétique chimique qu’en dynamique des structures, sans offrir de solution concrète.
Certains problèmes de cinétique chimique ont pour expression mathématique un système différentiel de la forme :
y0 = Ay + f (t)
où y est un vecteur dont les n coordonnées représentent des concentrations, A une matrice carrée
constante d’ordre n et f le vecteur de seconds membres. Je suppose que les valeurs propres λk de
A soient réelles et distinctes. Je connais alors la forme de la solution :
X
y=
ck exp(λk t)zk + ϕ(t).
Du point de vue numérique, il se posera un problème de stabilité chaque fois qu’une valeur propre
sera négative et le problème sera d’autant plus aigu que les λk seront plus différents les uns des
autres. En termes qualitatifs, il me faudra choisir un pas très petit pour traiter correctement les
décroissances les plus rapides (grand λ) mais, avec ce même pas, il faudra un nombre immense
d’itérations pour voir évoluer les décroissances les plus lentes. On dit que le système d’équations
différentielles est "raide".
Un problème analogue se rencontre pour des systèmes du second ordre
y00 = Ay + f (t)
comme on en trouve en mécanique des vibrations. Ici, l’échelle de temps est en principe définie par
la période du mouvement, mais il y a plusieurs périodes, puisque la matrice A a plusieurs valeurs
propres, lesquelles peuvent être très différentes. Je serai encore une fois obligé de choisir un pas
très petit pour suivre le mouvement le plus rapide et, simultanément, de prolonger le calcul pour
décrire le mouvement le plus lent.
Dans la pratique, la difficulté est souvent accrue par la non-linéarité des seconds membres. Seules
des méthodes implicites sont assez stables pour traiter ce type de problèmes. La convergence de
la méthode d’itération décrite au §6 n’est pas assurée dans ce cas et il faut résoudre l’équation
implicite du «correcteur» par une méthode de Newton.
89
Chapitre 8
Problèmes différentiels à conditions
aux limites et problèmes aux valeurs
propres
8.1
Introduction
La physique fournit de nombreux exemples de problèmes différentiels qui prennent un aspect
assez différent du problème de Cauchy (ou «à conditions initiales») examiné dans le chapitre
précédent. Il s’agit soit de problèmes à conditions aux limites, soit de problèmes aux valeurs
propres, les méthodes employées pour résoudre ces deux types de question étant assez proches.
Voici un exemple du premier type. Une poutre de longueur L, soumise à une charge uniforme
q(N/m) et à une tension S à chaque extrémité, se déforme verticalement ; j’appelle w(x) le déplacement d’un point de la poutre à partir de l’horizontale. w obéit à l’équation différentielle :
w00 −
S
1
w=
qx(x − L),
EI
2EI
où I est le moment d’inertie de la section droite de la poutre et E le module d’élasticité. Si la
poutre repose sur des supports fixes à chaque extrémité, w doit aussi satisfaire aux conditions aux
limites :
w(0) = w(L) = 0.
La résolution est facile si les paramètres sont constants, mais une méthode numérique devient
indispensable dès lors que la charge q ou les propriétés (E, I) de la poutre varient avec x.
L’étude des mouvements périodiques d’une corde vibrante de masse linéïque µ(x), soumise à
une tension T (x) fait apparaître un problème de valeurs propres. La déformation de la corde, y(x),
obéit à l’équation différentielle :
[T (x)y 0 ]0 + (2πν)2 µ(x)y = 0,
où ν est la fréquence. y doit aussi respecter des conditions aux limites en x = 0 et x = L, comme
par exemple y(0) = 0 (extrémité fixe) ou ∂y/∂x|L = 0 (extrémité libre). Le problème ainsi posé n’a
de solution que pour certaines valeurs de ν (les fréquences propres) ; les fonctions y correspondantes
sont les fonctions propres.
Il est facile de généraliser les considérations précédentes. Je suppose avoir affaire à une équation
résolue en y 00 , avec des conditions aux limites séparées sur y (le cas de conditions sur y 0 est très
semblable) :
y 00 = f (x, y, y 0 ) ; y(a) = A ; y(b) = B ; a ≤ x ≤ b.
90
Chapitre 8. Problèmes différentiels à conditions aux limites et problèmes aux valeurs propres
On rencontre rarement des conditions aux limites portant sur y et y 0 :
c0 y(a) + c1 y 0 (a) = A ;
d0 y(b) + d1 y 0 (b) = B.
(Il peut en principe arriver qu’une condition concerne les deux extrémités simultanément : uy(a) +
vy(b) = g, mais je n’examinerai pas ce cas).
Les problèmes à conditions aux limites n’ont pas toujours de solution ; ils peuvent aussi en avoir
plusieurs, un comportement que l’équation différentielle très simple
w00 + w = 0
illustre bien. La solution générale s’écrit w = c1 cos(x) + c2 sin(x). Selon les conditions aux limites
choisies, le problème différentiel a une, une infinité ou zéro solution :
w(0) = 0
w(0) = 0
w(0) = 0
w(π/2) = 1
w(π) = 0
w(π) = 1
w = sin x
une solution
w = c1 sin x infinité de solutions
aucune solution
Il est néanmoins possible, moyennant diverses hypothèses restrictives sur f et sur les conditions
aux limites, de démontrer l’existence et l’unicité de la solution du problème différentiel à conditions
aux limites.
8.2
8.2.1
La méthode du tir
Problème aux limites
Soit à résoudre le problème différentiel à conditions aux limites :
y 00 = f (x, y, y 0 ) ;
y(a) = A ;
y(b) = B.
(8.1)
J’associe à ce premier problème un problème à valeurs initiales :
w00 = f (x, w, w0 )
;
w(a) = A
;
w0 (a) = s
(8.2)
qui admet en général une solution unique, dépendante du paramètre s, w(x, s). Par hypothèse,
ce problème n’est pas soluble analytiquement et je doit donc en déterminer numériquement la
solution pour une valeur donnée de s, par l’une des méthodes exposées au chapitre précédent.
Comme il s’agit d’une équation différentielle du second ordre, il faudra sans doute la remplacer par
un système différentiel du premier ordre équivalent. Pour résoudre ensuite le problème aux limites,
connaissant w(x, s), il me suffit de trouver s tel que :
w(b, s) = B
ce qui revient à résoudre une équation non linéaire en s. Pour les personnes qui n’auraient eu le
bonheur de recevoir une formation militaire, je vais développer l’analogie avec le comportement
d’un artilleur. A l’aide d’un canon situé en x = a, celui-ci veut atteindre une cible en x = b ; il ne
dispose pour cela que d’un seul réglage, la hausse (angle que fait l’axe du canon avec l’horizontale).
Il procède par approximations successives : un coup court, un coup long (il encadre l’objectif)
et, idéalement ( ?), un coup au but. Pour la résolution pratique de problèmes aux limites, il est
recommandé de s’inspirer de l’artilleur, en traçant diverses fonctions w(x, s) pour différentes valeurs
de s et en observant leur comportement. Ce n’est qu’une fois acquise une certaine expérience du
problème que l’on se tournera vers des méthodes plus systématiques.
J’ai présenté de nombreuses méthodes de résolution d’une équation non-linéaire ; la plus simple
est la méthode de bissection (ou dichotomie). Sa mise en oeuvre suppose que je dispose de deux
valeurs de s telles que w(b, s1 ) et w(b, s2 ) encadrent B.
91
8.2. La méthode du tir
D’après un théorème connu sur les équations différentielles, la solution w(x, s) est une fonction
continûment dérivable de s. Je peux donc aussi utiliser la méthode de Newton. Je rappelle que, à
partir d’une valeur initiale s(0) , je calcule de façon itérative des valeurs s(i) à l’aide de la formule :
s(i+1) = s(i) −
F [s(i) ]
F 0 [s(i) ]
;
F (s) ≡ w(b, s) − B.
J’obtiens F [s(i) ] en résolvant le problème différentiel :
w00 = f (x, w, w0 ) ;
w(a) = A ;
w0 (a) = s(i) .
La méthode la plus simple pour calculer F’ consiste à l’approcher par le quotient :
F 0 [s(i) ] ∼
= {F [s(i) + h] − F [s(i) − h]}/(2h)
J’ai implicitement admis que l’algorithme qui détermine w partait de a et progressait vers les x
croissants. Ce n’est pas obligatoire et c’est même suicidaire si w a une discontinuité en x = a ;
dans ce cas, on peut partir de b, avec le même algorithme et un pas négatif. On peut être amené
à construire une morceau de solution à partir de a, un autre à partir de b : il faut alors imposer la
continuité de w ou de w0 au point de rencontre entre a et b. Il est souvent commode d’imposer que
la quantité w0 /w (la «dérivée logarithmique») soit continue ; cette condition a l’avantage d’être
insensible à la normalisation de w.
Le cas d’une équation différentielle linéaire, fréquent en physique, est nettement plus simple. Il
suffit en effet de déterminer deux solutions w(x, s1 ) et w(x, s2 ) du problème à conditions initiales
associé. La bonne valeur de s, soit s0 , pour laquelle w(b, s0 ) = B, s’obtient par interpolation linéaire. En effet, la solution du problème différentiel est une fonction linéaire des conditions initiales.
Exemple
Soit le problème différentiel :
y 00 + y = x ; y(0) = y(1) = 0.
L’équation différentielle du second ordre est équivalente au système :
y 0 = z ; z 0 = y − x,
que j’ai résolu par la méthode RK2, avec les conditions initiales y(0) = 0, y 0 (0) = s. Les deux
premières exécutions ont donné, pour s1 = −0, 3, y(1) = −0, 093915 et pour s2 = 0, 1, y(1) =
0, 242674. Une interpolation inverse linéaire me donne alors s0 = −0, 188392, qui conduit, comme
le montre la figure ci-dessous, à y(1) = 0. La solution analytique est y = x − sin(x)/sin(1) ; la
dérivée à l’origine est y 0 (0) = −0, 188395, très proche de la solution numérique.
8.2.2
Problèmes de valeurs propres
Un problème aux valeurs propres comme
y 00 = f (x, y, y 0 , λ) ;
y(a) = y(b) = 0
(8.3)
peut se ramener à un problème à conditions aux limites en introduisant une fonction inconnue
auxiliaire w ≡ λ et l’équation auxiliaire w0 = 0 ou en considérant la valeur propre comme un
paramètre ajustable, ce qui est d’une mise en oeuvre plus simple. Je me limite à une équation
différentielle linéaire, écrite sous la forme
y 00 + p(x)y 0 + λq(x)y = 0 ;
y(a) = y(b) = 0
92
;
a ≤ x ≤ b.
(8.4)
Chapitre 8. Problèmes différentiels à conditions aux limites et problèmes aux valeurs propres
0.25
’c:/an_poly-7/tir1.dta’
’c:/an_poly-7/tir2.dta’
’c:/an_poly-7/tir3.dta’
0.2
0.15
0.1
0.05
0
-0.05
-0.1
-0.15
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Fig. 8.1 – . La méthode du tir.
Comme l’équation (8.4) et ses conditions aux limites sont homogènes, ky est solution si y l’est.
J’associe à ce problème de valeurs propres un problème auxiliaire à conditions initiales :
v 00 + p(x)v 0 + λq(x) = 0; v(a) = 0; v 0 (a) = p,
où p est une constante arbitraire, la pente initiale. La solution est de la forme v = v(x, λ, p) et je sais
la trouver numériquement à l’aide de l’une des méthodes du chapitre précédent. Pour déterminer
la solution du problème aux valeurs propres, il me faudra déterminer λ tel que :
v(b, λ, p) = 0
Il s’agit encore d’une équation algébrique, mais ici l’inconnue est λ. Le paramètre p ne sert qu’à
fixer la normalisation de y. Il peut être choisi empiriquement avant le début du calcul pour obtenir
des valeurs commodes de y. La méthode de dichotomie se révèle très pratique pour trouver λ.
Exemple
La masse linéïque d’une corde de longueur L varie selon la loi µ = µ0 (1 + αx). Lorsque cette
corde effectue des oscillations sinusoïdales, sa forme est définie par l’équation :
y 00 + (k0 L)2 (1 + αr)y = 0 ; y(0) = y(1) = 0
√
où r = x/L, k0 = 2πν/c0 et c0 = (T /µ0 ), T étant la tension. Les fréquences de vibration sont
les valeurs de ν telles que le problème différentiel admette une solution. Je les ai cherchées par
la méthode du tir et l’algorithme de Runge-Kutta d’ordre 2. La figure montre le résultat de trois
exécutions du programme, pour des fréquences proches du second mode ((k0 L)2 = 10, 11, 532 et
13).
8.3
Méthodes aux différences finies
Dans ce type d’algorithme, je remplace,dans l’équation différentielle, les dérivées y 0 , y 00 , . . . par
des approximations formées à partir de différences latérales. Je me limite aux problèmes linéaires,
comme le problème du second ordre à conditions aux limites
y 00 + q(x)y = g(x); y(a) = A; y(b) = B
93
8.3. Méthodes aux différences finies
0.25
’c:/an_poly-7/valp1.dta’
’c:/an_poly-7/valp2.dta’
’c:/an_poly-7/valp3.dta’
0.2
0.15
0.1
0.05
0
-0.05
-0.1
-0.15
-0.2
0
0.2
0.4
0.6
0.8
1
Fig. 8.2 – : Recherche du 2ième mode d’une corde de densité variable. Le paramètre α vaut 5. La
valeur propre est k0 L = 3, 396.
Pour «discrétiser» ce problème, je subdivise [a, b] en n + 1 sous-intervalles égaux, de longueur
h = (b − a)/(n + 1), séparés par des pivots d’abscisses xi = a + ih, x0 = a, xn+1 = b et je
remplace y 00 (xi ) par [ui+1 − 2ui + ui−1 ]/h2 , en posant ui ' y(xi ). Ce faisant, je commets une
erreur de troncation que le théorème de Taylor appliqué à y(i+1 ) et y(i−1 ) permet d’évaluer à (h2 /12)y (4) (xi + θh), −1 < θ < 1. Il y a n + 2 valeurs de ui , dont deux nous sont déjà connues :
u0 = A, un+1 = B ; les autres sont solutions d’un système linéaire qui s’écrit, sous forme matricielle :
MU = K
avec les définitions U = [u1 , u2 , . . . , un ]T ,k = [g1 + A/h2 , g2 , ....gn−1 , gn + B/h2 ]T et


−2 + q1 h2
1
0 ...
0


1
−2 + q2 h2 1
0
...

M=


...
...
... ...
...
0
...
. . . 1 −2 + qn h2
On a le théorème suivant. Si qi ≥ 0 pour i = 1, 2, ..., n, alors A est définie positive : la solution
du système linéaire précédent est alors facile, les méthodes de Gauss ou de Cholesky s’appliquent
sans permutation de lignes. On montre aussi que l’erreur de troncation est partout d’ordre h2 . Cet
algorithme s’étend facilement aux problèmes contenant la dérivée première de y. Il est important
de représenter y 0 par une expression qui respecte la symétrie de la matrice M.
8.3.1
Exemple
Je reprend le problème déjà résolu par la méthode du tir
y 00 + y = x ; y(0) = y(1) = 0.
Je vais utiliser 20 points, donc 18 valeurs inconnues {uk }. Les éléments de la matrice M sont
Mi,i = h2 − 2, Mi,i+1 = Mi+1,i = 1 tandis que les coordonnées de k sont ki = h2 xi . Voici le
programme pour Scilab. Vous remarquez l’extrême simplicité de la résolution d’un système linéaire
de la forme Ax = b : il suffit d’écrire x = A\b.
94
Chapitre 8. Problèmes différentiels à conditions aux limites et problèmes aux valeurs propres
1 // y ’ ’+ y = x par d i s c r e t i s a t i o n
2 xmin = 0 ; xmax = 1 ;
3 np = input ( "nombre t o t a l de p o i n t s : " ) ;
4 n i = np −1;
5 nx = np −2;
6 M = zeros ( nx , nx ) ;
7 h = ( xmax−xmin ) / n i ;
8 f o r i =2:nx−1
9
M( i , i ) = h∗h−2;
10
M( i , i +1) = 1 ;
11
M( i , i −1) = 1 ;
12 end
13 M( 1 , 2 ) = 1 ; M( nx , nx−1) = 1 ; M( nx , nx ) = h∗h−2; M( 1 , 1 ) = h∗h−2;
14 x = linspace ( xmin+h , xmax−h , nx ) ’ ;
15 b = h∗h∗x
16 y = M\b
17 yy = [ 0 ; y ; 0 ] ; xx = [ xmin ; x ; xmax ] ;
18 x s e t ( " window " , 0 ) , xbasc ( 0 )
19 x s e g s ( [ xmin , xmax ] , [ 0 , 0 ] )
20 p l o t 2 d ( xx , yy , r e c t =[xmin , − 0 . 1 , xmax , 0 . 1 ] )
qui produit le trace de la figure 3.
0.10
0.08
0.06
0.04
0.02
0
−0.02
−0.04
−0.06
−0.08
−0.10
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
Fig. 8.3 – :Solution d’un problème avec conditions aux limites. La fonction inconnue est «discrétisée» sur 20 points
La méthode de discrétisation s’applique aussi en principe aux problèmes de valeurs propres
(linéaires). La différence est que l’on n’aboutit à un problème simple d’algèbre linéaire seulement
dans quelques cas particuliers. C’est le cas pour
y 00 + q(x)y = λy
;
y(a) = y((b) = 0.
On obtient une équation matricielle aux valeurs propres de la forme :
MU = λU
95
8.4. Méthodes variationnelles, Rayleigh-Ritz-Galerkin
avec la même matrice M que précédemment. Si A est d’ordre n, alors l’équation précédente admet
n solutions comprenant chacune une valeur propre λk et un vecteur propre U(k) (voir le chapitre
«éléments propres»).
Les deux approches que je vient de décrire (tir et discrétisation) sont en gros équivalentes,
du point de vue de la commodité comme du point de vue de la qualité des résultats, pour tout
les problèmes simples. Si les fonctions (comme q(x)) présentent des discontinuités, il vaut mieux
utiliser la discrétisation, plus stable.
8.4
Méthodes variationnelles, Rayleigh-Ritz-Galerkin
Les méthodes variationnelles utilisent le fait que la solution d’un problème différentiel à conditions aux limites possède souvent la propriété de rendre minimale ou plus généralement stationnaire
une certaine intégrale. La recherche de ce minimum peut être plus facile que la résolution directe,
surtout en présence de discontinuités des fonctions intervenant dans le problème différentiel. Le
but de ce paragraphe est de présenter une brève introduction à ces méthodes pour le cas simpliste
d’une seule variable. Je considère le problème (que l’on appelle un problème de Sturm-Liouville)
−(py 0 )0 + qy = f
;
y(a) = 0 ;
y(b) = 0
où p, q et f sont des fonctions de x continûment dérivables sur I = [a, b]. J’introduis un «opérateur
ˆ par la relation
différentiel» L
ˆ
L(v)
≡ −(pv)0 + qv,
si bien que (1) peut aussi s’écrire :
ˆ
L(y)
=f
Je vais me servir du produit scalaire de fonctions définies sur I déjà introduit au chapitre 5, cela
pour une fonction de poids égale à 1 :
Z
b
(u, v) =
u(x)v(x)dx ;
k u k2 = (u, u).
a
On démontre alors facilement les propriétés suivantes :
*L est «symétrique» : (u, L(v)) = (L(u), v).
*L est défini positif : (L(u), u) = (u, L(u)) > 0 pour tout u > 0.
Je définis un nombre dépendant de u (une «fonctionnelle» de u) :
F (u) = (u, u) − 2(u, f ),
où f est la fonction qui figure au second membre de l’équation différentielle. Si y vérifie L(y) = f ,
on a le théorème :
F (u) > F (y)
pour tout u 6= y. Ce résultat m’amène à chercher une approximation à y en rendant minimale
F (u). Cela sera d’autant plus facile que u est proche de la «vraie» solution, tout en gardant une
forme telle que les calculs soient simples. Il est courant de prendre pour u une combinaison linéaire
de fonctions de base :
u = a1 u1 + a2 u2 + ..... + an un .
La fonction F (u) devient alors F (a1 , ...an ) = F (a). Soit v le vecteur de coordonnées (ui , f ) et S
la matrice d’éléments si,j = (ui , uj ). Un calcul élémentaire montre que :
F (a) = aT Sa − 2vT a.
96
Chapitre 8. Problèmes différentiels à conditions aux limites et problèmes aux valeurs propres
Résoudre le problème différentiel est donc approximativement équivalent à trouver le vecteur a qui
rend F minimale. On montre encore que ce vecteur, a0 , est solution du système :
Sa = v.
Cette solution existe et est même facile à trouver parce que S est définie positive.
Les méthodes d’éléments finis (à deux et trois dimensions) utilisent un formalisme variationnel
analogue au précédent pour réduire les équations aux dérivées partielles, rencontrées en mécanique
des fluides ou en élasticité, à un système d’équations linéaires.
97
Chapitre 9
Résolution de systèmes d’équations
linéaires
9.1
Introduction
La résolution de systèmes d’équations linéaires est peut-être le problème le plus connu et le
mieux étudié de l’analyse numérique. Ces études s’appuient sur l’ensemble des connaissances en
algèbre linéaire. Malgré ces atouts, la résolution pratique d’un système linéaire peut poser des
difficultés, soit pour certains choix des coefficients (systèmes «mal conditionnés»), soit lorsque
le nombre d’inconnues devient grand (plus de quelques milliers), comme c’est le cas lors de la
résolution d’équations aux dérivées partielles ou dans certains domaines de l’économétrie. Il peut
aussi arriver que le système soit «surdéterminé» (plus d’équations que d’inconnues).
Quelles sont les méthodes que propose l’arsenal mathématique ? Tout d’abord une méthode que
je qualifierai de formelle : la solution du problème
Ax = b
(9.1)
(où A est une matrice n × n, b et x des vecteurs à n coordonnées) s’écrit x = A−1 b, puis la
méthode de Cramer, qui se révèle inutilisable en pratique dès qu’il y a plus de trois inconnues, (le
calcul d’un déterminant n × n nécessite n! opérations, ce qui est prohibitif).
Je rencontre ensuite un groupe de méthodes qui procèdent par éliminations successives des
inconnues : elles sont associées aux noms de Gauss et de Gauss-Jordan et sont d’application aisée.
D’autres algorithmes «factorisent» la matrice des coefficients (A =⇒ FG) avant de pratiquer des
éliminations successives qui sont alors très rapides à cause de la forme particulière des facteurs
mathbf F, G : ce sont les méthodes de Crout, Doolittle ou Cholesky. En dépit des apparences,
ces deux ensembles sont mathématiquement équivalents et sont fréquemment employés en analyse
numérique.
Dans un esprit bien différent, je pourrai faire appel à des procédés itératifs de résolution, dont
la convergence n’est pas toujours assurée : ce sont les méthodes associées aux noms de Jacobi et
Gauss-Seidel.
Comme vous le verrez, le calcul de l’inverse A−1 d’une matrice A est plus long que le calcul
direct de la solution du système linéaire (9.1). L’analogie avec l’algèbre peut faire comprendre
cette remarque. Pour résoudre 10x = 3, je peux faire 10−1 = 0, 1; 0, 1 × 3 = 0, 3 ou directement
x = 3/10 = 0, 3. On évite donc de calculer l’inverse de la matrice des coefficients, à moins que
le problème posé ne le demande explicitement. Si tel est le cas, je calculerai A−1 en résolvant n
systèmes linéaires particuliers, dont les seconds membres sont respectivement égaux à chacun des
vecteurs de base.
98
Chapitre 9. Résolution de systèmes d’équations linéaires
Dans la mise en oeuvre des méthodes d’élimination ou de factorisation, l’ordinateur ne commet
que des erreurs d’arrondi. Dans le cas d’une méthode itérative, je devrais tenir compte aussi d’une
erreur de troncation, puisque l’algorithme s’arrête au bout d’un nombre fini d’opérations.
Pour l’analyse numérique, la difficulté de résolution d’un système linéaire tient aux effets conjugués de sa taille et de son «conditionnement». Voici une interprétation graphique de cet anglicisme.
Soit le système linéaire :
ax + by = m,
cx + dy = n.
√
√
Je divise la première équation par un a2 + b2 et la seconde par c2 + d2 , pour obtenir
n1x x + n1y y = d1 , n2x x + n2y y = d2 .
Les coefficients satisfaisant maintenant aux relations n2ix + n2iy = 1, i = 1, 2, les vecteurs ni de
coordonnées {nix , niy } sont unitaires.
Le système linéaire ainsi écrit admet l’interprétation géométrique suivante. Chaque équation
est celle d’une droite Di du plan (x, y). La droite Di est perpendiculaire au vecteur ni ; la distance
de la droite à l’origine est di . La solution cherchée est représentée par le point d’intersection des
deux droites. Dans les cours élémentaires, on distingue trois cas : D1 confondue avec D2 (système
indéterminé ou infinité de solutions), D1 parallèle à D2 (système impossible), et le cas normal où
D1 coupe D2 .
Numériquement, il faut distinguer ici deux possibilités. Si D1 et D2 font entre elles un angle
notable, le point d’intersection est bien défini et la solution du système sera facile à trouver. Si
D1 et D2 se coupent sous un angle très faible, le système est dit «mal conditionné». Dans ce cas,
la moindre variation de l’un des di (les seconds membres) ou de l’un des nα,i (les coefficients,
α = x, y) entraînera un déplacement très important du point d’intersection. Autrement dit, la
solution est extrêmement sensible aux perturbations des coefficients ou des seconds membres. Un
déterminant très petit est une indication qu’un système est mal conditionné ; ce n’est pas une
condition nécessaire surtout lorsque le nombre de variables devient grand.
Je peux donner un aspect plus quantitatif aux considérations précédentes. J’admets qu’il existe
une norme vectorielle k x k et une norme matricielle k A k, cohérente avec la précédente (c’est-àdire que, pour tout x, k A k · k x k≥k Ax k). En plus du système (9.1), je considère un système
«perturbé» ; le second membre a subi une petite modification ∆b, ce qui a entraîné une petite
variation ∆x de la solution
A(x + ∆x) = b + ∆b
d’où ∆x = A−1 ∆b et :
k ∆x k≤k A−1 kk ∆b k .
J’en tire une majoration de la variation relative :
k ∆x k
k ∆b k
k ∆b k
=k A kk A−1 k
= cond(A)
.
kxk
kbk
kbk
Le nombre cond(A) = k A kk A−1 k est une mesure de la sensibilité de l’erreur relative (sur la
solution) aux variations du second membre.
Je montre maintenant que cond(A) représente aussi la sensibilité aux variations des coefficients
des premiers membres. Je considère un nouveau système perturbé
(A + δA)(x + δx) = b.
En retranchant membre à membre (9.1), je trouve
δx = −A−1 δA(x + δx),
99
9.2. Méthode de Gauss
ce qui implique l’inégalité
soit encore
k δx k≤k A−1 kk δA k (x + δx) k,
k δx k
k δA k
= cond(A)
.
k x + δx k
kAk
Il est souvent commode de considérer aussi (9.1) comme une application de Rn dans lui-même. Si
la matrice A est régulière, son «image» (l’ensemble des vecteurs Ax) est Rn lui-même ; quelque soit
le vecteur b, on pourra toujours trouver un x satisfaisant (9.1). Si, au contraire, A est singulière,
son image est un sous-ensemble de Rn . Deux possibilités se présentent alors. Si b n’appartient
pas à l’image de A, le système est impossible, puisqu’on ne pourra jamais trouver un vecteur x
convenable. Si b appartient à l’image de A, il y aura une infinité de solutions, car on pourra
toujours ajouter à une solution un vecteur y appartenant au noyau de A (l’ensemble des vecteurs
y tels que Ay = 0.
9.2
9.2.1
Méthode de Gauss
Exemple
Je vais traiter un exemple qui, mieux qu’un long discours, fera saisir l’esprit de la méthode
d’élimination de Gauss et son équivalence avec une factorisation de la matrice des coefficients. Il
s’agit du système

 


2
1
0
4
x1
2
 −4 −2

 

3
−7 
  x2  =  −9  = x.
Ax = 
(9.2)
 4
1
−2
8   x3   2 
0 −3 −12 −1
x4
2
Je vais procéder par éliminations successives en utilisant trois théorèmes bien connus d’algèbre
linéaire. La solution du système linéaire reste inchangée si :
* on multiplie une équation (une ligne de A et la coordonnée
correspondante de b) par une constante ;
* on ajoute une équation à une autre (une ligne de A à une autre
et la coordonnée correspondante de b à une autre) ;
* on permute deux équations (deux lignes de A et les coordonnées
correspondantes de b).
Je peux traiter A et b en parallèle ou construire une matrice A0 "augmentée" dont la n+1-ième
colonne est identique à b. J’indique entre parenthèses les instructions Scilab correspondantes.
Je commence par éliminer x1 . Pour cela :
je multiplie la ligne (1) par 2 et je l’ajoute à la ligne (2) (A(2,:) = A(2,:) + 2A(1,:);),
je multiplie la ligne (1) par -2 et je l’ajoute à la ligne (3) (A(3,:) = A(3,:) - 2A(1,:);).
Il vient :




2 1
0
4
2
 0 0


3
1 
 ; b(1) =  −5 
A(1) = 
 0 −1 −2


0
−2 
0 −3 −12 −1
2
On remarque que le multiplicateur relatif à la ligne i est −ai,1 /a11 ; a11 est appelé le "pivot" ; il
a intérêt à n’être pas nul ! Beaucoup d’auteurs emploient la convention opposée : ils multiplient
100
Chapitre 9. Résolution de systèmes d’équations linéaires
la ligne (1) par +ai,1 /a11 et la retranchent de la ligne (i) Le résultat est donné par la matrice
(1)
A(1) et le vecteur b(1) . Je dois maintenant éliminer x2 ; problème : le pivot correspondant (a22 )
est nul ! Mon élan parait devoir être brisé près du départ. Mais, heureusement, je peux permuter
les lignes (2) et (3)(temp = A(3,:); A(3,:) = A(2,:), A(2,:) = temp;) ; le nouveau pivot est
maintenant -1 ; j’ajoute -3 fois (2) à (4) pour trouver :




2 1
0
4
2

 0 −1 −2 0 

 ; b(3) =  −2 
A(3) = 

 0 0

3
1
5 
0 0 −6 −1
8
Finalement, en utilisant le pivot 3, j’ajoute 2 fois

2 1
0
 0 −1 −2
(4)
A =
 0 0
3
0 0
0
(3) à (4) :


4

0 
 ; b(4) = 


1
1

2
−2 

−5 
−2
La matrice A(4) , équivalente à A, a la forme «triangulaire supérieure». Elle rassemble les coefficients
d’un système triangulaire facile à résoudre par substitution à partir de la dernière ligne :
(4)
(3)
(2)
(1)
⇒ x4 = −2,
⇒ 3x3 − 2 = −5
⇒ x3 = −1,
⇒ −x2 − 2(−1) = −2
⇒ x2 = 4,
⇒ 2x1 + 4 + 4(−2) = 2 ⇒ x1 = 3.
Q (4)
Je gagne en prime la valeur de det A = (−1)p i aii , où p est le nombre de permutations de
lignes, ici 1, d’où det A = 6. Si l’un des éléments diagonaux de A(4) (l’un des pivots de l’élimination
de Gauss) est nul, le déterminant est nul ; réciproquement, si det A 6= 0, je suis assuré de trouver
des pivots non nuls (quitte à permuter des lignes).
9.2.2
Gauss-Jordan
Pour ceux qui auraient pris goût à l’élimination, je propose une variante. Plutôt que de substituer dans le système triangulaire, je poursuis l’élimination au-dessus de la diagonale principale :
c’est la méthode de Gauss-Jordan. Pour changer, je travaille sur la matrice augmentée A0 , réunion
de A et de b. J’ajoute (2) à (1) :


2 0 −2 4 0
 0 −1 −2 0 −2 
(5)

A0 = 
 0 0
3 1 −5 
0 0
0 1 −2
puis 2/3 de (3) à (1) et à (2) :
A0

(6)
2 0 0
 0 −1 0
=
 0 0 3
0 0 0
Pour finir, j’ajoute -14/3 (4) à (1), -2/3 (4) à (2) et

2 0
 0 −1
0 (8)
A
=
 0 0
0 0
14/3
2/3
1
1

−20/3
−16/3 

−5 
−2
-(4) à (3) ; il vient :

0 0 6
0 0 −2 

3 0 −3 
0 1 −2
écriture matricielle d’un système dont la résolution est immédiate.
101
9.2. Méthode de Gauss
9.2.3
Représentation matricielle de l’élimination
Multiplier la coordonnée 1 d’un vecteur par le coefficient m, puis ajouter le résultat à la coordonnée 2 revient à multiplier ce même vecteur par une matrice particulière :

 


1 0 0 0
b1
b1
 m 1 0 0   b2   mb1 + b2 


 

 0 0 1 0   b3  = 

b3
0 0 0 1
b4
b4
Plus généralement, pour ajouter m fois la ligne i à la ligne j, il suffit de disposer le nombre m à
la place de l’élément j, i de la matrice unité (i < j). Ce qui est vrai pour un vecteur l’est également
pour une matrice. La prémultiplication de A carrée quelconque par la matrice précédente revient
à multiplier successivement chaque colonne de A, donc à ajouter la première ligne de A à la
deuxième. Encore un exemple ; je veux ajouter -3 fois la 3-ième ligne à la 4-ième de la matrice
générale : -3 est en ligne 4, colonne 3 :



1 0 0 0
a11 a12 a13 a14
 0 1 0 0   a21 a22 a23 a24 



 0 0 1 0   a31 a32 a33 a34  =
0 0 −3 1
a41 a42 a43 a44


a11
a12
a13
a14


a21
a22
a23
a24




a31
a32
a33
a34
−3a31 + a41 −3a32 + a42 −3a33 + a43 −3a34 + a44
Les matrices qui viennent d’être définies (dites matrices de Frobenius) jouissent de propriétés
intéressantes. Si f (i, j, m) désigne la matrice de Frobenius contenant m en ligne i et colonne j, alors
f −1 = f (i, j, −m) : soustraire m fois la ligne i de la ligne j est bien l’opération inverse d’ajouter m
fois (i) à (j). f (i, j, m)f (i0 , j, m0 ) = f (i0 , j, m0 )f (i, j, m) contient m et m0 en colonne j, aux lignes i
et i’, ce qui représente bien le fait qu’ajouter un multiple de la ligne j aux lignes i et i0 sont des
actions indépendantes.
Dans l’exemple précédent, j’ai obtenu la matrice A(2) à partir de la matrice A(1) = A, en
utilisant deux multiplicateurs (2 et -2), ce qui peut s’écrire
A(2) = M1 A(1) ; b(2) = M1 b(1) ,
avec

1
 2
M1 = 
 −2
0

0 0 0
1 0 0 

0 1 0 
0 0 1
Je pose, en vue d’une utilisation future, L1 ≡ M−1
1 . Revenant à l’exemple, j’ai ensuite permuté les
lignes (2) et (3) pour faire apparaître un pivot non nul, ce que je représente par une prémultiplication par la matrice de permutation P :


1 0 0 0
 0 0 1 0 

P=
 0 1 0 0 
0 0 0 1
Cette matrice est symétrique et orthogonale : P−1 = PT = P et, par conséquent, P2 = I, ce qui
traduit le fait qu’échanger deux fois les mêmes lignes revient à ne rien faire. J’ai ensuite éliminé
102
Chapitre 9. Résolution de systèmes d’équations linéaires
x2 avec l’aide implicite de la matrice M2 .

1
 0
M2 = 
 0
0
0
1
0
−3
0
0
1
0

0
0 

0 
1
Je définis au passage son inverse, noté L2 ≡ M−1
2 .
Le système linéaire s’écrit maintenant : A(3) x = b(3) , avec A(3) = M2 PA(2) et b(3) = M2 Pb(1) .
Pour éliminer x3 , j’ai utilisé M3 :


1 0 0 0
 0 1 0 0 

M3 = 
 0 0 1 0 
0 0 2 1
La dernière forme du système s’écrit : A(4) x = b(4) . Je pose encore A(3) = L3 A(4) et b(3) = L3 b(4) .
En résumé, en ce qui concerne le tableau des coefficients, j’ai
A(4) = M3 A(3) = M3 M2 PA(2) = M3 M2 PM1 A(1)
Le vecteur b a subi les mêmes transformations, résumées par :
b(4) = M3 M2 PM1 b(1) .
Ces formules résument bien la «triangularisation» du système, mais c’est la relation inverse qui
est vraiment intéressante. Pour le voir, j’introduis les notations U = A(4) et c = b(4) (le système
linéaire est donc équivalent à : Ux = c). Je calcule ensuite
A = A(1) = L1 PL2 L3 A(4) = L1 PL2 L3 U.
ˆ ≡ L1 PL2 L3 , je mets la matrice de départ sous la forme A = LU
ˆ : c’est un produit
Si je pose L
de facteurs, dont l’un est triangulaire supérieur (U) ; malheureusement, à cause du facteur P, la
ˆ n’a pas de forme simple. Pour obtenir un résultat plus élégant, je commence par définir
matrice L
0
L1 ≡ PL1 PT ; cette nouvelle matrice s’obtient en permutant les lignes (2) et (3) de L1 (prémultiplication par P) et en permutant les colonnes (2) et (3) de la matrice obtenue (postmultiplication
par PT ; le résultat s’écrit :


1 0 0 0
 2 1 0 0 

L01 = 
 −2 0 1 0 
0 0 0 1
Comme vous le constatez, L01 est à nouveau triangulaire inférieure : la perturbation apportée par
P a été «absorbée» dans L01 . Je définis ensuite L = L01 L2 L3 :




1 0 0 0
1 0 0 0
1 0 0 0
 2 1 0 0  0 1 0 0  0 1 0 0 



L=
 −2 0 1 0   0 0 1 0   0 0 1 0 
0 0 0 1
0 3 0 1
0 0 −2 1
Le calcul explicite donne

1
 2

L=
−2
0
0
1
0
3
103
0
0
1
−2

0
0 

0 
1
9.2. Méthode de Gauss
Il suffit de recopier à leurs places dans L les éléments sous la diagonale des facteurs L01 , L2 et L3 ,
comme pour les matrices élémentaires de Frobenius. Je forme ensuite le produit LU :
LU = L01 L2 L3 A(4) = L01 L2 A(3) = L01 PA(2) = PL1 A(2) = PA(1) = PA.
La matrice PA a été décomposée en un produit de deux facteurs, l’un (L, lower) triangulaire
inférieur, avec des éléments diagonaux égaux à un, l’autre (U, upper) triangulaire supérieur. Vous
pouvez aussi effectuer numériquement le produit LU pour vous convaincre du résultat (matrice de
départ sauf permutation des lignes (2) et (3)).
Pour trouver la solution de (9.1), il suffit maintenant de résoudre successivement deux systèmes
triangulaires. D’abord
L0 y = Pb,
dont la solution est le vecteur y, puis
Ux = y
dont la solution est le vecteur x cherché. Vous pourrez vérifier que y = b(4) .
D’autre part, j’ai toujours sous la main le déterminant de A :
Y
(−1)p det(A) = det(PA) = det(LU) = det(L) det(U) =
uii .
i
9.2.4
Généralisation
L’exemple précédent se généralise sans difficulté au cas où A est une matrice carrée, régulière,
n × n. On peut démontrer l’existence et l’unicité de la factorisation. Je me contente de démontrer,
par l’absurde, cette dernière propriété. Supposons qu’il existe deux décompositions d’une même
matrice régulière :
A = L1 U1 = L2 U2 ,
d’où :
−1
X = L−1
2 L1 = U2 U1
Or, l’inverse d’une matrice triangulaire inférieure (supérieure) est elle-même triangulaire inférieure
(supérieure). Le produit de deux matrices triangulaires inférieures est une matrice de même forme ;
de même, le produit de deux matrices triangulaires supérieures est encore triangulaire supérieur.
X, qui doit réunir ces deux propriétés, ne peut être que la matrice unité, ce qui entraîne L1 = L2
et U1 = U2 .
9.2.5
Mise en oeuvre pratique
Si la matrice A est régulière, je suis assuré de toujours pouvoir trouver un pivot non nul :
l’élimination de Gauss est toujours possible en théorie. On montre qu’elle est encore utile pour des
matrices de rang < n ou pour des matrices rectangulaires. Je n’aborderais pas ces points ici.
Les calculs réels sont en fait entachés d’erreurs d’arrondi. Ceci a pour conséquence que le
résultat final dépendra fortement du choix des pivots (ou encore de l’ordre des variables éliminées).
On peut voir en gros ce qui se passe. Je suppose que les variables x1 , x2 , . . . , xk−1 ont été éliminées.
Pour éliminer l’inconnue xk , je multiplie la ligne k par aik /akk . Si le pivot akk est petit, toutes les
erreurs qui affectent les coefficients aik seront amplifiées. En conséquence, on adopte toujours la
stratégie de «recherche du pivot partiel» ; pour éliminer la variable xk et quelque soit la valeur de
|akk |, on recherche l’élément de plus grand module dans la colonne k et c’est lui que l’on prendra
comme pivot effectif, après avoir fait la permutation de lignes nécessaire.
Certains auteurs recommandent la stratégie de la recherche complète du pivot maximal («pivot
total»). Pour éliminer xk , on cherche pour i ≥ k et pour j ≥ k l’élément aij de plus grand
module. On l’amène en position de pivot par des permutations de lignes et de colonnes. Permuter
104
Chapitre 9. Résolution de systèmes d’équations linéaires
les colonnes n’est pas neutre, c’est équivalent à permuter les inconnues. Il faut donc garder trace
des ces permutations pour restaurer l’ordre initial à la fin. La programmation est un peu plus
compliquée. Il semble par ailleurs que l’analyse précise des erreurs d’arrondi ne démontre pas une
supériorité nette de la recherche globale sur la recherche partielle.
Les erreurs d’arrondi sont plus faibles si les éléments des matrices successives restent à peu près
du même ordre de grandeur. Pour cela, on peut, avant de résoudre le système, multiplier certaines
lignes par des facteurs tels que le plus grand coefficient de chaque ligne soit compris entre 0,5 et 1
(équilibrage).
Le décompte détaillé des opérations arithmétiques nécessaires fait apparaître le résultat suivant :
factorisation
substitution
n(n − 1/2)(n − 1)/3
n(n − 1)/2
n(n − 1)/2
n
additions et multiplications
divisions
additions et multiplications
divisions
Vous retiendrez les valeurs asymptotiques : pour l’élimination : O(n3 /3) opérations et pour la
résolution du système linéaire : O(n2 ) opérations.
L’algorithme de Gauss est assez économe en mémoire, si l’on accepte de détruire A. En effet,
à chaque étape, je range les éléments de L à la place que devraient occuper les zéros de A après
élimination (dans le triangle inférieur). Les 1 de la diagonale de L sont sous-entendus. Le triangle
supérieur de A est progressivement occupé par les éléments de U.
9.2.6
Calcul de l’inverse de A
Pour certaines applications, il faut calculer A−1 = X explicitement, soit encore trouver X telle
que AX = I. La colonne j de X est solution du système linéaire :
Axj = ej .
Je vais avoir à résoudre n systèmes linéaires dont les premiers membres sont identiques, mais
les seconds membres différents. Il est commode d’utiliser la décomposition PA = LU effectuée une
seule fois, puis de résoudre les systèmes triangulaires Lyj = Pej puis Uxj = yj . On sait que les
coordonnées de yj sont nulles jusqu’à un certain rang, ce qui permet de gagner un peu de temps.
Le nombre d’opérations nécessaires est O(n3 ), pas plus que pour calculer A2 mais trois fois plus
que pour résoudre un système linéaire de même n.
9.3
Factorisation directe
Je sais que la matrice régulière A admet une représentation sous forme d’un produit de matrices
triangulaires LU. Je peux alors me poser la question suivante : est-il possible de trouver les éléments
de L et U sans utiliser l’algorithme de Gauss ? La réponse est affirmative et c’est même assez
simple. Cependant, comme la décomposition LU est unique, ce nouvel algorithme est certainement
équivalent à celui de Gauss.
Soient `i,j les éléments de L, avec `i,j = 0 si i < j ; de même, les éléments de U sont tels que
ui,j = 0 si i > j ; enfin `i,i = 1. Je procéderai par identification.
a11 =
X
`1k uk1 = `11 u11 = u11 ,
X
a12 =
`1k uk2 = u12 ,
a1n =
X
......................
`1k ukn = u1n .
105
9.3. Factorisation directe
En utilisant la première ligne de A, j’ai trouvé la première ligne de U. L’astuce pour continuer
(due à Crout, d’où le nom de l’algorithme), consiste à identifier maintenant la première colonne de
A.
X
a21 =
`2k uk1 = `21 u11 + `22 u21 ⇒ `21 = a21 /u11
X
a31 =
`3k uk1 = `31 u11 + `32 u21 + `33 u31 ⇒ `31 = a31 /u11
................
Je détermine ainsi la première colonne de L. Vous pouvez imaginer que la deuxième ligne de U
s’obtient à partir de la deuxième ligne de A, puis que la deuxième colonne de L découle de la
deuxième colonne de A, etc... Les formules générales s’écrivent :
uij = aij −
i−1
X
`ik ukj ; j = i, i + 1, ...n;
k=1
`i,j
"
#
j−1
X
1
=
aij −
`ik ukj ; i = j + 1, j + 2, ...n
ujj
(9.3)
k=1
(9.4)
avec toujours `ii = 1. Il y a une petite difficulté : cet algorithme est très sensible aux erreurs
d’arrondis, et ne fonctionnera pas sans recherche du pivot maximal dans chaque colonne. D’autre
part, en général, je forme la décomposition LU pour résoudre un système linéaire ; ici, je n’ai
permuté que les lignes de A et non celles de b (qui n’apparaît pas) ; il faut donc garder trace des
permutations pour pouvoir retrouver les inconnues par la suite.
On rencontre fréquemment deux cas particuliers. La premier est celui d’une matrice définie
positive, le second celui d’une matrice tridiagonale. Je vais les examiner brièvement.
9.3.1
Matrice tridiagonale
Soit A une matrice tridiagonale ; Je pose ai,i−1 = xi , ai,i = yi et ai,i+1 = zi . J’admets en plus
que A possède une décomposition LU sans permutation de lignes. Par identification, on vérifie que
L et U sont bidiagonales :


y1 z1
0
...
...
0
 x2 y2 z2
0
...
0 


 0 ... ... ...
...
0 

=
 0 . . . 0 xn−1 yn−1 zn−1 
0 ... ...
0
xn
yn



1 0
0
... 0
d1 u1 0
...
0
 l2 1

0
... 0 
...
0 

  0 d2 u2

 0 ...


1
... 0  0 ... ... ...
0 


 0 . . . ln−1 1 0   0 . . . 0 dn−1 un−1 
0 ...
0
ln 1
0 ... 0
0
dn
Vous prouverez sans peine les relations suivantes :
y1 = d1
;
; z1 = u1
yi = li ui−1 + di
;
;
xi = li di−1 ;
; zi = ui .
Vous pourrez finalement établir les formules très simples de résolution d’un système linéaire dont
les coefficients seraient les xi , yi , zi . Dans le cas où l’on doit pratiquer une recherche du pivot
106
Chapitre 9. Résolution de systèmes d’équations linéaires
partiel, le pivot de l’étape k se trouve nécessairement dans l’une des lignes k ou k + 1 (matrice
tridiagonale). Il en résulte une décomposition PA = LU, où L est toujours bidiagonale inférieure,
alors que U est tridiagonale supérieure.
Une matrice n × n tridiagonale possède au plus 3n − 2 éléments non nuls, qui représentent, si
n est grand, une petite fraction des n2 éléments théoriques. Il est recommendé d’économiser de
la mémoire en rangeant ces éléments dans trois tableaux à une dimension. La discrétisation des
équations aux dérivées partielles fait souvent apparaître des matrices dites «creuses» comportant
très peu d’éléments différents de zéro. Il existe des programmes spécialisés pour les manipuler sans
encombrer la mémoire.
9.3.2
Matrice symétrique définie positive
Si A est symétrique, sa décomposition s’écrit : A = LLT . Je suppose en plus que A est
définie positive. Je rappelle deux définitions équivalentes : xT Ax > 0 quelque soit le vecteur
x ; toutes les sous-matrices principales ont des déterminants positifs). On montre alors que les
pivots de l’élimination de Gauss sont strictement positifs et donc que la factorisation LLT se
fait sans permutation (décomposition régulière de Cholesky). On détermine les éléments de L
(`ij = 0sij > i) par identification :
`211 = a11 > 0,
`11 `21 = a21 ,
2
`21 + `222 = a22
.......................
"
#
j−1
X
1
`i,j =
`ik `jk ,
aij −
`jj
k=1
#
"
j−1
X
1
`ik `jk
aij −
`i,j =
`jj
k=1
9.3.3
Variantes
J’ai montré que la matrice régulière A admet la factorisation LU en un produit de matrices
triangulaires, inférieure pour L à diagonale unitaire, supérieure pour U. Cette répartition des rôles
n’est pas la seule possible. On peut concevoir la décomposition A = L0 U0 où U0 est maintenant
triangulaire à diagonale unitaire, L0 étant simplement triangulaire ; un algorithme du à Doolittle
et très voisin des précédents permet d’obtenir L0 et U0 .
Plutôt que de favoriser l’un des facteurs grâce à la possession d’une diagonale unitaire, on peut
imposer que chaque facteur triangulaire présente des éléments diagonaux égaux à 1. On a alors :
A = LDU ,
`ii = uii = 1
où D est une matrice diagonale. Dans le cas particulier où A est symétrique, il vient :
A = LDLT
9.4
Méthodes itératives de résolution des systèmes linéaires
Les très grands systèmes linéaires posent un problème pratique : il peut être impossible de
caser en mémoire centrale l’ensemble des coefficients. D’autre part, on rencontre, surtout lorsque le
système linéaire provient de la discrétisation d’une équation aux dérivées partielles, une structure
particulière des coefficients : les éléments diagonaux sont plus grands que tous les autres. Dans
ces cas là, on peut utiliser avec profit des méthodes itératives de résolution, beaucoup moins
gourmandes en mémoire et plus rapides.
107
9.4. Méthodes itératives de résolution des systèmes linéaires
9.4.1
Méthode de Jacobi
Je cherche la solution de (9.1), avec aii 6= 0, 1 ≤ i ≤ n, en connaissant une approximation de
la solution : x[0] . Je vais utiliser une méthode d’approximations successives en traitant de façon
équivalente chaque coordonnée de x :
X
1
[k−1]
[k]
aij xj
) ; 1 ≤ i ≤ n.
(9.5)
xi =
(bi −
aii
j6=i
[k]
Le calcul de xi n’utilise que la ligne i de A : cette matrice peut donc être rangée sur disque et
lue à la demande.
Comme pour toute méthode d’itération, je dois me préoccuper d’un critère d’arrêt. On rencontre
couramment l’une des deux définitions classiques suivantes. Je définis le «résiduel» à l’itération k :
r[k] = b − Ax[k] .
Je peux choisir la condition de convergence
k r[k] k≤ ² k b k
, ² étant un seuil fixé à l’avance ou la condition :
k x[k] − x[k−1] k≤ ² k x[k−1] k .
L’algorithme (9.5) admet une représentation matricielle commode pour les analyses théoriques.
Je décompose A en une somme de trois matrices (rien à voir avec les L et U des paragraphes
précédents) :
A=D−L−U
où D est diagonale, E strictement triangulaire inférieure et F strictement triangulaire supérieure
(j’ai donc aii = dii ), `ii = uii = 0). J’introduis le vecteur δx[k] ≡ x[k+1] − x[k] . En utilisant les
relations de récurrence et la définition du vecteur résiduel, vous montrerez facilement que :
δx[k] = D−1 r[k]
d’où :
x[k+1] = D−1 (L + U)x[k] + D−1 b.
Exemple
Étant donné le système linéaire ci-dessous et le vecteur initial [0, 0]T :
3x + y = 2
−x + 2y = −2
ou
x = (1/3)(2 − y)
1
y = (x − 2)
2
je trouve la suite de solutions approchées suivante :
x
y
2/3
1
−1 −2/3
8/9
−1/2
5/6
−5/9
23/27
−7/12
31/36 139/162
−31/54 −41/72
qui converge effectivement mais lentement vers la solution exacte [6/7, −4/7]T .
108
Chapitre 9. Résolution de systèmes d’équations linéaires
un programme Scilab
Le code suivant résoud un système linéaire par la méthode itérative de Jacobi. La matrice des
coefficients est presque aléatoire, mais j’ai ajouté 2 à chaque élément diagonal pour être sûr de la
convergence ; le vecteur des seconds membres est arbiraire.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// méthode de J a c o b i pour l e s s y s t e m e s l i n e a i r e s
s e u i l = 1 e −6; nitmax = 1 0 0 ;
n = 36;
// c o n s t r u c t i o n d ’ une m a t r i c e A a d i a g o n a l e dominante
A = rand ( n , n ) −0.5∗ ones ( n , n ) + 2∗ eye ( n , n ) ;
d = diag (A ) ;
// c o n s t r u c t i o n d e s s e c o n d membres ;
b = sin ( ( 1 : n)∗% p i /n ) ’ ;
// i n i t i a l i s a t i o n
x = ones (n , 1 ) ;
// r e s o l u t i o n
f o r i t = 1 : nitmax
s = b − A∗x ;
y = x + s ./d ;
i f max( abs ( y−x ) ) < s e u i l , break , end
x = y;
end
// a f f i c h a g e
x’
(A∗x − b ) ’
À chaque tour dans la boucle, x contient l’ancienne valeur x[n] et y contient la nouvelle valeur x[n+1]
Pn
[n]
du vecteur inconnu. Plutôt que d’utiliser directement (9.5), il est commode de calculer 1 ai,j xj
(une composante du produit Ax), qui contient un terme de trop et de compenser après (lignes 13
et 14).
La méthode de Jacobi converge lentement, mais je peux facilement modifier cet algorithme pour
le rendre plus rapide.
9.4.2
Méthode de Gauss-Seidel
[k+1]
[k]
[k]
L’algorithme de Jacobi me prescrit de calculer xi
en utilisant les valeurs x1 , x2 , . . .,
[k]
[k]
[k]
xi−1 , xi+1 , ...xn ; il semble que je pourrais gagner du temps ou de la précision, puisque je connais
[k+1]
[k+1]
[k+1]
déjà x1
, x2
, . . . , xi−1 , qui sont plus précises que les valeurs des mêmes variables à l’itération
précédente (k). C’est ce que fait l’algorithme de Gauss-Seidel. Les relations de récurrence s’écrivent :


i−1
n
X
X
1
[k+1]
[k]
bi −
xk+1
=
(9.6)
aij xj
−
aij xj 
i
aii
j=1
j=i+1
Ces équations sont peut-être plus faciles à programmer que celles qui découlent de la méthode de
[k]
Jacobi. En effet, il n’est pas nécessaire de conserver l’ensemble des valeurs xi pendant le calcul
[k+1]
des xi
: chaque nouvelle valeur remplace la précédente.
Je vous laisse le soin de montrer que l’équivalent matriciel de ces formules est :
x[k+1] = (D − L)−1 Ux[k] + (D − L)−1 b.
Exemple
Appliquant l’algorithme de Gauss-Seidel à l’exemple du paragraphe précédent, je trouve la suite
de valeurs :
109
9.4. Méthodes itératives de résolution des systèmes linéaires
x
y
2/3
-2/3
8/9
-5/9
23/27
-31/54
139/162
-185/324
Certains de ces nombres sont apparus lors du calcul précédent ; on observe toutefois que la convergence est beaucoup plus rapide.
une version en Scilab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// méthode de Gauss−S e i d e l pour l e s s y s t e m e s l i n e a i r e s
s e u i l = 1 e −6; nitmax = 3 0 ;
n = 16;
// c o n s t r u c t i o n d ’ une m a t r i c e A a d i a g o n a l e dominante
A = rand ( n , n ) −0.5∗ o n e s ( n , n ) + 2∗ eye ( n , n ) ;
d = d i a g (A ) ;
// c o n s t r u c t i o n d e s s e c o n d membres ;
b = s i n ( ( 1 : n)∗% p i /n ) ’ ;
// i n i t i a l i s a t i o n
x = ones (n , 1 ) ;
// r e s o l u t i o n
f o r i t = 1 : nitmax
for i = 1:n
s = A( i , : ) ∗ x ;
x ( i ) = x ( i ) + ( b ( i ) − s ) /A( i , i ) ;
end
i f max( abs ( y−x ) ) < s e u i l , break , end
y = x; it
end
x
A∗x − b
9.4.3
Méthode de surrelaxation
Cette variante de l’algorithme de Gauss-Seidel (elle peut utiliser Jacobi aussi, mais sans avanˆ [k+1] à
tage) procède comme suit. Connaissant un vecteur x[k] , je calcule un vecteur provisoire x
[k+1]
l’aide de l’algorithme (9.6), puis je définis le vecteur x
définitif comme :
x[k+1] = ωˆ
x[k+1] + (1 − ω)x[k] .
(9.7)
ω est un paramètre réel dont il faut optimiser la valeur pour chaque classe de problème. Le choix
ω = 1 me ramène à (9.6). On a toujours ω < 2, et l’expérience montre que la meilleure valeur de
ω est voisine de 1,7.
En Scilab
1
2
3
4
5
6
7
8
9
10
11
// méthode de s u r r e l a x a t i o n pour l e s s y s t e m e s l i n e a i r e s
s e u i l = 1 e −6; nitmax = 3 0 ;
n = 1 6 ; omg = 1 . 0 5 ;
// c o n s t r u c t i o n d ’ une m a t r i c e A a d i a g o n a l e dominante
A = rand ( n , n ) −0.5∗ ones ( n , n ) + 2∗ eye ( n , n ) ;
d = diag (A ) ;
// c o n s t r u c t i o n d e s s e c o n d membres ;
b = sin ( ( 1 : n)∗% p i /n ) ’ ;
// i n i t i a l i s a t i o n
x = ones (n , 1 ) ;
y = x;
110
Chapitre 9. Résolution de systèmes d’équations linéaires
12
13
14
15
16
17
18
19
20
21
22
// r e s o l u t i o n
f o r i t = 1 : nitmax
for i = 1:n
s = A( i , : ) ∗ x ;
x ( i ) = x ( i ) + omg ∗ ( b ( i ) − s ) /A( i , i ) ;
end
i f max( abs ( y−x ) ) < s e u i l , break , end
y = x; it
end
x
A∗x − b
111
Chapitre 10
Éléments propres
10.1
Introduction
Du point de vue théorique, le problème de la détermination des vecteurs propres et valeurs
propres d’une matrice est presque aussi bien connu que la résolution des systèmes linéaires. La
physique fournit un grand nombre de problèmes équivalents à la diagonalisation d’une matrice
symétrique ou hermitique. Je me limiterai essentiellement au cas des matrices réelles symétriques.
Je rappelle quelques propriétés des éléments propres d’une telle matrice.
J’appelle valeurs propres de la matrice carrée symétrique A les solutions de l’équation en λ :
det(A − λI) = 0
si I est la matrice identité. Si A et I sont de taille n × n, les valeurs propres sont donc solutions
de l’équation polynômiale de degré n :
(−1)n (λn − Cn−1 λn−1 + · · · − C1 λ − C0 ) = 0
appelée équation (ou polynôme) caractéristique. Dans le cas d’une matrice symétrique n × n,
l’équation (2) admet n racines réelles, distinctes ou non. Un certain nombre de méthodes anciennes
(Leverrier, Krylov) forment le polynôme caractéristique et déterminent ses zéros. Ces méthodes
sont abandonnées, car, en l’absence d’hypothèses supplémentaires sur A, elles sont lentes (calcul
des Ci ) et instables (recherche des racines). Par contre, ces deux opérations sont rapides pour
une matrice tridiagonale. Vous verrez que l’une des méthodes les plus performantes consiste à
«tridiagonaliser» A en conservant ses éléments propres, puis à calculer les racines de son polynôme
caractéristique.
Étant donné une matrice M orthogonale, je dis que la matrice A0 est semblable à A si A0 =
T
M AM . On a le théorème : A0 et A ont mêmes valeurs propres.
Le vecteur propre u associé à la valeur propre λ est défini par la relation :
Au = λu
Dans le cas particulier d’une matrice symétrique, les vecteurs propres (au nombre de n) peuvent
être choisis comme orthonormés : ils forment une base complète. Soit U la matrice dont les colonnes
sont les vecteurs propres. Les lectrices vérifieront sans peine que l’ensemble des n équations du type
(3) peut s’écrire :
AU = U Λ
si Λ désigne une matrice diagonale dont les seuls éléments non nuls sont les valeurs propres. De
par sa définition, U est orthogonale, U T = U −1 . En effet, l’élément i, j du produit U T U est le
produit scalaire de la ligne i de U T , soit le vecteur ligne uTi , par la colonne j de U , soit uj . Comme
112
Chapitre 10. Éléments propres
les vecteurs propres sont orthonormés, j’ai (U T U )i,j = δi,j ; autrement dit, ce produit de matrices
se réduit à la matrice unité. Finalement :
Λ = U T AU
ce qui traduit le théorème suivant. Une matrice symétrique peut toujours être diagonalisée au
moyen d’une similitude ; la matrice de transformation est orthogonale et ses colonnes forment un
jeu complet de vecteurs propres.
10.2
Méthode de la puissance n-ième et méthodes dérivées
10.2.1
Puissance n-ième
Il arrive parfois que l’on recherche uniquement la plus grande des valeurs propres. La méthode
de la puissance n-ième répond bien à ce besoin. L’algorithme est très simple. Ayant fait choix d’un
vecteur initial x(0) , je forme par récurrence :
x(n) = Axn−1 = An x(0) .
Le vecteur x(n) tend vers le vecteur propre associé à la plus grande valeur propre (en module) ;
(n)
(n−1)
appelons-la λ1 . Le rapport de deux composantes homologues de x(n) et x(n−1) , soit xk /xk
,
tend vers λ1 . La démonstration est facile dans le cas d’une matrice symétrique, bien que la méthode
qui vient d’être exposée soit plus générale. Soient u(i) , λi les éléments propres de A. Je peux
développer x(0) sur la base des u(i) :
X
x(0) =
ci u(i)
i
Appliquons A :
x(1) = Ax(0) =
X
ci Au(i) =
i
X
ci λi u(i)
i
puis A2 :
x(2) = Ax(1) =
X
ci λ2i u(i) .
i
Il est facile d’écrire le cas général si l’on se souvient de ce que Ak admet les mêmes vecteurs propres
que A et les λki comme valeurs propres :
X
X
(k)
ci (λi /λ1 )k u(i) .
x(k) =
ci λki u(i) = λk1 c1 u(1) + λ1
i=2
i
Comme λi /λ1 < 1, la propriété est démontrée.
Exemple.
Cherchons la plus grande valeur propre de
·
A=
2
1
1
2
¸
à partir du vecteur [1, 0]T . La suite des vecteurs itérés et les valeurs approchées de la valeur propre,
calculées à partir de la deuxième composante, sont :
k
x(k)
λ(k)
1
2
1
2
5
4
2,5
3
14
13
2,8
113
4
41
40
2,93
5
122
121
2,98
6
365
364
2,99
10.2. Méthode de la puissance n-ième et méthodes dérivées
Le programme ci-desous
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// p u i s s a n c e n−ième
A = [1 ,2;3 ,1];
u = [ −1;0.1];
xset ( "window" , 0 ) , xbasc ( 0 )
xsetech ( [ 0 , 0 , 1 , 1 ] , [ − 1 . 1 , − 1 . 1 , 0 . 1 5 , 0 . 1 5 ] )
plot2d ( 0 , 0 , s t y l e = −1, f r a m e f l a g =0)
xarrows ( [ 0 , u ( 1 ) ] , [ 0 , u ( 2 ) ] , 0 . 0 5 )
xstring ( u ( 1 ) , u ( 2 ) − 0 . 1 , s t r i n g ( 0 ) )
for i = 1 : 8
u = A∗u ;
c o e f = max( abs ( u ) )
u = u/ c o e f
xarrows ( [ 0 , u ( 1 ) ] , [ 0 , u ( 2 ) ] , 0 . 0 5 , i +1)
xstring ( u ( 1 ) , u ( 2 ) − 0 . 1 , s t r i n g ( i ) )
end
a produit une représentation graphique de ces calculs Comme le montre l’exemple, il arrive que
Fig. 10.1 – Recherche d’un vecteur propre par la méthode de la puissance n-ième
1.2
45
3
1.0
2
0.8
0.6
1
0.4
0.2
0
0.0
−0.2
−0.2
0.0
0.2
0.4
0.6
0.8
1.0
1.2
certaines composantes de u(i) deviennent très grandes (ou très petites) au cours du calcul. Pour
(i)
éviter tout problème de dépassement de capacité, on normalise x(i) de telle façon que supm |xm | =
(i+1)
1, avant de calculer x
(normalisation au sens de la norme infinie). Le facteur de normalisation
est alors l’approximation de la valeur propre. Le
10.2.2
Puissance n-ième avec décalage
La rapidité de convergence de l’algorithme précédent dépend des rapports λi /λ1 . La convergence
sera lente s’il existe une autre valeur propre proche de λ1 . Il est possible d’accélérer la convergence,
en augmentant les différences entre valeurs propres. Il suffit de remarquer que A et A0 = A − sI
ont mêmes vecteurs propres (ces matrices commutent) et que leurs valeurs propres diffèrent par
une translation. Si u et λ sont éléments propres de A, alors :
(A − sI)u = Au − sIu = (λ − s)u
Ce procédé est utile dans le cas λ1 ∼
= −λ2 ; après changement d’origine, λ01 pourra être très différent
0
de λ2 .
114
Chapitre 10. Éléments propres
10.2.3
Puissance n-ième de l’inverse
Je peux, en principe, obtenir une estimation de la plus petite valeur propre de A, en module,
en multipliant n fois le vecteur x(0) par la matrice A−1 . Je vous laisse les lecteurs démontrer ce
résultat. Dans la pratique, on ne calcule pas x(n) = A−1 x(n−1) , mais on résout le système linéaire
Ax(n) = x(n−1) , ce que l’on peut faire rapidement en formant une fois pour toute la décomposition
LU de A. Cette méthode a pour mérite principal de servir d’introduction à l’algorithme suivant,
plus utile.
10.2.4
Puissance n-ième de l’inverse avec décalage
Considérons la matrice B = (A − sI)−1 ; quels sont ses éléments propres ? Si s ne coïncide
pas avec l’une des valeurs propres de A, B est régulière et commute avec A. Elle admet donc les
mêmes vecteurs propres. Soit u l’un de ces vecteurs ; il obéit à la relation Au = λu, ou encore
u = λA−1 u, ce qui montre que 1/λ est valeur propre de A−1 ; en combinant ce résultat avec les
propriétés de A − sI, je vois que 1/(λ − s) est valeur propre de B. Étant donné un vecteur initial
x(0) , je forme par récurrence :
x(k) = Bx(k−1) = B k x(0) = (A − sI)−k x(0) .
Développons x(0) selon les vecteurs propres de A, en appelant λm la valeur propre la plus proche
de s :


X
X µ λm − s ¶k
c
c
i
m
um +
x(k) =
u =
ci
ui 
k i
k
(λ
−
s)
(λ
−
s)
λ
−
s
i
m
i
i
i6=m
(k)
Comme |λm − s| < |λi − s|, le vecteur x
converge vers un vecteur proportionnel à u(m) . Ici
encore, il ne faut pas calculer les inverses des matrices, mais résoudre des systèmes linéaires,
comme (A − sI)x(k) = x(k−1) .
Cet algorithme peut me permettre de calculer toutes les valeurs propres de A. Il suffit de
balayer, à l’aide du paramètre s, l’intervalle où doivent se trouver les valeurs propres. Pour chaque
valeur de s, l’itération sur x converge vers le vecteur propre appartenant à la valeur propre la plus
proche de s ; par ailleurs, le rapport de deux coordonnées permet le calcul de cette valeur propre :
(k)
(k−1)
xj /xj
= 1/(λj − s).
En fait, la méthode s’avère peu pratique pour la recherche systématique des valeurs propres ;
elle est au contraire très commode pour déterminer les vecteurs propres, connaissant des valeurs
approchées des λi . Supposons en effet qu’une autre méthode, différente, m’ait fourni un nombre
λ0 , valeur approchée au millième de λm . Si je choisis s = λ0 , l’algorithme précédent va converger
en quelques itérations vers le vecteur propre associé à λm , à condition que toutes les autres valeurs
propres diffèrent de λm par plus de quelques millièmes.
Exemple. Au §2.1, j’ai trouvé une valeur approchée de la plus grande valeur propre d’une matrice
A, soit s = 2, 99. Cherchons le vecteur propre correspondant à partir de x(0) = (1, 0)T . Il me faut
résoudre le système :
−1, 01u + v = 1,
u − 1, 01v = 0,
dont la solution est [−50, 2487; −49, 7512]T ou [1; 0, 990099]T après normalisation. Une autre itération donnerait le vecteur [1; 0, 99995]T exact à 5 10−5 près.
10.3
Méthode de Jacobi
Contrairement aux algorithmes précédents, la méthode de Jacobi permet le calcul de tous les
éléments propres simultanément. Il s’agit d’effectuer une série de similitudes qui vont amener la
matrice carrée symétrique A progressivement à la forme diagonale, tout en préservant ses valeurs
propres.
115
10.3. Méthode de Jacobi
10.3.1
Principe
Le principe de la méthode est facile à comprendre sur le cas à deux dimensions, et c’est par là
que je commence. Soit la matrice :
·
¸
a11 a12
A=
a12 a22
que je souhaite diagonaliser par une similitude A0 = RT AR, où R est une matrice orthogonale
qui s’écrit :
·
¸ ·
¸
cos α sin α
c s
R=
=
.
− sin α cos α
−s c
Un calcul élémentaire montre que :
·
a11 c2 − 2a12 sc + a22 s2
A0 =
a12 (c2 − s2 ) + (a22 − a11 )cs
a12 (c2 − s2 ) + (a22 − a11 )cs
a11 s2 + 2a12 cs + a22 c2
¸
.
Je peux alors diagonaliser A en choisissant α selon la relation :
tg2α = 2a12 /(a22 − a11 ).
Ces petits calculs admettent une interprétation géométrique simple. Soit x = (x1 , x2 ) un vecteur
de <2 ; à la matrice A, j’associe la forme quadratique xT Ax et l’équation :
xT Ax = 1 = a11 x21 + (a12 + a21 )x1 x2 + a22 x22
qui représente une conique ; je suppose, pour fixer les idées, que cette courbe est une ellipse.
J’effectue maintenant le changement de repère défini par :
x = Ry.
Il s’agit d’une rotation des axes d’angle α. Je fais le changement de variables dans l’équation de
l’ellipse :
(Ry)T ARy = yRT ARy = yA0 y = 1
La nouvelle équation de la conique est définie par la nouvelle matrice. Si A0 est diagonale parce
que j’ai fait un bon choix pour α, l’équation s’écrit :
a011 y12 + a022 y22 = 1.
Une rotation de −π/3 amène les axes rouges sur les axes bleus. On dit que la conique «a été
ramenée à ses axes principaux» ; les axes principaux sont aussi les axes de symétrie de l’ellipse.
Les termes «croisés» ou «rectangles» ont disparu de l’équation. La généralisation de ce procédé à
n dimensions constitue l’algorithme de Jacobi.
10.3.2
Méthode de Jacobi
Je vais appliquer à la matrice A une suite de similitudes A → A(1) 1 → A(2) 2 → · · · →
A , avec A(i) = Ri−1 A(i−1) Ri de telle manière que A(n) tende vers une matrice diagonale D
d’éléments diagonaux λi . Il est facile de comprendre pourquoi la diagonalisation n’est qu’approchée. A l’aide d’une rotation des axes du plan (x1 , x2 ), je peux annuler l’élément a12 comme au
paragraphe précédent. Mais, lorsque que j’applique une nouvelle similitude pour faire disparaître
a13 , tous les éléments de la ligne 1, en particulier le zéro que je viens de créer en a12 , sont modifiés.
Ce n’est que progressivement que la "substance" de la matrice va se concentrer sur la diagonale. A
(n)
116
Chapitre 10. Éléments propres
Fig. 10.2 – Une ellipse, avec un repère quelconque en rouge et les axes principaux en bleu
x2
y2
x1
y1
est symétrique, réelle. Le passage de A(i) (éléments ars ) à A(i+1) (d’éléments a0rs ) fait intervenir
la matrice orthogonale Rjk qui vaut (en posant c = cos θjk et s = sin θjk ) :

Rj,k








=








1
0
0
..
.
0
..
.
..
.
..
.
0
0
···
···
··· ··· 0
···









c
s



1



−s
c


..
. 0 
··· ··· ··· ··· 1
···
1
···
···
0
..
.
..
.
..
.
..
.
Rjk représente une rotation des axes dans le sous-espace (j, k). Seules les colonnes j et k et les
lignes j et k de A(i+1) diffèrent de celles de A(i) . En calculant d’abord AR, puis RT AR, vous
montrerez que les équations de transformation s’écrivent :
a0rs = ars , r, s 6= j, k,
= carj − sark , r 6= j, k,
a0rj = a0jr
a0rk = a0kr = sarj + cark ,
r 6= j, k,
a0jj = c2 ajj + s2 akk − 2csajk ,
a0jk = a0kj = cs(ajj − akk ) + (c2 − s2 )ajk ,
a0kk = s2 ajj + c2 akk + 2csajk .
L’angle de rotation est défini par la condition a0jk = 0
tg 2θjk = (akk − ajj )/(2ajk ).
En pratique, on effectue les calculs sur une moitié de la matrice, puisque la similitude respecte la
symétrie. On ne calcule pas non plus a0jk , dont on sait qu’il est nul.
Je peux donner une indication sur la convergence de la méthode. Nous définissons les normes
117
10.3. Méthode de Jacobi
extradiagonales de A et de A0 par les relations :
X
X
|ajk |2 ; S 02 =
|a0jk |2 .
S2 =
j6=k
j6=k
a0jk
En remplaçant les
par leurs expressions, on montre que S 0 < S, si bien que la suite des
S(A(j) ), positive décroissante, converge. Il est un peu plus difficile de montrer que les S(A(j) )
tendent vers zéro, à condition que les éléments à éliminer soient choisis dans l’ordre "lexicographique" a12 , a13 , . . . , a1n , a23 , . . . , a2n , . . . On arrête le calcul quand sup |aij | < seuil.
Lorsque la convergence est atteinte, la matrice est réputée diagonale et QT AQ = D, avec
R1 R2 · · · Rn = Q. Les colonnes de Q sont les vecteurs propres et nous intéressent. Il serait ruineux
de conserver les matrices Ri pour les multiplier à la fin. Je procède en fait par récurrence, en posant
Qk = R1 R2 · · · Rk , k < n
et
Qk+1 = Qk Rk+1
. Chaque fois que je définis les éléments d’une matrice R, j’en profite pour former la matrice Qk+1
0
(éléments qrs
) à partir de Qk (éléments qrs ) :
0
qrs
= qrs , r, s 6= j, k,
0
qrj = cqrj + sqrk , r 6= j, k,
0
qrk
= −sqrj + cqrk , r =
6 j, k;
Dès que l’ordre de la matrice dépasse une dizaine, la méthode de Jacobi est moins rapide que
la réduction de la matrice à la forme tridiagonale, suivie d’un calcul de valeurs propres. Cette
remarque est d’autant plus pertinente que A a la forme d’une matrice bande plus ramassée : la
méthode de Jacobi détruit cette structure.
Exemple.
Je me propose de diagonaliser la matrice symétrique


1.0 1.
0.5
A = A0 =  1.0 1. 0.25 
0.5 0.25 2.0
Je calcule d’abord le carré de la norme diagonale -->sum(A.*A) = 8.625 et le carré de la norme
complète de A : -->trace(A.*A) = 6.0 Pour annuler l’élément a12 , il faut effectuer une première
rotation dans le sous-espace (1,2). Comme a22 = a11 , j’ai 2θ = π/2, θ = π/4, si bien que


.7071068 .7071068 0.
R1 =  −.7071068 .7071068 0. 
0.
0.
1.
et

0.
0.
A1 = R1T AR1 = 
.1767767

0.
.1767767
2.
.5303301 
.5303301
2.
La norme au carré reste constante, sum(A1.*A1) = 8.625, alors que la somme des carrés des
éléments diagonaux augmente : trace(A1.*A1) = 8. La deuxième rotation, destinée à annuler
le plus grand élément extradiagonal, soit a123 , est encore particulière, θ = π/4 et


1.
0.
0.
R2 =  0. .7071068 .7071068 
0. −.7071068 .7071068
118
Chapitre 10. Éléments propres


0.
−.125
.125
1.4696699
2.220E − 16 
A2 = R2T ∗ A1 ∗ R2 =  −.125
.125 2.220E − 16
2.5303301
Les tous petits nombres a223 = a232 sont dûs à des erreurs d’arrondi ; je fait le ménage pour les faire
disparaître
A2 = clean(A2) = !
0.
! - .125
!
.125
-
.125
1.4696699
0.
.125
!
0.
!
2.5303301 !
Je surveille le carré de la norme complète, sum(A2.*A2) = 8.625 et le carré de la norme diagonale,
trace(A2.*A2) = 8.5625. Vous remarquez que les éléments précédemment annulés ont tendance
à «repousser», bien que moins vigoureusement.
La troisième rotation, dans le sous-espace (1,2), vise à éliminer a212 . Je trouve tg 2θ = 2a212 /(a222 −
2
a11 ) = −0.1701062, d’où la matrice de rotation


.9964533 −.0841471 0.
R3 =  .0841471 .9964533 0. 
0.
0.
1.
et la matrice A3 , débarrassée d’éléments inférieurs à 10−16 :


−.0105558
0.
.1245567
0.
1.4802257 −.0105184 
A3 = 
.1245567 −.0105184 2.5303301
Les éléments diagonaux se renforcent : trace(A3.*A3) = 8.59375.
La quatrième rotation aura lieu dans le sous-espace (1,3), avec tg 2θ = 0.0980419 ou θ =
0.0488648 rd. La matrice de rotation s’écrit


.9988064 0. .0488453

0.
1.
0.
R4 = 
−.0488453 0. .9988064
et permet d’obtenir

−.0166471
A4 =  .0005138
0.
.0005138
1.4802257
−.0105058

0.
−.0105058 
2.5364214
Mon critère de convergence est atteint : j’arrête l’itération. Le carré de la norme diagonale vaut
maintenant 8.6247788 (à 3 10−4 du total). Les vecteurs propres sont les colonnes de la matrice de
similitude globale ; comme je n’ai à manipuler que 4 petites matrices, je forme R directement


.7213585
.4387257 .5358747
R = R1 ∗ R2 ∗ R3 ∗ R4 =  −.6861572 .5577276 .4670419 
−.0939688 −.7045989 .7033564
Cette matrice est orthogonale aux erreurs d’arrondi près, comme vous le vérifierez en formant
RT ∗ R. Je vous recommande aussi d’effectuer le produit de A par une colonne de R, pour vérifier
que l’on obtient bien un vecteur proportionnel à cette colonne et à la valeur propre correspondante.
Enfin, je peux demander à Scilab de faire les calculs directement, avec une tolérance de l’ordre
de 10−16 :
-->[D,X] = bdiag(A)
X =
!
.7212071 - .5314834
-
.4442811 !
119
10.4. Réduction à la forme tridiagonale
! - .6863493
! - .0937280
D =
! - .0166473
!
0.
!
0.
-
.4614734
.7103293
0.
2.5365259
0.
-
.5621094 !
.6976011 !
0.
!
0.
!
1.4801214 !
L’erreur encourue sur les valeurs propres après 4 itérations de l’algorithme de Jacobi n’excède pas
10−4 . Les vecteurs propres sont nettement moins précis. C’est toujours le cas pour l’algorithme de
Jacobi. Une dernière remarque : l’ordre dans lequel apparaissent les valeurs propres et les vecteurs
propres associés est arbitraire, de même que le signe des vecteurs propres.
10.4
Réduction à la forme tridiagonale
Il est avantageux d’abandonner l’objectif de l’algorithme de Jacobi (diagonaliser une matrice
symétrique par une suite convergente de similitudes) pour un objectif plus restreint : amener
la matrice réelle symétrique A à la forme tridiagonale. En effet, la détermination des éléments
propres d’une matrice tridiagonale est très rapide. D’autre part, la transformation de A en matrice
tridiagonale nécessite, grâce à l’algorithme de Householder, un nombre fini d’opérations.
10.4.1
Matrice de Householder
L’algorithme de Householder se comprend facilement à partir de sa représentation géométrique
dans l’espace à trois dimensions. Soient un point M et un plan (P), contenant l’origine (mais pas
M) et normal au vecteur unitaire n
ˆ . Je cherche à construire le point M’ qui se déduit de M par une
symétrie orthogonale par rapport à (P). La droite passant par M et perpendiculaire à (P) perce ce
−−→
plan en K ; elle passe aussi par M’. Le vecteur KM est parallèle à n
ˆ ; sa longueur est celle de la
−−−→
−−→
−−→
projection orthogonale de OM sur n
ˆ ; autrement dit, KM = (ˆ
n · OM )ˆ
n. Par symétrie, KM 0 est
−
−
−
→
−
−
−
→
−−→
−−→
−−→ −−→ −−→
−−→
l’opposé de KM . Je peux relier M’ à M par OM 0 = OM +M M 0 = OM −2KM = OM −2(ˆ
n·OM )ˆ
n.
0
Il est clair que OM = OM , la symétrie préservant les longueurs.
Lorsque je représente les vecteurs par des matrices colonne, les relations précédentes deviennent
−−−→
−−→
OM = x, OM 0 = x0 et x0 = x − 2(ˆ
nT x)ˆ
n = x − 2ˆ
nn
ˆ T x = (I − 2ˆ
nn
ˆ T )x, les dernières formes
étant rendues possibles par l’associativité des produits.
Ce raisonnement se généralise sans peine à l’espace à n dimensions, même si la représentation
géométrique devient plus difficile. Soit w un vecteur unitaire de <n : wT w = 1. Je définis une
matrice :
P = 1 − 2wwT .
Cette matrice est symétrique : P T = P parce que le transposé d’un produit est égal au produit
des transposées dans l’ordre inverse. Elle est aussi orthogonale :
P T P = P P = (I − 2wwT )(I − 2wwT )
= I − 2wwT − 2wwT + 4wwT wwT = I.
et donc idempotente P 2 = I. Si deux vecteurs x, y satisfont à la relation :
y = P x = x − 2(wwT x),
alors :
y T y = xT P T P x = xT x.
Je m’intéresse maintenant à la réciproque du cas précédent :je voudrais déterminer un vecteur w
(et donc une matrice P ) tel qu’un x donné soit transformé par P en un vecteur donné à l’avance
120
Chapitre 10. Éléments propres
et même, plus précisément, en un multiple du premier vecteur de la base canonique
P x = ke1 .
D’après les relations précédentes, il apparaît que |k|2 =k x k2 = xT x ≡ L2 et k = ±L. De plus,
d’après la définition de P x, x − ke1 = 2wwT x = 2(wT x)w : le vecteur w doit être proportionnel
à x − ke1 . Comme il doit être en plus normalisé, je peux écrire
w=
De plus
x − ke1
k x − ke1 k
k x − ke1 k=k x ± Le1 k= [(x1 ± L)2 + x22 + .... + x2n ]1/2 .
On montre qu’il vaut mieux choisir le signe moins (pour éviter des erreurs d’arrondi), si bien que :
|x1 − k|2 = |x1 + L|2 = L2 + 2L|x1 | + x21 .
Il s’en suit que : k x − ke1 k2 = 2L2 + 2L|x1 |. On peut écrire, sans normaliser le vecteur w :
P = 1 − βuuT
avec : L =k x k, k = −L, u = x − ke1 = [x1 + L, x2 , . . . , xn ]T , β = 1/L(L + x1 ).
Exemple. Soit le vecteur x = [1, −2, 3, 1, −1]T dont la norme est L = 4. Le vecteur u vaut
[5, −2, 3, 1, −1]T et β = 1/20. On trouve alors :


−5 10 −15 −5 5
 10
16
6
2 −2 

1 
 −15 6
11
−3
3 
P =


20 
−5
2
−3 19
1 
5
−2
3
1
19
et on vérifie que P x = [−4, 0, 0, 0, 0]T .
10.4.2
Tridiagonalisation
Je vais utiliser des matrices de Householder comme P pour amener la matrice réelle symétrique
A à la forme tridiagonale, à l’aide d’une série de similitudes :
T
A(i) = Q(i) A(i−1) Qi .
Le premier produit (prémultiplication qui agit sur les colonnes), QT A, doit laisser invariant a11 et
doit transformer le vecteur [a21 , a31 , . . . , an1 ]T en [k, 0, 0, . . .]T , un multiple du premier vecteur de
la base canonique de <n−1 . Il faut donc faire agir une matrice de Householder Pn−1 de dimension
n − 1 ; celle-ci sera insérée dans une matrice d’ordre n ayant la structure
¸
·
1 0...0
Q=
0 Pn−1
Le deuxième produit (QT A)Q (postmultiplication agissant sur les lignes) fera de même pour la
première ligne de A : a11 invariant et [a12 , a13 , . . . , a1n ] transformé en [k, 0, . . . , 0].
Vous imaginez sans peine la suite de l’itération : à l’aide d’une matrice de Householder n − 2 ×
n − 2, je forme une nouvelle matrice Q, d’ordre n − 1, dont la mission sera d’annuler les éléments
a42 , . . . , an2 et a24 , . . . , a2n (ce sont les mêmes). Au bout de n − 2 similitudes, la matrice sera
exactement sous forme tridiagonale : cet algorithme est plus compliqué que celui de Jacobi, mais
il aboutit au résultat cherché en un nombre fini d’opérations.
Il faudra, en principe, garder les matrices Qi pour le calcul des vecteurs propres. Si y est un
vecteur propre de An−2 , x = Q1 Q2 · · · Qn−2 y est vecteur propre de A. En pratique, le produit
des Q est accumulé au fur et à mesure.
121
10.4. Réduction à la forme tridiagonale
Exemple
Je vais tridiagonaliser la matrice qui m’a déjà servi à illustrer la méthode de Jacobi :


1. 1. .5
A =  1. 1. .25 
.5 .25 2.
Le bas de la première colonne constitue le vecteur à traiter
·
¸
1.
xx = A(2 : 3, 1) =
.
.5
Je calcule successivement k
= sqrt(x’*x) = 1.118034,
·
¸
−.1180340
0
w = x − k ∗ [10] =
,
.5
que je normalise
·
w = w/sqrt(w0 ∗ w) =
J’en déduit
·
−.2297529
.9732490
¸
.
.8944272 .4472136
.4472136 −.8944272
P = eye(2, 2) − 2 ∗ w ∗ w0 =
¸
.
Je vérifie ce premier résultat
·
P ∗ A(2 : 3, 1) = P x =
1.118034
2.776E − 16
¸
.
Je construit la matrice Q avant de tridiagonaliser :

Q = [1 0 0; 0 P (1, 1) P (1, 2); 0

1.
0.
0.
P (2, 1) P (2, 2)] =  0. .8944272 .4472136  .
0. .4472136 −.8944272
Pour une matrice 3 × 3, il n’y a qu’une étape de tridiagonalisation :


1.
1.118034
0.
1.4
−.55  .
A1 = clean(A1) =  1.118034
0.
−.55
1.6
Quelques vérifications élémentaires : trace(A1) = 4. = trace(A) et det(A1) = -.0625 = det(A).
10.4.3
Calcul des valeurs propres
Soit J une matrice tridiagonale symétrique réelle d’ordre n :




J =


δ1
γ2
0
..
.
γ2
δ2
γ3
0
γ3
δ4
..
.
122
···
···
γ4
..
.
0
0
···
γn
δn




.


Chapitre 10. Éléments propres
Nous supposons les γi tous différents de zéro. Nous pouvons former facilement le polynôme
caractéristique de J , en procédant par récurrence. Définissons en effet la matrice partielle :


δ1 γ2 0 · · ·
 γ2 δ1 γ3 · · · 


··· 
Ji = 
 ···


γi 
γi δi
et
pi (x) = det[Ji − λI].
En développant ce déterminant en fonction des éléments de la dernière colonne, je trouve les
relations :
p0 (x) = 1; p1 (x) = δ1 − x;
pi (x) = (δi − x)pi−1 (x) − γi2 pi−2 (x).
Toute méthode efficace de recherche des zéros d’un polynôme est maintenant applicable au
calcul des valeurs propres (les racines de pn ) ; la méthode de bissection est stable et commode. On
peut aussi utiliser l’algorithme de Newton, en calculant la dérivée de pn à l’aide de la récurrence :
p00 (x) = 0; p01 (x) = −1,
p0i (x) = −pi−1 (x) + (δi − x)p0i−1 (x) − δi2 p0i−2 (x).
10.5
Matrices hermitiques
On rencontre souvent , en physique, des matrices hermitiques : comment chercher leurs éléments
propres ? La méthode de Householder peut s’étendre à des matrices complexes, mais la programmation en Pascal est pénible, puisque ce langage ignore le TYPE complexe et que l’on est obligé
de réécrire toutes les opérations arithmétiques (ce ne serait pas le cas en FORTRAN ou en C). Une
autre méthode consiste à séparer partie réelle et partie imaginaire du problème de valeurs propres.
Je cherche des solutions de :
Ax = λx,
où A est hermitique et λ est réel. Je pose A = A0 + i00 , x = x0 + ix00 . L’hermiticité de A impose
la symétrie de A0 et l’antisymétrie de A00 ( A00T = −A00 ). En séparant partie réelle et partie
imaginaire :
A0 x0 − A00 x00 = λx0 ,
A00 x0 + A0 x00 = λx00 .
Ces relations peuvent être considérées comme le développement par blocs de l’équation :
·
¸· 0 ¸
· 0 ¸
A0 −A00
x
x
=λ
.
A00
A0
x00
x00
J’ai ainsi remplacé un problème n × n complexe en un problème 2n × 2n réel. Le nombre de valeurs
propres a-t-il doublé pour autant ?
123
Chapitre 11
Traitement de données
expérimentales
11.1
Introduction
Chaque fois que je cherche à mesurer pratiquement une grandeur, j’obtiens un résultat plus
ou moins éloigné de la "vraie" valeur. En répétant l’expérience, en améliorant la technique, la
méthode et les instruments de mesure, j’ai l’espoir (souvent vérifié) que la part d’erreur va diminuer
et que les résultats vont s’approcher asymptotiquement d’une estimation raisonnable et sûre. Des
considérations de ce genre s’appliquent à toute activité et en particulier aux mesures physiques,
qui sont toujours entachées d’erreurs et d’incertitudes, lesquelles doivent être réduites par des
perfectionnements de la technique et aussi estimées pour établir la validité des résultats.
Il est commode d’établir une classification des erreurs qui guettent la personne qui effectue des
mesures. On distingue ainsi les erreurs systématiques, qui découlent par exemple d’un mauvais
étalonnage d’un instrument ou d’un biais de l’observateur. Si, pour prévoir l’issue d’un prochain
scrutin présidentiel, je n’interrogeais que des personnes de sexe masculin, d’âge supérieur à 50
ans et dont les revenus sont supérieurs à 300 000 F/an, j’aboutirais à une prédiction « biaisée»,
entachée d’une erreur de méthode. De même la mesure des dimensions d’une pièce avec une règle
tordue, la mesure précise d’une masse sans tenir compte de la poussée d’Archimède de l’air...
D’autre part, malgré la bonne volonté de la personne chargée des mesures, il peut s’introduire
des erreurs non reproductibles, aléatoires. C’est par exemple le cas lorsque la sensibilité de l’appareil
est insuffisante et que le signal cherché est accompagné de « bruit ». Les erreurs aléatoires affectent
la précision de la mesure : plus elles sont importantes, plus les mesures sont dispersées. Les erreurs
systématiques affectent la justesse du résultat.
Si la dispersion se détecte aisément, le biais est moins visible ; en toute rigueur, il faudrait, pour
le mettre en évidence, disposer d’une mesure juste et indépendante de la quantité en question. On
augmente la précision d’une expérience en répétant celle-ci plusieurs fois et en retenant la moyenne
des résultats individuels. On améliore la justesse en analysant avec soin la mesure et en cherchant
toutes les causes d’erreurs possibles.
Dans les paragraphes qui suivent, je considérerais a priori que je dispose de mesures parfaitement
justes, seulement affectées d’erreurs aléatoires. Cette situation permet de faire des prédictions assez
simplement. Le résultat d’une mesure est considéré comme le résultat du tirage d’une variable
aléatoire, superposition de la valeur "vraie" (non fluctuante ou certaine) et de l’erreur ; je supposerai
que les erreurs sont additives, c’est-à-dire qu’un résultat Y est la somme de la valeur vraie inconnue
s et d’une erreur ² : Y = s + ².
Comme ² est réputée aléatoire, je suis conduit à considérer les lois de probabilités les plus
fréquentes qui peuvent caractériser une grandeur aléatoire. Une mesure physique est rarement
124
Chapitre 11. Traitement de données expérimentales
utilisée seule ; je chercherai souvent à tirer parti d’une série de résultats, pour déterminer les
paramètres qui définissent un modèle théorique. Quelle est l’influence des erreurs de mesures sur
la précision de mes connaissances des paramètres ? Je donnerai quelques éléments de réponse à la
fin du chapitre.
11.2
11.2.1
Probabilités
Variables discrètes
Je suppose que les lecteurs ont des connaissances élémentaires en théorie des probabilités et je
ne ferai que rappeler quelques définitions. Je commence par le cas de grandeurs aléatoires discrètes,
qui ne prennent que des valeurs entières ou équivalentes à des entiers (pile ou face, lancement d’un
dé, tirage du loto). Les différents résultats possibles d’un tirage ou d’une épreuve, Xi , sont repérés
par l’indice i, 1 ≤ i ≤ n. Soit pi la probabilité du résultat i. Ces grandeurs sont normalisées, en ce
sens que
n
X
pi = 1.
1
La valeur moyenne d’une grandeur aléatoire X est notée < X > ou µ ; on a :
< X >≡
n
X
pi Xi .
(11.1)
1
Un autre paramètre important est l’écart type σ tel que :
σ 2 ≡< (X− < X >)2 >;
(11.2)
σ 2 est appelée la variance de X.
Il arrive souvent que l’on sache que tous les résultats d’une épreuve sont également probables
(lancement d’un dé équilibré par exemple). La probabilité d’un événement complexe est alors
proportionnelle au nombre d’événements élémentaires qui le compose (exemple : faire apparaître
un nombre pair en lançant un dé a une probabilité de 3/6). On traduit souvent ce fait en disant que
la probabilité d’un événement composé est le rapport du nombre de cas «favorables» au nombre
de cas total.
11.2.2
Variables continues
Ces définitions prennent une forme un peu différente lorsque la quantité X est une grandeur
réelle, continue, définie dans un intervalle fini ou non. Il est commode d’introduire la fonction de
répartition de X, qui est la probabilité d’observer une valeur de X inférieure ou égale à x :
F (x) = P roba(X ≤ x)
et la densité de probabilité de X qui est la dérivée de la fonction précédente :
f (x) = F 0 (x).
On l’interprète comme la probabilité de trouver X dans un petit intervalle :
f (x)dx = P roba(x ≤ X ≤ x + dx).
125
11.3. Lois de probabilité
1.2
1.0
0.8
0.6
P
0.4
P
0.2
0
0
1
2
3
4
5
6
7
8
9
10
La figure montre les deux fonctions F et F 0 = f et la représentation géométrique de la probabilité de trouver X dans l’intervalle [5,3..6,4]. La densité de probabilité est normalisée :
Z
f (x)dx = 1,
ce qui implique que la fonction de répartition F varie de 0 à 1 d’une extrémité à l’autre de l’intervalle
de définition. La valeur moyenne et l’écart type sont alors définis comme :
Z
< x >≡ xf (x)dx,
(11.3)
Z
σ 2 ≡ (x− < x >)2 f (x)dx,
(11.4)
les intégrales étant étendues à tout le domaine permis de x.
11.3
11.3.1
Lois de probabilité
Loi Binomiale
Soit une épreuve aléatoire n’ayant que deux résultats possibles : A et B ; si A ne se réalise
pas, il y aura réalisation de l’événement complémentaire B (événements mutuellement exclusifs).
Soit p la probabilité de A, et donc q = 1 − p celle de B. Procédons à n épreuves consécutives
et indépendantes. Je peux définir une variable aléatoire à valeurs entières X égale au nombre
d’apparitions du résultat A sur l’ensemble des n épreuves. La probabilité pour que A se réalise
exactement k fois (et donc B n − k fois), sans tenir compte de l’ordre des événements, s’écrit :
P (X = k) ≡ b(k; n, p) = Cnk pk q n−k .
(11.5)
Cette loi de probabilité est appelée loi binomiale, ou de Bernouilli. Le maximum de b(k; n, p)
est atteint approximativement pour k = np ≡ km . On montre aussi que pour la loi binomiale :
< k >= np ;
126
σ=
√
npq.
(11.6)
Chapitre 11. Traitement de données expérimentales
11.3.2
Loi de Poisson
Lorsque la probabilité p de A est faible et que n est assez grand, de telle sorte que λ ≡ np reste
moyen, la loi binomiale tend vers une forme limite, connue sous le nom de loi de Poisson. J’essaie
de rendre plausible le passage d’une loi à l’autre, par le raisonnement suivant. Pour k = 0, j’ai
b(0; n, p) = (1 − p)n = (1 −
λ n
) ' e−λ .
n
De plus, je déduis de la définition de b(k; n, p) la relation
λ − (k − 1)p
λ
b(k; n, p)
=
' .
b(k − 1; n, p)
k(1 − p)
k
Cette relation de récurrence me permet de calculer successivement
b(1; n, p) = λe−λ ,
b(2; n, p) =
λ2 −λ
e
2
et ainsi de suite. Je note p(k; λ) cette valeur approchée de b(k; n, p) : c’est la loi de Poisson, laquelle
s’écrit en général
λk
(11.7)
p(k; λ) = e−λ .
k!
On montre que < k >= λ et que l’écart-type obéit à σ 2 =< k >. Cette loi de probabilité intervient
dans tous les problèmes de comptage en radioactivité comme en microbiologie.
11.3.3
Loi normale ou de Gauss
Lorsque le nombre d’épreuves n et le nombre de «succès» k deviennent grands (en pratique
supérieurs à 10), la loi binomiale tend vers la loi de Gauss. Pour le voir, il est commode de faire,
dans b(k; n, p), un changement de repère tel que le maximum de b(k) soit à l’origine ; j’ai dit que
ce maximum avait lieu pour k ' np =< k >. Il faut donc choisir comme nouvelle variable l’écart à
la moyenne x = k− < k >. De plus, lorsque
n et k sont grands, je peux approcher les factorielles
√
par la formule de Stirling : n! = nn e−n 2πn. Il vient alors
µ
¶
µ
¶
1
x2
1
x2
b(x; n, p) ' √
exp −
= √ exp − 2 ,
2npq
2σ
2πnpq
σ 2π
√
x2
en introduisant l’écart-type σ = npq ; J’ai supposé que n et k étaient grands ; la quantité 2σ
2
varie donc très peu lorsque k augmente d’une unité et je vais pouvoir la considérer comme une
variable continue.
Je cherche la probabilité pour que la variable aléatoire X soit inférieure ou égale à x. Cet
événement se produit si X = x − 1 ou si X = x − 2,. . . si bien que la fonction de répartition de X
s’écrit
µ
¶
x
X
1
x02
√ exp − 2 .
F (x) =
2σ
σ 2π
Comme les valeurs de x0 sont très serrées, je peux remplacer cette somme par une intégrale
µ
¶
Z x
x02
1
√ exp − 2 dx0 .
F (x) =
2σ
σ 2π
La fonction exponentielle décroît très rapidement lorsque x0 devient supérieur à quelque fois σ ; je ne
commet pratiquement pas d’erreur en calculant l’intégrale depuis −∞. La fonction correspondante
127
11.3. Lois de probabilité
est considérée comme la fonction de répartition de la loi de Gauss-Laplace. Plus généralement,
celle-ci est définie par
¸
·
Z x
1
(x0 − µ)2
√
N (x; µ, σ) ≡
exp −
.
(11.8)
2σ 2
σ 2π −∞
La probabilité pour que X soit compris entre x et x + dx est proportionnelle à la densité de
probabilité n(x) = N 0 (x) :
¸
·
1
(x − µ)2
dx.
n(x)dx = √ exp −
(11.9)
2σ 2
σ 2π
Il est commode d’introduire la loi normale réduite (ou standard) pour laquelle σ = 1 et < x >= 0,
représentée ci-dessous.
1.2
1.0
0.8
0.6
0.4
0.2
0
−4
−3
−2
−1
0
1
2
3
4
Vous pouvez maintenant oublier l’origine discontinue de la variable x et la considérer comme
une variable continue définie sur tout l’axe réel. Vous pourrez montrer directement (à l’aide des
formules 11.3) que, comme on pouvait s’y attendre, la moyenne de X est µ et que son écart type
est σ.
11.3.4
Loi du chi-deux ou de Pearson
Si X1 , X2 , . . . , Xn sont n variables aléatoires indépendantes,
Pchacune distribuée selon la même
loi normale de moyenne µ et d’écart type σ, alors la quantité (Xi − µ)2 /σ 2 P
est distribuée selon
2
une
loi
dite
«
du
χ
(prononcez
qui-deux)
à
n
degrés
de
liberté
».
Si
<
X
>=
Xi /n, la variable
P
(Xi − < X >)2 /σ 2 est distribuée comme le χ2 à n − 1 degrés de liberté.
Une variable aléatoire X est distribuée comme le chi-carré (ou comme le chi-deux) à n degrés
de liberté si sa densité de probabilité est :
xn/2−1 e−x/2
.
2n/2 Γ(n/2)
f (x, n) =
La « fonction gamma », Γ(x), est l’intégrale :
Z
Γ(x) =
∞
tx−1 e−t dt.
0
128
(11.10)
Chapitre 11. Traitement de données expérimentales
Elle obéit à la relation de récurrence Γ(x + 1) = xΓ(x) et, de plus, Γ(1/2) =
√
π.
0.20
0.18
0.16
0.14
0.12
0.10
0.08
0.06
0.04
0.02
0
0
2
4
6
8
10
12
14
16
18
20
La figure montre trois versions de la loi du χ2 , respectivement pour n = 4, 8, 16. On utilise
souvent la fonction de répartition P (X ≤ χ2 ) ou la fonction complémentaire Q(X ≥ χ2 ), que l’on
trouve tabulées dans les ouvrages de statistique mais que l’on peut aussi calculer facilement par
intégration numérique.
11.3.5
Paramètres de la loi de probabilité et paramètres de l’échantillon
Dans la pratique, je dispose d’un certain nombre n d’observations d’une grandeur Y , réparties
au hasard. L’ensemble des yi constitue un échantillon extrait de la «population» de toutes les
valeurs possibles de Y . . La variable aléatoire Y obéit à une certaine loi de probabilité p(y),
laquelle est caractérisée par une moyenne µ et un écart-type σ. Je n’aurai jamais connaissance de
ces paramètres, mais je pourrai essayer de les estimer à partir de propriétés de l’échantillon. Il
importe de ne pas confondre paramètres de la population et paramètres de l’échantillon. En fait,
on a les résultats suivants :
* La meilleure estimation
de la moyenne µ de la population parente est la moyenne m de
P
l’échantillon (m = (1/n) yi ).
* La meilleure estimation de l’écart-type σ de la population parente est égale à l’écart-type s
de l’échantillon, défini par :
n
1 X
s2 =
(11.11)
(yi − m)2 .
n−1 1
Le facteur n − 1 (au lieu de n que l’on pourrait attendre) tient compte de ce qu’une partie de
l’information contenue dans l’échantillon a été «consommée» pour calculer m. On dit que les
nombres m et s sont respectivement des estimateurs de µ et σ. Ce sont des variables aléatoires (un
autre échantillon donnerait d’autres valeurs de m et s). On montre que ces estimateurs sont sans
biais, c’est-à-dire que < m >= µ et que < s2 >= σ 2 .
11.3.6
Vérification d’une loi de probabilité
Je dispose d’un échantillon d’une variable aléatoire Y : suis-je capable de déterminer la loi
de probabilité à laquelle obéit Y ? Non, pas plus que je ne pourrais trouver rigoureusement la
moyenne ou l’écart-type de Y . La seule approche possible est la suivante. Je fais le choix d’une loi de
129
11.4. Propagation des erreurs
probabilité f (y) et j’essaye de vérifier l’hypothèse : « les résultats expérimentaux sont compatibles
avec la loi f , avec une probabilité de α%. » Je ne considère ici qu’un exemple élémentaire. Soit
une épreuve conduisant à l’un ou l’autre de r résultats mutuellement exclusifs dont les probabilités
(inconnues) sont p1 , p2 , ...pr . Par ailleurs, je note qi mon estimation de la probabilité du résultat
i. Je vais essayer de vérifier l’hypothèse qi = pi , 1 ≤ i ≤ r. Je répète n fois l’épreuve et je désigne
par Yi le nombre d’apparitions du résultat i. La quantité Yi /n est proche de pi (loi des grands
nombres) et, si l’hypothèse est valable, elle est aussi voisine de qi . Je dispose alors du théorème
suivant. La variable S, définie comme
S=
r
X
(Yi − npi )2
npi
1
obéit à la loi de Pearson à r − 1 degrés de liberté, à condition que les nombres npi soient assez
grands (npi ≥ 10 en pratique). Comme j’ignore les pi , je considère, à la place de S, l’estimateur
T =
r
X
(Yi − nqi )2
nqi
1
,
(11.12)
qui obéit à peu près à la même loi de répartition. Il est clair que T sera petit si mon hypothèse
est vérifiée. Je choisis une probabilité ² ; T 0 étant une variable distribuée selon le chi-deux à r − 1
degrés de liberté, je détermine un nombre χ2 vérifiant
P roba(T 0 ≥ χ2 ) ≤ ².
Je rejette l’hypothèse si T ≥ χ2 . En d’autres termes, si l’écart entre fréquences observées et fréquences calculées me parait trop grand pour être dû au hasard, je dois conclure que mon hypothèse
est fausse.
Exemple. J’ai lancé 120 fois un dé, pour obtenir les résultats consignés ci-dessous. Je fais
l’hypothèse que le dé est équilibré, ou encore que la probabilité de chaque face est 1/6.
Rang i
1
2
3
4
5
6
nombres observés
25
21
16
28
14
16
total : 120
nombres calculés
20
20
20
20
20
20
total : 120
(yi − nqi )2 /nqi
1,25
0,05
0,8
3,2
1,8
0,8
T = 7,9
Je constate, à la lecture d’une table du χ2 , que la probabilité pour que T (avec 5 degrés
de liberté) soit au moins égal à 7,9 est comprise entre 0,1 et 0,2. L’hypothèse est considérée
comme plausible et elle est acceptée. Le tableur « EXCEL » (entre autres) permet d’obtenir ce
résultat en quelques pressions de touches. La fonction « loi.khi-deux(a2 ;n) » renvoie la probabilité
d’apparition d’une valeur de T 0 au moins égale au contenu de la cellule «a2» pour un nombre
de degrés de liberté égal à n ; le résultat est ici 0,1618. La fonction « test.khi-deux » effectue
automatiquement l’ensemble des calculs, à condition de fournir en arguments la plage de cellules
contenant les résultats observés et la plage destinée à contenir les résultats attendus.
11.4
Propagation des erreurs
Je m’intéresse maintenant à une grandeur physique G qui est déterminée indirectement à partir
des mesures de deux grandeurs U et V . Sachant que les valeurs de U et de V sont entachées d’erreurs
aléatoires, je me demande quelle peut être la dispersion de G = g(U, V ). La probabilité d’obtenir,
130
Chapitre 11. Traitement de données expérimentales
lors d’une mesure particulière, le résultat (u, v) dépend de la «densité de probabilité conjointe»
f (u, v). Plus précisément, la probabilité pour que U soit dans l’intervalle [u, u + du] et V dans
[v, v + dv] est :
P roba(u ≤ U ≤ u + du; v ≤ V ≤ v + dv) = f (u, v)dudv.
Il faut encore généraliser la notion de valeur moyenne :
Z Z
< g(u, v) >=
g(u, v)f (u, v)dudv.
La probabilité pour que U soit dans l’intervalle [u, u + du], cela quelque soit V , s’écrit :
Z
P roba(u ≤ U ≤ u + du; ∀V ) = f1 (u) = f (u, v)dv.
À partir de la densité f1 , je peux calculer la valeur moyenne < u > et l’écart-type σu de U , quelque
soit V ; des formules symétriques existent pour la variable V . J’introduis ensuite les «moments»
de la distribution f :
Z Z
mp,q ≡< up v q >=
f (u, v)up v q dudv,
puis les "moments centrés" µp,q =< (u− < u >)p (v− < v >)q >. Je trouve en particulier :
µ2,0 = σu2
;
µ0,2 = σv2 .
Le moment centré µ1,1 ≡< (u− < u >)(v− < v >) > est souvent appelé la covariance de U et V .
Les variables aléatoires U et V sont dites corrélées si µ1,1 6= 0. Bien entendu, je ne dispose pas des
« vraies » valeurs de U et V ; je ne connais que des estimateurs U ∗ et V ∗ (qui pourraient être les
moyennes de quelques mesures de U et V ). Ces estimateurs sont supposés sans biais :< U ∗ >= U
et < V ∗ >= V . Il est raisonnable de choisir G∗ = g(U ∗ , V ∗ ) comme estimateur de G. Je vais
calculer la moyenne et la variance de G∗ . Je fais un développement limité de g autour du point
U, V :
g(U ∗ , V ∗ ) = g(U, V ) + (U ∗ − U )gu + (V ∗ − V )gv + . . .
Dans cette expression, les dérivées (gU = ∂g/∂U, gV = ∂g/∂V ) sont calculées en U, V et sont
certaines (non aléatoires). La valeur moyenne de cette expression vaut, sachant que U ∗ , et V ∗ sont
sans biais,
< g ∗ >≡< g(U ∗ , V ∗ ) >= g(U, V )
en négligeant les termes d’ordre supérieur. g ∗ est donc lui-même, à cette approximation, un estimateur non biaisé. Je calcule maintenant la variance de g
σg2 =< [G(U ∗ , V ∗ ) − G(U, V )]2 >=< [(U ∗ − U )gU + (V ∗ − V )gV ]2 >
et, en développant la valeur moyenne du carré :
2
σg2 = µ2,0 gU
+ 2µ1,1 gU gV + µ0,2 gV2 .
Cette formule donne l’écart type sur g connaissant les moments centrés de U et V ; on l’écrit en
général en fonction des écarts types :
2
σg2 = σu2 gU
+ 2σu,v gU gV + σv2 gV2 ,
(11.13)
où j’ai introduit la notation habituelle σuv = µ1,1 pour la covariance. En pratique, on ne connaît
pas les µi,j mais seulement des estimateurs construits à partir de résultats expérimentaux. Si les
observations de U et V ne sont pas corrélées, alors σuv = 0 et la formule précédente se simplifie :
¶2
µ
¶2
µ
∂g
∂g
+ σv2
.
σg2 = σu2
(11.14)
∂U
∂V
131
11.5. Méthode du maximum de vraisemblance
Exemple. Je considère les fonctions x = uv et y = u/v ; les variances correspondantes sont :
2
σx2 = σu2 v 2 + σv2 u2 + 2σuv
uv
;
2
σy2 = σu2 /v 2 + σv2 u2 /v 4 − 2σuv
u/v 3
ce que l’on écrit en général de façon plus symétrique (z = uv ou z = u/v) :
³ σ ´2 ³ σ ´2 ³ σ ´2
³ σ ´2
z
u
v
uv
=
+
±2
z
u
v
uv
(11.15)
Dans le cas de variables non corrélées, on retrouve un résultat qui évoque l’addition des erreurs
relatives que l’on enseigne dans les cours élémentaires.
11.5
Méthode du maximum de vraisemblance
Un noyau radioactif a une certaine probabilité de désintégration par unité de temps, notée
1/τ ; en conséquence, pour un grand nombre de noyaux, le nombre de désintégrations par unité de
temps, dN/dt, (la fréquence de l’événement) est proportionnel au nombre de noyaux :
dN/dt = −N (t)/τ,
équation différentielle dont la solution s’écrit N (t) = N0 e−t/τ . La probabilité de désintégration par
seconde d’un noyau est p(t) = (1/τ )e−t/τ . Comment déterminer la « durée de vie » ? Je peux (en
principe au moins) mesurer les dates t1 , t2 , . . . , tN auxquelles chacun de ces N noyaux disparaît.
Si je recommençais l’expérience avec une nouvelle famille de N noyaux, j’obtiendrais des valeurs
des ti différentes des précédentes : ces fluctuations sont dues à la nature aléatoire du processus
radioactif et existent même si les erreurs de mesure sont négligeables. La probabilité V (τ ) d’observer
effectivement les désintégrations aux époques t1 , t2 , . . . s’écrit (événements indépendants) :
(
)
N
N
Y
1X
V (τ ) =
p(ti ) = exp −
ti − N ln τ .
τ 1
i
Le meilleur choix de τ est celui qui maximise V , c’est à dire celui qui rend le plus vraisemblable
possible le résultat effectivement observé. Le maximum de V est atteint lorsque − ln V est minimal,
soit pour la valeur :
N
1 X
τ∗ =
ti .
N 1
Autrement dit, la valeur de τ égale à la moyenne des ti calculée sur l’échantillon rend maximale la
probabilité d’apparition de cet ensemble de valeurs. On dit que V est une fonction de vraisemblance
et que τ a été choisi selon un critère de maximum de vraisemblance.
L’exemple qui précède est particulier : si les mesures ne sont pas reproductibles, c’est à cause
de la nature aléatoire du phénomène. De plus, le nombre de désintégrations par seconde est donné
par une loi exponentielle (c’est en fait un cas particulier de loi de Poisson). Dans beaucoup d’autres
cas, les mesures vont être entachées d’erreurs expérimentales. Je donne encore un exemple simple
d’application du principe de maximum de vraisemblance dans ce cas.
Je suppose que j’ai réalisé n déterminations de la grandeur X, que les conditions sont un peu
différentes d’une mesure à l’autre, si bien qu’à chaque mesure est associée une incertitude (écarttype) σi particulière. La probabilité d’apparition de la valeur xi est, comme très souvent pour des
erreurs expérimentales, donnée par une loi de Gauss, de valeur moyenne µ et de variance σi2 :
µ
¶
(xi − µ)2
1
p(xi ) = √ exp −
2σi2
σ 2π
Je me demande quelle est la « meilleure » valeur de µ, en supposant, pour simplifier le raisonnement, que les σi sont connues. Pour répondre, je construis une fonction de vraisemblance V (µ),
132
Chapitre 11. Traitement de données expérimentales
égale au produit des p(xi ), et qui représente la probabilité d’observer l’ensemble des résultats xi .
Comme au paragraphe précédent, je vais chercher la valeur de µ qui rend maximale la probabilité
V , ce qui revient à chercher le minimum de ln V ou de l’argument de l’exponentielle. Il vient :
"n
#
"
¶2 #
n µ
Y 1
1 X xi − µ
√
V (µ) =
exp −
.
2 1
σi
σi 2π
1
En annulant la dérivée par rapport à µ de l’exposant, je trouve :
, n
n
X
X 1
xi
∗
µ =
2
σi
σi2
1
1
La valeur la plus vraisemblable de µ est la moyenne pondérée des valeurs observées xi , les poids
étant les inverses des variances relatives à chaque mesure. Je peux même déterminer l’incertitude
sur µ : cette quantité dépend en effet des observations xi et obéit à la loi de propagation des erreurs
(nous supposons les mesures indépendantes, donc les corrélations nulles) :
σµ2
=
¶2
n µ
X
∂µ
1
Un calcul simple montre que
∂xi
σi2 .
1
2 .
1 (1/σi )
σµ2 = Pn
(11.16)
Lorsque toutes les incertitudes sont égales à σ, cette relation se réduit à
σ
σµ = √ .
n
(11.17)
L’incertitude sur la valeur moyenne d’une série de
mesures équivalentes décroît comme l’inverse de la
racine carrée du nombre de mesures indépendantes.
11.6
Méthode des moindres carrés
Je vais maintenant appliquer la méthode du maximum de vraisemblance à un problème plus
général. Il me faut, cependant, faire une remarque préliminaire. Bien des gens considère la méthode
(on dit souvent le principe) du maximum de vraisemblance comme peu convaincante. Ils préfèrent
se référer plus directement à un «principe des moindres carrés». Sauf cas particuliers, les deux
démarches sont équivalentes.
J’imagine que j’ai mesuré la variation d’une grandeur physique y en fonction d’une autre grandeur indépendante x : par exemple la susceptibilité magnétique d’un matériau en fonction de la
température. Je dispose donc d’une série de résultats expérimentaux {xi, yi}, i = 1, 2, . . . , n. Les
valeurs {xi } de la variable indépendante sont supposées parfaitement exactes, alors que les mesures
de y sont entachées d’erreurs aléatoires. D’autre part, j’ai des raisons de penser que y est lié à x
par une loi physique de la forme :
y = f (x, a1 , a2 , ...am )
où les ai sont des paramètres constants. Je suppose que les erreurs qui affectent chaque mesure yi
sont additives, indépendantes et réparties selon une loi normale. Je vais donc utiliser le modèle
Y = f (x, a1 , a2 , . . . , am ) + ².
Je supposons encore que ce modèle est "juste" ou non biaisé, c’est-à-dire que < ² >= 0 ou encore
que la moyenne de la distribution p(yi ) est f (xi , a1 , ...) = fi =< Yi >. Je souhaite trouver les valeurs
133
11.6. Méthode des moindres carrés
des ai telles que la loi précédente représente "au mieux" l’ensemble des résultats expérimentaux
{xk , yk }, k = 1...n.
Avec les hypothèses faites, je peux écrire la probabilité d’apparition conjointe des événements
y1 , y2 , . . . , yn :
¸
·
m
Y
1
(yi − fi )2
√ exp −
V (a1 , a2 , . . . , am ) =
2σi 2
σi 2π
1
ou encore
V =
m
Y
1
σi
1
√
µ
¶
S
exp −
2
2π
;
S≡
m
X
(yi − fi )2
σi2
1
La quantité S joue un grand rôle dans ce formalisme : c’est la somme des carrés des écarts entre
valeurs observées (yi ) et valeurs calculées (fi ), chaque terme étant pondéré par l’inverse du carré de
l’écart-type. Le maximum de V (la vraisemblance) est atteint lorsque l’exposant est minimal. On
rejoint ici le «principe des moindres carrés» qui stipule que les meilleures valeurs des paramètres
sont celles qui minimisent la somme (pondérée) des carrés des écarts entre valeurs expérimentales
et valeurs théoriques.
Le maximum de V et le minimum de S sont atteints quand
m
X
∂S
yi − fi ∂fi
= −2
= 0.
∂ak
σi2 ∂ak
i=1
11.6.1
Ajustement sur une fonction affine
Pour commencer, je considère un modèle dépendant linéairement de deux paramètres (et linéairement de x, bien que cette hypothèse ne soit pas nécessaire). Je dit que je vais ajuster les
paramètres d’un modèle linéaire ou encore lisser les données à l’aide d’une droite. Le modèle s’écrit
Y = f (x, a, b) + ² = ax + b + ²
Comme ∂f /∂a = x et que ∂f /∂b = 1, les conditions du maximum de vraisemblance sont alors
n
X
yi − fi
i=1
σi2
=0 ;
n
X
xi
i=1
yi − fi
= 0.
σi2
Ces relations constituent en fait un système de deux équations linéaires à deux inconnues (a et b).
Il est commode de poser
S=
n
X
1
σ2
i=1 i
;
Sx =
n
X
xi
σ2
i=1 i
;
Sxx =
n
X
x2i
σ2
i=1 i
;
Sy =
n
X
yi
σ2
i=1 i
;
Le système mentionné ci-dessus s’écrit explicitement :
½
aSxx + bSx = Sxy ,
aSx + bS
= Sy .
Sxy =
n
X
xi yi
i=1
σi2
.
(11.18)
Ces équations sont appelées «équations normales» ou «équations de Gauss». Le tableau des coefficients est symétrique et les valeurs expérimentales (yi ) n’apparaissent qu’au second membre. La
solution est élémentaire ; je pose ∆ = SSxx − Sx2 et je trouve
a∗ =
1
(SSxy − Sx Sy )
∆
;
b∗ =
1
(Sxx Sy − Sx Sxy ).
∆
(11.19)
Les coefficients a∗ et b∗ sont des fonctions des variables aléatoires yi : ce sont donc elles-mêmes
des variables aléatoires qui nous servent à estimer les « vraies » a et b. Pour apprécier la précision
134
Chapitre 11. Traitement de données expérimentales
(ou l’incertitude) de a∗ et de b∗, il faut calculer l’écart-type de ces paramètres, au moyen de la
formule de propagation des erreurs (11.14). Pour u = a∗ ou b∗, je sais que
σu2
=
¶2
n µ
X
∂u
∂yi
1
σi2 .
Je calcule les dérivées partielles à l’aide des formules (11.19) :
xi S − Sx ∂b
Sxx − xi Sx
∂a
;
.
=
==
∂yi
σi2 ∆
∂yi
σi2 ∆
Je trouve ensuite
2
σa∗
=
S
∆
;
σb∗ =
Sxx
.
∆
(11.20)
Cette méthode élémentaire ne permet pas de trouver la covariance de a∗ et b∗ ; je citerai simplement
le résultat : σa∗b∗ = −Sx /∆.
Les formules (11.19) et (11.20) se trouvent assez couramment programmées sur les calculettes.
D’autre part, le système linéaire des équations normales définissant a∗ et b∗ fait intervenir la
matrice :
·
¸
Sxx Sx
M=
,
Sx
S
Je sais déjà que det M = ∆ et je calcule M−1 :
−1
M
1
=
∆
·
S
−Sx
−Sx
Sxx
¸
·
=
σa ∗2
σa∗b∗
σa∗b∗
σb ∗2
¸
.
Vous voyez que l’inverse de la matrice des équations normales est la matrice dite des « variancescovariances ». C’est un cas où le calcul de l’inverse d’une matrice s’avère fructueux.
11.6.2
Linéarisation
Bien des fonctions peuvent, par un changement de variable approprié, se ramener au modèle
linéaire du paragraphe précédent. Je vais encore traiter un cas particulier. L’étude théorique de la
cinétique d’une réaction chimique montre que la concentration d’un réactif dépend du temps selon
le modèle :
y = y0 e−αt .
L’expérience m’a fourni des valeurs yi relevées aux instants ti . Pour déterminer y0 et α, je linéarise
ce modèle en posant z = ln y :
z = ln y0 − αt ≡ β − αt.
Dans un calcul de moindres carrés habituel, chaque terme yi − fi est pondéré par l’inverse de
l’écart-type, σi . Quel est l’écart-type sur ln yi ? Il se déduit de la loi de propagation des erreurs :
σz =
∂z
σy
σy =
∂y
y
en supposant que chaque mesure souffre de la même incertitude. L’algorithme des moindres carrés
va fournir la meilleure valeur de β, avec son écart-type, σβ , mais c’est y0 qui a un sens physique ;
j’utilise encore la relation (11.14) pour trouver cette fois : σy0 = y0 σβ .
135
11.7. Qualité de l’ajustement
11.7
Qualité de l’ajustement
Après avoir déterminé les meilleures valeurs des paramètres a et b caractérisant un modèle
linéaire, je dois me demander si l’expérience vérifie ce modèle. On dispose pour cela de divers
tests statistiques. Je vais décrire le plus courant, le test dit du chi-deux. J’ai montré comment la
méthode du maximum de vraisemblance conduisait aux valeurs les plus probables de a et b en
rendant minimale la quantité
X µ yi − fi ¶2
S2 =
σi
où yi est un résultat de mesure et fi la valeur de y calculée par le modèle pour la même valeur
de la variable indépendante xi . Si le modèle était exact et les fluctuations absentes, S 2 serait nul.
Ce ne sera pas le cas en pratique, à cause des erreurs de mesure d’une part, et des défauts du
modèle d’autre part. J’espère néanmoins que S 2 est «petit». Comme il s’agit d’une somme sur
toutes les mesures (n en tout), S 2 augmente avec n. On peut raisonnablement s’attendre à ce que
yi − fi soit de l’ordre de σi et S 2 soit de l’ordre de n. Pour m’affranchir de l’effet du nombre de
mesures, je pourrais être tenté de considérer la quantité S 2 /n. Ce n’est pas tout à fait le bon choix,
comme le montre l’exemple de n = 2. Je peux toujours faire passer une droite exactement par deux
points, mais la perfection de cette ajustement n’est pas très convaincante. Il faut en fait rapporter
S 2 au « nombre de degrés de liberté » de l’expérience (ν), défini comme le nombre de résultats
indépendants (n) diminué du nombre de contraintes ou du nombre de paramètres ajustables (p en
général, deux pour l’exemple d’une fonction affine), ν = n − p. Une meilleure mesure de la qualité
de l’ajustement est donc fournie par le « chi-deux réduit »
n
χ2ν
S2
1 X
≡
=
ν
N −p i
µ
y i − fi
σi
¶2
.
D’après les considérations précédentes,χ2ν est une fonction aléatoire dont la valeur moyenne est
proche de 1. Aussi, une valeur de χ2 /ν voisine de 1 signale-t-elle un bon modèle. De façon un peu
plus précise, je remarque que l’une ou l’autre des quantités χ2 ou S 2 est une somme de carrés de
variables aléatoires gaussiennes ; elles obéissent donc à la loi du chi-deux. Je vais devoir décider
si, et avec quelle probabilité, la valeur de χ2ν déduite de mes mesures peut être le fait du hasard.
Je fais donc l’hypothèse que mon modèle est juste, je fais le choix d’un seuil ² et, muni d’une
table de la fonction de répartition de la loi de Pearson, je cherche un nombre u tel que pour une
variable T 0 (distribuée selon la loi du chi-carré) , P roba(T 0 > u) = ². Si χ2 /ν > u, c’est que l’écart
théorie-expérience est très improbable, ou que mon hypothèse est fausse.
Il est malheureusement assez fréquent que je ne connaisse pas de l’incertitude affectant les
yi : c’est le cas lorsque je n’ai pas les moyens de répéter les expériences nécessaires. Je suis alors
contraint de faire le raisonnement simplifié suivant. Je suppose que chaque mesure a la même
dispersion : σi = σ pour l’instant inconnue, je détermine les meilleures valeurs de a et b, puis je
recalcule σ comme
1 X
σ2 =
(yi − a∗ xi − b∗ )2
n−2
Les écarts-types
sur a∗ et b∗ peuvent alors être calculés par les formules (11.20) multipliées par le
p
facteur S/(n − 2).
Exemple. J’ai relevé les couples de valeurs suivantes :
x
y
1
-0,1
2
1,7
4
3,3
5
4,9
8
7,6
9
8,4
10
9,1
12
10,7
15
12,3
et je veux lisser les valeurs de y à l’aide du modèle y = ax + b, autrement dit, ajuster au sens
des moindres carrés les paramètres a et b pour que l’équation proposée représente au mieux les
résultats expérimentaux. Vous pouvez vous prêter au jeu suivant : reporter ces données sur papier
136
Chapitre 11. Traitement de données expérimentales
millimétré et déterminer « à l’oeil » la meilleure droite et les valeurs correspondantes de a et b,
avant de faire les calculs.
*1er cas (fréquent) : j’ignore les valeurs des erreurs commises sur les y, mais je pense qu’elles
sont toutes aléatoires et distribuées de façon identique. Je pose alors σi = σ = 1. Comme toutes
les formules qui donnent a∗ et b∗ sont homogènes en σ, la valeur exacte importe peu. Le calcul se
fait facilement avec une calculette ou avec Scilab. Dans ce logiciel, je défini deux vecteurs x et y
contenant les données. J’ai alors les instructions
S = length(x); Sx = sum(x); Sxx = sum(x.*x); Sy = sum(y); Sxy = sum(x.*y);
Delta = S*Sxx-Sx*Sx;
a = (S*Sxy - Sx*Sy)/Delta, b = (Sxx*Sy - Sx*Sxy)/Delta;
siga = sqrt(S/Delta); sigb = sqrt(Sxx/Delta)
Les résultats sont a∗ = 0.8903, σa = 0.0754, b∗ = −0.0958, σb = 0.645 ; les points expérimentaux
et la droite sont représentés sur la figure. Si la pente est bien déterminée, l’ordonnée à l’origine est
imprécise.
17
15
13
∆
∆
11
∆
9
∆
∆
7
∆
5
∆
3
∆
1
∆
−1
−1
1
3
5
7
9
11
13
15
17
Avec ces valeurs de a∗ et b∗ , je recalcule σ : j’admet que tout écart entre valeur expérimentale et
valeur calculée est due à une erreur aléatoire ; je retiens la moyenne du carré de ces écarts comme
valeur de σ 2 (comme indiqué plus haut, je considère qu’il n’y a que n − 2 = 7 mesures). Je trouve
que σ = 0.62, d’où je déduis les «bonnes» valeurs σa = 0.047, σb = 0.401. Les amateurs d’EXCEL
verront que ce logiciel, grâce à la fonction « DROITEREG », peut faire automatiquement les calculs
précédents.
*2ème cas (idéal) : Je sais que les valeurs de y sont entachées d’erreurs telles que l’écart-type
sur les 4 premières valeurs de y est de 0,4 et qu’il est de 0,6 sur les 5 dernières. J’obtiens alors :
S = 38, 89
Sx = 225, 0
Sy = 194, 86
Sxx = 1993, 06
Sxy = 1757, 08
d’où je tire a = 0, 911, σa = 0, 038, b = −0, 259, σb = 0, 272. La quantité S 2 vaut 11,04 soit un χ2ν
réduit (7 degrés de liberté) de 1,577. Les tables donnent une probabilité d’environ 0,14 d’obtenir
par hasard une valeur au moins aussi élevée. Le modèle est donc accepté.
11.8
Coefficient de corrélation
Une suite d’observations m’a fourni des couples de valeurs (xi , yi ), comme par exemple le
nombre de taches solaires observées pendant l’année i et le cours moyen du bourgogne à la vente
137
11.9. Ajustement sur une fonction linéaire de m paramètres
des Hospices de Beaune la même année. Je me pose la question de savoir s’il existe une relation
causale entre ces deux variables, en d’autres termes, je cherche à savoir si x est corrélé à y. Je vais
examiner le cas le plus simple, celui d’une corrélation linéaire. Si y dépend de x selon la loi linéaire
y = ax + b, les résultats du paragraphe précédent me permette d’estimer le coefficient a. Si x et y
sont indépendants, y ne doit, en moyenne, ni croître ni décroître quand x augmente, donc a = 0.
Il est aussi permis d’estimer les paramètres de la loi x = a0 y + b0 . Ils sont différents des précédents,
mais a et a0 sont liés si x et y sont corrélées. Si la corrélation entre x et y est parfaite, les deux
0
0
lois sont décrites par des fonctions inverses l’une de l’autre
√ et a = 1/a ou aa = 1. Je définis le
0
coefficient empirique de corrélation par la relation r = aa . En supposant tous les écarts types
égaux (une hypothèse qu’il est facile de lever), on trouve la formule ci-dessous.
Pn
(xi − < x >)(yi − < y >)
r ≡ pPn 1
.
(11.21)
Pn
2
2
1 (xi − < x >)
1 (yi − < y >)
|r| est compris entre 0 (pas de corrélation) et 1 (corrélation complète) : on considère que x et y
sont fortement corrélés lorsque que |r| est voisin de 1, pratiquement indépendants si r est proche
de 0, mais il est difficile de donner un critère vraiment quantitatif en l’absence d’hypothèses plus
précises sur la nature des erreurs entachant x et y.
11.9
Ajustement sur une fonction linéaire de m paramètres
Je généralise hardiment le raisonnement des paragraphes précédents, pour obtenir l’expression :
y(x) =
m
X
ak ϕk (x)
(11.22)
1
qui dépend linéairement des m paramètres ak , alors que les fonctions ϕk qui définissent la loi en x
sont quelconques. Je souhaite de nouveau rendre minimale la somme des carrés des écarts :
S2 =
n
X
[y obs − y calc ]2
i
i
σi2
1
yicalc
= y(xi ), la valeur prédite par le modèle. Il est commode
avec, pour chacune des n mesures,
d’introduire les notations suivantes. A est la matrice à n lignes et m colonnes d’éléments Aij =
ϕj (xi )/σi et b est le vecteur à n coordonnées bi = yiobs /σi . De plus, les paramètres ak sont
considérés comme les coordonnées d’un vecteur a. Les conditions pour que S 2 soit minimale sont :
n
X
¤
1 £ calc
yi − yiobs ϕk (xi ) = 0
2
σ
i=1 i
ce qui s’écrit :
Ma = β
;
Mik =
βj =
;
k = 1, 2, . . . , m.
n
X
1
2 ϕk (xi )ϕj (xi ),
σ
i=1 i
n
X
1
2 yi ϕk (xi ).
σ
i=1 i
Vous pourrez vérifier les relations
M = AT A
;
β = AT b
où AT désigne la matrice transposée de A. La matrice M est symétrique définie positive et le
système linéaire se résout facilement par la méthode de Cholesky. La solution formelle est
a = M−1 β = (AT A)−1 AT b.
138
Chapitre 11. Traitement de données expérimentales
Cependant, comme dans le cas à 2 inconnues, l’inverse de M présente un intérêt : l’élément diagonal [M−1 ]ii est la variance (carré de l’incertitude) du paramètre ai , alors que les éléments non
diagonaux [M−1 ]ik sont les covariances entre ai et ak .
139