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