0% ont trouvé ce document utile (0 vote)
8 vues416 pages

Ebook MéthodesNumériquesAvecPython 416p

Ce manuel présente les principes mathématiques et l'implémentation des méthodes de calcul scientifique en Python, en mettant l'accent sur des applications réelles. Destiné aux étudiants et professionnels, il combine théorie, algorithmes et exercices pratiques pour une compréhension approfondie. Les librairies NumPy et SciPy sont utilisées tout au long du texte, avec des scripts pédagogiques disponibles pour illustrer les concepts abordés.

Transféré par

Alain Rolland
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
8 vues416 pages

Ebook MéthodesNumériquesAvecPython 416p

Ce manuel présente les principes mathématiques et l'implémentation des méthodes de calcul scientifique en Python, en mettant l'accent sur des applications réelles. Destiné aux étudiants et professionnels, il combine théorie, algorithmes et exercices pratiques pour une compréhension approfondie. Les librairies NumPy et SciPy sont utilisées tout au long du texte, avec des scripts pédagogiques disponibles pour illustrer les concepts abordés.

Transféré par

Alain Rolland
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Michaël Baudin

Méthodes numériques
avec Python
Théorie, algorithmes, implémentation
et applications avec Python 3
Graphisme de couverture : Elizabeth Riba
Illustration de couverture : © Lauren Suryanata - [Link]

© Dunod, 2023
11 rue Paul Bert, 92240 Malako
[Link]
ISBN 978-2-10-085338-0
Avant-propos

Le calcul scientifique en Python


L’objectif de ce manuel est de présenter les principes mathématiques, les appli-
cations et la mise en œuvre de méthodes de calcul scientifique en Python. Ce texte
évoque, tour à tour, la pratique et la théorie : nous montrons l’utilisation de ces mé-
thodes dans le langage Python en utilisant les librairies NumPy et SciPy et l’analyse
théorique sur laquelle le calcul s’appuie.
Partout où cela est possible et pertinent, nous présenterons des applications réelles
plutôt que des exemples simplifiés ou théoriques. En effet, l’objectif de ce texte est de
montrer comment utiliser au mieux ces outils en pratique et, en particulier, dans la
pratique du chercheur et de l’ingénieur.

Utilisation du manuel
Ce livre s’adresse aux étudiants en deuxième année de licence ou au-delà, aux
ingénieurs et aux chercheurs. Pour en tirer profit, il est utile d’avoir déjà suivi un
cours de Python et de posséder des bases en analyse et en algèbre.
Le manuel peut être utilisé pour un cours d’un semestre composé de séances de
cours, de travaux dirigés et de travaux pratiques. Cela constitue le contenu pour un
module d’environ 10 à 15 séances de 3 heures, ce qui représente un total compris entre
30 et 50 heures d’enseignement.

Méthode pédagogique
Une des sources d’inspiration initiales de ce texte est le livre de Cleve Moler [104].
Ce livre s’appuyait lui-même sur une généalogie de livres dont le plus ancien est [46],
un livre pionnier mêlant les méthodes, les algorithmes et les applications. Traduire
en langage Python l’esprit de cette introduction au calcul numérique est rapidement
apparu une approche incomplète dans la mesure où ces ouvrages laissent, d’une part,
peu de place à la théorie et, d’autre part, aucune aux démonstrations. Puisque les
démonstrations sont au cœur des mathématiques, nous avons complété le texte par
des définitions et des théorèmes, associés à des preuves. L’objectif est de fournir au
lecteur non seulement des méthodes applicables, des scripts Python fonctionnels, mais
aussi une compréhension détaillée des calculs.
Dans le but de pouvoir concentrer la première lecture sur les concepts et non pas
sur les détails, les démonstrations sont généralement présentées à travers les exemples

3
4

Nombre d’étoiles Difficulté


Aucune Mise en œuvre directe du cours
* Un argument est requis
** Plusieurs arguments sont requis
*** Plusieurs raisonnements se combinent

Table 1 – Difficultés des exercices.

ou détaillées sous la forme d’exercices.


Les exercices qui accompagnent la partie théorique du cours constituent une partie
indispensable de l’apprentissage. Cela est une conséquence du choix de déplacer une
partie de l’analyse de la section principale vers les exercices, dans le but de concentrer
la présentation principale sur l’essentiel. Ces exercices sont triés par ordre de difficulté
croissante, en fonction des critères indiqués dans la table 1.
Certains lecteurs trouvent que les démonstrations sont parfois trop détaillées. La
qualité d’une démonstration tient essentiellement dans la qualité de son argumenta-
tion. En pratique, ce niveau de détail est bienvenu pour d’autres lecteurs, car cela
leur permet de comprendre un point qui leur a échappé.
Partout où le soupçon d’une astuce mathématique se laissait entrevoir, nous avons
préféré l’analyse rendant à la démonstration son caractère logique et cohérent avec
l’objectif poursuivi. C’est la raison pour laquelle, parmi plusieurs démonstrations pos-
sibles d’un théorème, nous avons toujours préféré la plus riche du point de vue pé-
dagogique, même si ce n’est pas la plus courte. Il s’ensuit des démonstrations aussi
rigoureuses que possible, mais occasionnellement longues : le lecteur nous le pardon-
nera plus volontiers (nous l’espérons), pourvu que cette démonstration ait pu révéler
des mécanismes intéressants.
Une partie significative de ce texte est consacrée au conditionnement des problèmes
que nous allons traiter. En effet, bien qu’il occupe une place importante dans le calcul
impliquant des nombres à virgule flottante, le conditionnement n’est pas un concept
lié uniquement au calcul numérique, mais un concept mathématique associé à l’idée
plus générale de changement de la solution lorsque les données sont perturbées. Cette
idée, associée au concept de problème bien posé, ne peut pas être ignorée lorsqu’on
utilise des méthodes numériques.
À chaque fois que cela est possible et pertinent, nous illustrons le concept mathé-
matique par une figure, que celle-ci soit créée par une librairie de dessin vectoriel ou
qu’elle soit créée en Python. L’exercice, pour le lecteur, consiste alors à observer la
figure en détail pour faire le lien entre la figure et la définition ou le théorème. C’est
un exercice que j’ai souvent demandé à mes étudiants, en précisant la grille de lecture
d’un tel graphique : l’axe des abscisses, l’axe des ordonnées, le contenu du graphique
et le lien avec le concept mathématique.
Dans certains contextes, la bibliographie francophone a des traditions dont cer-
taines sont appropriées et d’autres non. Lorsque le présent manuel dévie de la tradi-
tion, nous expliquerons notre choix de manière explicite. C’est, par exemple, le cas
pour la formule de Taylor page 38 ainsi que pour le théorème de la valeur intermédiaire
page 363.
Certaines sections présentent des concepts plus avancés et dont la compréhension
peut être difficile lors d’une première lecture, en fonction du niveau du lecteur. Nous
avons indiqué ces chapitres par un astérisque (*) dans le titre. C’est le cas par exemple
5

pour le chapitre 6.6, qui peut être passée lors d’une première lecture. Au contraire, le
lecteur désireux d’approfondir ses connaissances pourra utiliser ces indications pour
identifier les chapitres les plus avancés. Par exemple, cela peut être utile pour un
enseignant qui souhaiterait dispenser ce cours à un niveau supérieur.

Valeurs numériques
En langue française, le séparateur décimal est la virgule « , », ce qui est différent
de la langue anglaise dans laquelle le séparateur décimal est le point « . ». Nous
allons voir par la suite que le langage Python utilise la convention anglaise pour le
séparateur décimal et utilise la virgule pour d’autres objectifs. Dans le contexte de
ce livre, à la croisée des mathématiques et de l’informatique, dans le but de rendre le
texte cohérent, nous avons adopté la convention anglaise pour le séparateur décimal,
c’est-à-dire le point.
Un livre de calcul scientifique ne contenant aucune valeur numérique serait une
absurdité. En effet, nous allons analyser en détail pourquoi les nombres flottants avec
lesquels la plupart des utilisateurs de Python réalisent des calculs ont approximative-
ment 16 chiffres significatifs. Toutefois, écrire toutes les valeurs numériques avec une
précision aussi importante n’apporte pas nécessairement d’information pertinente.
Pour cette raison, nous arrondissons tous les résultats numériques au plus proche,
avec 4 chiffres significatifs. Cela signifie que, lorsque le nombre mathématique est
« 1.23456 », nous écrirons dans le texte « 1.235 ». De même, le nombre « 0.001234 »
possède 4 chiffres significatifs, car les zéros devant le premier chiffre non nul ne
comptent pas. Nous utiliserons occasionnellement la notation scientifique « 1.234 ×
10−3 ».
Une précision importante est que nous présentons 4 chiffres significatifs y compris
dans la plupart les résultats des sessions Python (mais Python utilise davantage de
chiffres significatifs dans ses calculs). C’est une des raisons pour lesquelles, si le lecteur
reproduit les scripts Python présentés dans ce texte, les valeurs numériques peuvent
être légèrement différentes. Une autre raison fréquente est que les sessions présentées
dans ce texte ont été exécutées sur différents systèmes (Linux et Windows), ce qui
peut produire des résultats légèrement différents. Ces différences sont la plupart du
temps sans conséquence. Plus de détails sur ce sujet seront présentés dans le chapitre
4 consacré aux nombres flottants.

Thèmes
Les différentes méthodes que nous allons détailler dans ce livre forment un réseau,
de telle sorte que certaines méthodes s’appuient les unes sur les autres. La figure 1
présente certains de ces liens. Tentons de les éclaircir.
D’une manière générale, deux approches mathématiques se font face : l’algèbre et
l’analyse. Dans notre contexte, deux sujets sont plus difficiles, plus fondamentaux ou
plus importants que d’autres, car ils sont à la base de nombreuses autres techniques : il
s’agit des systèmes d’équations linéaires (algèbre) et des équations différentielles ordi-
naires (analyse). D’un côté, les systèmes d’équations linéaires sont un thème essentiel
en algèbre linéaire et ouvrent la porte à de nombreuses applications ainsi qu’à d’autres
sujets, en particulier en algèbre linéaire numérique. D’un autre côté, les équations dif-
6

Équations
Différentielles
Ordinaires
Moindres
Carrés
Linéaires Interpolation Intégration

Systèmes
d'Équations Différenciation
Zéros
Linéaires Numérique

Vecteurs, Matrices Optimisation

Figure 1 – Liens entre les méthodes numériques.

férentielles ordinaires sont à la base de nombreux modèles physiques et ouvrent la


porte aux équations aux dérivées partielles.
La figure 1 montre bien que certains thèmes sont en réalité à la croisée de l’al-
gèbre et de l’analyse. Dans le contexte de l’interpolation par exemple, représenter une
fonction sur une base de fonctions donnée nécessite de considérer un espace vecto-
riel de dimension infinie. Puisque ce n’est pas pratique, nous ne représentons souvent
que la projection de cette fonction sur un espace vectoriel de dimension finie, pour
lequel l’algèbre fournit les outils de calcul appropriés. Nous laissons le soin au lecteur
d’établir de nouveaux liens entre ces méthodes.

Scripts d’accompagnement
Les librairies NumPy et SciPy sont d’excellentes librairies de calcul scientifique et
nous les utiliserons tout au long de cet ouvrage. Toutefois, dans certaines circons-
tances, nous pensons que les fonctionnalités dont nous avons besoin pour un thème
précis sont mieux illustrées avec des algorithmes simplifiés, moins robustes, mais dont
le code source est plus explicite.
C’est la raison pour laquelle nous avons développé une collection de scripts Py-
thon pédagogiques accompagnant le cours. Ces scripts sont disponibles sur le dépôt
[Link]/mbaudin47/menum_code. La table 2 présente la liste des modules. Ils sont
disponibles dans le répertoire Scripts-Eleves/Py3 du dépôt. Pour les utiliser, il est
nécessaire de mettre à jour la variable PYTHONPATH, de telle sorte que l’environnement
Python puisse connaître le nom du répertoire contenant les scripts. Configurer cette
variable peut dépendre du système d’exploitation. Sur Linux, par exemple, on peut
exécuter la ligne suivante dans le terminal :
1 export PYTHON PATH =" / home / monlogin / Scripts - Eleves / Py3 : $PYT HONPA TH "

Ces modules pédagogiques sont utiles pour l’étude des algorithmes, mais je ne
recommande à personne de les utiliser pour des études d’ingénierie ou bien pour
7

[Link] Nombres à virgule flottante


[Link] Équations non linéaires
[Link] Interpolation
[Link] Moindres carrés linéaires
[Link] Systèmes d’équations linéaires
[Link] Différentiation numérique
[Link] Équations différentielles ordinaires
[Link] Optimisation
[Link] Intégration

Table 2 – Modules fournis avec le manuel.

la recherche : leur objectif n’est ni la performance, ni la précision, ni la souplesse


d’utilisation, ni la robustesse. En effet, il existe une différence importante entre un
algorithme et son implémentation (nous reviendrons sur ce thème dans la section 5.9).
Toutefois, ces modules sont documentés et testés.
Pour chaque chapitre, les scripts sont disponibles dans le sous-répertoire Scripts.
Pour le chapitre intégration, par exemple, les scripts sont disponibles dans le répertoire
Integration/Scripts.
Pour les scripts les plus simples, nous fournissons parfois un script « squelette »,
contenant une base de travail que l’élève peut compléter durant les séances de travaux
pratiques en Python. Dans ce script, le travail consiste à remplacer les instructions
TODO par du code valide. L’objectif est de ne pas avoir à débuter par un script vide. Le
script suivant1 , par exemple, présente un modèle de script pour l’intégration numé-
rique. Nous indiquons dans une note de bas de page le nom du fichier correspondant
au script présenté dans l’exemple ou dans la figure correspondante.
1 # Import des modules
2 TODO
3

4 def myfunB (x) :


5 y = TODO
6 return y
7

8 Q, fcount = adapt sim_g ui ( myfunB , 0.0 , 1.0)

Le script suivant2 présente la solution du problème.


1 import numpy as np
2 from quadra ture import adap tsim
3

4 def myfunB (x) :


5 y = 1.0 / np . sqrt (1.0 + x ** 4)
6 return y
7

8 Q, fcount = adaptsim ( myfunB , 0.0 , 1.0)

Occasionnellement, nous distinguons une fonction mathématique de son implé-


mentation en Python. Dans ce cas, nous employons un changement de fonte pour
1Script Python : Integration/Scripts/Py3/[Link].
2Script Python : Integration/Scripts/Py3/[Link].
8

R Nombres réels, par ex. x = 1.234


R? Nombre réels non nuls : {x ∈ R, x = 6 0}
C Nombres complexes, par ex. z = 1 + 2i
N Entiers naturels, par ex. i = 1, 2, 3, . . .
Z Entiers relatifs, par ex. m = . . . , −2, −1, 0, 1, 2, . . .
Z? Entiers relatifs non nuls : {k ∈ Z tels que k = 6 0}
Re(z) La partie réelle du nombre complexe z ∈ C
Im(z) La partie imaginaire du nombre complexe z ∈ C
x, y, z Des nombres réels
i, j, k Des entiers
[a, b] L’ensemble : {x ∈ R | a ≤ x ≤ b}
(a, b) L’ensemble : {x ∈ R | a < x < b}
x Variable Python

Table 3 – Notations.

α A Alpha ι I Iota ρ P Rho


β B Beta κ K Kappa σ Σ Sigma
γ Γ Gamma λ Λ Lambda τ T Tau
δ ∆ Delta µ M Mu υ Y Upsilon
 E Epsilon ν N Nu φ Φ Phi
ζ Z Zeta ξ Ξ Xi χ X Chi
η H Eta o O Omicron ψ Ψ Psi
θ Θ Theta π Π Pi ω Ω Omega

Table 4 – Lettres grecques.

signifier cette distinction. Par exemple, nous notons sin la fonction mathématique
trigonométrique et sin son implémentation en Python.

Notations
Nous utiliserons les notations présentées dans la table 3. La table 4 présente les
lettres grecques utilisées dans l’ouvrage. Dans le contexte de l’algèbre linéaire, les
conventions présentées dans la table 5 sont adoptées. Elles correspondent à celles
employées dans [70] page 2 à une exception : nous notons en caractères gras les
vecteurs ainsi que le fait [132]. Ce livre a été préparé avec LATEX3 .

Remerciements
J’adresse des remerciements tout particuliers à Jean-Marc Martinez qui m’a fait
confiance pour commencer à enseigner ce type de méthodes et sans qui ce livre n’exis-
terait probablement pas. Ses commentaires et correction sur ce manuel ont étés très
bénéfiques. Mes remerciements vont à Bernard Hugueney qui m’a encouragé à appro-
fondir ce sujet. Je remercie les élèves de l’Institut supérieur d’électronique de Paris
3https ://[Link]/
9

α Scalaire (réel ou complexe) : lettre grecque


x Vecteur : lettre latine, minuscule, en gras
hx, yi Produit scalaire des vecteurs x et y
Rn Ensemble des vecteurs réels de dimension n
Rm×n Ensemble des matrices réelles à m lignes et n colonnes
x Vecteur : lettre latine, minuscule, en gras
diag Matrice diagonale
I Matrice identité
rang Rang d’une matrice
kxk Norme du vecteur x
P Matrice de permutation
Q Matrice orthogonale
L Matrice triangulaire inférieure
U Matrice triangulaire supérieure
A−1 Inverse de A
κ(A) Conditionnement de la matrice A
A† Pseudo-inverse de A

Table 5 – Notations pour l’algèbre linéaire.

(ISEP) qui, par leurs questions et leurs commentaires, m’ont stimulé dans la rédaction
de ce document. Mes remerciements s’adressent également aux enseignants qui m’ont
accompagné sur le module de méthodes numériques, en particulier Omar Al Hammal.
Je remercie le Dr. Jean-Pierre de Mondenard pour sa relecture du chapitre consacré
aux applications et en particulier à la prévention de la commotion cérébrale. Je sou-
haite remercier Régis Lebrun pour ses suggestions et corrections. Je tiens à remercier
Vincent Chabridon pour ses encouragements et ses corrections. Je remercie enfin mon
épouse Vi-An Baudin pour ses relectures, commentaires et corrections détaillées.
J’invite le lecteur à me transmettre ses suggestions à
[Link]@[Link].

Michaël Baudin,
Août 2022
Table des matières

I Prolégomènes au calcul scientifique 17


1 À quoi sert le calcul numérique ? 19
1.1 Prévention de la commotion cérébrale . . . . . . . . . . . . . . . . . . 19
1.2 Réel et modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3 Exemple d’essais en soufflerie . . . . . . . . . . . . . . . . . . . . . . 23
1.4 Essais difficiles, coûteux ou impossibles . . . . . . . . . . . . . . . . . 24
1.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.6 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2 Python 27
2.1 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2 Listes et tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3 Conditions et boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4 Fonctions et modules . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3 Outils mathématiques 35
3.1 Notation de Landau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2 Formule de Taylor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3 Condition d’optimalité . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.6 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

4 Flottants 49
4.1 Représentation binaire des entiers . . . . . . . . . . . . . . . . . . . . 49
4.2 Les nombres à virgule flottante . . . . . . . . . . . . . . . . . . . . . 52
4.3 Des fonctions utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.4 Flottants normalisés, dénormalisés . . . . . . . . . . . . . . . . . . . . 57
4.5 Flottants extrêmes et arrondi . . . . . . . . . . . . . . . . . . . . . . 59
4.6 En Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.7 Bit implicite (*) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.8 Erreurs d’arrondi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.10 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.11 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

5 Convergence, erreurs et conditionnement 71

11
12 Table des matières

5.1 Convergence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2 Erreur absolue et erreur relative . . . . . . . . . . . . . . . . . . . . . 75
5.3 Erreur directe et inverse . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.4 Conditionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.5 Les fonctions log1p et expm1 . . . . . . . . . . . . . . . . . . . . . . . 83
5.6 Conditionnement dans le cas vectoriel (*) . . . . . . . . . . . . . . . . 85
5.7 Conditionnement de la somme (*) . . . . . . . . . . . . . . . . . . . . 87
5.8 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.8.1 Fiabilité d’une batterie . . . . . . . . . . . . . . . . . . . . . . 88
5.8.2 Attaque cryptographique . . . . . . . . . . . . . . . . . . . . . 90
5.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.10 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.11 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

6 Vecteurs, Matrices 97
6.1 Vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.2 Produit scalaire et norme vectorielle . . . . . . . . . . . . . . . . . . . 100
6.3 Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.4 Produit matrice-vecteur . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.5 Norme matricielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6.6 Vecteur optimal (*) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6.7 Matrices particulières . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
6.8 Produit tensoriel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.9 Matrice identité, inverse et permutation . . . . . . . . . . . . . . . . 115
6.10 Orthogonalité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.11 Application : robotique . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.12 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
6.13 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
6.14 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

II Méthodes numériques 127


7 Systèmes d’équations linéaires 129
7.1 Dépendance et indépendance . . . . . . . . . . . . . . . . . . . . . . . 130
7.2 Rang et inverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.3 Conditionnement d’un système d’équations linéaires . . . . . . . . . . 134
7.4 Méthode de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
7.5 Décomposition LU avec permutations . . . . . . . . . . . . . . . . . . 142
7.6 Utiliser la décomposition PA=LU . . . . . . . . . . . . . . . . . . . . 146
7.7 La permutation des lignes . . . . . . . . . . . . . . . . . . . . . . . . 148
7.8 Analyse matricielle du pivot de Gauss . . . . . . . . . . . . . . . . . . 150
7.9 Le facteur de croissance (*) . . . . . . . . . . . . . . . . . . . . . . . 152
7.10 Chiffres significatifs dans la solution . . . . . . . . . . . . . . . . . . . 155
7.11 Effet géométrique d’une perturbation . . . . . . . . . . . . . . . . . . 157
7.12 Application : calcul d’un réseau électronique . . . . . . . . . . . . . . 161
7.13 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.14 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.15 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Table des matières 13

8 Interpolation 177
8.1 Le polynôme de Lagrange . . . . . . . . . . . . . . . . . . . . . . . . 180
8.2 Implémentation de l’interpolateur de Lagrange . . . . . . . . . . . . . 184
8.3 Nœuds de Chebyshev . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
8.4 Matrice de Vandermonde . . . . . . . . . . . . . . . . . . . . . . . . . 187
8.5 Interpolation linéaire par morceaux . . . . . . . . . . . . . . . . . . . 190
8.6 Erreur d’interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
8.7 La constante de Lebesgue (*) . . . . . . . . . . . . . . . . . . . . . . 198
8.8 Conditionnement de l’interpolation (*) . . . . . . . . . . . . . . . . . 200
8.9 Les splines (*) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
8.10 Application à un problème de fiabilité . . . . . . . . . . . . . . . . . . 203
8.11 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
8.12 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
8.13 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

9 Différentiation 213
9.1 Différences finies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
9.2 Limitation de la précision . . . . . . . . . . . . . . . . . . . . . . . . . 219
9.3 Origine de la limitation de la précision . . . . . . . . . . . . . . . . . 228
9.4 Conditionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
9.5 Implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
9.6 Extrapolation de Richardson (*) . . . . . . . . . . . . . . . . . . . . . 232
9.7 Améliorer la précision (*) . . . . . . . . . . . . . . . . . . . . . . . . . 235
9.8 Contre-exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
9.9 Application : chute dans un fluide . . . . . . . . . . . . . . . . . . . . 241
9.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.11 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.12 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

10 Moindres carrés linéaires 251


10.1 Hypothèses de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
10.2 Matrice de conception et modèles . . . . . . . . . . . . . . . . . . . . 255
10.3 Moindres carrés et norme euclidienne . . . . . . . . . . . . . . . . . . 257
10.4 Conditionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
10.5 Méthode des équations normales . . . . . . . . . . . . . . . . . . . . . 262
10.6 Conditionnement des équations normales . . . . . . . . . . . . . . . . 266
10.7 Décomposition QR (*) . . . . . . . . . . . . . . . . . . . . . . . . . . 268
10.8 Application : résistivité du cuivre . . . . . . . . . . . . . . . . . . . . 270
10.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
10.10 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
10.11 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

11 Intégration 277
11.1 Conditionnement de l’intégrale . . . . . . . . . . . . . . . . . . . . . . 278
11.2 Règles de quadrature . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
11.3 Règles plus précises . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
11.4 Formules de Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . 290
11.5 Le problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
11.6 Méthode composite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
14 Table des matières

11.7 Quadrature adaptative (*) . . . . . . . . . . . . . . . . . . . . . . . . 299


11.8 Performance (*) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
11.9 Traiter les difficultés . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
11.10 Fonction paramétrique . . . . . . . . . . . . . . . . . . . . . . . . . . 308
11.11 Applications : intégrer la loi normale . . . . . . . . . . . . . . . . . . 309
11.12 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
11.13 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
11.14 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

12 Équations différentielles ordinaires 319


12.1 EDO et quadrature . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
12.2 Systèmes d’EDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
12.3 Méthodes à un pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
12.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
12.3.2 Méthode d’Euler . . . . . . . . . . . . . . . . . . . . . . . . . 327
12.3.3 Méthode de Runge, méthode de Heun . . . . . . . . . . . . . . 330
12.3.4 Les méthodes de Runge-Kutta . . . . . . . . . . . . . . . . . . 332
12.4 Erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
12.5 Méthodes adaptatives (*) . . . . . . . . . . . . . . . . . . . . . . . . . 337
12.5.1 Principe d’une méthode adaptative . . . . . . . . . . . . . . . 337
12.5.2 Méthodes de Runge-Kutta d’ordre 2 et 3 . . . . . . . . . . . . 339
12.5.3 Contrôle du pas de discrétisation . . . . . . . . . . . . . . . . 340
12.6 Équations raides (*) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
12.7 EDO paramétrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
12.8 Champ de vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
12.9 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
12.9.1 Un modèle de frasil . . . . . . . . . . . . . . . . . . . . . . . . 347
12.9.2 L’attracteur de Lorenz . . . . . . . . . . . . . . . . . . . . . . 351
12.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
12.11 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
12.12 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

13 Équations non linéaires 361


13.1 Conditionnement d’une équation non linéaire . . . . . . . . . . . . . . 362
13.2 Méthode de la bissection (dichotomie) . . . . . . . . . . . . . . . . . 363
13.3 Implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
13.4 Nombre d’itérations de la bissection . . . . . . . . . . . . . . . . . . . 368
13.5 Méthode de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
13.6 Convergence de la méthode de Newton . . . . . . . . . . . . . . . . . 373
13.7 Méthode de la sécante . . . . . . . . . . . . . . . . . . . . . . . . . . 375
13.8 La condition d’arrêt . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
13.9 Application : gaz réels . . . . . . . . . . . . . . . . . . . . . . . . . . 378
13.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
13.11 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
13.12 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

14 Optimisation 383
14.1 Propriétés des minima . . . . . . . . . . . . . . . . . . . . . . . . . . 384
14.2 Méthode du nombre d’or . . . . . . . . . . . . . . . . . . . . . . . . . 387
Table des matières 15

14.3 Conditionnement de l’optimisation . . . . . . . . . . . . . . . . . . . 390


14.4 Application : conduction de la chaleur . . . . . . . . . . . . . . . . . 393
14.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
14.6 Notes et références . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
14.7 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394

15 Conclusion 399

Bibliographie 403

Index 413
Première partie

Prolégomènes au calcul
scientifique

17
Chapitre 1

À quoi sert le calcul


numérique ?

Les objectifs de ce chapitre sont multiples. Premièrement, ce chapitre a pour but de


définir le calcul numérique et sa position par rapport aux autres outils scientifiques qui
lui sont souvent associés. Deuxièmement, il tente de présenter le calcul numérique en
action, à travers ses applications et ses enjeux. Enfin, il tente de montrer l’importance
que cette discipline, à la croisée des mathématiques appliquées, de l’informatique et
de la plupart des sciences applicatives (par exemple la physique et la chimie), a prise
dans le monde contemporain.
Pour mieux cerner les applications pratiques de la simulation numérique, on peut
énumérer quelques exemples de problèmes d’ingénierie classiques. Il s’agit parfois de
réduire le poids (kg), d’assurer la fiabilité ou de réduire le coût (€). Presque toutes
les industries ont recours au calcul numérique : nous allons voir quelques-unes de ces
applications.

1.1 Prévention de la commotion cérébrale chez les


cyclistes
La conception des casques de cyclisme peut faire appel à la simulation numérique.
Comme nous allons le voir, ce problème d’ingénierie révèle beaucoup de caractéris-
tiques de la pratique du calcul numérique. En 2006, S. Kleiven a utilisé un modèle
numérique de la masse cérébrale permettant de prévoir, dans le volume crânien, la
pression en fonction de l’espace et du temps lorsqu’un crâne est soumis à un impact
[83]. Ce modèle est fondé sur la méthode des éléments finis, une méthode numérique
avancée souvent utilisée en mécanique. Dans la figure 1.1, le volume de la tête est
décomposé en différentes sous-parties. En commençant par les parties les plus ex-
ternes, ces volumes sont la boîte crânienne, les lobes, le cervelet et la moelle spinale1 .
Puisque le comportement mécanique de chaque partie est spécifique (par exemple, la
boîte crânienne se déforme moins facilement que la matière grise), il est nécessaire
de spécifier localement les propriétés mécaniques de chaque partie. Dans ce contexte,
1En ancienne nomenclature, la moelle spinale est nommée moelle épinière et le fluide cérébrospinal
est nommé fluide céphalorachidien.

19
20 Chapitre 1 • À quoi sert le calcul numérique ?

Matière grise cérébrale


Crâne
Fluide
Veines cérébrospinal
ponts

Cervelet
Moelle spinale
Os de la face
Os du cou

Figure 1.1 – Discrétisation d’une tête humaine [84]. Le crâne, le liquide cérébrospinal
et la matière grise. Illustration reproduite avec l’aimable autorisation de S. Kleiven.

on utilise le module d’Young qui caractérise la relation entre la déformation et la


contrainte exercée [85]. Chaque volume est associé à un maillage spécifique, qui est
une discrétisation de sa géométrie.
Ces travaux faisaient suite à des recherches initiées par le neurochirurgien sué-
dois Hans von Holst à la fin des années 1990 pour identifier des améliorations dans
les casques de protection individuels. Il a alors contacté l’École royale polytechnique
(KTH) de Stokholm pour initier un programme de recherche sur ce thème, ce qui a
mené Peter Halldin, un étudiant de cet institut, à commencer une thèse en biomé-
canique. C’est dans ce contexte que le travail de recherche de S. Kleiven débutera
quelques années plus tard [85] et mènera à l’article de 2006 que nous sommes en train
d’analyser.
Les impacts pris en compte dans l’étude sont caractérisés par leur direction fron-
tale, occipitale (à l’arrière du crâne) ou latérale et par leur intensité. L’objectif final
de ce travail était en particulier de pouvoir prévoir l’apparition de la commotion
cérébrale liée à l’impact sur la tête et pouvant mener, dans certains cas, à des séquelles
temporaires, définitives, ou à la mort.
Le chercheur souhaitait confronter les résultats du modèle numérique à la réalité.
Il était évidemment hors de question de projeter des cobayes humains contre des
obstacles pour observer l’apparition d’une commotion cérébrale. Pour résoudre cette
difficulté, l’auteur a utilisé dans [83] des données issues de mesures expérimentales sur
des cadavres. Toutefois, ces données doivent être corrigées pour prendre en compte le
changement potentiel de rigidité de la matière cérébrale après la mort. De plus, les
mesures pourraient être affectées par la présence d’air dans le fluide céphalo-rachidien,
ce qui rend difficile les comparaisons avec la simulation numérique.
Dans [84, 82], l’auteur a utilisé des images de football américain captées par la
télévision pour observer si on pouvait reproduire par la simulation les traumatismes
observés sur les joueurs. Il a utilisé des indicateurs comme l’accélération angulaire,
l’accélération de translation et la puissance d’impact pour observer si ces indicateurs
sont de bons prédicteurs de la pression intracrânienne et des déformations associées à
1.2 • Réel et modèle 21

la blessure. Les résultats montrent une corrélation statistique entre les déformations,
les contraintes et l’apparition de blessures dans certaines zones du cerveau, et en
particulier dans la matière grise.
En analysant les mécanismes générant des déformations et des contraintes dans le
cerveau, les chercheurs ont compris que celui-ci est bien plus sensible à des rotations
qu’à des déplacements linéaires. Il s’avère que, bien que la plupart des casques de
cyclisme soient correctement testés en laboratoire par des organismes de certification
vis-à-vis d’un impact linéaire, ce n’est pas ce type d’impact qui peut générer le plus
facilement une commotion : il y a souvent plus de dommages lors d’un impact avec
un angle entre le casque et l’obstacle, à cause de la rotation qui s’ensuit.
La boîte crânienne protège le cerveau d’intrusions extérieures. Du côté intérieur,
si le cerveau était directement en relation avec la boîte crânienne, le moindre choc
pourrait endommager le cerveau, qui est contraint à rester à l’intérieur de la boîte. Un
des rôles du fluide entre le cerveau et la boîte crânienne (liquide céphalo-rachidien)
est de limiter ces mouvements potentiellement brutaux. De plus, il peut permettre de
limiter l’impact d’une accélération de rotation. L’idée des chercheurs a alors été de
reproduire ce mécanisme naturel grâce à une couche de plastique mobile à l’intérieur
du casque. Cette couche plastique peut se déplacer d’environ 10 à 15 millimètres sur
la surface intérieure du casque. Ainsi, lors d’un choc avec un angle, la vitesse de
rotation du casque n’est pas immédiatement transmise à la boîte crânienne, mais elle
est amortie par l’interface plastique mobile, ce qui atténue la rotation. Pour valider
leur approche, le modèle numérique cérébral a été utilisé : il montre que la technique
peut permettre de limiter les déformations et les contraintes dans le cerveau.
Depuis, cette technologie a été commercialisée par une société [103] et de nombreux
casques de cyclistes en sont équipés. Bien sûr, la technologie a également été testée
en laboratoire par des essais mécaniques, mais il n’est pas si simple de reproduire en
laboratoire la dynamique de la masse cérébrale à l’intérieur de la boîte crânienne. Cet
exemple révèle l’utilisation conjointe de méthodes numériques et d’essais en labora-
toire dans l’objectif d’améliorer la sécurité.
Dans la section suivante, nous allons élargir la discussion pour analyser comment
les méthodes numériques et les essais en laboratoire se positionnent dans le panorama
des méthodes scientifiques.

1.2 Réel et modèle


Lorsque l’on cherche à comprendre le comportement d’un système réel, on peut
soit procéder à des expériences, soit créer un modèle du système, comme le montre la
figure 1.2. Les expériences, par exemple en laboratoire ou bien sur le terrain, mènent
à des résultats expérimentaux, souvent entachés d’erreurs de mesures. D’un autre
côté, le modèle peut être traité soit par une approche théorique, soit par simulation.
L’approche par simulation, qui est le sujet de ce cours, mène à des résultats de simula-
tion, qui sont fréquemment associés à des erreurs d’arrondis et, parfois, à des erreurs
d’approximation. Une difficulté importante est que la plupart des modèles théoriques
n’ont pas de solution explicite. On peut alors utiliser des modèles théoriques appro-
chés menant à des prédictions théoriques. Les trois types de résultats (expérimentaux,
théoriques ou issus de simulations numériques) peuvent être comparés, ce qui peut
mener à améliorer en retour ces trois approches.
22 Chapitre 1 • À quoi sert le calcul numérique ?

Modèle du
Système réel
système

Théories
Expériences Simulations approchées

Résultats Résultats Prédictions

Comparer et améliorer
expérience, simulation
et théorie

Figure 1.2 – Position des expériences, de la simulation numérique et des théories


approchées [30].

L’approche expérimentale est indispensable dans la mesure où c’est elle qui pos-
sède, en première instance, la plus grande proximité avec la réalité. Toutefois, c’est
une approche coûteuse en argent et aussi, nous allons le voir, en temps. De plus, les
moyens expérimentaux nécessaires pour pouvoir réaliser les mesures dans de bonnes
conditions de sécurité mènent parfois à s’éloigner du système réel.
L’approche par simulation numérique est, en pratique, plus aisée (nous espérons
convaincre le lecteur de cela à l’issue cet ouvrage) et souvent performante, notam-
ment grâce aux spectaculaires progrès de l’informatique, à la fois sur le plan logiciel
et matériel. Toutefois, elle peut s’avérer complexe à mettre en œuvre, par exemple
lorsque le coût de calcul (en termes de performance) s’avère élevé. Actuellement, la
relative démocratisation du calcul parallèle (distribué) et des supercalculateurs tend à
modérer ce coût. Surtout, le coût de développement des logiciels de calcul numérique
peut se traduire soit par des coûts internes de développement et de formation des
développeurs, soit par des coûts d’achat de licence. Enfin, la simulation numérique
est toujours associée à des approximations, que le présent cours va présenter en détail,
mais qui sont potentiellement difficiles à contrôler. L’approche théorique fondée sur
les méthodes exactes, analytiques, est souvent précise. Une limitation déterminante
de cette approche est que bon nombre de systèmes d’équations n’ont pas de solu-
tion exacte connue. De manière alternative, on peut, dans certains cas, utiliser des
systèmes de calcul symbolique, mais ceux-ci peuvent s’avérer moins performants.
Bien sûr, la plupart des ingénieurs et chercheurs utilisent les trois approches
lorsque cela est possible et il n’y a pas une approche qui serait, en toute généra-
lité, supérieure aux autres, comme nous allons le voir en détail par la suite. Dans la
section suivante, nous présentons un exemple d’essai expérimental classique : l’essai
en soufflerie.
1.3 • Exemple d’essais en soufflerie 23

1.3 Exemple d’essais en soufflerie : application aux


jantes de cycle

Une des forces limitant la progression de l’ensemble cycliste-bicyclette dans l’air


est la résistance due à la force de traînée aérodynamique [56, 18]. Celle-ci dépend en
particulier de la surface frontale de l’ensemble cycliste-bicyclette, du carré de la vitesse
(incluant la vitesse de la bicyclette et du vent), de la densité de l’air et d’un coefficient
nommé coefficient de traînée. Ce coefficient dépend de plusieurs facteurs, dont la
forme de l’ensemble cycliste-bicyclette. D’après Jean-Pierre Mercat, responsable de
recherche MAVIC, un cycliste roulant à 50 km/h sur le plat développe 90% de sa
puissance pour vaincre la force de traînée [68].
C’est la raison pour laquelle la société MAVIC utilise des techniques issues de
l’aéronautique dans le but de créer des jantes de cycle plus performantes comme la
Cosmic CXR. Parmi ces techniques, une des méthodes consiste à concevoir la forme
de la jante de telle sorte que l’ensemble pneu-jante suive un profil aérodynamique
minimisant le coefficient de traînée. Dans le but de minimiser la force de traînée, on
utilise des méthodes numériques issues de la mécanique des fluides. Ce type de profil
est parfois nommé profil « NACA », du nom du centre de recherche des USA chargé
d’élaborer des profils d’aile d’avion à partir des années 1920. En effet, le National
Advisory Committee for Aeronautics (NACA), créé en 1915, était un organisme de
recherche dont le but était de conduire des recherches dans le domaine de l’aéronau-
tique. Cet organisme est ensuite devenu en 1958 la National Aeronautics and Space
Administration (NASA) pour inclure les recherche dans le domaine de l’espace [107].
Une fois le profil dessiné, la maquette doit ensuite être testée pour observer ses
performances en situation réelle. Pour cela, la société MAVIC a collaboré avec le
CMEFE-HEPIA2, un centre de recherche actif dans les mesures aérodynamiques lo-
calisé à Genève en Suisse. La collaboration a duré 3 ans, de 2009 à 2012, en particulier
pour utiliser la soufflerie HEPIA et leurs compétences dans les mesures associées [68].
La figure 1.3 présente un essai de jantes MAVIC dans la soufflerie HEPIA. On y
distingue le cycliste sur sa machine placé dans un tunnel équipé de ventilateurs, une
situation qui simule l’air circulant autour du cycliste lorsqu’il se déplace : ici, le cy-
cliste est immobile et c’est l’air qui s’écoule autour de lui. On y distingue au premier
plan un tube métallique, nommé tube de Pitot, dont le but est de mesurer la vitesse
de l’air. D’après Jean-Pierre Mercat, les essais ont étés menés durant plus de 500
heures [68].
Une des difficultés associées à ces essais en soufflerie est leur coût. Puisque les souf-
fleries coûtent cher, elles sont peu nombreuses et seuls certains laboratoires, comme
le CMEFE-HEPIA, en disposent. Il n’est pas facile d’indiquer précisément le prix de
l’utilisation d’une telle soufflerie, car les investissements sont généralement associés à
la fois à l’achat du matériel, mais également au considérable investissement humain
associé à ce type d’équipement nécessitant de grandes compétences expérimentales.
Frédéric Grappe ([56], page 9) indique la somme d’environ 100 000 Francs par jour
en 2000, un montant équivalent à environ 20 000 €par jour en 2021. Toutefois, en
comparaison d’autres essais, ce coût peut paraître acceptable, voire insignifiant, ce
que nous allons voir dans la section suivante.
2
[Link]
24 Chapitre 1 • À quoi sert le calcul numérique ?

Figure 1.3 – Essais en soufflerie de jantes MAVIC. Avec l’aimable autorisation de


la soufflerie HEPIA Genève, de MAVIC et de [Link].

1.4 Essais difficiles, coûteux ou impossibles


Dans certaines situations, les essais sont très coûteux, voire impossibles à réaliser.
Le but de cette section est de présenter quelques exemples d’essais expérimentaux de
ce type, les difficultés associées et leur position par rapport à la simulation numérique.
Les essais de chocs de voiture ou crash-test sont des essais destructifs ayant pour
objectif d’observer et mesurer les effets d’un choc sur un véhicule [59]. Aux États-Unis,
le programme New Car Assessment Program (ou NCAP) est créé en 1979 dans le but
de créer des automobiles plus sûres pour le véhicule lui-même et pour ses occupants. Ce
test consistait en un choc frontal à 35 mph, soit environ 56 km/h. Dans le programme
européen EURO-NCAP de 2020 les véhicules sont projetés de face contre un obstacle
fixe ou mobile. Un autre test consiste à projeter un obstacle mobile sur le côté du
véhicule à la vitesse de 60 km/h. La dynamique de déformation du véhicule se déroule
en une fraction de seconde. Ces essais ont l’inconvénient de coûter plutôt cher, et c’est
une des raisons pour laquelle la simulation numérique par la méthode des éléments
finis est utilisée [59]. La simulation permet en effet de comprendre la dynamique plus
en détail, ainsi que de réduire le nombre d’essais nécessaires.
On peut citer d’autres exemples d’essais coûteux. Dans le cadre du programme
Apollo, le centre de recherche de la NASA, à Langley (en Virginie, aux États-Unis),
a été utilisé pour tester l’atterrissage lunaire d’un véhicule. Ce site expérimental a
ensuite été utilisé pour tester la robustesse d’autres équipements. Par exemple, en
1984, trois avions de transport Boeing 707 ont étés testés dans le cadre d’essais de
chute verticale [76].
Entre les phases d’essais et de commercialisation, l’étape de qualification d’un
1.5 • Conclusion 25

produit peut être utilisée pour observer le comportement de l’objet en conditions


réelles. Durant cette phase, l’objet à qualifier est équipé de capteurs, ce qui peut
permettre de détecter et de corriger des problèmes qui n’ont pas été identifiés lors
des essais préalables. Une telle situation a eu lieu dans le cadre du programme de
lancement de satellites via le lanceur Ariane 5. En 1996, le vol de qualification du vol
501 d’Ariane 5 est un échec et 4 sondes sont perdues, d’une valeur de 370 millions
de dollars. De plus, le programme Ariane 5 est retardé d’un an [90]. La cause du
problème est un dysfonctionnement informatique.
Lorsque les essais sont impossibles, il faut trouver des alternatives. C’est le cas
de tous les essais associés à des défaillances de systèmes critiques. De toute évidence,
il n’est pas question de créer un accident de perte de réfrigérant primaire pour étu-
dier le comportement d’une centrale nucléaire de production d’électricité en situation
accidentelle. C’est pourquoi, dans le but de caractériser le comportement de la pre-
mière barrière de confinement de la radioactivité, des essais sur la gaine du crayon
combustible sont réalisés [64].
On peut avoir le sentiment a priori que ces essais difficiles ou impossibles ne sont
qu’une question de coût et qu’un investissement supplémentaire pourrait résoudre les
difficultés. En fait, dans certains cas, la durée de l’essai est beaucoup plus longue
que l’on pourrait le croire et cette durée ne peut pas être réduite facilement. Par
exemple, les deux sondes Voyager 1 et Voyager 2, lancées en août et septembre 1977,
ne survolent Saturne qu’en novembre 1980 et août 1981 [65]. La sonde Voyager 2 ne
s’approche de Neptune qu’en 1989, c’est-à-dire 12 ans après son lancement.
Après avoir réalisé des essais militaires de bombes nucléaires en Algérie, puis en
Polynésie, la France a arrêté définitivement en 1996 d’utiliser ce type d’essais [21].
Dans le but de maintenir la performance et la sûreté de ces armes, le Commissariat
à l’Énergie Atomique (CEA) a engagé un programme appelé « Simulation » [110].
Cela a mené à l’utilisation d’une famille de supercalculateurs parallèles à Bruyères-Le-
Chatel, les machines « TERA », un nom issu de teraflops, l’unité de mesure du nombre
d’opérations par seconde d’un calculateur. De plus, des équipements expérimentaux
comme le Laser MégaJoule ont étés créés. Ce laser est installé dans le Centre d’Études
Scientifiques et Technique d’Aquitaine (CESTA), un site du CEA localisé en Gironde.

1.5 Conclusion
Dans ce chapitre, nous avons vu le positionnement de la simulation numérique et
son utilité en complément des indispensables essais expérimentaux. L’objectif de ce
chapitre est de montrer au lecteur qui n’aurait utilisé que des méthodes de résolution
exactes ce que la simulation numérique peut apporter dans certaines applications.
Malheureusement, la simulation n’est pas la solution « miracle » et beaucoup de défis
théoriques et pratiques restent à résoudre. Une difficulté est le coût de simulation en
temps de calcul. Par exemple, il n’est pas rare qu’une simulation en dynamique des
fluides, menée sur des milliers de processeurs en parallèle, dure de plusieurs heures à
plusieurs jours, voire plusieurs semaines. Un autre problème est l’assurance dans la
qualité de la prédiction des simulations numériques. Sur ce sujet, un des thèmes de re-
cherche actuels est la validation des codes de calcul par comparaison avec les essais, un
sujet faisant partie de la vérification et validation des codes (appelée « V&V ») [137].
26 Chapitre 1 • À quoi sert le calcul numérique ?

1.6 Notes et références


Je remercie Jean-Pierre de Mondenard pour ses conseils dans la rédaction de la
section 1.1, dans le contexte de la chute de Romain Bardet survenue le vendredi 11
septembre 2020 lors de la treizième étape du Tour de France menant de Châtel-Guyon
au Puy Mary dans le Cantal.
Chapitre 2

Python

L’objectif de ce chapitre est de servir de base minimale à l’apprentissage du langage


Python pour le calcul numérique. Au détour de certains thèmes, nous découvrirons
des aspects spécifiques, parfois inattendus, du langage, en particulier pour les nombres
flottants.
Ce chapitre ne saurait se substituer à un véritable cours sur ce sujet. C’est pourquoi
nous conseillons au lecteur qui ne connaîtrait pas ce langage de consulter [112] et [34],
deux références très populaires et librement disponibles sur internet. Puisque le niveau
de programmation Python requis dans ce cours est plutôt minimal, seuls les premiers
chapitres de ces ouvrages sont nécessaires.
Pour installer la librairie Python, il existe de nombreux moyens. Une distribution
Python très populaire est la distribution Anaconda, disponible sur [Link]
tant pour Windows, Linux ou bien Mac. Ce cours s’appuie sur Python 3 et nous
utiliserons, de plus, les modules NumPy, SciPy et Matplotlib. Une bonne nouvelle
pour les plus pressés d’entre nous est que la distribution Anaconda, quoique pesante
en termes de taille de fichier, contient déjà les librairies dont nous avons besoin.
Sur les systèmes Linux, il est la plupart du temps facile d’installer Python en
utilisant le logiciel de paquets, comme Synaptic sur Debian, par exemple. Souvent,
le langage Python est déjà pré-installé sur ce système d’exploitation et il n’y a rien à
faire de particulier. Toutefois, il peut être commode d’installer une version spécifique
de Python. Sur Ubuntu par exemple, on peut installer Python 3.9 avec la commande :
1 sudo apt install pyt hon3 .9

Une fois la distribution Python installée, il est parfois nécessaire d’installer des
librairies particulières comme NumPy par exemple. Dans ce cas, on peut utiliser l’uti-
litaire pip qui permet de télécharger et installer des modules Python :
1 pip install numpy matp lotlib scipy spyder

Les scripts présentés dans ce manuel sont testés avec Python 3.9, NumPy 1.23,
SciPy 1.9 et Matplotlib 3.5.
Lorsqu’on écrit un code source en langage Python, il y a en fait peu de place pour
le style de programmation. Plus précisément, le style désigne la manière d’indenter les
blocs de code structurés, le lieu où on peut placer une ligne blanche, le choix de l’espace
blanc ou de la tabulation, le nombre maximum de caractères par lignes, la manière
de nommer les variables et beaucoup d’autres éléments. Ces éléments de style ne sont

27
28 Chapitre 2 • Python

pas imposés par le langage Python. Cependant, il est d’usage de suivre strictement
les conventions du Python Enhancement Proposal 8 ou PEP8 [118], comme nous
l’avons fait dans ce manuel. Pour faciliter ce travail, on peut utiliser le logiciel black1
qui formate automatiquement le fichier passé en argument en suivant les conventions
requises.

2.1 Variables
Après avoir ouvert l’interpréteur Python, nous obtenons une console commençant
par trois chevrons >>>, que l’on nomme le prompt. La session Python suivante2 pré-
sente quelques opérations arithmétiques élémentaires. Après le caractère « # », il y a
des commentaires qui ne sont pas exécutés par Python. Le point décimal « . » sépare
la partie entière et la partie fractionnaire. Insistons sur le fait, contrairement à la
langue française, ce n’est pas la virgule qui est le séparateur décimal en Python (nous
reviendrons sur ce sujet par la suite).
1 >>> x = 12.0 # A ffecter une variable
2 >>> x # Afficher la valeur de x
3 12.0
4 >>> y = 2 * x # On mu ltiplie x par 2
5 >>> y # Afficher la valeur de y
6 24.0
7 >>> print (y) # Afficher la valeur de y
8 24.0
9 >>> del y # Eff acer la variable y
10 >>> y
11 Traceba ck ( most recent call last ):
12 File " < stdin >" , line 1, in <module >
13 NameErr or : name ’y ’ is not defined
Le langage Python fournit plusieurs types de données, en particulier les nombres
à virgule flottante (ou « float ») et les entiers (ou « int »). Pour écrire le nombre
à virgule flottante 12, nous écrivons en général « 12.0 » dans le but de spécifier
explicitement sa nature, bien que le langage permette également la syntaxe « 12. ».
Lorsqu’on écrit « 12 », Python considère que c’est un entier. Nous verrons par la suite
que ces deux types de variables ont des comportements radicalement différents.
1 >>> x = 12.0
2 >>> type ( x)
3 < class ’ float ’ >
4 >>> x = 12
5 >>> type ( x)
6 < class ’ int ’ >

2.2 Listes et tuples


Dans cette section, nous introduisons deux structures de données complémen-
taires : les listes et les tuples.
1https ://[Link]/project/black/
2Script Python : Python/Scripts/Py3/[Link].
2.2 • Listes et tuples 29

Indice i 0 1 2
Variable a[i] a[0] a[1] a[2]
Valeur 9. 5. 11.

Table 2.1 – Indice, variable et valeur dans un tableau Python.

Pour définir une liste, on utilise les crochets « [ » et « ] », qui marquent le début
et la fin de la liste. La virgule « , » sépare les éléments de la liste. Dans la session
suivante3, la liste a est de longueur 3.
1 >>> a = [9.0 , 5.0 , 11.0]
2 >>> type ( a)
3 < type ’ list ’ >

Pour la liste précédente, les indices commencent à i=0 et terminent à i=2. La table 2.1
présente, pour chaque indice de 0 à 2, la variable correspondante ainsi que sa valeur.
C’est la raison pour laquelle la valeur correspondant à l’indice i=1 est la seconde
valeur de la liste, comme on le voit dans la session suivante.
1 >>> a = [9.0 , 5.0 , 11.0]
2 >>> a [1]
3 5.0
Une exception de type IndexError est retournée par l’interpréteur lorsque l’indice
est trop grand.
1 >>> a = [9.0 , 5.0 , 11.0]
2 >>> a [3]
3 Traceba ck ( most recent call last ):
4 File " < stdin >" , line 1, in <module >
5 Index Error : list index out of range

Un tuple est une collection d’objets. La virgule « , » sépare les éléments du tuple.
Les parenthèses « ( » et « ) » marquent le début et la fin du tuple. Une différence
importante avec la liste est qu’on ne peut pas changer le contenu d’un tuple. Dans
l’exemple suivant, la variable x est un tuple de longueur 3 contenant des entiers.
1 >>> x = (7 , 12 , 5)
2 >>> x
3 (7 , 12 , 5)
4 >>> type ( x)
5 < type ’ tuple ’ >

On peut se demander pourquoi utiliser un tuple, alors qu’une liste fournit les
mêmes fonctionnalités, avec l’avantage supplémentaire que l’on peut modifier le
contenu d’une liste (mais pas d’un tuple). Par exemple, si on doit créer un pro-
gramme capable de gérer la liste des élèves d’une classe, mais que cette liste n’est
pas connue à l’avance et peut changer au cours du temps, la liste semble, en effet, la
structure de données la plus appropriée.
En pratique, il y a des situations où l’on souhaite justement empêcher de modifier
le contenu d’une collection d’objets. Par exemple, supposons que l’on souhaite repré-
senter les bits 0 et 1 par les caractères "0" et "1". Puisqu’il n’existe aucun autre bit
3Script Python : Python/Scripts/Py3/[Link].
30 Chapitre 2 • Python

possible, la structure appropriée est le tuple et une exception sera générée lorsqu’on
tentera de modifier la collection de bits. En effet, c’est précisément dans le but de
générer une exception dans cette situation que le développeur préférera utiliser un
tuple plutôt qu’une liste.
En français, il y a une confusion possible, car le séparateur décimal est la virgule,
alors que le séparateur décimal en Python est le point. C’est ce qui explique pourquoi
la session suivante génère, de manière implicite, un tuple, au lieu du nombre à virgule
flottante auquel l’élève pourrait s’attendre.
1 >>> x = 12 ,5
2 >>> x
3 (12 , 5)

2.3 Conditions et boucles


Dans cette section, nous introduisons l’instruction if ainsi que les boucles fondées
sur les instructions while et for.
L’instruction if permet de créer une structure conditionnelle. Le caractère « : »
marque la fin de la condition du « if » et du « else ». À l’intérieur de chaque bloc,
on doit indenter avec quatre espaces blancs. On n’utilise ni trois espaces blancs, ni
cinq, ni une tabulation : exactement quatre espaces blancs. La condition suivante4
affiche "Negatif" ou "Positif ou nul" selon le signe de a.
1 if a < 0.0:
2 print ( " Negati f " )
3 else :
4 print ( " Positi f ou nul " )
En théorie, le langage Python n’oblige pas nécessairement à utiliser quatre espaces
blancs pour indenter correctement le script : on pourrait parfaitement utiliser une
tabulation. Pire, il est possible de mélanger les espaces blancs et les tabulations.
Toutefois, le problème de la tabulation est que sa longueur graphique, c’est-à-dire la
largeur physique que la tabulation occupe à l’écran, peut dépendre de l’encodage dans
lequel le texte est sauvegardé. C’est la raison pour laquelle la plupart des développeurs
utilisent l’espace blanc pour indenter leur code, car celui-ci est encodé de manière
presque universelle de la même manière sur tous les systèmes.
Dans la session suivante, on affecte le nombre à virgule flottante 0 à la variable a.
Puis, si a est négatif, on affiche « Negatif » et « Positif ou nul » sinon.
1 >>> a = 0.0
2 >>> if a < 0.0:
3 ... print ( " Negatif " )
4 ... else :
5 ... print ( " Positif ou nul " )
6 ...
7 Positif ou nul
Une boucle while s’exécute tant que la condition est vérifiée. Le caractère « : »
marque la fin de la condition du « while ». À l’intérieur du bloc, on doit indenter avec
quatre espaces blancs. Dans la session suivante5 , on utilise une boucle while pour
4Script Python : Python/Scripts/Py3/[Link].
5Script Python : Python/Scripts/Py3/[Link].
2.4 • Fonctions et modules 31

afficher les entiers de 1 à 4.


1 >>> n = 1 # Initia lisa tion
2 >>> while n < 5:
3 ... print ( n)
4 ... n = n + 1
5 ...
6 1
7 2
8 3
9 4

Pour définir des boucles for, nous utiliserons la plupart du temps la fonc-
tion range. L’instruction range retourne un itérateur (en Python 3). L’instruction
range(stop), où stop est un entier, retourne un itérateur sur la liste [0, 1, ..., stop -
1]. L’instruction range(start, stop), où start et stop sont deux entiers, retourne
un itérateur sur la liste [start, start + 1, ..., stop - 1]. En d’autres termes, il
s’agit des indices supérieurs ou égaux à start, mais strictement inférieurs à stop. La
session suivante crée deux itérateurs différents : le premier sur les indices 0, 1, ..., 4
et le second sur les indices 2, 3, 4.
1 >>> range (5)
2 range (0 , 5)
3 >>> range (2 , 5)
4 range (2 , 5)

La boucle for suivante s’exécute sur les indices i spécifiés par range. Le caractère
« : » marque la fin de l’instruction « for ». À l’intérieur du bloc, on doit indenter avec
quatre espaces blancs. Le script suivant montre comment utiliser une boucle for pour
afficher les entiers de 0 à 3.
1 for i in range (4) :
2 print (i)

Le script précédent produit le résultat suivant.


1 >>> for i in range (4) :
2 ... print ( i)
3 ...
4 0
5 1
6 2
7 3

2.4 Fonctions et modules


Dans cette section, nous introduisons la fonction Python. Nous introduisons éga-
lement les modules Python, qui sont des collections de fonctions. En particulier, nous
présentons le module pylab de la librairie Matplotlib que nous utilisons pour créer
des graphiques.
L’instruction def permet de définir une fonction. Le caractère « : » marque la
fin de la définition de la fonction. À l’intérieur d’une fonction, on doit indenter avec
quatre espaces blancs.
32 Chapitre 2 • Python

1 def m afon cti onsq uar e (x) :


2 y = x ** 2
3 return y

Pour évaluer la valeur de la fonction mafonctionsquare au point x=2.0, il suffit


de l’invoquer de la manière suivante :
1 >>> mafon ctio nsq uare (2.0)
2 4.0

Un module Python est un fichier .py contenant plusieurs fonctions. Par exemple,
nous utiliserons parfois le module math, un module Python fournissant de nombreuses
fonctions mathématiques comme les fonctions exponentielle, logarithme, sinus, cosi-
nus, etc. Dans l’exemple suivant, on utilise la fonction sqrt pour évaluer une racine
carrée. L’instruction import permet d’utiliser la fonction sqrt du module math.
1 >>> from math import sqrt
2 >>> sqrt (3.0)
3 1.73 2050 8075 7

Un autre module que nous utiliserons souvent est le module NumPy. La fonc-
tion linspace de ce module génère un tableau de nombres flottants. L’instruc-
tion linspace(start, stop, num) génère num valeurs régulièrement réparties entre
start et stop. Par défaut, la variable num est égale à 50. Dans le script suivant, la
variable x est un array NumPy.
1 >>> from numpy import linspace
2 >>> x = lins pace (0.0 , 1.0 , 10)
3 >>> print (x)
4 [ 0. 0.1111 1111 0.2222 2222 0.333 33333
5 0 .44444 444 0.55555 556 0.6666 6667 0.7777 7778
6 0 .88888 889 1. ]

Dans certains cas, il n’est pas pratique d’importer l’une après l’autre les fonc-
tions du module. Il peut alors être intéressant d’importer le module avec l’instruction
import. Pour évaluer les fonctions du module, on doit faire précéder le nom de la
fonction par le nom du module et utiliser un point « . » entre les deux.
1 >>> import numpy
2 >>> x = numpy . linsp ace (0.0 , 1.0 , 10)

Du point de vue du style, la difficulté avec l’instruction précédente est qu’elle peut
être longue en termes de nombres de caractères. Le script suivant présente une autre
manière de procéder, qui permet de donner un nom abrégé au module que l’on souhaite
utiliser. Dans le script suivant, on importe le module NumPy et on lui donne le nom
abrégé np.
1 >>> import numpy as np
2 >>> x = np . linspace (0.0 , 1.0 , 10)

Les scripts Python précédents sont parfaitement équivalents du point de vue fonc-
tionnel.
Nous utiliserons la librairie Matplotlib pour réaliser des graphiques. Un de ses
sous-modules, le module pylab, permet de réaliser des graphiques de manière très
2.5 • Conclusion 33

La fonction sin
1

y
−1
0.0 2.5 5.0
x

Figure 2.1 – Une fonction bien connue dessinée avec le module pylab de
Matplotlib.

intuitive. Le script suivant6 permet de créer un graphique représentant la fonction


sinus sur l’intervalle [0, 2π].
1 import pylab as pl
2 from math import pi
3 from numpy import sin , lin space
4 x = linspace (0.0 , 2 * pi , 100)
5 y = sin (x ) # Une seule instr uction vectoris ee
6 pl . plot (x , y , " -" )
7 pl . xlabel ( "X " )
8 pl . ylabel ( "Y " )
9 pl . title ( " La fonction sin " )
10 pl . show ()
Le script précédent produit une figure proche de la figure 2.1. En effet, pour les
besoins esthétiques de ce livre, nous avons configuré Matplotlib pour utiliser les
mêmes fontes LATEX que le corps du texte, tant du point de vue du style que de la
taille. Les couleurs des traits des courbes sont déterminés de manière automatique,
mais on peut forcer la couleur en spécifiant celle-ci dans le troisième argument d’entrée
de la fonction plot. Par exemple, l’instruction [Link](x, y, "r-") force le choix
de la couleur rouge, d’où le « r » pour red en anglais.

2.5 Conclusion
Pour aller plus loin dans la programmation Python, on peut consulter [112] et [34].
Par exemple, bien que cela ne soit pas nécessaire pour la suite du cours, la maîtrise
des classes en Python semble une compétence fondamentale. Dans le domaine du
traitement de données, la librairie Pandas est souvent utilisée [102]. Une autre librairie
très populaire en apprentissage statistique est la librairie Scikit-Learn [143].

6Script Python : Python/Scripts/Py3/[Link].


Chapitre 3

Outils mathématiques

Dans ce chapitre, nous présentons trois outils mathématiques qui serviront pen-
dant toute la durée de ce cours : la notation de Landau (grand O), la formule de
Taylor et les conditions d’optimalité.
L’outil que nous utiliserons le plus est certainement la formule de Taylor, qui sera
omniprésente dans ce cours, surtout dans le contexte de l’analyse. Dès le chapitre
5, une des méthodes pour déterminer le conditionnement d’une fonction consiste à
utiliser son développement de Taylor. Nous l’utiliserons également dans le chapitre 8
sur les méthodes d’interpolation. Plus précisément, le théorème 8.7 page 193, nommé
formule de Taylor pour l’interpolation, présente une expression de l’erreur de l’inter-
polation polynomiale globale. Puisque certaines méthodes d’intégration sont fondées
sur l’interpolation polynomiale, nous verrons à nouveau la formule de Taylor appa-
raître dans le chapitre 11. La formule de Taylor sera aussi utilisée dans le chapitre
9 sur les méthodes de différentiation, ainsi que dans le chapitre 12 sur les équations
différentielles ordinaires.
Nous allons voir qu’il existe plusieurs formulations différentes de la formule de
Taylor. Toutefois, une expression particulièrement pertinente dans notre contexte est
celle utilisant la notation de Landau, car celle-ci permet d’obtenir des résultats ap-
propriés dans le contexte du développement des méthodes numériques. De plus, la
notation de Landau est utilisée dans le contexte de la définition de la complexité d’un
algorithme, un sujet sur lequel nous reviendrons dans le chapitre 6. C’est pour cette
raison que nous présentons d’abord la notation de Landau dans la section 3.1, puis la
formule de Taylor dans la section 3.2.
Enfin, le troisième sujet évoqué dans ce chapitre est la présentation des conditions
d’optimalité dans la section 3.3. Nous utiliserons ces conditions dès le chapitre 9 pour
déterminer le pas de différentiation optimal d’une méthode de différences finies. Ces
conditions sont aussi utilisées dans l’exercice 12.8 dans lequel nous analysons le pas
optimal d’une méthode numérique pour résoudre une équation différentielle ordinaire.
Puisque nous revoyons ce sujet dans le chapitre 14 consacré exclusivement à l’opti-
misation, nous pourrions sur le plan strictement technique, reporter la présentation
de ce sujet à ce moment. D’une part, cela serait problématique, puisque nous avons
besoin de ces résultats avant de parcourir ce chapitre. D’autre par, il peut être béné-
fique pour des raisons pédagogiques de se familiariser avec ces concepts au plus tôt
et de ne pas traiter les méthodes d’optimisation au début du cours, dans la mesure
où d’autres sujets sont à la fois plus fondamentaux et plus difficiles.

35
36 Chapitre 3 • Outils mathématiques

2
|f(x)| | sin(x)|
M|g(x)| |x|

y
0
-δ 0 δ x −2 −δ 0 δ 2
x

Figure 3.1 – À gauche, la notation grand O pour x → 0. À droite, la fonction sinus


est dominée par x quand x → 0.

3.1 Notation de Landau


La notation de Landau est une famille de comparaisons asymptotiques entre fonc-
tions. Dans cette section, nous présentons la notation de Landau, appelée grand O.
Cette notation peut être utilisée pour simplifier différentes approximations et en par-
ticulier la formule de Taylor que nous allons utiliser tout au long de ce livre. On peut
aussi utiliser la notation de Landau pour exprimer le nombre d’opérations arithmé-
tiques (additions, soustractions, multiplications et divisions) dans un algorithme. Il
existe une autre notation de Landau petit o que nous n’utiliserons pas dans ce livre,
mais sur laquelle nous reviendrons lorsque nous analyserons la formule de Taylor.
La notation de Landau possède deux variantes. La première analyse le comporte-
ment d’une fonction au voisinage de zéro et la seconde vers l’infini. Nous commençons
par présenter la notation de Landau au voisinage de zéro.

Définition 3.1 (Notation grand O au voisinage de zéro). Soient f et g deux fonctions


de R dans R. On note f (x) = O(g (x)) quand x → 0 s’il existe un nombre fini M > 0
et un nombre réel δ > 0 tels que |f (x)| ≤ M |g (x)| pour tout réel x tel que |x| ≤ δ.

L’exercice 3.3 met en application la définition précédente. La définition signifie que


la fonction f est dominée par la fonction g quand x tend vers zéro (à une constante
multiplicative près). La partie gauche de la figure 3.1 illustre la définition précédente.
On observe que, dans l’intervalle [−δ, δ], la fonction M |g(x)| (représentée par le trait
discontinu) est plus grande que la fonction |f (x)| (représentée par le trait plein). En
dehors de cet intervalle, les deux fonctions peuvent avoir un ordre différent, puisque la
définition ne concerne que l’intervalle [−δ, δ]. Il n’est pas nécessaire d’utiliser la valeur
la plus grande possible de δ : le théorème ne le demande pas. En particulier dans la
figure 3.1, on n’est pas contraint d’utiliser la valeur de δ correspondant exactement à
l’intersection entre la fonction |f (x)| et M |g(x)|, dans la partie gauche de la figure.

Exemple 3.1 (Comportement de la fonction sinus au voisinage de zéro). On a


sin(x) = O(x) quand x → 0. En effet, pour tout x ∈ [−1, 1], on a | sin(x)| ≤ |x|.
On peut donc appliquer la définition avec f (x) = sin(x), g(x) = x, δ = 1 et M = 1.
En d’autres termes, la fonction sinus est dominée par x quand x tend vers zéro.
La partie droite de la figure 3.11 présente la fonction | sin(x)| pour x ∈ [−2, 2].
1Script Python : Problemes/Scripts/Py3/[Link].
3.1 • Notation de Landau 37

|f(x)| 5x 3 − 6x 2 + 3
M|g(x)| 25 14x3

y
0
x0 x 0.5 1.0 1.5
x

Figure 3.2 – À gauche, notation grand O pour x → ∞. À droite, la fonction


5x3 − 6x2 + 3 est dominée par (un multiple de) x3 quand x → +∞.

On observe que l’on peut appliquer la définition 3.1 avec la fonction g (x) = x, la
constante M = 1 et le seuil δ = 1.

La seconde version de la notation de Landau analyse le comportement d’une fonc-


tion vers l’infini.

Définition 3.2 (Notation grand O vers l’infini). Soient f et g deux fonctions de R


dans R. On note f (x) = O(g(x)) quand x → ∞ s’il existe un nombre fini M > 0 et
un nombre réel x0 tel que |f (x)| ≤ M |g(x)| pour tout x tel que x > x0 .

La définition signifie que la fonction f est dominée par la fonction g quand x tend
vers l’infini (à une constante multiplicative près). La partie gauche de la figure 3.2
illustre la définition précédente. On observe que, à droite de x0, la fonction M |g(x)|
(représentée par le trait discontinu) est plus grande que |f (x)| (représentée par le
trait plein). Il n’est pas nécessaire d’utiliser la valeur la plus petite possible de x0 : le
théorème ne le demande pas. En particulier dans la figure 3.2, on n’est pas contraint
d’utiliser la valeur de x0 correspondant exactement à l’intersection entre la fonction
|f (x)| et M |g(x)|, dans la partie gauche de la figure.

Exemple 3.2 (Comportement d’un polynôme vers l’infini). On a 5x3 − 6x2 + 3 =


O(x3 ) quand x → ∞. En effet, pour tout x > 1, on a :

|5x3 − 6x 2 + 3| ≤ |5x3 | + |6x 2 | + |3| (par l’inégalité triangulaire)


≤ 5x3 + 6x2 + 3 (puisque x > 1)
≤ 5x3 + 6x3 + 3x3
≤ 14x3.

En effet, pour tout x > 1, on a x 2 ≤ x 3 et 1 ≤ x3 . On peut donc appliquer la


définition 3.2 avec la fonction g(x) = x3 , la constante M = 14 et le seuil x0 = 1.
En d’autres termes, la fonction f est dominée par x3 quand x tend vers l’infini.
La partie droite de la figure 3.22 présente la fonction f (x) = 5x3 − 6x2 + 3 pour
x ∈ [0.5, 1.5]. Puisque ce polynôme est strictement positif sur l’intervalle [0.5, 1.5],
nous n’avons pas besoin de la valeur absolue. Il est possible de choisir les paramètres
M et x0 de telle sorte que les deux courbes se croisent au point x = x0. Observons,
2Script Python : Problemes/Scripts/Py3/[Link].
38 Chapitre 3 • Outils mathématiques

Notation de Landau quand x → +∞


5x3 − 6x2 + 3
5 5x3

y
0 x 0 =0.7071
0.5 1.0
x

Figure 3.3 – Le polynôme 5x3 − 6x 2 + 3 est dominé par (un multiple de) x3 quand
x → +∞. On peut choisir les valeurs de x0 et M avec exactitude comme dans la
figure, mais cela n’est pas obligatoire.


par exemple, que la solution positive de l’équation 5x3 − 6x2 + 3 = 5x3 est x0 = 2
2
=

0.7071 avec 4 chiffres significatifs. L’autre racine de cette équation est − 22 , qui est
strictement négative. Par conséquent, on peut démontrer que, pour tout x > x0 , on a
|5x3 − 6x 2 + 3| ≤ 5x3 ce qui est illustré dans la figure 3.3 3. Toutefois, insistons sur le
fait que le choix exact des paramètres M et x0 n’est pas indiqué dans la définition :
seule une inégalité est demandée, ce qui laisse souvent une souplesse importante dans
le choix des paramètres.

Dans l’exercice 3.3, nous étudions le comportement du polynôme 5x3 −6x2 +3 pour
x → 0. Il est parfois fastidieux d’identifier les paramètres M , δ et x0 dans chaque cas
particulier. Le théorème suivant permet de simplifier plusieurs opérations courantes
dans la manipulation de la notation de Landau.

Théorème 3.1 (Notation grand O dans R). Soient f et g deux fonctions de R dans
R. Soit α un réel non nul. Alors, pour x → 0 ou pour x → ∞, on a les égalités
suivantes :
— somme : O(f (x)) + O(g (x)) = O(|f (x)| + |g(x)|) ;
— produit : O(f (x))O(g (x)) = O(f (x)g(x)) ;
— multiplication par une constante : αO(f (x)) = O(αf (x)) = O(f (x)) ;
— valeur absolue : |O(f (x))| = O(|f (x)|) = O(f (x)).

Dans l’exercice 3.1, il est demandé de démontrer ce théorème. Dans la section


suivante, nous allons présenter la formule de Taylor. Nous allons voir qu’une des
variantes de la formule utilise la notation de Landau au voisinage de zéro.

3.2 Formule de Taylor


Dans ce paragraphe, nous présentons la formule de Taylor, une équation qui sera
très utilisée dans la suite. Il n’est pas exagéré de dire que la plupart des chapitres de
ce livre sont fondés sur ce théorème, ce qui montre son importance. En particulier,
nous l’utiliserons dans les méthodes d’approximation de la dérivée d’une fonction,
3Script Python : Problemes/Scripts/Py3/[Link].
3.2 • Formule de Taylor 39

1
ξ = 0.5560
f(x)

y
0

a ξ b x
0 1
x

Figure 3.4 – À gauche, le théorème de Rolle. À droite, application du théorème de


Rolle à la fonction f (x) = (1 − x 2) sin(x) avec a = 0 et b = 1.

ainsi que dans les méthodes d’interpolation, d’intégration et pour les méthodes pour
les équations différentielles ordinaires.
Nous commençons par rappeler la définition d’une classe de fonctions et le théo-
rème de Rolle. Dans la définition suivante, on note f (n) la n-ième dérivée de la fonc-
tion f .

Définition 3.3 (Classe d’une fonction). Soit f une fonction réelle sur R. On dit que
f est de classe C n(R) si f, f 0 , . . . , f (n) existent et sont continues sur R.

Le théorème de Rolle occupe une place centrale dans la démonstration de la for-


mule de Taylor, c’est pourquoi nous commençons par rappeler ce résultat fondamental.

Théorème 3.2 (Théorème de Rolle). Soit f une fonction de classe C1 (R). Soient
a et b deux réels tels que a < b. Si f (a) = f (b) = 0, alors il existe ξ ∈]a, b[ tel que
f 0 (ξ) = 0.

Ce théorème ne sera pas démontré dans ce document. Un point important dans


le théorème de Rolle est que le point ξ est strictement compris entre a et b : on a
ξ ∈]a, b[. Ce théorème est illustré dans la partie gauche de la figure 3.4. On observe
que la pente de la fonction est nulle au point ξ .

Exemple 3.3 (Application du théorème de Rolle). Considérons la fonction f (x) =


(1 − x2 ) sin(x) pour tout x ∈ R présentée dans la partie droite de la figure 3.44 .
On a f(0) = sin(0) = 0 et f (1) = sin(1)(1 − 1) = 0. On peut donc appliquer le
théorème de Rolle avec a = 0 et b = 1 : il existe ξ ∈]0, 1[ tel que f0 (ξ) = 0. On
a f 0(x) = (1 − x 2 ) cos(x) − 2x sin(x) pour tout x ∈ R. Il ne semble pas évident de
déterminer une formule explicite de la solution de l’équation f 0 (ξ) = 0. C’est pour
cette raison que l’on utilise une méthode numérique, qui produit la solution ξ = 0.5560
avec 4 chiffres significatifs.

La formule de Taylor est fondée sur un polynôme qui approche le comportement


local de la fonction f .

Définition 3.4 (Polynôme de Taylor). Soit f une fonction de classe C n (R). Soient
a et b deux réels tels que a < b. Le polynôme de Taylor de degré n au point a est le
4Script Python : Problemes/Scripts/Py3/[Link].
40 Chapitre 3 • Outils mathématiques

polynôme Pn défini par :


f00 (a) f (n)(a)
Pn (x) = f (a) + f 0(a)(x − a) + (x − a)2 + . . . + (x − a)n (3.1)
2! n!
pour tout x ∈ [a, b].
En toute rigueur, nous devrions noter Pn,a , car le polynôme est paramétré par
le point où nous considérons l’approximation, mais nous préférons conserver une no-
tation plus simple. Le polynôme de Taylor peut également s’écrire sous la forme
suivante :
n
X f (i)(x)
Pn(x) = (x − a)i (3.2)
i=0
i!

pour tout x ∈ [a, b]. Par construction, le polynôme de Taylor est une approximation
locale de la fonction f au sens suivant : au point x = a, les dérivées successives du
polynôme de Taylor sont égales aux dérivées de la fonction f au point a. Plus de
détails sur cette propriété sont donnés dans l’exercice 3.6, page 46.
La formule de Taylor n’est pas très compliquée à comprendre et à démontrer, mais
sa construction peut être mieux appréhendée à travers un exemple concret. Pour cette
raison, avant de voir le théorème, observons la construction du polynôme de Taylor
dans l’exemple suivant.
Exemple 3.4 (Démonstration de la formule de Taylor à l’ordre 2 appliquée à la
fonction sinus). Considérons la fonction f (x) = sin(x) pour tout x ∈ [0, 1/2]. Premiè-
rement, commençons par introduire le polynôme de Taylor associé à la fonction f au
point a = 0. Soit P1 le polynôme de Taylor de degré 1 au point a = 0. Par définition,
le polynôme de Taylor P1 est égal à P 1(x) = sin(0) + sin 0(0)x pour tout x ∈ [0, 1/2].
Puisque sin(0) = 0 et sin 0(0) = cos(0) = 1, on en déduit que P 1(x) = x pour tout
x ∈ [0, 1/2]. Deuxièmement, déterminons la valeur de la fonction f en x = 1/2 en
fonction du polynôme de Taylor P1. Il existe nécessairement un réel c tel que :
sin(1/2) = P1(1/2) + c(1/2) 2 . (3.3)
En effet, la solution de l’équation précédente est :
sin(1/2) − P1(1/2)
c= .
(1/2)2
Troisièmement, tentons de déterminer une expression plus simple de c. Soit F la
fonction définie par l’équation F (x) = sin(x) − P1 (x) − cx 2 pour tout x ∈ [0, 1/2].
On a P 1(0) = sin(0) par construction du polynôme de Taylor P1 . Donc F (0) = 0.
Puisque F (1/2) = 0 par définition de la constante c, le théorème de Rolle implique
qu’il existe ξ1 ∈]0, 1/2[ tel que F 0(ξ 1) = 0. La dérivée première de F est F 0 (x) =
cos(x) − P10(x) − 2cx pour tout x ∈ [0, 1/2]. Or P 10 (0) = cos(0) = 1 par construction du
polynôme de Taylor P 1. Cela implique F 0 (0) = 0. Le théorème de Rolle implique qu’il
existe ξ2 ∈]0, ξ 1[ tel que F 00(ξ 2) = 0. La dérivée seconde de F est F 00 (x) = − sin(x)− 2c
pour tout x ∈ [0, 1/2], car P100 (x) = 0 puisque P 1 est un polynôme de degré 1. Cela
implique − sin(ξ 2) − 2c = 0 et mène à l’équation c = − sin(ξ 2
2)
. On substitue l’équation
précédente dans l’équation 3.3, et on obtient :
sin(ξ2)
sin(1/2) = P1(1/2) − (1/2) 2 .
2
3.2 • Formule de Taylor 41

Comme nous venons de le voir sur un cas particulier, les propriétés du polynôme
de Taylor permettent d’obtenir le théorème suivant, qui montre que f peut être loca-
lement approchée par le polynôme de Taylor.
Théorème 3.3 (Théorème de Taylor avec reste de Lagrange). Soit f une fonction
de classe C n (R). Pour tout x ∈ R, pour tout h ∈ R, il existe ξ entre x et x + h, tel
que :
f 00(x) 2 f (n−1) (x) n−1 f (n) (ξ) n
f (x + h) = f (x) + f 0 (x)h + h + ... + h + h . (3.4)
2! (n − 1)! n!
La preuve de ce théorème est donnée dans l’exercice 3.8.
Remarque 3.1. Dans le théorème de Taylor, on écrit « il existe ξ entre x et x + h »
car le réel h peut être négatif de telle sorte que l’on ne peut pas écrire ξ ∈]x, x + h[.
On pourrait écrire « strictement entre x et x + h » car ξ 6= x et ξ 6= x + h, comme le
montre la démonstration présentée dans l’exercice 3.8.
Exemple 3.5 (Formule de Taylor appliquée à la fonction sinus). Considérons la
fonction f (x) = sin(x) pour tout x ∈ R. La formule de Taylor avec reste de Lagrange
implique qu’il existe ξ entre 0 et h tel que :

0 h2
00 (3) h3 (4) h4 (5) h5
sin(0 + h) = f (0) + f (0)h + f (0) + f (0) + f (0) + f (ξ)
2 6 4! 5!
pour tout h ∈ R. Pour tout x ∈ R, on a f 0(x) = cos(x), f 00(x) = − sin(x), f (3)(x) =
− cos(x), f (4)(x) = sin(x) et f (5)(x) = cos(x). On considère le point x = 0. Par
conséquent, f(0) = 0, f 0(0) = 1, f 00 (0) = 0, f (3) (0) = −1 et f(4) (0) = 0. Cela
implique :
h3 h5
sin(h) = h − + cos(ξ )
6 5!
pour tout h ∈ R. Cela implique que, pour tout x ∈ R, il existe ξ entre 0 et x tel que :
x5
sin(x) = P3 (x) + cos(ξ )
5!
3
où P3(x) = x − x6 . Par un raisonnement similaire, on peut obtenir le développement
de Taylor à l’ordre 1, ce qui mène au polynôme P1 (x) = x pour tout x ∈ R. La figure
3.55 montre l’approximation de Taylor de la fonction f (x) = sin(x) par les polynômes
P1 et P3. Analysons l’erreur absolue du polynôme de Taylor. Soit R le reste de la
formule de Taylor, c’est-à-dire R(x) = sin(x) − P3 (x) pour tout x ∈ R. Alors, l’erreur
absolue de l’approximation de Taylor est :
 
 x5
|x|5
 
|R(x)| = cos(ξ)  ≤
5! 5!
pour tout x ∈ R, puisque | cos(ξ )| ≤ 1. Par exemple, au point x = 1/2, l’erreur absolue
est inférieure ou égale à :
1
|R(1/2)| ≤ = 2.604 × 10 −4 .
5!25
Cette inégalité est plutôt proche de la valeur exacte, puisque l’erreur absolue exacte
est :
|R(1/2)| = |sin(1/2) − P 3(1/2)| = 2.589 × 10 −4.
42 Chapitre 3 • Outils mathématiques

2.5
sin
0.0 P1

y
−2.5 P3

−2 0 2
x

Figure 3.5 – Approximation de Taylor de la fonction sinus au voisinage de zéro.

En fonction de l’objectif poursuivi, on peut utiliser différentes expressions de la


formule de Taylor avec reste de Lagrange. On écrit l’équation 3.4 également de la
manière suivante :
n−1
X f (i) (x) i f (n) (ξ) n
f (x + h) = h + h . (3.5)
i=0
i! n!

L’équation précédente peut également s’écrire :

f(n) (ξ) n
f (x + h) = P n−1(x + h) + h
n!
où P n−1 est le polynôme de Taylor de degré n − 1 au point x :

f 00(x) 2 f (n−1) (x) n−1


P n−1(x + h) = f (x) + f 0(x)h + h + ... + h .
2! (n − 1)!
Il existe plusieurs expressions du reste de la formule de Taylor. Une des expressions
les plus simples de la formule de Taylor exploite la notation de Landau.
Théorème 3.4 (Théorème de Taylor avec grand O). Soit f une fonction de classe
C n (R). Alors, pour tout x ∈ R, on a :

f 00 (x) 2 f(n−1) (x) n−1


f (x + h) = f (x) + f 0(x)h + h + ... + h + O(hn) (3.6)
2! (n − 1)!
quand h → 0.
Le théorème précédent est démontré dans l’exercice 3.9. L’équation 3.6 peut éga-
lement s’écrire en fonction du polynôme de Taylor de degré n − 1 au point x :

f (x + h) = Pn−1 (x + h) + O(hn )

quand h → 0.
Le théorème suivant présente une variante du théorème de Taylor dans laquelle le
reste est nommé reste de Peano. En langue française, c’est l’expression qui mène au
développement limité de la fonction f . Une différence importante entre le développe-
ment limité et le théorème 3.4 est que le développement limité utilise la notation de
Landau avec petit o, alors que le théorème 3.4 utilise le grand O.
5Script Python : Problemes/Scripts/Py3/[Link].
3.2 • Formule de Taylor 43

Théorème 3.5 (Théorème de Taylor avec reste de Peano). Soit f une fonction de
classe Cn (R). Pour tout x ∈ R, il existe une fonction , continue, telle que :
n
X f (i)(x)
f (x + h) = h i + hn (h) (3.7)
i=0
i!

pour tout h ∈ R où lim h→0 (h) = 0.


On remarque que, dans l’équation 3.7, la somme est pour i de 0 à n alors que
dans l’équation 3.5 elle parcourt les indices de 0 à n − 1. La preuve de ce théorème
est donnée dans l’exercice 3.10. L’équation 3.7 peut également s’écrire en fonction du
polynôme de Taylor au point x, cette fois de degré n :
f (x + h) = Pn (x + h) + h n(h).
Exemple 3.6 (Formule de Taylor à l’ordre 2 dans R). Appliquons les théorèmes 3.3
et 3.4 dans le cas où n = 2. Soit f une fonction de classe C 2(R). Alors, pour tout
x ∈ R et h ∈ R, il existe ξ entre x et x + h tel que :
1
f (x + h) = f (x) + f 0(x)h + f 00 (ξ)h2.
2
De plus f (x + h) = f (x) + f0 (x)h + O(h 2 ) quand h → 0.
Il existe deux autres variantes de la formule de Taylor : la formule avec reste
intégral et celle avec reste de Cauchy que nous ne présentons pas dans ce livre. Cela
forme un total de 5 expressions du reste de la formule de Taylor (Lagrange, grand O,
intégral, Peano et Cauchy) et on peut se demander quelle formule choisir en fonction
de la situation. Premièrement, nous n’utiliserons pas les restes de Peano, de Cauchy
et intégral dans ce livre, car cela ne sera pas utile pour nos calculs. Deuxièmement, on
peut observer que toutes les formulations dérivent de la formulation de Lagrange, ce
qui montre la place centrale de ce théorème. Il reste donc à choisir entre la formulation
de Lagrange et celle fondée sur la notation de Landau.
En observant l’équation 3.4, on constate que la supériorité de la formulation de
Lagrange est qu’elle donne une expression exacte du reste en fonction d’une certaine
dérivée de f . Au contraire, l’équation 3.6 simplifie ce reste en indiquant uniquement
qu’il est dominé par une certaine puissance de h. Ainsi, la notation de Landau sera
utile dans tous les cas où seul l’ordre de convergence du reste en fonction du para-
mètre h importe. Dans ce contexte, la notation de Landau bénéficie d’un avantage
puisque nous verrons dans les exercices 3.1 et 3.2 comment réaliser de manière simple
certaines opérations sur ces expressions. Par exemple, dans l’exercice 3.5 nous voyons
comment exploiter ce théorème pour obtenir des expressions particulièrement simples
du développement de Taylor de certaines fonctions communes. De même, dans la sec-
tion 12.4, nous introduisons l’erreur d’approximation locale d’une méthode numérique
pour la résolution d’une équation différentielle : l’ordre de précision suffit à obtenir
des résultats intéressants dans ce contexte.
D’un autre côté, il peut arriver que l’on ait besoin d’une expression plus détaillée
du reste du développement de Taylor. Dans le chapitre consacré aux équations non
linéaires par exemple, nous considérerons (dans le théorème 13.5 page 373) l’expression
de l’erreur de la méthode de Newton : dans ce cas, la formule de Taylor avec reste
de Lagrange s’impose pour obtenir la récurrence requise (il en est de même pour la
méthode de la sécante).
44 Chapitre 3 • Outils mathématiques

3.3 Condition d’optimalité


Lorsque l’on souhaite minimiser une fonction, il est nécessaire de caractériser les
propriétés de ce minimum. Cela nous sera utile par la suite, en particulier dans le cha-
pitre 9 sur l’approximation de la dérivée d’une fonction par les méthodes de différences
finies.
De manière informelle, le point x ∈ R est un minimum si aucun autre point y n’est
associé à une valeur f (y ) inférieure. Des définitions plus formelles seront présentées
dans la section 14.1, mais ce niveau de détail n’est pas nécessaire pour le moment.
Caractériser l’optimalité d’un point x ∈ R, nécessite de distinguer les conditions
nécessaires d’une part et les conditions suffisantes d’autre part. Le théorème suivant
présente deux conditions nécessaires pour l’optimalité.
Théorème 3.6 (Fermat). Supposons que f est une fonction de classe C 2 (R) et que
x ∈ R est un minimum local. Alors f 0(x) = 0 et f 00 (x) ≥ 0.
C’est une condition nécessaire, mais pas suffisante. En d’autres termes, l’équation
f (x) = 0 n’implique pas nécessairement que x est un minimum local. En effet, le
0

point x peut être un point d’inflexion, comme le montre le contre-exemple suivant.


Contre-exemple 3.1. Considérons, par exemple, la fonction f (x) = x3 pour tout
x ∈ R. Le point x = 0 n’est pas le minimum de f , mais pourtant f 0 (0) = 0.
Le théorème suivant présente deux conditions suffisantes pour l’optimalité.
Théorème 3.7 (Conditions suffisantes d’optimalité). Supposons que f est une fonc-
tion de classe C 2(R). Si f 0(x) = 0 et f 00 (x) > 0 alors x est un minimum local.
C’est une condition suffisante, mais pas nécessaire. En d’autres termes, l’affirma-
tion « x est un minimum local » n’implique pas nécessairement que f 00(x) > 0, comme
le montre le contre-exemple suivant.
Contre-exemple 3.2. Considérons, par exemple, la fonction f (x) = x4 pour tout
x ∈ R. Le point x = 0 est le minimum global de f , mais f 00 (0) = 0.
Nous reviendrons sur les critères d’optimalité et, plus généralement, sur le thème
de l’optimisation dans le chapitre 14, où nous observerons des liens avec la formule
de Taylor.

3.4 Conclusion
Nous nous appuierons sur ces définitions et théorèmes dans le chapitre 9 consacré
à la différentiation, dans le chapitre 11 sur le thème de l’intégration ainsi que dans le
chapitre 12 dédié aux équations différentielles ordinaires. On peut étendre les résultats
précédents aux fonctions de plusieurs variables ([96] chapitre 7), en particulier la
formule de Taylor ([108] théorème 2.1 page 15).

3.5 Notes et références


Plus de détails sur ce thème sont donnés dans [9], en particulier le chapitre 6
« Differentiation ». Pour approfondir le thème de l’analyse, on peut consulter [95, 96,
3.6 • Exercices 45

9]. Sur ces sujets, les chapitres 9 et 11 de [96] peuvent être intéressants pour certains
lecteurs. La figure 3.1 est inspirée de [146], avec des modifications. La figure 3.5 est
inspirée de [150], avec des modifications.

3.6 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.
Dans l’exercice suivant, on utilise les définitions 3.1 et 3.2, et on cherche à démontrer
certaines propriétés énoncées dans le théorème 3.1.

* Exercice 3.1 (Grand O : somme, multiplication par une constante et produit) Supposons
que f1(x) = O (g1 (x)) et f 2(x) = O (g2 (x)) quand x → 0.
1. Montrer que, pour tout réel α non nul, on a αf1 (x) = O(g1 (x)) quand x → 0. En
d’autres termes, multiplier par une constante à l’extérieur de grand O ne change pas
l’équation.
2. Montrer que, pour tout réel α non nul, on a f1 (x) = O(αg1 (x)) quand x → 0. En
d’autres termes, multiplier par une constante à l’intérieur de grand O ne change pas
l’équation.
3. Montrer que f1 (x) + f2 (x) = O (|g1 (x)| + |g2 (x)|) quand x → 0.
4. Montrer que f1 (x)f 2(x) = O (g1 (x)g 2(x)) quand x → 0.
Dans l’exercice suivant, on prolonge l’exercice 3.1 pour continuer à propriétés énoncées
dans le théorème 3.1.

Exercice 3.2 (Grand O : valeur absolue, différence, division)


1. Supposons que f (x) = O(g (x)) quand x → 0. Montrer que f (x) = O (|g (x)|) quand
x → 0 et que |f (x)| = O(g (x)) quand x → 0.
2. Montrer que O (x) − O (x) = O (x) quand x → 0.
O(h 2 )
3. Montrer que h
= O (h) quand h → 0 avec h 6= 0.
4. Montrer que, pour tout entier n 6= 0 :

O (hn+1 )
= O (h n ) quand h → 0 (3.10)
h
avec h 6= 0.
O(h)
Remarque 3.2. Dans le cas où n = 0, l’équation 3.10 devient h = O (1) quand h → 0.
Remarque 3.3. Le fait que O (x)− O (x) = O (x) quand x → 0 peut paraître a priori étonnant,
dans le sens où on pourrait penser que O(x) − O (x) est nul. En fait, la notation de Landau
ne stipule pas une égalité, mais une inégalité.

Exercice 3.3 (Exemple de O(1)) Montrer que 5x3 − 6x2 + 3 = O (1) quand x → 0.
L’expression O(1) signifie que la fonction est dominée par une constante au voisinage de
zéro.
Remarque 3.4 (Notation de Landau quand x → 0). La figure 3.66 présente la fonction
|f (x)| = |5x3 −6x2 +3| au voisinage de zéro. Le polynôme 5x 3 −6x2 +3 est négatif sur la partie
gauche de l’intervalle (précisément pour x ≤ −0.5805, arrondi avec 4 chiffres significatifs) de
6Script Python : Problemes/Scripts/Py3/[Link].
46 Chapitre 3 • Outils mathématiques

Notation de Landau quand x → 0


|5x 3 − 6x 2 + 3|
10 14

y 0
−1 0 1
x

Figure 3.6 – La fonction |5x3 − 6x 2 + 3| est dominée par (un multiple de) 1 quand
x → 0.

telle sorte que la valeur absolue est nécessaire. Cette valeur absolue crée une discontinuité
dans la dérivée de la fonction |f (x)| qui est visible dans la figure au point x = −0.5805.
On observe que l’on peut appliquer la définition 3.1 (page 36) avec la fonction g (x) = 1, la
constante M = 14 et la largeur δ = 1.

Exercice 3.4 (Formule de Taylor à l’ordre 2 dans R (deuxième version)) Soit f une
fonction de classe C 2(R) telle que f 00 est bornée. En utilisant le théorème 3.3, montrer que,
pour tout x ∈ R, on a f (x + h) = f (x) + f 0 (x)h + O (h2 ) quand h → 0.
2
Exercice 3.5 (Formule de Taylor) Montrer que ex = 1 + x + x2 + O (x 3 ) quand x → 0.
2
Montrer que log(1 + x) = x − x2 + O (x3 ) quand x → 0 où log est la fonction logarithme de
3 2
base e. Montrer que sin(x) = x− x6 +O (x5) quand x → 0. Montrer que cos(x) = 1− x2 +O (x4)
quand x → 0.
Remarque 3.5 (Méthode pour obtenir un développement de Taylor). Dans beaucoup de
situations, la formule de Taylor s’exprime en fonction de la variable x lorsque celle-ci tend
vers zéro. Or la formule de Taylor (par exemple l’équation 3.6), est exprimée en un point x
donné, avec h tendant vers zéro. Dans le but de clarifier le procédé et éviter les confusions,
précisons la méthode qui permet d’obtenir le résultat requis. Les étapes sont les suivantes :
écrire la formule de Taylor avec reste en grand O c’est-à-dire l’équation 3.6, choisir la fonction
f et le point x, calculer les dérivées f (x), f 0 (x), ..., f(n−1) (x), substituer les dérivées dans
la formule de Taylor, puis simplifier l’expression. La formule de Taylor ainsi obtenue dépend
alors de la variable h, qui tend vers zéro. On peut alors utiliser la variable x à la place de la
variable h pour obtenir la formule désirée.

* Exercice 3.6 (Propriété du polynôme de Taylor) Soit f une fonction de classe C n (R).
Soit a ∈ R. Soit Pn (x) le polynôme de Taylor de degré n au point a, au sens de la définition
3.4. Montrer que, pour tout i = 0, 1, ..., n, on a :

Pn(i)(a) = f (i) (a). (3.11)

Remarque 3.6. En d’autres termes, le polynôme de Taylor est tel que ses dérivées sont égales
aux dérivées de f au point a.

Théorème 3.8 (Le théorème de super-Rolle). Soient a et b deux réels tels que a < b.
Soit f une fonction de classe Cn (R). Supposons que f (a) = f (b) = 0 et f (i) (a) = 0 pour
i = 1, ..., n − 1. Alors, il existe un réel ξ ∈]a, b[ tel que f (n) (ξ ) = 0.
3.6 • Exercices 47

Remarque 3.7 (Théorème de Super-Rolle). Le théorème précédent est nommé « super-Rolle »


dans [91]. Ce théorème est également présenté dans [26]. Nous utiliserons le théorème 3.8
dans le but de simplifier la démonstration dans l’exercice 3.8.

** Exercice 3.7 (Un théorème utile pour la formule de Taylor) Montrer le théorème 3.8.
Indication. Utiliser le théorème de Rolle 3.2 page 39.
Dans l’exercice suivant, on démontre la formule de Taylor avec reste de Lagrange.

*** Exercice 3.8 (La formule de Taylor-Lagrange) Soit f une fonction de classe C n (R).
Soient a et b deux réels tels que a < b. Soit Pn−1(x) le polynôme de Taylor au point a défini
par :

0 f 00(a) 2 f (n−1) (a) n−1


Pn−1 (x) = f (a) + f (a)(x − a) + (x − a) + . . . + (x − a) (3.12)
2! (n − 1)!

pour tout réel x ∈ [ a, b]. Soit x un nombre réel. L’objectif de cet exercice est de montrer qu’il
existe ξ tel que a < ξ < b avec :

f (n)(ξ )
f (b) = Pn−1 (b) + (x − a)n . (3.13)
n!
Pour cela, nous allons introduire la fonction R représentant le reste de la formule de Taylor
et analyser les propriétés de cette fonction. Soit R la fonction définie par :

R(x) = f (x) − P n−1(x) (3.14)

pour tout réel x ∈ [a, b]. En toute rigueur, il faudrait noter Rn,a car le reste est paramétré
par l’entier n et le point a, mais nous préférons une notation plus simple. La fonction R est
le reste de la formule de Taylor. On souhaite montrer qu’il existe ξ tel que a < ξ < b tel que :

f (n) (ξ )
R(b) = (b − a) n. (3.15)
n!
En d’autres termes, on souhaite expliciter le reste sous la forme de Lagrange.
1. Montrer que :

R(i)(a) = 0 (3.16)

pour i = 0, 1, ..., n − 1. Indication. Utiliser l’exercice 3.6.


2. Soit c une constante réelle et soit F la fonction définie par :

F (x) = R (x) − c(x − a)n (3.17)

pour tout réel x ∈ [a, b]. On choisit c telle que F (b) = 0. Montrer qu’il existe ξ tel que
a < ξ < b avec F (n) (ξ ) = 0 et en déduire que :

f (n) (ξ )
c= . (3.18)
n!
Indication. Utiliser le théorème 3.8.
3. Conclure la preuve.

Remarque 3.8 (Autres formes de la formule de Taylor). Pour obtenir l’équation 3.4, on
considère l’équation 3.13 au point a = x0 et on évalue la fonction f au point b = x0 + h.
Enfin, on remplace la variable x 0 par la variable x.
48 Chapitre 3 • Outils mathématiques

** Exercice 3.9 (Formule de Taylor avec grand O ) Soit f une fonction de classe C n (R).
Utiliser le théorème 3.3 et démontrer le théorème 3.4. Indication. Utiliser le théorème de
Weierstrass (théorème des bornes).
Remarque 3.9 (Importance de la borne). L’exercice 3.4 est beaucoup plus facile que l’exercice
3.9. Dans l’exercice 3.4, on fait l’hypothèse que f00 est bornée, ce qui facilite beaucoup
la démonstration. Dans l’exercice 3.9, on fait l’hypothèse que f est de classe C n (R) sans
supposer que f (n) est bornée, ce qui nécessite de faire appel à un outil d’analyse plus puissant
pour borner f (n) sur un intervalle.

** Exercice 3.10 (Formule de Taylor avec reste de Peano) Démontrer le théorème 3.5.
Chapitre 4

Flottants

Dans ce chapitre, nous présentons les nombres à virgule flottante qui sont utili-
sés par la plupart des ordinateurs pour approcher des nombres réels mathématiques
dont nous sommes familiers. Dans le chapitre 5, nous étudierons l’influence de cette
approximation sur les calculs numériques.
Le standard IEEE 754 a pour objectif de normaliser la manière de stocker et de
réaliser des opérations sur les nombres à virgule flottante [155]. Dans sa dernière
version de 2008, le standard spécifie plusieurs formats pour les nombres à virgule
flottante, mais nous nous concentrerons dans ce document sur les nombres utilisés
la plupart du temps dans le langage Python, c’est-à-dire les flottants sur 64 bits. La
première version du standard IEEE 754 a été publiée en 1985 [72]. Un des intérêts de ce
standard est d’encourager le développement de programmes performants et fiables. En
effet, avant l’avènement de ce standard et sa diffusion chez les fabricants de processeurs
et les éditeurs de librairies de calcul, chaque logiciel de calcul numérique devait être
adapté aux spécificités matérielles de la machine sur laquelle il était utilisé. Toutes les
machines n’utilisaient pas nécessairement le même nombre de bits dans l’exposant ou
dans la partie intégrale. De plus, les différents modes d’arrondi, que nous analyserons
dans la section 4.5, n’étaient pas implémentés strictement de la même manière. C’est
pourquoi le code source de certains programmes contenait parfois des instructions
pour choisir les valeurs des paramètres de l’algorithme en fonction de la machine.
Optimiser la performance d’un programme dans ces conditions pouvait nécessiter
beaucoup de travail. Depuis, la généralisation du standard IEEE 754 a grandement
simplifié la situation.
Nous analyserons dans la section 4.2 comment on peut représenter certains
nombres réels par des nombres à virgule flottante. Nous sommes alors amenés à consi-
dérer deux entiers - la partie intégrale et l’exposant - que nous pouvons représenter
par leur décomposition en base 2. C’est la raison pour laquelle, nous montrons dans
cette section comment représenter un entier en base 2 par une succession d’entiers
nommés les bits.

4.1 Représentation binaire des entiers


Dans cette section, nous montrons comment représenter un entier par sa décom-
position en base 2. Nous séparons l’analyse en deux parties. Dans la première, nous

49
50 Chapitre 4 • Flottants

n d3 d2 d1 (d3 d 2 d1 )2
0 0 0 0 (000) 2
1 0 0 1 (001) 2
2 0 1 0 (010) 2
3 0 1 1 (011) 2
4 1 0 0 (100) 2
5 1 0 1 (101) 2
6 1 1 0 (110) 2
7 1 1 1 (111) 2

Table 4.1 – Les 8 entiers naturels représentables sur 3 bits.

analysons comment représenter des entiers positifs ou nuls et nous présentons dans la
seconde comment représenter des entiers relatifs. Nous verrons qu’on peut représenter
des entiers relatifs par deux méthodes, soit avec un biais, soit avec un bit de signe. La
définition suivante introduit la décomposition binaire d’un entier naturel, c’est-à-dire
positif ou nul. Elle permet d’introduire la notation (·)2 permettant de spécifier que
l’on évoque l’expression en base 2 d’un entier.

Définition 4.1 (Représentation binaire d’un entier). Soit p ≥ 1 un entier repré-


sentant le nombre de bits. La représentation binaire de l’entier n ∈ N est n =
(dpdp−1 . . . d1 )2 si n = 2p−1 dp + . . . + 2d 2 + d1 où d 1, d 2 , . . . , dp ∈ {0, 1}. Dans ce
cas, on a n ∈ [0, 2p − 1].

Dans l’exercice 4.2, on montre que, sous les hypothèses précédentes, on a n ≤ 2p −1.
La table 4.1 présente la représentation binaire des entiers naturels représentables
avec p = 3 bits. Puisque ces entiers ne changent pas de signe, on dit qu’ils sont
« non signés ». Comme nous avons choisi d’utiliser seulement trois bits, on ne peut
représenter que les entiers entre 0 et 7.

Exemple 4.1 (Représentation binaire de l’entier 5). On considère des entiers binaires
(non signés) sur 3 bits : pourquoi (101)2 = 5 ? Le nombre binaire (101)2 est associé
aux bits d 3 = 1, d2 = 0, et d 1 = 1. Par conséquent :

(101)2 = d 3 × 22 + d 2 × 21 + d1 × 2 0
= 1 × 22 + 0 × 21 + 1 × 20 = 4 + 1 = 5.

C’est pourquoi le nombre binaire (101)2 représente le nombre décimal 5, et on écrit


(101)2 = 5.

Exemple 4.2 (Représentation binaire de l’entier 8). On considère des entiers binaires
(non signés) sur 3 bits : comment représenter n = 8 ? On a 8 = 23 = (1000)2 . Par
conséquent, il faut p = 4 bits et il est impossible de représenter n = 8 sur 3 bits.

Une limitation importante de la définition 4.1 est que l’on ne peut pas représenter
les entiers relatifs, puisque l’on forme une combinaison positive de puissances de 2.
C’est pourquoi la définition suivante introduit un biais b qui sert de décalage en
direction des entiers relatifs négatifs. Puisque les entiers relatifs peuvent avoir un
signe négatif, on dit qu’ils sont signés.
4.1 • Représentation binaire des entiers 51

n d3 d2 d1 (d3 d2 d 1)2
-4 0 0 0 (000)2
-3 0 0 1 (001)2
-2 0 1 0 (010)2
-1 0 1 1 (011)2
0 1 0 0 (100)2
1 1 0 1 (101)2
2 1 1 0 (110)2
3 1 1 1 (111) 2

Table 4.2 – Les 8 entiers relatifs représentables sur 3 bits avec un biais.

Définition 4.2 (Représentation binaire d’un entier relatif avec un biais). On consi-
dère des nombres binaires sur p ≥ 1 bits où p est un entier. Alors, le biais est b = 2p−1 .
La représentation binaire de l’entier relatif n ∈ Z avec le biais b est n = (dpd p−1 . . . d1 )2
si n = 2p−1 dp + . . . + 2d2 + d1 − b où d1 , d2 , . . . , dp ∈ {0, 1}. Dans ce cas, on a
n ∈ [−2p−1, 2 p−1 − 1].
La table 4.2 présente la représentation binaire des entiers relatifs négatifs et positifs
avec 3 bits et un biais. Puisque p = 3, le biais est égal à b = 22 = 4 de telle sorte
qu’on ne peut représenter que les entiers entre -4 et 3. Lorsque l’on compare avec la
table 4.1, on observe que le seul changement est dans la première colonne, avec un
décalage égal au biais.
Exemple 4.3 (Représentation binaire de l’entier 5 par un nombre binaire signé avec
un biais). On considère des entiers binaires signés sur 3 bits : pourquoi (101)2 = 1 ?
Le nombre binaire (101)2 est associé aux bits d3 = 1, d2 = 0, d 1 = 0 et au biais b = 4.
Or 1 × 22 + 0 × 2 1 + 1 × 20 − 4 = 4 + 1 − 4 = 1. C’est pourquoi le nombre binaire
(101)2 signé représente le nombre décimal 1, et on écrit (101) 2 = 1.
Dans l’exemple 4.1, nous avons vu que lorsqu’on utilise des nombres binaires non
signés, la représentation (101)2 est égale à l’entier 5. Au contraire, dans l’exemple
4.3, lorsqu’on utilise des nombres binaires signés, la même représentation est égale à
l’entier 1. Cela montre que, pour décoder un nombre binaire, on doit savoir à l’avance
s’il est signé ou non.
Exemple 4.4 (Représentation binaire de l’entier signé -5 avec un biais). On considère
des entiers binaires signés sur 3 bits : comment représenter n = −5 ? Dans ce cas, que
vaut p, que vaut b ? Avec p = 3 bits et le biais b = 22 = 4, on ne peut pas représenter
n = −5 : l’entier est trop négatif. C’est pourquoi on utilise p = 4 bits. On en déduit
que le biais est b = 23 = 8. Or −5 = 3 − 8 = 3 −b et 3 = 2 1 +20 . Donc la représentation
binaire de l’entier signé -5 est −5 = (0011)2 .
Il existe une autre représentation possible pour les entiers relatifs dans laquelle on
utilise un bit de signe.
Définition 4.3 (Représentation binaire d’un entier relatif avec un bit de signe). On
considère des nombres binaires sur p ≥ 1 bits où p est un entier. La représentation
binaire de l’entier relatif n ∈ Z avec un bit de signe est n = (dp d p−1 . . . d1) 2 si
n = (−1)d p(2p−2 dp−1 + . . . + 2d 2 + d1 ). Dans ce cas, l’entier n est dans l’intervalle
[−(2p−1 − 1), 2p−1 − 1].
52 Chapitre 4 • Flottants

n dp d2 d1 (dpd 2 d 1)2
0 0 0 0 (000)2
1 0 0 1 (001)2
2 0 1 0 (010)2
3 0 1 1 (011)2
-0 1 0 0 (100)2
-1 1 0 1 (101)2
-2 1 1 0 (110)2
-3 1 1 1 (111)2

Table 4.3 – Les 8 entiers relatifs représentables sur 3 bits avec un bit de signe.

La table 4.3 présente les entiers relatifs sur 3 bits, dont 1 bit de signe. On observe
que les entiers qui apparaissent sont d’abord les entiers positifs, puis les entiers né-
gatifs, ce qui est un changement significatif par rapport à la table 4.2 où les entiers
étaient dans l’ordre croissant. On observe également une autre différence, puisque les
entiers représentables sont entre -3 et 3 : on ne peut plus représenter l’entier -4 dans
cette représentation, ce qui peut être considéré comme un inconvénient. On observe
enfin qu’il y a deux représentations différentes de l’entier 0 : un zéro positif et un zéro
négatif.
Dans cette section, nous avons vu comment représenter des entiers en les décom-
posant en base 2. Une des propriétés de cette représentation est que, si le nombre de
bits est fixé à l’avance, alors on ne peut représenter qu’un nombre fini d’entiers dans
ce système. En particulier, si l’entier à représenter est trop négatif ou trop positif,
alors il est nécessaire d’utiliser davantage de bits pour le décomposer. Des propriétés
similaires vont apparaître lorsque nous analyserons les nombres à virgule flottante
dans la section suivante.

4.2 Les nombres à virgule flottante


Dans le but de formaliser la représentation des nombres à virgule flottante, nous
allons d’abord définir un système flottant dont les paramètres sont, en quelque sorte,
ceux de la machine physique dans laquelle les nombres sont représentés. Nous défini-
rons ensuite les nombres à virgule flottante représentables dans ce système.
La définition suivante introduit les paramètres du système flottant.
Définition 4.4 (Système à virgule flottante). Un système à virgule flottante est défini
par les quatre entiers β, p, emin et emax où :
• β ∈ N est la base et satisfait β ≥ 2,
• p ∈ N est la précision et satisfait p ≥ 2,
• emin, emax ∈ Z sont les exposants extrêmes et sont tels que emin < 0 < emax .

Exemple 4.5. Dans le contexte du langage Python, le type float correspond à des
nombres à virgule flottante sur 64 bits tels qu’ils sont définis dans le standard IEEE
754 : nous les appelons les « doubles », car le nombre de bits est multiplié par deux
par rapport aux nombres à virgule flottante sur 32 bits, nommés « simples ». Les
« doubles » IEEE sont associés aux paramètres β = 2, p = 53, emin = −1022 et
emax = 1023.
4.2 • Les nombres à virgule flottante 53

Signe Exposant Partie intégrale

1 2 12 13 64
Figure 4.1 – Représentation d’un nombre à virgule flottante binaire de type IEEE
754 sur 64 bits, c’est-à-dire un « double ».

Puisque les paramètres du système flottant sont définis, on peut désormais intro-
duire les nombres que l’on peut représenter dans ce système.
Définition 4.5 (Nombre à virgule flottante). Un nombre à virgule flottante est un
réel x ∈ R tel qu’il existe un couple (m, e) qui vérifie l’équation :
x = m × βe−p+1 (4.1)
où m ∈ Z est la partie intégrale et satisfait :
|m| < β p (4.2)
et e ∈ Z est l’exposant et satisfait :
emin ≤ e ≤ emax . (4.3)
Les inégalités 4.3 sont équivalentes à e ∈ {emin , emin + 1, ..., e max }. Dans l’équation
précédente, nous avons utilisé des accolades pour rendre explicite le fait qu’il s’agit
d’un ensemble d’entiers relatifs. Cet ensemble est de taille emax − emin + 1.
De plus, remarquons que la partie intégrale m peut être négative. En effet, l’in-
égalité 4.2 est équivalente à |m| ≤ β p − 1 de telle sorte que l’ensemble des valeurs que
peut prendre la partie intégrale est définie par : m ∈ {1 − βp, 2 − β p , ..., β p − 1}. Cet
ensemble est de taille (βp − 1) − (1 − β p ) + 1 = 2βp − 1.
Dans ce document, nous considérons les nombres à virgule flottante binaires avec
64 bits. Un double est défini par 1 bit de signe pour représenter la partie intégrale
m, 11 bits pour l’exposant e et 53 bits pour la partie intégrale m (dont 1 implicite).
La figure 4.1 présente les 64 bits associés aux nombres à virgules flottantes de type
binaire à 64 bits tels qu’ils sont définis par le standard IEEE 754. En d’autres termes
un nombre à virgule flottante est représenté par un tableau de 64 cases contenant des
0 et des 1.
Dans le standard IEEE 754, l’exposant est un entier relatif, représenté par ses
bits grâce à un biais, au sens de la définition 4.2. Au contraire, la partie intégrale est
représentée par un entier relatif représenté par ses bits grâce à un bit de signe, au
sens de la définition 4.3. En d’autres termes, le bit de signe présenté dans la figure
4.1 est le bit de signe associé à la partie intégrale.
Les nombres réels R sont différents des nombres flottants à cause de deux sortes
de limitations. Il y a d’abord des limitations de principe. D’une part, l’ensemble R est
continu, mais les flottants sont discrets. D’autre part, l’ensemble R est infini, mais les
flottants sont en nombre fini.
Il y a ensuite des limitations techniques. Premièrement, l’exposant est limité. Cela
implique une limitation de l’ordre de grandeur (l’amplitude) des flottants. Deuxième-
ment, la partie intégrale est limitée. Cela implique une limitation de la précision des
flottants. Dans la suite, nous allons détailler ces concepts sur le plan mathématique.
54 Chapitre 4 • Flottants

Une difficulté avec les doubles IEEE 754 est qu’ils sont nombreux, ce qui empêche
de voir facilement leurs propriétés et de faire des calculs simples. C’est pourquoi
nous considérons dans l’exemple suivant un système flottant « jouet » virtuel, qui ne
correspond à aucune machine réelle, mais permet d’observer quelques propriétés.

Exemple 4.6. Considérons le système flottant « jouet » de base β = 2, de précision


p = 3 et d’amplitude d’exposants emin = −2 et emax = 3. Le nombre réel x = 3 peut
être représenté par le nombre flottant (m, e) = (6, 1), puisque

x = 6 × 21−3+1 = 6 × 2 −1 = 3. (4.4)

Vérifions, de plus, que les inégalités attendues sont satisfaites. En effet, la partie
intégrale m satisfait l’inégalité |m| = 6 ≤ βp − 1 = 23 − 1 = 7 et l’exposant e satisfait
l’inégalité emin = −2 ≤ e = 1 ≤ e max = 3.

Dans l’exemple suivant, nous énumérons la liste de tous les nombres flottants dans
le système « jouet ».

Exemple 4.7 (Générer la liste des flottants dans un système jouet). On considère
le système « jouet » avec (β, p, e min, e max ) = (2, 3, −2, 3). Pour générer la liste des
nombres flottants dans ce système, le script suivant1 utilise deux boucles imbriquées.
La première boucle permet de générer la liste des parties intégrales entre 1−2p et 2p −1.
Rappelons qu’en Python, la fonction range retourne une liste d’éléments supérieurs ou
égaux au premier argument et strictement inférieurs au second argument. La seconde
boucle permet de générer la liste des exposants entre emin et emax. À chaque itération
de l’algorithme, nous affichons la partie intégrale et l’exposant entre parenthèses, puis
la valeur du nombre flottant. De plus, nous créons la liste allfloats contenant tous
les flottants dans ce système. Pour cela, nous initialisons la variable allfloats à une
liste vide, puis, à chaque itération, nous ajoutons le flottant x dans la liste grâce à la
méthode append.
1 p = 3
2 emin = -2
3 emax = 3
4 allfloa ts = []
5 for m in range (1 - 2 ** p , 2 ** p ):
6 for e in range ( emin , emax + 1) :
7 x = m * 2 ** (e - p + 1)
8 print ( "( " , m, " ," , e, ") = " , x)
9 allfloat s . append (x)

Le script précédent affiche les lignes suivantes.


1 ( -7 , -2) = -0.4375
2 ( -7 , -1) = -0.875
3 ( -7 , 0) = -1.75
4 ( -7 , 1) = -3.5
5 ( -7 , 2) = -7
6 ( -7 , 3) = -14
7 etc .
1Script Python : Flottants/Scripts/Py3/[Link].
4.2 • Les nombres à virgule flottante 55

Système flottant, p = 3, emin = −2, emax = 3

−15 −10 −5 0 5 10 15
x

Figure 4.2 – Tous les flottants (normalisés et dénormalisés) dans le système « jouet »
avec (β, p, emin , e max) = (2, 3, −2, 3).

Cet affichage n’est pas très pratique. D’une part, les nombres flottants apparaissent
bien par ordre croissant de m et e, mais les nombres flottants x ne sont pas triés.
D’autre part, certains nombres sont affichés plusieurs fois. Par exemple, le nombre
x = 0.25 apparaît 2 fois dans la liste :
1 (1 , 0) = 0.25
2 (2 , -1) = 0.25

Le nombre x = 0 apparaît 6 fois :


1 (0 , -2) = 0.0
2 (0 , -1) = 0.0
3 (0 , 3) = 0.0

Nous reviendrons sur ce problème dans la suite. Pour trier les nombres flottants par
ordre croissant, on peut utiliser la fonction sorted. De plus, pour obtenir une liste
de nombres flottants uniques, on peut utiliser la fonction set, qui permet de définir
une collection d’objets uniques. Le script suivant permet d’afficher la liste triée des
nombres flottants uniques.
1 sort ed_f loat s = sorted ( set ( all floats ))
2 print ( s orte d_fl oats )

La liste complète des 55 nombres flottants uniques dans ce système jouet est la
suivante : −14.0, −12.0, −10.0, −8.0, −7.0, −6.0, −5.0, −4.0, −3.5, −3.0, −2.5, −2.0,
−1.75, −1.5, −1.25, −1.0, −0.875, −0.75, −0.625, −0.5, −0.4375, −0.375, −0.3125,
−0.25, −0.1875, −0.125, −0.0625, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375,
0.4375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0,
7.0, 8.0, 10.0, 12.0, 14.0. La figure 4.22 présente tous les flottants dans le système
« jouet ». Il est facile de produire cette image avec la fonction floatgui du module
floats développé pour ce cours3 . On observe que les nombres flottants sont entre
-14 et 14. On observe également que les graduations sont plus resserrées lorsqu’on est
plus proche de zéro.

Il y a une analogie entre les doubles et la mesure de longueurs sur une règle
graduée. En effet, le système des nombres à virgule flottante est une sorte de règle
graduée qui permet de mesurer des nombres négatifs, qui a une longueur finie et dont
les graduations sont plus resserrées autour de zéro.
2Script Python : Flottants/Scripts/Py3/[Link].
3Script Python : Scripts-Eleves/Py3/[Link].
56 Chapitre 4 • Flottants

4.3 Des fonctions utiles


Dans cette section, nous introduisons le logarithme en base arbitraire et la partie
entière d’un nombre réel. Nous utiliserons la fonction logarithme à plusieurs occasions
dans ce livre. Par exemple, nous présenterons dans la prochaine section comment,
étant donné un nombre réel x, on peut déterminer son exposant et sa partie intégrale
en utilisant le logarithme de base 2. Dans la section 5.1, nous utiliserons à nouveau
cette fonction pour déterminer le nombre d’itérations de la méthode de la dichotomie
pour résoudre une équation non linéaire. Enfin, nous utiliserons cette fonction dans
la définition 5.4 page 78 pour évaluer le nombre de chiffres corrects dans une base b
arbitraire.
Nous notons log la fonction qui évalue le logarithme naturel de base e où e = 2.718
est le nombre d’Euler. La fonction log est également appelée logarithme népérien en
hommage au mathématicien Jean Napier. On note parfois cette fonction ln mais
nous préférons utiliser la notation log car celle-ci correspond au nom de la fonction
équivalente dans le module math en Python. On observe, de plus, que la fonction ln
n’existe pas dans le module math de Python, ni dans NumPy. La définition suivante
permet de généraliser la fonction logarithme à une base arbitraire.
Définition 4.6 (Logarithme de base arbitraire). Soit β > 1 un nombre réel. Le
logarithme de x en base β est :
log(x)
logβ (x) = (4.5)
log(β )
pour x > 0.
Les bases les plus couramment utilisées sont β = e (qui conduit au logarithme
népérien), β = 2 et β = 10. Dans le module math de Python, la fonction log est
implémentée dans la fonction log, la fonction log10 est implémentée dans la fonction
log10 et la fonction log 2 est implémentée dans la fonction log2. En fait, le logarithme
en base β est indépendant du logarithme qu’on utilise pour le définir, comme le montre
l’exercice 4.9. En d’autres termes, pour définir logβ , on peut utiliser log (comme dans
la définition 4.6), log2 ou bien log10 .
Les propriétés du logarithme en base β sont proches des propriétés du logarithme
de base e. En particulier, on a la propriété suivante.
Théorème 4.1 (Propriété du logarithme de base β). Soit β > 1 un nombre réel.
Alors,

logβ(β x ) = x, (4.6)

pour tout réel x.


En d’autres termes, le logarithme en base β permet de calculer l’exposant en base
β. Le théorème précédent est démontré dans l’exercice 4.8.
Exemple 4.8. Considérons le cas où β = 2. On a log 2(2x ) = x pour tout réel x.
Notons qu’une autre manière de procéder consiste à utiliser l’équation 4.6 comme
une définition, et d’en déduire l’équation 4.5. La définition suivante introduit les
fonctions floor qui signifie plancher en anglais et ceil qui signifie plafond.
4.4 • Flottants normalisés, dénormalisés 57

Définition 4.7 (Les fonctions plafond et plancher). Pour tout réel x, on note n = bxc
le plus grand entier n inférieur ou égal à x et n = dxe le plus petit entier n supérieur
ou égal à x.
En termes plus mathématiques, on a :

bxc = max ({n ≤ x}) et dxe = min ({n ≥ x}) .


n∈Z n∈Z

Exemple 4.9. On a b1.7c = 1, d1.7e = 2, b−1.7c = −2 et d−1.7e = −1.


En complément de la section suivante, nous réutiliserons à nouveau les fonctions
floor et ceil à plusieurs occasions dans ce livre. Par exemple, nous utiliserons la
fonction ceil dans le théorème 13.4 page 369 pour évaluer le nombre d’itérations
utilisé par la méthode de la dichotomie pour résoudre une équation non linéaire. Nous
utiliserons également cette fonction dans le théorème 14.5 page 390 pour évaluer le
nombre d’itérations de la méthode du nombre d’or en optimisation.

4.4 Flottants normalisés, dénormalisés


Dans cette section, nous distinguons deux classes de nombres à virgule flottante,
c’est-à-dire les nombres flottants normalisés - les plus nombreux - et les nombres flot-
tants dénormalisés. On peut s’interroger sur l’unicité de la représentation des nombres
flottants. En d’autres termes, si x est un nombre réel, y a-t-il un unique nombre flot-
tant qui représente x ? Si on divise m par 2 et qu’on ajoute 1 à e, alors la valeur de
l’expression m × βe−p+1 est inchangée. Cela montre que la représentation flottante
définie précédemment ne garantit pas l’unicité.
Exemple 4.10. On considère le même système flottant « jouet » avec (β, p, emin ,
emax ) = (2, 3, −2, 3). Le nombre réel x = 3 peut aussi être représenté par le flottant
(m, e) = (3, 2), puisque :
x = 3 × 22−3+1 = 3 × 2 0 = 3. (4.7)

De plus, vérifions les inégalités. On a |m| = 3 ≤ βp − 1 = 2 3 − 1 = 7 et −2 ≤ e =


2 ≤ 3. Par conséquent, le couple (m, e) = (3, 2) est une représentation flottante de
x = 3. Or, nous avons déjà vu dans l’exemple précédent que (m, e) = (6, 1) est une
représentation flottante de x = 3. Nous venons donc de montrer qu’il existe au moins
deux représentations flottantes différentes pour le nombre réel x = 3.
L’exemple précédent montre que la définition 4.5 ne garantit pas l’unicité de la
représentation flottante d’un nombre réel x donné. Cela nous amène à introduire la
notion de normalisation d’un flottant.
Définition 4.8 (Flottant normalisé). Un flottant est normalisé si m satisfait :

βp−1 ≤ |m| < βp . (4.8)


Si on compare la définition précédente avec la définition 4.5, on observe que le
changement porte sur la borne inférieure de la valeur absolue de la partie intégrale, ce
qui a deux conséquences. La première est qu’un flottant normalisé est non nul puisque
|m| ≥ β p−1 > 0. La seconde, plus significative, est que la représentation d’un flottant
normalisé est unique.
58 Chapitre 4 • Flottants

Théorème 4.2 (Unicité de la représentation d’un nombre flottant normalisé). Si x


est un flottant normalisé, alors sa représentation (m, e) est unique et :
x
e = blogβ (|x|)c et m= . (4.9)
β e−p+1
En d’autres termes, pour obtenir l’unicité de la représentation d’un nombre flot-
tant, on ajoute une borne inférieure sur m : la partie intégrale m doit être suffisamment
grande en valeur absolue pour que le flottant soit normalisé. Le théorème précédent
est démontré dans l’exercice 4.4.
Exemple 4.11. On considère le même système flottant « jouet », défini par β = 2,
p = 3, e min = −2, emax = 3. Les nombres flottants normalisés sont tels que : β p−1 =
4 ≤ m < β p = 8.
Par opposition aux flottants normalisés, on introduit les flottants dénormalisés.
Définition 4.9 (Flottant dénormalisé). Un flottant (m, e) est dénormalisé si e = e min
et m satisfait :

|m| < β p−1 . (4.10)

En d’autres termes, un flottant dénormalisé est un nombre flottant non nul asso-
cié à une partie intégrale m petite en valeur absolue. En anglais, on dit subnormal
floating point pour nommer un nombre flottant dénormalisé. Nous avons déjà vu com-
ment on peut écrire un entier n sous la forme de ses bits, ce qui mène à la notation
(d p, ..., d 1 )2 . Cette notation peut également être utilisée pour les nombres à virgule
flottante, comme le montre le théorème suivant.
Théorème 4.3 (Représentation d’un réel en base β ). Supposons que x est un flottant.
Alors, le nombre x peut être écrit sous la forme :
 
d2 dp
x = ± d1 + + . . . + p−1 × βe
β β
ou encore :

x = ±(d1.d2 · · · dp )β × β e (4.11)

avec d 1, ..., dp ∈ {0, 1, ..., β − 1}.


Le théorème précédent est démontré dans l’exercice 4.5. L’équation 4.11 est si-
milaire à la notation scientifique du nombre x où e est l’exposant. Par exemple, la
notation scientifique du nombre x = 0.001234 est x = 1.234 × 10 −3 . La seule particu-
larité de l’équation 4.11 est d’utiliser la base β au lieu de la base 10 habituelle.
Le théorème 4.2 mène à plusieurs questions. Une des premières est que l’exposant
calculé grâce à l’équation e = blog β (|x|)c peut poser une difficulté puisque l’équation
4.3 limite les bornes de l’exposant d’un nombre à virgule flottante. Nous verrons dans
la section suivante comment déterminer les nombres flottants extrêmes associés à un
tel système. Lorsque le nombre réel est trop grand en valeur absolue (c’est-à-dire trop
positif ou trop négatif), alors l’exposant dépasse les bornes et un nombre flottant
exceptionnel est généré. Dans la section 4.6, nous analyserons le comportement du
langage Python lorsque de tels nombres sont considérés. D’autre part, le nombre réel
4.5 • Flottants extrêmes et arrondi 59

x n’est pas nécessairement un nombre flottant. Cela peut mener à une différence
entre le nombre réel x et sa représentation par un nombre à virgule flottante. Dans
la section suivante, nous étudierons comment quantifier l’erreur d’arrondi de cette
représentation. Nous reviendrons sur le thème des erreurs d’arrondi dans la section
4.8 où nous examinerons des exemples concrets de nombres réels associés à une erreur
de représentation.

4.5 Flottants extrêmes et arrondi


Nous allons maintenant analyser les limitations les plus importantes du système
de représentation avec des nombres flottants. Dans cette section, nous présentons
les nombres extrêmes que l’on peut représenter dans un système flottant. Puis, nous
présentons le mode d’arrondi par défaut du standard IEEE 754, c’est-à-dire l’arrondi
au plus proche. Nous en déduirons l’erreur de représentation d’un nombre à virgule
flottante. Le théorème suivant permet de calculer les flottants extrêmes d’un système
à virgule flottante.
Théorème 4.4 (Flottants extrêmes). Considérons le système flottant de paramètres
β , p, emin et emax . Le plus petit flottant normalisé positif est :

µ = βemin . (4.12)

Le plus grand flottant normalisé est :


 
Ω = β − β 1−p β emax . (4.13)

Le plus petit flottant dénormalisé strictement positif est :

α = βemin −p+1 . (4.14)

Le nombre flottant Ω est le plus grand flottant positif fini. Au contraire, le nombre
flottant α est le nombre flottant positif non nul le plus proche de zéro. Le théorème
précédent est démontré dans l’exercice 4.3. La table 4.4 résume les propriétés des
doubles IEEE 754, que l’on pourrait nommer « l’alpha et l’omega des nombres flottants
sur 64 bits ». On observe, par exemple, que le plus grand flottant fini est 10308 environ.
Cela implique que le nombre flottant le plus négatif est approximativement égal à
−10308 .
Exemple 4.12 (Flottants dénormalisés et extrêmes dans le système jouet). Repre-
nons les données et le script de l’exemple 4.7 et évaluons la liste des flottants dénor-
malisés. Pour cela, considérons tous les flottants (normalisés et dénormalisés) dans le
système « jouet » défini par (β, p, emin , emax ) = (2, 3, −2, 3). Pour déterminer la liste
des nombres flottants dénormalisés, on considère la définition 4.9. Premièrement, ces
nombres sont associés à l’exposant e = e min = −2, ce qui implique que la puissance de
2 considérée est 2 e−p+1 = 2−2−3+1 = 2 −4. Deuxièmement, on observe que l’inégalité
4.10 est équivalente à m ∈ {−βp−1 + 1, . . . , β p−1 − 1} car la partie intégrale m est un
entier. Puisque β p−1 = 23−1 = 4, l’ensemble des parties intégrales des nombres dénor-
malisés est m ∈ {−3, −2, . . . , 3}. C’est pourquoi les nombres dénormalisés dans ce sys-
tème sont {−3×2−4, −2×2 −4 , . . . , 3×2−4 }, c’est-à-dire {−0.1875, −0.125, . . . , 0.1875}.
Dans la liste suivante, nous avons écrit tous les nombres à virgule flottante et souligné
60 Chapitre 4 • Flottants

Paramètre Valeur numérique Paramètre Valeur numérique


 
β 2 Ω 2 − 2 1−53 × 21023
p 53 ≈ 10 308
e min -1022 µ 2 −1022 ≈ 10 −308
e max 1023
α 2 −1022−53+1 ≈ 10−324

Table 4.4 – Propriétés des nombres à virgule flottante IEEE 754 sur 64 bits. À
gauche, la base β , la précision p et les exposants minimum emin et maximum emax . À
droite, le plus grand flottant positif Ω, le plus petit flottant normalisé positif µ et le
plus petit flottant dénormalisé positif α.

les nombres dénormalisés : −14.0, −12.0, −10.0, −8.0, −7.0, −6.0, −5.0, −4.0, −3.5,
−3.0, −2.5, −2.0, −1.75, −1.5, −1.25, −1.0, −0.875, −0.75, −0.625, −0.5, −0.4375,
−0.375, −0.3125, −0.25, −0.1875, −0.125, −0.0625, 0.0, 0.0625, 0.125, 0.1875, 0.25,
0.3125, 0.375, 0.4375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5,
4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 12.0, 14.0. On observe que les nombres dénormalisés sont
proches de zéro. De plus, les nombres extrêmes sont :
 
µ = 2−2 = 0.25, Ω = 2 − 21−3 23 = 14, α = 2−2−3+1 = 0.0625.

La définition suivante introduit la représentation flottante d’un nombre réel.


Définition 4.10 (Représentation flottante). Pour un système flottant de précision
p, pour tout x ∈ R, on note fl(x) la représentation flottante de x.
Parfois, il arrive que le nombre réel que l’on considère est un nombre à virgule
flottante, mais c’est plutôt rare. En général, il y a une différence entre un nombre réel
et sa représentation par un nombre à virgule flottante. Plus précisément, si un nombre
réel est positionné entre deux nombres flottants consécutifs, il est nécessaire de choisir
lequel sera son représentant. Pour déterminer par quel nombre flottant on représente
un nombre réel donné, différentes méthodes sont disponibles. Dans ce livre, nous nous
concentrons sur le mode d’arrondi par défaut dans le standard IEEE 754, c’est-à-dire
l’arrondi au plus proche. En effet, le standard IEEE 754 2008 propose d’autres modes
d’arrondi, mais nous ne les détaillerons pas dans ce livre, car leur utilisation n’est pas
très fréquente.
Soit x le nombre réel que l’on souhaite représenter. Si x est dans l’intervalle
[−Ω, Ω], le mode d’arrondi par défaut est l’arrondi au plus proche (round to nearest
en anglais) que l’on note RN(x). La figure 4.3 montre le principe du mode d’arrondi
au plus proche. Dans la figure, le nombre réel x est entre deux nombres flottants
f− et f +. Comme x est plus proche de f−, le nombre flottant qui représente x est
RN(x) = f −.
Exemple 4.13 (Arrondi au plus proche). Considérons le système « jouet » défini
par (β, p, emin , emax ) = (2, 3, −2, 3). Soit x = 4.4 un nombre réel. On observe que x
se trouve entre deux nombres flottants : 4 et 5. Puisque x est plus proche de 4, on a
fl(x) = 4. Soit x = 4.7 un nombre réel. On observe que x se trouve entre les mêmes
nombres flottants : 4 et 5. Cette fois-ci x est plus proche de 5, ce qui mène à l’égalité
fl(x) = 5.
4.5 • Flottants extrêmes et arrondi 61

RN(x)

f- x f+

Figure 4.3 – Mode d’arrondi au plus proche.

Il y a une différence entre x et sa représentation flottante fl(x) et c’est la raison


pour laquelle on peut essayer d’évaluer cette erreur. Pour cela, il sera utile d’introduire
la notion de précision machine.
Définition 4.11 (Précision machine). Pour un système flottant de précision p, la
précision machine est définie par u = 12 β 1−p .
L’erreur de représentation d’un flottant est déterminée par le théorème suivant.
Théorème 4.5 (Erreur de représentation d’un nombre à virgule flottante). Soit
x ∈ R. Supposons que le mode d’arrondi du système flottant est l’arrondi au plus
proche. Si x est normalisé, alors :

fl(x) = x(1 + δ ) (4.15)

où δ est un réel tel que |δ | ≤ u et u est la précision machine. Si x est dénormalisé,


alors :
1 emin −p+1
| fl(x) − x| ≤ β . (4.16)
2
Le théorème précédent est démontré dans l’exercice 4.10. En d’autres termes, si
x est dans l’intervalle normalisé, alors il y a une erreur relative qui est toujours plus
petite que u. En effet, dans ce cas, le nombre x est différent de zéro, puisque m est,
par définition d’un flottant normalisé, non nul. Par conséquent, l’erreur relative entre
x et fl(x) est égale à |δ| et :
 
 fl(x) − x 
 ≤u (4.17)
 x 

comme le montre l’exercice 5.3 page 92. En revanche, si x est dans l’intervalle dénor-
malisé, alors il y a une erreur absolue qui est toujours plus petite que βemin −p+1 .
Définition 4.12 (Précision machine). Avec les doubles IEEE 754, la précision ma-
chine est u = 2 −53 ≈ 2×10−16 et la valeur de l’epsilon machine est M = 2−52 ≈ 10−16 .
En anglais, la précision machine u valeur est nommée unit roundoff. Avec les
doubles, le théorème 4.5 implique que, pour des nombres dénormalisés, approxima-
tivement 16 chiffres décimaux sont corrects. La précision machine ne doit pas être
confondue avec l’epsilon machine, qui est différent d’un facteur 2. Avec les doubles
IEEE 754, la valeur de βe min −p+1 est βemin−p+1 = 2 −1074 ≈ 10 −324 et c’est la raison
pour laquelle le théorème 4.5 implique une erreur absolue plus petite que environ
10−324 pour les nombres dénormalisés.
La figure 4.4 montre les doubles avec une échelle « artistique ». En effet, en toute
rigueur, l’échelle n’est pas correcte, car l’espace horizontal entre α, µ et Ω ne cor-
respond pas exactement aux vrais intervalles. On observe que les nombres entre zéro
62 Chapitre 4 • Flottants

-Infini Nombres Nombres -Zéro Zéro Nombres Nombres Infini


normalisés dénormalisés dénormalisés normalisés

-Ω≈-10308 -μ≈-10-308 -α≈-10-324 0 α≈10-324 μ≈10 -308 Ω≈10308

Figure 4.4 – Représentation des doubles avec une échelle « artistique ».

et α sont représentés par le plus proche des deux. Les nombres dénormalisés positifs
sont entre α et µ, tandis que les nombres normalisés positifs sont entre µ et Ω.
Lorsqu’un nombre réel x non nul est représenté par zéro, c’est-à-dire lorsque fl(x) =
0, alors on dit qu’il y a underflow. Au contraire, si un nombre fini x est trop grand,
il est représenté par INF et on dit qu’il y a overflow, comme dans l’exemple suivant.

Exemple 4.14 (Underflow et overflow en Python). Dans la session Python sui-


vante 4, on évalue les nombres flottants qui représentent des nombres mathématiques
extrêmes.
1 >>> 1. e -1000 // Underflo w
2 0.0
3 >>> 1. e1000 // Overflow
4 inf
5 >>> -1. e1000 // Overflow
6 - inf
7 >>> -1. e -1000 // Und erflow
8 -0.0

Dans la sessions précédente, on observe en particulier qu’il y a deux zéros flottants


différents, représentés par 0.0 et -0.0. Ces deux nombres flottants sont différents,
bien que les deux nombres réels qu’ils représentent soient égaux. En effets, la présence
du bit de signe de la représentation par des nombres à virgule flottante génère cette
différence entre les deux zéros. Dans ce contexte, on dit que le zéro est signé. Nous
reviendrons sur ce sujet dans le contexte de l’intégration, dans la section 11.9.

Dans cette section, nous avons vu la représentation flottante d’un nombre réel
et le mode d’arrondi par défaut dans le standard IEEE 754. Nous avons vu dans
l’exemple 4.14 que si un nombre réel est trop proche de zéro, alors il est représenté
par l’un des deux zéros. De plus, si le nombre est trop grand en valeur absolue, on
peut produire les nombres à virgule flottante INF ou -INF. Dans la section suivante,
nous allons voir comment produire intentionnellement ces deux nombres et quelles
sont leurs propriétés.

4.6 En Python
Nous présentons dans cette section les nombres flottants exceptionnels en Python
et en particulier les nombres +INF, -INF et NAN. Le but cette section est de voir
comment produire volontairement ces nombres et comment ils peuvent apparaître
dans un calcul. Un des objectifs de cette section est de ne pas être démuni lorsqu’un
4Script Python : Flottants/Scripts/Py3/[Link].
4.6 • En Python 63

x float(x)
"inf" ∞
"-inf" −∞
"nan" Not-A-Number

Table 4.5 – La fonction float en Python.

tel nombre est affiché et de pouvoir comprendre dans quelles circonstances cela peut
advenir.
Les nombres flottants +INF et -INF se comportent comme les nombres mathéma-
tiques ±∞. En d’autres termes, à chaque fois que le comportement mathématique
attendu par la fonction est ±∞, alors le comportement en Python devrait être simi-
laire et on devrait obtenir +INF ou -INF. En Python, on peut générer les nombres
flottants infinis avec la fonction float, qui est présentée dans la table 4.5.
Exemple 4.15 (Comment créer un INF). Dans la session Python suivante5, on ob-
serve le comportement du nombre flottant INF.
1 >>> x = float ( " inf " )
2 >>> x
3 inf
4 >>> 1 + x
5 inf
6 >>> 2 * x
7 inf
8 >>> x / 2
9 inf
10 >>> 1/ x
11 0.0

Dans le paragraphe précédent, nous avons indiqué que cela devrait être le compor-
tement pour la plupart des fonctions, car c’est ainsi que le standard IEEE 754 a été
pensé. Toutefois, le comportement réel dépend de l’implémentation de chaque fonc-
tion spécifique. Ainsi ce principe général n’est pas implémenté dans tous les modules
Python et, d’autre part, fait parfois l’objet de débats passionnés chez les développeurs
pour qui ce comportement n’est pas toujours souhaitable.
Le nombre flottant not-a-number est souvent connu en tant que NAN. Ce nombre
apparaît lorsque le résultat mathématique est indéterminé, comme INF - INF ou
0 / 0. De plus, quand l’entrée d’une fonction est NAN, alors la sortie est NAN.
Exemple 4.16 (Comment créer un NAN). La session Python suivante6 montre com-
ment générer un NAN.
1 >>> x = float ( " inf " )
2 >>> x - x
3 nan
4 >>> 0 * x
5 nan
5Script Python : Flottants/Scripts/Py3/[Link].
6Script Python : Flottants/Scripts/Py3/[Link].
64 Chapitre 4 • Flottants

6 >>> x / x
7 nan
8 >>> x = float ( " nan " )
9 >>> x
10 nan
11 >>> 2 * x
12 nan
13 >>> x / 2
14 nan
15 >>> 1 / x
16 nan

Les nombres flottants exceptionnels peuvent sembler anecdotiques et on peut être


capable d’utiliser ou développer une méthode numérique sans nécessairement prendre
en compte ces particularités. Toutefois, leur maîtrise n’est, après ces quelques lignes,
pas très complexe. D’autre part, ne pas les prendre en compte peut mener à une
implémentation peu robuste d’une méthode, comme nous le vérifierons par exemple
dans le contexte de l’interpolation dans la section 13.3.
Dans l’exemple 4.5, le lecteur attentif aura remarqué que l’on ne stocke que 52
bits lorsqu’on considère des nombres flottants de type IEEE 754 sur 64 bits. Nous
avons cependant indiqué que la précision est p = 53, c’est-à-dire un bit de plus que le
nombre de bits réellement stockés. Le but de la prochaine section est d’expliquer ce
hiatus.

4.7 Bit implicite (*)


Dans cette section, nous montrons que l’implémentation des nombres à virgule
flottante exploite une propriété des nombres normalisés qui permet d’obtenir un bit
supplémentaire de précision. Ce bit « gratuit » est le bit implicite. Ce bit explique
pourquoi on ne stocke que 52 bits dans le standard IEEE 754, mais qu’on dispose
d’une précision égale à p = 53. Le théorème suivant montre que l’on peut caractériser
le premier bit d’un nombre à virgule flottante en fonction de sa normalisation.
Théorème 4.6 (Bit de tête de la représentation en base β). Supposons que x est un
flottant. Si x est normalisé, alors d 1 6= 0. Si x est dénormalisé, alors d 1 = 0.
Le théorème précédent est démontré dans l’exercice 4.6. Considérons en particulier
la base β = 2. Si x est normalisé, alors :

x = ±(1.d2 · · · dp )2 × 2e.

En d’autres termes, si x est normalisé, alors son premier bit est d1 = 1. Si x dénor-
malisé, alors :
x = ±(0.d2 · · · dp )2 × 2e.
En d’autres termes, si x est dénormalisé, alors son premier bit est d1 = 0. En consé-
quence, si on sait que x est normalisé, il n’est pas nécessaire de stocker le premier
bit d1 car on sait qu’il est nécessairement égal à 1. Dans le standard IEEE 754, un
encodage particulier de l’exposant permet de savoir si x est normalisé ou dénormalisé.
Le bit d1 est donc stocké de manière implicite. Cela explique pourquoi les doubles sont
associés à la précision p = 53, alors que seulement 52 bits sont stockés.
4.8 • Erreurs d’arrondi 65

4.8 Erreurs d’arrondi


Dans la section 4.5, nous avons analysé comment représenter un nombre réel par un
nombre à virgule flottante et comment procéder, si nécessaire, à son arrondi. L’objectif
principal de cette section est de montrer dans quelles circonstances il peut y avoir une
différence entre un nombre réel et sa représentation par un nombre à virgule flottante.
En effet, pour beaucoup de nombres réels, et en particulier pour un grand nombre
d’entiers, il n’y a pas d’arrondi et le réel est égal à sa représentation flottante. On
peut alors se demander si il existe des nombres pour lesquels il y a une différence
√ et
quelle est l’origine de celle-ci. En fait, beaucoup de nombres réels comme 2 ou le
nombre d’Euler e ne peuvent pas être représentés par des nombres à virgule flottante
de manière exacte. Dans cette section, nous avons choisi de nous concentrer sur les
nombres 0.1 et π, car ils occupent une place relativement commune en mathématiques.
De manière plus générale, nous allons analyser l’inclusion de plusieurs ensembles de
nombres et montrer ses conséquences dans le contexte des flottants. La définition
suivante précise les ensembles des flottants sur 64 bits, des nombres binaires et des
nombres décimaux.
Définition 4.13 (Nombres flottants sur 64 bits, binaires et décimaux). On note F64
l’ensemble des nombres à virgule flottante associés au système flottant spécifié par les
définitions 4.4 et 4.5 avec les paramètres du standard IEEE 754 sur 64 bits. Soient :
   
k k
B= tels que k ∈ Z, n ∈ N , D= tels que k ∈ Z, n ∈ N
2n 10n
et :  
p
Q= tels que p, q ∈ Z et q 6= 0 .
q
L’ensemble B est l’ensemble des nombres possédant une décomposition finie en
base 2 et l’ensemble D l’ensemble des nombres possédant une décomposition finie
en base 10. Dans la suite, nous appelons B l’ensemble des nombres binaires et D
l’ensemble des nombres décimaux. L’ensemble Q est l’ensemble des nombres ration-
nels. L’ensemble des nombres réels qui ne sont pas rationnels sont nommés nombres
irrationnels.
Exemple 4.17. On a 1, 2, 3, 12 , 14 ∈ B et 1, 2, 3, 10
1
, 2 1
10 , 100 ∈ D.
Il est évident que F64 ⊂ B, car les nombre à virgule flottante du standard IEEE
754 sont des nombres binaires. De plus, l’inclusion est stricte, puisqu’il existe des
nombres binaires qui ne peuvent pas être représentés par des nombres à virgule flot-
tante (comme par exemple les nombres binaires très proches de zéro). De plus, il est
évident que D ⊂ Q. Complétons cette analyse de manière plus fine. Premièrement,
nous allons voir que B ⊂ D et que cette inclusion est stricte. Puis, nous démontre-
rons que D ⊂ R et que cette inclusion est stricte. Le théorème suivant montre que
l’ensemble des nombres binaires est inclus dans l’ensemble des nombres décimaux.
Théorème 4.7 (Inclusion des binaires dans les décimaux). On a B ⊂ D.
Démonstration. Soit x ∈ B. Par définition, il existe deux entiers k et n tels que x = 2n .
k
n
k0
Multiplions le numérateur et le dénominateur par 5n . Cela implique x = 2k5 n5 n = 10n
où k0 = 5n k et montre que x ∈ D.
66 Chapitre 4 • Flottants

ℝ (ex. : π)
ℚ (ex. : 1/3)
𝔻 (ex. : 1/10)
𝔹 (ex. : 1/210000)
𝔽64

Figure 4.5 – Inclusion stricte des ensembles F64 , B, D, Q et R.

L’exemple suivant montre que l’inclusion B ⊂ D est stricte.


Exemple 4.18 (Un nombre décimal qui n’est pas un nombre binaire). Le nombre
10 ∈ D, mais 10 6∈ B. En effet, par définition, on a 10 ∈ D. Utilisons le théorème
1 1 1

4.3 pour écrire la représentation en base 2 de 10 . On a 10


1 1
= (0.00011001100 . . .) 2
et le motif (1100)2 se répète à l’infini. Montrons que 10 6∈ B par l’absurde. Si c’est
1

vrai, alors il existe un couple d’entiers k et n tels que 101


= 2kn. Cela implique que
2n = 10k, ce qui mène à l’égalité 2n−1 = 5k après simplification par 2. Cela implique
que le nombre premier 5 est un diviseur de 2n−1 , ce qui est impossible, car 2 est
1
également un nombre premier. Par conséquent, on a 10 6∈ B ce qui implique qu’il
1
est nécessaire d’utiliser un nombre infini de bits pour représenter 10 en base 2. C’est
1
pourquoi lorsqu’on représente 10 par un nombre à virgule flottante, il y a une erreur
d’arrondi non nulle.
L’inclusion D ⊂ Q est un truisme, car les nombres décimaux sont des fractions
particulières. De même, l’inclusion Q ⊂ R est évidente, mais il n’est pas trivial de voir
que cette inclusion est stricte. L’exemple suivant présente un nombre réel qui n’est
pas un nombre décimal.
Exemple 4.19. On a π = 3.142 en base 10 avec 4 chiffres significatifs. Toutefois, la
représentation exacte de π nécessite un nombre infini de décimales ce qui implique
que π 6∈ D. En d’autres termes, le nombre π est un nombre réel, mais pas un nombre
décimal. Plus précisément, on peut démontrer que π est un nombre irrationnel ([127]
chapitre 16 page 321), ce qui implique que π 6∈ Q.
Dans la figure 4.5, nous présentons les ensembles F 64, B, D et R. La figure montre
que F64 ⊂ B ⊂ D ⊂ Q ⊂ R et que ces inclusions sont strictes. De surcroît, pour
chaque ensemble, nous donnons un exemple de nombre qui n’est pas inclus dans le
sous-ensemble
 1  qu’il contient. Par exemple, on a 2101000 ∈ B, mais 2 101000 6∈ F 64 puisque
fl 210 000 = 0 lorsqu’on considère des nombres à virgule flottante sur 64 bits. De
1 1
même, nous avons 10 ∈ D mais 10 6∈ B comme nous l’avons vu dans l’exemple 4.18.
La figure montre qu’il existe des nombres réels qui ne sont pas des nombres à virgule
flottante. Pour chacun de ces nombres réels, il y a une erreur d’arrondi non nulle
quand on le représente par un nombre à virgule flottante.
La figure 4.5 a plusieurs conséquences concrètes. Par exemple, cela implique que
lorsqu’on simule un système d’équations différentielles ordinaires, utiliser le pas de
temps ∆t = 10 1
n’est pas un choix très approprié si on réalise les calculs avec des
nombres à virgule flottante. En effet, une erreur d’arrondi non nulle est commise au
1
moment où on représente le nombre 10 par un flottant. Cette erreur est proche de la
1
précision machine, ce qui peut sembler négligeable. Plus précisément, le nombre 10
4.9 • Conclusion 67

est compris entre les deux nombres flottants consécutifs suivants7 :


 
−56 1 1
7205759403792793 × 2 < < 7205759403792794 × 2−56 = fl .
10 10

Puisque le nombre flottant le plus proche de 10 1


est strictement supérieur, cela génère
une erreur d’arrondi relative égale à 5.551 × 10 , ce qui est relativement petit. Bien
−17

que cela ne soit pas l’unique cause du problème, l’erreur de représentation du nombre
0.1 par un nombre binaire explique l’absence d’interception d’un missile Scud par un
missile Patriot le 25 février 1991 sur la base de Dahran en Arabie Saoudite, tuant 28
soldats [124]. En remplacement, on peut utiliser le pas de temps ∆t = 18 = 0.125 qui
a l’avantage d’être à la fois un nombre flottant et un nombre décimal.
Il est possible d’observer l’impact de ce problème en Python. La session suivante
montre que la représentation en virgule flottante du nombre 3 − 0.3/0.1 n’est pas égale
à 0, mais que le résultat est proche de la précision machine.
1 >>> x = 3.0 - 0.3 / 0.1
2 >>> print ( "x = " , x)
3 x = 4.440 8920 985 006 26 e -16
La cause de ce problème est que le nombre réel 0.3 est représenté par un flottant un
peu inférieur à 0.3 et que 0.1 est représenté par un flottant un peu supérieur à 0.1
([104] page 37).
Un autre exemple est donné par le nombre π , qui n’est pas un nombre à virgule
flottante. Lorsqu’on approche ce nombre par un flottant, il y a une erreur de représen-
tation de telle sorte que l’évaluation numérique de sin(π) n’est pas égale à 0, comme
on le voit dans la session suivante.
1 >>> import numpy as np
2 >>> x = np . sin ( np .pi )
3 >>> print ( "x = " , x)
4 x = 1.224 646 7991 473 532 e -16
La cause de ce problème n’est pas une mauvaise implémentation de la fonction sin en
Python. En fait, le nombre π est compris entre les deux nombres flottants consécutifs
suivants :

fl(π) = 7074237752028440 × 2−51 < π < 7074237752028441 × 2 −51.

Le nombre flottant le plus proche de π est donc strictement inférieur à celui-ci, ce qui
mène à une erreur de représentation relative égale à 3.898 × 10−17. L’évaluation de la
fonction sin par Python est ensuite très précise.

4.9 Conclusion
Dans ce chapitre, nous avons vu comment représenter un nombre réel par un
nombre à virgule flottante. Nous avons vu que, pour beaucoup de nombres réels, il
existe une différence entre le nombre et sa représentation à cause de l’arrondi. Or, au
lieu de faire des calculs avec des nombres réels, les algorithmes Python font des calculs
avec des nombres à virgule flottante. Cela induit une erreur et on peut se demander
7Script Python : Flottants/Scripts/Py3/[Link].
68 Chapitre 4 • Flottants

comment se propage cette erreur au travers de la méthode numérique. Ce problème


nous mènera à la notion de conditionnement, que nous analyserons plus en détail dans
le chapitre 5.
Nous avons analysé seulement une partie de la théorie associée aux nombres à
virgule flottante, car une analyse complète nécessiterait beaucoup plus de détails, ce
qui ne rentre pas dans le cadre de ce cours. Par exemple, un thème que nous n’avons
pas abordé est la perte de précision graduelle des nombres flottants dénormalisés.
D’une manière générale, nous avons vu les propriétés des nombres binaires à virgule
flottante, mais nous n’avons pas étudié les algorithmes mis en œuvre pour manipuler
ces nombres. Par exemple, nous n’avons pas vu comment convertir un nombre à
virgule flottante en base 10 ou bien comment faire la somme de deux nombres à
virgule flottante. Pour la plupart d’entre nous, ce n’est pas un problème, puisqu’une
connaissance relativement superficielle suffit à comprendre la plupart des difficultés
les plus courantes.
Pour aller plus loin sur le thème des nombres flottants, on peut analyser le pro-
blème de la propagation des erreurs d’arrondis dans les algorithmes numériques, par
exemple la somme ou le produit de deux réels. Nous reviendrons en particulier sur le
difficile problème de la somme de deux nombres flottants dans la section 5.7. On peut
également analyser les algorithmes classiques pour calculer des résultats numériques
plus précis ou plus robustes comme, les méthodes de sommes compensées pour le
calcul de la somme ou les méthodes robustes pour le calcul de la division de deux
nombres complexes. Ces sujets ne seront pas abordés dans ce cours, mais on peut
consulter [54, 70, 73, 104, 106].

4.10 Notes et références


La figure 4.1 est inspirée de [147], avec des modifications. La figure 4.2 est inspirée
de [104], figure 1.7, page 35, avec des modifications. En particulier, la figure 4.2 est
générée en Python. Dans [106], la partie intégrale est notée avec la lettre majuscule
M (équation 2.1 page 14). La lettre m est, dans [106], utilisée pour désigner un autre
nombre. Dans l’équation 4.1 page 53, nous avons plutôt utilisé la lettre minuscule
m pour trois raisons. Premièrement, la convention mathématique la plus fréquente
pour désigner les entiers relatifs est d’utiliser une lettre minuscule. Deuxièmement,
nous pourrions confondre avec la constante associée à la notation de Landau que nous
avons vue dans la définition 3.1. Enfin, nous préférons utiliser la lettre majuscule pour
désigner les matrices.
La table 4.6 présente les fonctions du module [Link] développé pour ce livre.

4.11 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.

Exercice 4.1 (Représentation binaire de quelques entiers) Dans cet exercice, on considère
des entiers non signés. Montrer que (101)2 = 5. Montrer que (111) 2 = 7. Expliquer pourquoi
l’entier n = 8 ne peut pas être représenté avec seulement trois bits.
4.11 • Exercices 69

computeDigits Log-relative erreur


relativeError Erreur relative
absoluteError Erreur absolue
fCond Conditionnement d’une fonction
logCond Conditionnement de la fonction log
log1pCond Conditionnement de la fonction log1p
expCond Conditionnement de la fonction exp
expm1Cond Conditionnement de la fonction expm1
erfCond Conditionnement de la fonction erf
computefloats Liste des flottants
floatgui Liste des flottants (avec graphique)

Table 4.6 – Fonctions du module [Link] développé pour ce livre.

Exercice 4.2 (Représentation binaire des entiers) Considérons l’entier n dont la représen-
tation binaire est n = (dp dp−1 . . . d1 )2 où d1, d2 , . . . , dp ∈ {0, 1}. Montrer que n ∈ [0, 2 p − 1].
Indication. On a :
y k+1 − 1
1 + y + y2 + . . . + y k = (4.18)
y −1
pour tout réel y différent de 1 et tout entier k .

Exercice 4.3 (Nombres flottants extrêmes) Considérons le système flottant jouet de


paramètres (β, p, emin , e max) = (2, 3, −2, 3). Répondre aux questions suivantes. Pour répondre
aux trois premières questions, on utilisera un calcul direct, sans utiliser le théorème 4.4.
1. Quel est le plus grand nombre flottant Ω (fini) dans ce système ?
2. Quel est le plus petit nombre flottant µ normalisé positif dans ce système ?
3. Quel est le plus petit nombre flottant α dénormalisé strictement positif dans ce sys-
tème ?
4. Démontrer le théorème 4.4.

Exercice 4.4 (Flottants normalisés) Démontrer le théorème 4.2 page 58.


Le prochain exercice repose sur le théorème suivant.

Théorème 4.8 (Décomposition d’un entier en base β ). Supposons que β ≥ 2 est un entier
positif et que n ∈ N est un entier tel que 0 ≤ n < βp où p ∈ N. Alors, il existe p uniques
entiers d1 , . . . , dp tels que n = d 1β p−1 +d2β p−2 + . . . + d p avec 0 ≤ d i < β pour i = 1, 2, . . . , p.

Ce théorème se démontre en utilisant le théorème de la division euclidienne, qui stipule


que, pour deux entiers a et b, avec b > 0, il existe deux uniques entiers q et r tels que
a = qb + r . Dans ce théorème, l’entier q est le quotient et r est le reste. Ces deux théorèmes
sont élémentaires en théorie des nombres, et nous les considérons par la suite comme acquis.

Exercice 4.5 (Représentation d’un flottant en base β ) Supposons que x est un nombre
flottant. Alors montrer qu’il existe des entiers d1 , ..., d p tels que :
 
d2 dp
x = ± d1 + + . . . + p−1 · βe (4.20)
β β

avec d 1, . . . , dp ∈ {0, 1, . . . , β − 1}.


70 Chapitre 4 • Flottants

(m1 ,e1) x (m2 ,e2)

Figure 4.6 – Encadrement d’un nombre réel x, représenté par un point entre deux
flottants (m1 , e1 ) et (m2, e 2 ), représentés par des traits continus.

On peut également écrire x = ±(d1.d2 . . . dp )β ·β e . Dans l’exercice 5.18 page 95, on montre
que l’expression entre parenthèses dans l’équation 4.20 est de valeur absolue strictement
inférieure à β .

Exercice 4.6 (Premier chiffre d’une représentation en base β ) Supposons que x est un
flottant.
1. Si x est normalisé, montrer que le premier chiffre d1 de la représentation en base β de
x défini par l’équation 4.20 est non nul.
2. Si x est dénormalisé, montrer que le premier chiffre d1 est nul.

Exercice 4.7 (Représentation (s,f,e) d’un flottant) Supposons que x est un flottant non
nul. Montrer que x peut être défini par x = (−1) s · f · βe où s ∈ {0, 1} est le signe de x,
f ∈ R est la partie intégrale normalisée et satisfait 0 ≤ f < β et e ∈ N est l’exposant tel que
e min ≤ e ≤ e max.
Le but de l’exercice suivant est de démontrer le théorème 4.1.

Exercice 4.8 (Propriété du logarithme en base arbitraire) Soit b > 1 un entier. Montrer
que log b(b x) = x pour tout réel x.

* Exercice 4.9 (Indépendance du logarithme en base b par rapport au logarithme qui le


logc(x)
définit) Soit b > 1 et c > 1 deux entiers. Soit f la fonction définie par f (x) = log pour
c(b)
tout réel x > 0. Montrer que f (x) = log b(x) pour tout réel x > 0.
L’exercice 4.9 montre que le logarithme en base b est indépendant de c, c’est-à-dire de
la base du logarithme qui définit f . En d’autres termes, on peut définir la fonction logb en
utilisant n’importe quel logarithme, qu’il soit de base e (comme dans la définition 4.6), de
base 10 ou encore de base 2 : tous les logarithmes définiront la même fonction log b.

** Exercice 4.10 (Arrondi) Soit x ∈ R. Supposons que le système flottant est arrondir-
au-plus-proche. L’objectif de cet exercice est de démontrer le théorème 4.5 page 61.
1. Si x est dénormalisé, montrer l’inégalité 4.16.
2. Montrer que, si x est représentable par un flottant, alors l’égalité fl(−x) = −fl(x) est
satisfaite.
3. Si x est normalisé, montrer l’inégalité 4.15. Dans ce but, montrer l’inégalité 4.17.
Chapitre 5

Convergence, erreurs et
conditionnement

Dans le chapitre 4, nous avons vu comment représenter un nombre réel par un


nombre à virgule flottante que l’on peut représenter sur un ordinateur. En consé-
quence, il peut y avoir une différence entre ces deux nombres et on peut s’interroger
sur l’impact de cette différence sur le résultat de l’algorithme. L’objectif principal
de ce chapitre est de quantifier l’impact de cette différence, c’est-à-dire de mesurer la
sensibilité du résultat d’un algorithme lorsque les paramètres d’entrée sont légèrement
perturbés. Pour quantifier cette différence, nous allons définir la notion de condition-
nement du problème. Dans les chapitres suivants, nous allons appliquer ce concept à
la plupart des méthodes numériques présentées dans ce livre.
Dans ce chapitre, on analyse les méthodes de base pour le calcul numérique, en
particulier les concepts liés à la précision et la convergence d’une méthode numérique.
Pour illustrer le propos, nous anticipons un peu sur les méthodes numériques pour
la résolution d’équations non linéaires et plus précisément sur les méthodes de dicho-
tomie et de Newton. Celles-ci seront présentées en détail dans le chapitre 13 : on se
satisfait ici d’une observation extérieure du comportement de l’algorithme, sans en
observer les détails.
Nous analysons dans ce chapitre pourquoi distinguer l’erreur absolue et l’erreur
relative et nous montrons comment calculer le nombre de chiffres corrects d’un résultat
numérique. Enfin, on analyse le concept de conditionnement d’un calcul qui sera utilisé
dans la plupart des chapitres qui suivent, et en particulier en algèbre linéaire. Comme
illustration du conditionnement d’une fonction, nous présentons les fonctions expm1
et log1p.

5.1 Convergence
Dans cette section, la question que l’on se pose est de savoir comment évaluer la
vitesse de convergence d’un algorithme itératif. En effet, considérons un algorithme
itératif dont le but est de calculer une approximation de la solution exacte x ?. À
chaque itération i, l’algorithme produit un itéré xi qui est une approximation de la
solution exacte x ?. On fait l’hypothèse que la suite réelle xi converge vers x? et on

71
72 Chapitre 5 • Convergence, erreurs et conditionnement

souhaite évaluer la vitesse de convergence. Pour cela, on considère l’erreur absolue à


l’itération i définie par l’équation :

ei = |xi − x ?| (5.1)

pour i = 0, 1, .... Si ei+1 < e i alors l’erreur est réduite à chaque itération, mais
la vitesse de convergence peut être lente dans certains cas. Le taux de convergence
linéaire stipule la limite du rapport entre l’erreur absolue à l’itération i + 1 et l’erreur
absolue à l’itération i.
Définition 5.1 (Taux de convergence : linéaire). Supposons que la suite réelle (xi )i≥0
converge vers x ?, c’est-à-dire limi→∞ xi = x ? . La suite (x i )i≥0 converge vers x? li-
néairement avec le taux µ < 1 si :
|x i+1 − x? |
lim = µ. (5.2)
i→∞ |xi − x ? |

Si µ = 0, alors la convergence est dite « super-linéaire ». Si µ = 1, alors la convergence


est dite « sous-linéaire ».
Dans la définition précédente, on a nécessairement µ ≥ 0, puisqu’il s’agit de la
limite d’une suite positive. On peut écrire l’équation 5.2 en termes d’erreur absolue,
ce qui mène à l’équation lim i→∞ ei+1ei = µ. Plus la constante µ est proche de zéro,
plus la convergence est rapide. Une convergence sous-linéaire est très lente. Si la
convergence est linéaire, on a, lorsque i est grand, l’approximation e i+1 ≈ µei et
l’erreur est réduite d’un facteur égal à µ à chaque itération. Le taux de convergence
d’ordre p généralise la définition précédente en utilisant la puissance p de l’erreur à
l’itération i au dénominateur de la fraction.
Définition 5.2 (Taux de convergence : ordre p). Supposons que la suite réelle (x i )i≥0
converge vers x ?. Supposons que p ∈ R et p > 1. La suite (xi )i≥0 converge vers x?
avec l’ordre p s’il existe µ > 0 tel que :
|x i+1 − x? |
lim = µ. (5.3)
i→∞ |xi − x?| p

On peut écrire l’équation 5.3 en termes d’erreur absolue, ce qui mène à l’équation
lim i→∞ ei+1
ep
= µ. Plus la constante p est grande, plus la convergence est rapide. En
i
particulier, si p = 2, on dit que la convergence est quadratique. Si c’est le cas, lorsque i
est grand, on a ei+1 ≈ µe2i . Dans la définition 5.2, le nombre p n’est pas nécessairement
un entier. Par exemple, on peut démontrer que la méthode de la sécante converge
avec l’ordre p = φ = 1.618 (avec 4 chiffres significatifs) où φ est le nombre d’or. Nous
reviendrons sur ce sujet dans la section 13.7 consacrée à la méthode de la sécante. Une
différence significative entre les définitions 5.1 et 5.2 est que la définition 5.2 n’exige
pas que µ < 1. Bien sûr, si p = 1, la condition µ < 1 est requise pour garantir la
convergence, mais ce n’est pas une condition nécessaire si p > 1. Dans l’exemple qui
suit, nous comparons les taux liés à la convergence linéaire et quadratique.
Exemple 5.1 (Convergence linéaire et convergence quadratique). Les suites réelles
x i = 21i et xi = 212i pour i = 0, 1, 2, . . . tendent vers x? = 0 à des vitesses très
   
différentes. La figure 5.1 présente la convergence des suites 12i i≥0 et 212 i vers
i≥0
5.1 • Convergence 73

Convergence linéaire et quadratique


10−2 Linéaire
Erreur absolue Quadratique
10−7

10−12

0 2 4
Nombre d’itérations

1 1
Figure 5.1 – Convergence des suites 2i et 22
i vers zéro.

zéro. Sur l’axe des abscisses, on représente i, tandis que l’axe des ordonnées représente
 
l’erreur absolue ei = |xi − x ?| = xi , puisque x? = 0 et xi est positif. La suite 21i i≥0
 
converge linéairement et la suite 212 i converge de manière quadratique comme
i≥0
on le démontre dans l’exercice 5.2. La figure 5.11 montre que la suite qui converge à
un taux quadratique se rapproche de zérobeaucoup plus rapidement. En effet, après
seulement quatre itérations, la suite 2 12i a une valeur proche de 10−16, tandis
  i≥0
que la suite 21i i≥0 a une valeur proche de 10 −1 seulement.

Dans cette section, nous allons voir deux exemples pratiques de méthodes nu-
mériques avec des vitesses de convergence différentes. Par exemple, la méthode de la
dichotomie (aussi appelée « bissection ») possède une convergence approximativement
linéaire de taux µ = 1/2. Au contraire, la méthode de Newton-Raphson possède une
convergence quadratique (sous certaines hypothèses). Comme nous allons le voir, une
méthode possédant une convergence quadratique est beaucoup plus rapide qu’une
méthode avec une convergence linéaire.
On considère la méthode de la dichotomie pour résoudre une équation non linéaire.
Nous approfondirons cette méthode dans la section 13.2. Soit  > 0 un nombre réel
représentant une tolérance pré-déterminée. On se demande combien d’itérations sont
nécessaires pour obtenir une erreur inférieure ou égale à la tolérance . On peut
montrer que l’erreur à chaque itération i satisfait l’inégalité :

`0
ei ≤
2i
pour i = 1, 2, ... où `0 est une constante représentant la longueur de l’intervalle de
recherche initial (voir l’exercice 5.7). Supposons de plus que x? ≈ 1. Cela implique
que, à chaque itération, on a approximativement un bit de précision supplémentaire
(voir l’exercice 5.5). Avec des doubles, cela signifie que la méthode de la dichotomie
n’a, en général, pas besoin de plus de 53 itérations pour obtenir tous les bits de x? .
Soit  une tolérance absolue sur x donnée. Dans l’équation qui va suivre, nous
allons faire usage de la fonction ceil, notée dxe, déjà vue dans la définition 4.7, ainsi
1Script Python : Methodes/Scripts/Py3/[Link].
74 Chapitre 5 • Convergence, erreurs et conditionnement

que le logarithme de base 2, déjà vu dans la définition 4.1. Nous montrerons (dans le
chapitre 13) que, après :

i = dlog 2 (` 0 /)e (5.4)

itérations de la méthode de la dichotomie, alors ei ≤ . En d’autres termes, le nombre


d’itérations nécessaires pour obtenir une erreur absolue inférieure à  est donné par
l’équation 5.4.

Exemple 5.2 (Nombre d’itérations de la méthode de la dichotomie). Considérons


l’équation non linéaire f (x) = x3 + x − 1 = 0. Soit x? la solution exacte :

x? = 0.6823278038280193273694837...

Pour résoudre ce problème, nous proposons d’utiliser la méthode de la dichotomie. Soit


x i l’approximation de la solution à l’itération i c’est-à-dire xi ≈ x? pour i = 1, 2, ....
Combien d’itérations sont nécessaires pour atteindre une erreur (absolue) égale à
 = 0.5 × 10 −3, avec ` 0 = 1 ? La session Python suivante2 permet de répondre à cette
question en utilisant l’équation 5.4.
1 >>> from math import ceil , log2
2 >>> l = 1
3 >>> e = 0.5 e -3
4 >>> ceil ( log2 ( l / e) )
5 11

Par conséquent, onze itérations sont nécessaires.

L’exemple précédent montre que la méthode de la dichotomie peut sembler très


satisfaisante. Dans l’exemple suivant, nous montrons que, dans certains cas, une mé-
thode beaucoup plus rapide peut être utilisée.

Exemple 5.3 (Vitesse de convergence des méthodes de la dichotomie et de New-


ton). Dans la table 5.1, on observe la convergence de la méthode de la dichotomie
pour résoudre l’équation f (x) = x3 + x − 1 = 0 et on compare avec la méthode de
Newton (également nommée méthode de Newton-Raphson), que nous présenterons
dans la section 13.5. On observe qu’il faut seulement six itérations pour obtenir un
nombre maximal de chiffres significatifs avec la méthode de Newton. En revanche,
huit itérations sont nécessaires pour obtenir seulement une décimale exacte avec la
méthode de la dichotomie. Pour expliquer ce résultat, nous allons montrer, dans le
chapitre consacré à la résolution d’équations non linéaires, que la méthode de Newton
converge, sous certaines hypothèses, de manière quadratique.

En effet, sous certaines conditions, on peut démontrer que, pour la méthode de


Newton, l’erreur à l’itération i satisfait l’équation :

ei+1 = ce 2i , (5.5)

pour i = 0, 1, 2, ... où c > 0 est une constante dépendante de f 0(x? ) et f 00 (x? ). Cela
montre que la convergence de la méthode de Newton est associée à un taux de conver-
gence quadratique. Supposons, par exemple, que e0 = 0.1 et c = 1, ce qui est un cas
favorable pour la méthode de Newton. Le tableau 5.2 présente la liste des valeurs de
5.2 • Erreur absolue et erreur relative 75

Itération Dichotomie Newton-Raphson


i xi Décimales xi Décimales
0 0.000000 0 1.00000000000000000 0
1 1.000000 0 0.75000000000000000 1
2 0.500000 1 0.68604651162790697 2
3 0.750000 1 0.68233958259731420 4
4 0.625000 1 0.68232780394651271 10
5 0.687500 2 0.68232780382801939 16
6 0.656250 1 0.68232780382801927 15
7 0.671875 1
8 0.679688 1

Table 5.1 – Convergence de la méthode de la dichotomie pour résoudre f (x) =


x3 + x − 1 = 0 et comparaison avec la méthode de Newton. Les chiffres corrects sont
indiqués en gras.

i 0 1 2 3 4 5 ...
ei 10−1 10−2 10−4 10−8 10 −16 10−32 ...

Table 5.2 – Convergence quadratique de l’erreur absolue.

l’erreur ei lorsqu’elle suit la récurrence donnée par l’équation 5.5. On observe que,
pour i ≥ 4, on a ei ≤ 10 −16 .
D’une manière plus générale, avec des doubles, quand la méthode de Newton con-
verge vers une racine simple, elle converge à la précision maximale en 5 à 7 itérations.
Toutefois, nous verrons par la suite que la méthode de Newton souffre de plusieurs
limitations. Par exemple, la méthode peut ne pas converger (c’est-à-dire produire une
boucle infinie) ou bien diverger (c’est-à-dire produire une suite de valeurs tendant vers
l’infini). Plus de détails sur ce thème seront donnés dans le chapitre 13 sur la résolution
d’équations non linéaires. Mais si la méthode converge et si x? = 1, alors le nombre
de bits corrects est multiplié par deux à chaque itération. En effet, le logarithme de
l’égalité 5.5 est :
log(e i+1) = log(c) + 2 log(ei)
pour i = 0, 1, 2, .... Ainsi, on observe que le logarithme de l’erreur absolue à l’itération
i +1, c’est-à-dire log(ei+1), est le double du logarithme de l’erreur absolue à l’itération
i, c’est-à-dire log(e i+1) (plus une constante). En effet, le logarithme de l’erreur indique
le nombre de chiffres significatifs dans le résultat : c’est l’ordre de grandeur de l’erreur
que nous souhaitons, en général, mesurer. Ce concept est précisé dans la section
suivante où nous introduisons les erreurs absolues et relatives ainsi que la log-erreur
relative.

5.2 Erreur absolue et erreur relative


Dans cette section, nous introduisons les erreurs absolues et relatives. Nous avons
déjà utilisé de manière informelle l’erreur absolue, mais nous souhaitons surtout pré-
2Script Python : Methodes/Scripts/Py3/[Link].
76 Chapitre 5 • Convergence, erreurs et conditionnement

x x̃ eabs e rel
A 1. 2. 1. 1.
B 1. 1.000001 10−6 10 −6
C 10100 1.000001 × 10 100 1094 10 −6
D 0. 10−100 10−100 ∞

Table 5.3 – Erreur absolue ou relative dans quatre cas particuliers.

senter les deux pour mettre en avant la seconde. En effet, nous voulons montrer que,
dans la plupart des situations, l’erreur relative est plus appropriée que l’erreur absolue
pour quantifier l’erreur. Nous montrons comment le nombre de chiffres corrects peut
être mesuré par la « log-erreur relative ».
La définition suivante précise les notions d’erreur absolue et d’erreur relative.
Définition 5.3 (Erreur absolue et erreur relative). Soit x un nombre réel et x̃ son
approximation. Alors, l’erreur absolue entre x et x̃ est :

eabs(x, x
˜) = |x − x̃|

et l’erreur relative est :


|x − x̃|
erel(x, x)
˜ =
|x|
si x 6= 0.
Dans la définition de l’erreur relative, on ne peut pas inverser les entrées de la
fonction erel , c’est-à-dire que erel (x, x
˜) n’est pas nécessairement égal à erel (x̃, x). En
effet, la définition implique de diviser par la valeur exacte x et non pas par la valeur
approchée x̃. En d’autres termes, en général, le premier argument de l’erreur relative
est la valeur exacte. En pratique, la différence numérique entre erel (x, x ˜) et erel(x̃, x)
n’est généralement pas très significative comme le montre l’exercice 5.4.
Exemple 5.4. La table 5.3 présente différents nombres à comparer du point de
vue de l’erreur absolue ou relative3. Dans chaque cas, on se demande si x̃ est une
représentation « acceptable » de x. Le tableau suivant présente l’analyse des erreurs
absolues et relatives dans chaque cas.
Absolue Relative
Grande A, C A, D
Petite B, D B, C
— Pour le cas A, les deux erreurs sont grandes, de telle sorte que l’analyse est sans
ambiguïté : le nombre x̃ est une mauvaise représentation de x.
— Pour le cas B, les deux erreurs sont petites : le nombre x̃ est une bonne repré-
sentation de x.
— Pour le cas C, l’erreur absolue est grande, mais l’erreur relative est petite et
c’est pourquoi on peut considérer que x̃ est une bonne représentation de x. En
effet, x̃ et x ont six chiffres décimaux significatifs en commun, ce qui correspond
à une erreur relative égale à 10−6 .
3Script Python : Methodes/Scripts/Py3/[Link].
5.2 • Erreur absolue et erreur relative 77

— Pour le cas D, l’erreur absolue est petite, mais l’erreur relative est grande et
c’est pourquoi on peut considérer que x̃ est une mauvaise représentation de x.
En effet, x̃ et x n’ont aucun chiffre significatif en commun, ce qui est confirmé par
l’erreur relative infinie. En d’autres termes, la faible erreur absolue est trompeuse
puisqu’il n’y a aucun chiffre significatif correct.
Cet exemple indique que l’erreur relative est, quand elle existe, une meilleure
quantification du nombre de chiffres significatifs corrects dans un résultat numérique.
La différence entre erreur absolue et erreur relative est particulièrement sensible
lorsqu’on considère un changement d’unité, par exemple lorsqu’on calcule l’erreur en
millimètres (mm) ou en kilomètres (km). Bien sûr, une erreur absolue d’un millimètre
pour une mesure égale à 10 millimètres est relativement modérée. La même erreur
absolue d’un millimètre est très petite pour une mesure égale à 10 kilomètres. Cela
montre que l’erreur absolue est sensible à un facteur de changement d’échelle (comme,
par exemple, un changement d’unité de mesure), alors que l’erreur relative ne l’est
pas. Les deux exemples précédents sont une illustration de la propriété suivante.

Théorème 5.1 (Sensibilité à un changement d’échelle). Soit α > 0 un réel repré-


sentant un facteur de changement d’échelle. On suppose que x et x̃ sont différents de
zéro. Alors :

eabs (αx, αx
˜) = αe abs (x, x
˜) et erel (αx, αx
˜) = erel (x, x
˜ ).

En d’autres termes, un changement d’unité modifie l’erreur absolue, mais pas


l’erreur relative. Le théorème précédent est démontré dans l’exercice 5.9. En général, si
x 6= 0, on préfère utiliser l’erreur relative. Par contre, si x = 0, on doit utiliser l’erreur
absolue. Si x ∈ R n est un vecteur, on peut utiliser l’erreur relative composante-par-
composante :  
 x i − x̃i 
max  .
i=1,...,n  xi 
Les sources d’erreurs les plus fréquentes dans les calculs numériques sont (outre
les erreurs humaines) les suivantes.
— Les erreurs de mesures physiques (distances, temps, etc.) sont en général impor-
tantes, de telle sorte qu’on a souvent seulement quelques chiffres significatifs.
Par exemple, l’erreur absolue pour une mesure de température avec un ther-
momètre conventionnel à 20 degré Celsius est d’un degré, ce qui représente une
erreur relative égale à 5 × 10−2.
— Les erreurs de représentation sur ordinateur sont des erreurs d’arrondi et sont,
en général, beaucoup plus faibles. Nous avons déjà introduit la notation fl(x)
dans la définition 4.10 pour désigner la représentation en arithmétique flottante
d’une expression x. Avec des nombres à virgule flottante de type « doubles »
(sur 64 bits dont 53 bits de précision), l’erreur de représentation relative entre
x et fl(x) est d’environ 10−16 (sauf en cas d’underflow ou d’overflow ), comme
nous l’avons vu dans le théorème 4.5 page 61.
— Les erreurs de calculs sur ordinateur peuvent être importantes ou faibles, en
fonction du calcul à réaliser (c’est-à-dire de la fonction à évaluer) et en fonction
de l’algorithme utilisé pour l’évaluer. Ce thème sera approfondi dans la suite du
cours.
78 Chapitre 5 • Convergence, erreurs et conditionnement

b=2 b = 10
LRE min 0 0
LRE max 53 15.95

Table 5.4 – Log-erreur relative minimales et maximales en bases 2 et 10.

Pour quantifier le nombre de chiffres corrects, nous pouvons utiliser la log-erreur


relative présentée dans la définition suivante.
Définition 5.4 (Log-erreur relative en base b). Soit b un entier avec b > 1. La
log-erreur relative en base b est définie par :

LRE b(x, x)
˜ = − logb (erel (x, x
˜)), (5.6)

pour x 6= 0 et x 6= x̃.
Dans la définition précédente, nous utilisons le logarithme de base b, noté logb ,
introduit dans la définition 4.6. Soulignons que le signe « - » devant le logarithme
en base b est important : si on l’omet, le nombre devient négatif, ce qui n’a plus de
sens. En particulier, si l’erreur relative est strictement comprise entre 0 et 1, alors son
logarithme en base b est négatif, ce qui implique que la log-erreur relative est positive
ou nulle. La log-erreur relative en base b est le nombre de chiffres en base b corrects
dans x̃ par rapport à x. Ce thème est exploré dans l’exercice 5.19. Dans l’exemple
suivant, nous observons l’exposant de l’erreur relative pour en déduire la log-erreur
relative.
Exemple 5.5 (Log-erreur relative). Supposons que e rel(x, x)˜ = 10 −6. Alors, la log-
erreur relative en base 10 est LRE10 (x, x)
˜ = − log 10(10 ) = 6. Cela implique que six
−6

chiffres décimaux sont corrects.


Considérons des nombres à virgule flottante de type « doubles ». Dans la définition
4.12 page 61, nous avons déjà vu que la précision machine est u = 2 −53 ≈ 10 −16 .
En anglais, on parle de unit roundoff. Le tableau 5.4 indique la log-erreur relative
minimum et maximum en bases 2 et 10. Comme on le voit, la log-erreur relative
minimum en base 10 est comprise entre zéro (lorsque tous les bits sont faux) et
environ 16 (lorsque les 53 bits sont corrects). En effet, en base 2, on a LRE2,max =
− log 2 (2−53) = 53. De même, en base 10, on a LRE10,max = − log 10 (2 −53) = 15.95. En
d’autres termes, avec des doubles, on peut représenter la plupart des nombres flottants
normalisés avec approximativement 16 chiffres significatifs. Avec des doubles, la log-
erreur relative en base 2 ne peut pas être plus grande que 53, puisque deux nombres
réels x 1 et x2 différents peuvent avoir la même représentation en virgule flottante
fl(x). Ainsi, même si les 53 bits sont corrects, on ne peut pas savoir, en général, si la
représentation est exacte ou non.

5.3 Erreur directe et inverse


Dans cette section, nous analysons les deux types d’erreurs associées à l’évaluation
d’une fonction f , c’est-à-dire les erreurs directes et inverses4. Nous montrons que la
4En anglais, forward et backward.
5.3 • Erreur directe et inverse 79

stabilité d’un algorithme peut être mesurée en étudiant la sensibilité de la sortie à


une perturbation de l’entrée. Cette analyse mène à la définition du conditionnement,
que nous étudions dans la section suivante.
On se pose la question suivante : si f est une fonction de x, quelle est l’erreur
commise sur son évaluation en virgule flottante fl(f (x)) ? Avant de considérer le cas
général, l’énoncé suivant se concentre sur les opérations algébriques.
Hypothèse 5.1 (Erreur relative des opérations algébriques). Soit x et y des doubles
tels qu’ils sont définis par le standard IEEE 754 (avec 64 bits dont 53 bits de précision).
Les opérations arithmétiques satisfont :
fl(x op y) = (x op y)(1 + δ) (5.7)
où |δ | ≤ u et op désigne une des opérations arithmétiques +, -, * et /.
Dans les hypothèses précédentes, la constante u est la précision machine au sens
du théorème 4.5. L’équation 5.7 montre que la valeur exacte de l’opération, égale à
x op y, est multipliée par 1 + δ. La démonstration dépend de l’algorithme choisi pour
l’opération op. Les hypothèses précédentes sont vérifiées pour l’arithmétique IEEE
754 : cela est garanti par le standard5. L’erreur relative est :
 
 fl(x op y) − (x op y) 
  = |δ| ≤ u.
 (x op y) 

En d’autres termes, les hypothèses 5.1 garantissent que l’erreur relative sur x op y est
inférieure à u pour les opérations algébriques. L’équivalence entre l’erreur relative et
la formulation qui utilise un facteur de correction 1 + δ est approfondie dans l’exercice
5.16.
Nous allons maintenant tenter d’analyser la situation plus générale dans laquelle
on évalue une fonction comme f (x) = sin(x). On considère une fonction f , un réel
d’entrée x et on veut calculer y = f (x). Soit ỹ une approximation de y, c’est-à-dire
telle que ỹ ≈ f (x). On recherche une mesure de la « qualité » de ỹ. Une mesure
possible consiste à dire que l’erreur est faible si :
|ỹ − y|
erel (y, y)
˜ = ≈ u.
|y|
Une autre mesure consiste à demander pour quelle donnée d’entrée avons-nous résolu
le problème de manière exacte ? En d’autres termes, quelle perturbation de l’entrée x
est-il nécessaire d’appliquer pour obtenir exactement la sortie ỹ ? Cela signifie qu’on
doit rechercher la valeur de ∆x telle que ỹ = f (x + ∆x) où l’égalité précédente est
exacte. S’il y a plusieurs ∆x, on prend le plus petit en valeur absolue. Nous venons
de décrire deux types d’erreurs. L’erreur directe sur y est mesurée par erel(y, y)˜ ou
eabs (y, y).
˜ L’erreur inverse sur x est mesurée par |∆x|/|x| (relative) ou |∆x| (absolue).
La figure 5.2 présente les erreurs directes et inverses pour l’équation y = f (x). La
définition suivante formalise notre analyse pour préciser une propriété de stabilité de
la fonction f .
Définition 5.5 (Stabilité inverse). Une méthode pour évaluer la sortie y = f (x) est
backward stable si, pour tout entrée x, elle produit une valeur ỹ avec une petite erreur
backward c’est-à-dire telle que ỹ = f (x + ∆x) pour un ∆x « petit ».
5Voir [70] page 40.
80 Chapitre 5 • Convergence, erreurs et conditionnement

Entrée Sortie
x y=f(x)
Erreur Erreur
inverse : Δx directe : Δy
x~=x+Δx ~
y=f(x+Δx)

Figure 5.2 – Erreurs directes et inverses pour y = f (x). Le trait plein montre le
calcul exact tandis que le trait pointillé montre la valeur calculée.

La manière de définir « petit » dépend du contexte. La définition 5.5 peut s’ap-


pliquer à des contextes comme la résolution d’équations linéaires ou non linéaires ou
encore l’optimisation. En fait, cette approche a une portée générale et nous l’utili-
serons systématiquement dans chaque chapitre. Dans la section suivante, nous com-
mençons par le cas le plus simple et nous l’appliquons à l’évaluation d’une fonction
d’une variable réelle.

5.4 Conditionnement
Dans cette section, nous introduisons la définition du conditionnement d’une fonc-
tion réelle et nous étudions en particulier le conditionnement de la fonction logarith-
mique. Dans la section 5.6, nous généraliserons l’analyse au cas des fonctions dont
l’entrée et la sortie sont des vecteurs. Le conditionnement permet de mesurer la limite
du rapport entre l’erreur relative sur la sortie et l’erreur relative sur l’entrée, lorsque
nous perturbons les données du problème en entrée.

Définition 5.6 (Conditionnement relatif d’une fonction dans R). Soit f une fonction
réelle. On suppose que x et f (x) ne sont pas nuls. Le conditionnement de f est :

erel (y, y)
˜
cf (x) = lim
∆x→0 e rel(x, x)
˜

avec x̃ = x + ∆x, y = f (x) et y˜ = f (x + ∆x).

Si x = 0 ou si f (x) = 0, alors on ne peut pas appliquer la définition précédente.


Dans ce cas, il faut utiliser une autre définition du conditionnement, ce que nous
explorons dans l’exercice 5.11. Dans la définition précédente, on a ỹ = f (x̃). Le coeffi-
cient multiplicatif c f mesure le rapport entre l’erreur relative sur y et l’erreur relative
sur x. Quand ∆x est petit, on a e rel(y, y˜) ≈ c f(x) × e rel(x, x)
˜ ce qui implique :

LRE10 (y, y)
˜ ≈ LRE10(x, x)
˜ − log 10(cf (x)).

La conclusion de l’équation précédente est que y possède environ log10 (cf (x)) dé-
cimales correctes en moins que x. Lorsque la fonction f est dérivable, le théorème
suivant permet de simplifier l’évaluation du conditionnement de la fonction en un
point.

Théorème 5.2 (Conditionnement relatif dans R). Soit f une fonction de classe
C 1 (R). On suppose que x 6= 0 et f (x) =
6 0. Alors le conditionnement de la fonction f
5.4 • Conditionnement 81

Fonction Description Conditionnement


 Domaine
 xf 0(x) 
f Fonction  f (x)  x 6= 0, f (x) 6= 0
f ◦g Fonction composée f (g (x)) cg (x)
crel rel
x=6 0, f (g(x)) =
6 0,
g(x) 6= 0
|x|
x+α Somme |x+α| x + α 6= 0
αx Produit 1 R?
α/x
√ Division 1 R?
1
x Racine carrée 2 x>0
x α Puissance |α| x>0
cos Cosinus |x tan(x)| x= 6 (2k + 1)π/2, k ∈ Z
sin Sinus |x cot(x)|  x= 6 kπ, k ∈ Z
 
tan Tangente  cos(x)xsin(x)  x 6= kπ, k ∈ Z
exp Exponentielle |x|  R?
 x exp(x) 
expm1 Expm1  exp(x)−1  R?
1
log Logarithme |log(x)|  x > 0, x 6= 1
 x 
log1p Log1p  (1+x) log(1+x)  x > −1, x 6= 0
kxk1
x1 + x 2 Somme avec k.k1 sur R2 |x1+x 2 | x 6= 0, x 1 + x2 6= 0

Table 5.5 – Conditionnement (relatif) de différentes fonctions élémentaires.

au point x est :
 0 
 xf (x) 
c f(x) =  . (5.8)
f (x) 

Le théorème précédent est démontré dans l’exercice 5.10. L’équation 5.8 néces-
site d’évaluer la dérivée de la fonction f au point x. Dans le cas où on ne dispose
pas de la dérivée, on peut utiliser les méthodes de différentiation présentées dans
le chapitre 9. Dans l’exercice 5.21, l’objectif est de démontrer que le conditionne-
ment d’une fonction composée est égal au produit des conditionnements. Lorsqu’on
les considère séparément, on peut voir les différentes situations qui peuvent générer
un conditionnement grand : lorsque x est grand, lorsque f 0(x) est grand (c’est-à-dire
si la pente de la courbe est grande) ou lorsque f (x) est proche de zéro. En pratique,
les termes x, f (x) et f 0(x) interagissent et peuvent se simplifier mutuellement. La
table 5.5 présente le conditionnement de différentes fonctions élémentaires. La table
utilise les ensembles R ? et Z?, qui sont définis dans la table 3 page 8. Dans la table,
on a tan(x) = sin( x) π cos(x)
cos(x) pour tout x 6= kπ + 2 et cot(x) = sin(x) pour tout x 6= kπ où
k ∈ Z. Dans l’exercice 5.12, nous analysons le conditionnement de plusieurs fonctions
élémentaires. L’exemple suivant montre que la fonction logarithme n’est pas toujours
bien conditionnée.

Exemple 5.6 (Conditionnement de la fonction log). On considère la fonction f (x) =


log(x) pour x > 0. Le conditionnement est :
 
 1 
c log(x) =  
log(x) 
82 Chapitre 5 • Convergence, erreurs et conditionnement

Cond. log1p log1p(x)


log(x)
0 0

−1 −1
0.5 1.0 1.5 −0.5 0.0 0.5

Cond. log
103 1.25
1.00
100
0.5 1.0 1.5 −0.5 0.0 0.5
x x

Figure 5.3 – À gauche, conditionnement de la fonction log(x) quand x ≈ 1. À droite,


conditionnement de la fonction log1p.

pour x > 0 et x 6= 1. Ce conditionnement est grand pour x ≈ 1 car log(1) = 0. Ainsi,


on a log(1 + ∆x) ≈ 0, lorsque ∆x est petit. Donc un petit changement (relatif) autour
de x = 1 provoque sur log(x) un petit changement absolu, mais un grand changement
relatif.

La partie gauche de la figure 5.36 présente le conditionnement de la fonction log(x)


quand x ≈ 1. La figure du bas représente le conditionnement de la fonction log(x) en
échelle logarithmique. On observe que le conditionnement est élevé au voisinage de
x = 1 et infini au point x = 1.
Dans certaines situations, nous ne pourrons pas évaluer le conditionnement de ma-
nière exacte, mais nous pouvons établir une borne supérieure de ce conditionnement.
Dans ce contexte, la règle générale est la suivante7 :

erreur directe . conditionnement relatif × erreur inverse (5.9)

Par conséquent, une petite erreur inverse implique une petite erreur directe, mais
pas le contraire. En d’autres termes, si l’erreur directe (c’est-à-dire mesurée sur y )
est petite, cela n’implique pas que l’erreur inverse (c’est-à-dire mesurée sur x) est
petite : cela dépend du conditionnement qui, dans certains cas, peut être grand. Notre
étude des méthodes numériques nous permettra d’illustrer ce principe dans plusieurs
contextes. Nous avons déjà étudié dans l’exemple 5.6 comment cela apparaît pour la
fonction logarithmique. Dans la section 5.6, nous examinerons comment introduire
le conditionnement d’une fonction vectorielle. Cela nous permettra d’illustrer une
seconde fois l’équation 5.9 dans la section 5.7 où nous considérons la somme de deux
nombres réels. Un autre exemple peut être trouvé dans l’analyse de la solution d’un
système d’équations linéaires, comme l’illustre la section 7.9. Dans la section suivante,
nous allons voir comment on peut tenter de résoudre le problème du conditionnement
de la fonction logarithmique en introduisant la fonction log1p et sa fonction associée,
la fonction expm1.
6Script Python : Methodes/Scripts/Py3/[Link].
7Voir [70] page 9.
5.5 • Les fonctions log1p et expm1 83

1-εM/2 1 1+εM

Figure 5.4 – Zoom au voisinage de x = 1 avec des nombres à virgule flottante de


type double.

5.5 Les fonctions log1p et expm1


Dans cette section, nous mettons en œuvre les concepts précédents dans deux cas
particuliers, c’est-à-dire les fonctions log1p et expm1, deux fonctions qui sont utiles
dans certaines circonstances. Nous analysons leur définition et leur conditionnement
et nous montrons des exemples de leur utilisation. La fonction log1p a une définition
tellement simple qu’elle peut sembler inutile à première vue.
Définition 5.7 (Fonction log1p). La fonction log1p est définie par :

log1p(x) = log(1 + x)

pour tout x > −1.


Le but de la fonction log1p est d’évaluer log(1 + x) précisément lorsque x est
proche de zéro. La session Python suivante 8 montre le comportement de la fonction
log1p du module NumPy pour x = 10−20 .
1 >>> from numpy import log , log1p
2 >>> log (1.0 + 1. e -20)
3 0.0
4 >>> log1p (1. e -20)
5 1e -20
La valeur exacte est :
 
log 1 + 10 −20 = 9.9999999999999999999500000... × 10 −21.

Donc log1p fournit la réponse la plus précise possible (avec des doubles). La cause
de ce problème est que la représentation flottante de la somme 1 + 1.e-20 est exac-
tement égale à un. En d’autres termes fl(1 + 10−20 ) = 1. En effet, avec des doubles,
le nombre 10−20 est trop petit pour que la somme 1 + 10−20 puisse être représen-
tée précisément. C’est pourquoi l’expression log(1.0 + 1.e-20) est évaluée comme
log(1.0) qui est nul. Cette situation est présentée dans la figure 5.4. On observe que
les flottants les plus proches de x = 1 sont 1 − M /2 et 1 +  M. Avec des nombres à
virgule flottante de type double, on a  M = 2−52 ≈ 10−16. C’est pourquoi la repré-
sentation flottante du nombre 1 + 10−20 est 1.
On peut facilement vérifier que le conditionnement de la fonction log1p est accep-
table si x > −0.5 (mais la fonction est singulière au point x = −1). Cela montre que
le conditionnement n’est pas la cause du problème dans ce cas particulier. En effet,
le conditionnement de la fonction log1p est :
 
 x 

c log1p(x) =  
(1 + x) log(1 + x) 
8Script Python : Methodes/Scripts/Py3/[Link].
84 Chapitre 5 • Convergence, erreurs et conditionnement

pour tout x > −1. Lorsque x = 0, il y a une singularité apparente de la forme


0/ log(1) = 0/0. En fait, on peut démontrer (voir l’exercice 5.14) que c log1p(0) = 1.
Ce conditionnement est tout à fait idéal. La partie droite de la figure 5.39 montre le
conditionnement de la fonction log1p. En conclusion, si on doit évaluer log(1 + x)
avec x proche de zéro (c’est-à-dire si |x| < 1), la fonction log1p donne un résultat plus
précis. La fonction log1p est la sœur de la fonction expm1, que nous allons maintenant
analyser.
Définition 5.8 (Fonction expm1). La fonction expm1 est définie par :
expm1(x) = exp(x) − 1
pour réel x.
Le but de la fonction expm1 est d’évaluer exp(x) − 1 précisément lorsque x est
proche de zéro. La session Python suivante10 montre le comportement de la fonction
expm1 pour x = 10−20 .
1 >>> exp (1. e -20) - 1.0
2 0.0
3 >>> expm1 (1. e -20)
4 1e -20
La valeur exacte est :
 
exp 10−20 − 1 = 1.00000000000000000000500000... × 10−20.
Donc expm1 fournit la réponse la plus précise possible (avec des doubles).
On pourrait penser que la fonction exp est mal conditionnée au voisinage de zéro,
mais il n’en est rien. En effet, il est facile de voir que le conditionnement de la fonction
exponentielle est :  
 x exp(x)
cexp (x) =    = |x|
exp(x) 
pour tout x ∈ R. Cela montre que la fonction exp est mal conditionnée lorsque
x → +∞, mais qu’elle est bien conditionnée au voisinage de zéro. De même, l’exercice
5.13 montre que la fonction expm1 est bien conditionnée au voisinage de zéro. La
cause du problème doit par conséquent se trouver ailleurs.
L’explication de ce phénomène de perte de précision consiste à voir l’« effacement »
(ou cancellation) des chiffres significatifs. La table 5.6 montre le comportement de la
fonction exp(x) lorsque x → 0. On a écrit les nombres avec 17 chiffres décimaux
significatifs pour représenter ce qui se passe en machine avec des nombres à virgule
flottante de type double (mais les calculs sont effectués par l’ordinateur en base 2 et
non pas en base 10 comme dans la table). On observe que lorsque x est proche de
zéro alors exp(x) est proche de 1. On remarque que le chiffre « 1 » après la virgule se
déplace de plus en plus vers la droite lorsque x tend vers zéro. Lorsque ce chiffre « 1 »
dépasse la 17e décimale, il n’est représenté. C’est pourquoi, lorsqu’on soustrait 1 et
qu’on effectue l’opération exp(x) − 1, il y a de moins en moins de chiffres significatifs :
le résultat calculé contient de plus en plus de chiffres erronés. En particulier, lorsque
x = 10 −20, on réalise l’opération :
fl(exp(10−20 )) − 1.0 = 1.0 − 1.0 = 0.0.
9Script Python : Methodes/Scripts/Py3/[Link].
10Script Python : Methodes/Scripts/Py3/[Link].
5.6 • Conditionnement dans le cas vectoriel (*) 85

x exp(x)
1.00000000000000000e+00 2.71828182845904509
1.00000000000000002e-02 1.01005016708416795
1.00000000000000005e-04 1.00010000500016671
9.99999999999999955e-07 1.00000100000049996
1.00000000000000002e-08 1.00000000999999994
1.00000000000000004e-10 1.00000000010000001
9.99999999999999980e-13 1.00000000000100009
9.99999999999999999e-15 1.00000000000000999
9.99999999999999979e-17 1.00000000000000000

Table 5.6 – Comportement de la fonction exp(x) lorsque x → 0. Dans la seconde


colonne, les chiffres non nuls sont représentés en gras.

Le calcul précédent produit un résultat sans aucun chiffre correct.


Comme on l’a vu, dans le cas de l’évaluation de y = exp(x) − 1 lorsque x est proche
de zéro, ce n’est pas la fonction elle-même qui est mal conditionnée, c’est l’algorithme
qui permet de l’évaluer. En effet, cet algorithme se compose de deux étapes, dont la
première évalue z = exp(x) et la seconde évalue la soustraction entre z et 1. Lorsque
x est proche de zéro, c’est en fait la seconde étape, c’est-à-dire la soustraction, qui
est mal conditionnée, car celle-ci évalue la différence entre deux nombres très proches.
Nous reviendrons sur ce sujet dans la remarque 5.3. Ce problème est en fait plus
général et concerne le calcul d’une somme, ce que nous approfondissons dans la section
5.7. Mais avant de pouvoir l’étudier, observons que la somme de deux nombres réels
est une fonction vectorielle de R2 vers R. Or la définition 5.6 ne s’applique qu’à une
fonction de R vers R. C’est pourquoi un petit détour théorique s’impose : nous devons
étendre la définition du conditionnement, ce qui est l’objectif de la section suivante.

5.6 Conditionnement dans le cas vectoriel (*)


Nous cherchons dans cette section à étendre la définition du conditionnement d’une
fonction de R dans R aux fonctions de Rm dans Rn. Dans ce but, nous commençons
par étendre les notions d’erreur absolue et relative dans un espace vectoriel. Dans
la section suivante, nous utiliserons ces définitions pour étudier le conditionnement
de la somme de deux nombres réels. Le lecteur trouvera de l’intérêt à consulter si
nécessaire le chapitre 6 consacré aux vecteurs et aux matrices et en particulier la
définition 6.7 d’une norme vectorielle. La définition suivante étend la définition 5.3
au cas vectoriel. En effet, lorsque nous disposons de deux vecteurs x et x̃ et que nous
souhaitons quantifier l’écart entre ces deux points, on peut introduire leur distance,
ce qui mène à la notion de norme vectorielle. Nous introduisons dans la définition
suivante les erreurs absolue et relative dans un espace vectoriel muni d’une norme.

Définition 5.9 (Erreur absolue et erreur relative vectorielles). Soit x ∈ Rm un point


et x̃ ∈ Rm son approximation. Soit k · k une norme sur Rm . Alors, l’erreur absolue
entre x et x̃ est :
eabs (x, x̃) = kx − x̃k
86 Chapitre 5 • Convergence, erreurs et conditionnement

et l’erreur relative est :


kx − x̃k
e rel(x, x̃) =
kxk
si x 6= 0.
Par définition de la norme vectorielle, on a kxk = 0 si et seulement si x = 0.
Cela implique que le dénominateur de l’erreur relative est non nul si x 6= 0. Le
point important de la définition précédente est que l’erreur dépend du choix de la
norme. C’est une différence significative avec le cas réel, dans lequel la valeur absolue
est le choix le plus simple. Au contraire, dans un espace vectoriel, il faut faire un
choix de norme vectorielle et l’on n’obtient pas la même erreur si l’on choisit la
norme 1, la norme euclidienne ou bien la norme infinie. Nous pouvons alors définir
le conditionnement d’une fonction de Rm dans Rn . Nous commençons par définir
le conditionnement en général, puis présentons un théorème qui peut être appliqué
aux fonctions de classe C1 et qui exploite la matrice jacobienne de la fonction. La
définition suivante étend la définition 5.6 au cas plus général où la fonction f prend
en entrée un vecteur et retourne un vecteur.
Définition 5.10 (Conditionnement dans Rm). Soit f : Rm → R n . Soit x ∈ Rm un
point. Le conditionnement absolu de la fonction f au point x est :
eabs (y, ỹ)
c f,abs(x) = lim sup
→0 k∆xk≤ eabs (x, x̃)

où x̃ = x + ∆x, y = f (x) et ỹ = f (x + ∆x). Le conditionnement relatif de la fonction


f au point x est :
e rel(y, ỹ)
cf,rel(x) = lim sup .
→0 k∆xk≤ erel (x, x̃)

Dans la définition précédente, on a ỹ = f ( x̃). On remarque qu’il y a en fait


deux normes différentes impliquées dans la définition : une norme sur Rn portant sur
l’espace d’entrée et une norme sur Rm portant sur l’espace de sortie. C’est pourquoi
le conditionnement dépend en pratique du choix des normes considérées. C’est une
différence importante avec le cas du conditionnement d’une fonction de R dans R, pour
laquelle la valeur absolue est utilisée à la fois pour l’entrée et pour la sortie. Lorsque
la fonction f est de classe C1 (Rm ), le théorème suivant montre comment exploiter ses
dérivées partielles pour obtenir une formulation explicite de son conditionnement.
Théorème 5.3 (Conditionnement dans Rm ). Soit f : R m → R n . On suppose que f
est de classe C1 . Alors le conditionnement de la fonction f est :
c f, abs (x) = kJ (x)k (5.10)
et :
kxk
c f, rel (x) = kJ(x)k (5.11)
kf (x)k
où J est la matrice jacobienne de f :
 ∂f 1 ∂f 1 
∂x1 ... ∂xm
 . .. 
J(x) =  .. . 
∂f n ∂f n
∂x1 ... ∂xm
5.7 • Conditionnement de la somme (*) 87

pour tout x ∈ R m.
Le théorème précédent, démontré dans l’exercice 5.20, permet d’analyser beaucoup
de fonctions vectorielles. Parmi ces fonctions, nous avons choisi d’illustrer le cas de la
fonction somme dans la section suivante.

5.7 Conditionnement de la somme (*)


Dans cette section, nous allons voir comment l’analyse du conditionnement donne
un éclairage puissant sur les instabilités potentielles lorsque l’on évalue la somme de
deux nombres. Considérons la fonction :

s(x 1 , x2) = x 1 + x2

pour tout x = (x1 , x2 )T ∈ R 2. La matrice Jacobienne de la fonction s est J (x) = (1, 1)


pour tout x ∈ R2 . On considère tout d’abord la norme k.k1 sur R2 (en entrée de la
fonction) et la valeur absolue comme norme sur R (en sortie de la fonction). Par
définition de la norme matricielle (présentée dans la section 6.5 page 109), on a :
  
 a 1 

kJ(x)k1 = max (1, 1) = max |a + a2 | ≤ 1.
kak1=1 a 2  kak 1 =1 1

De plus, le maximum est atteint, par exemple, au point a1 = 1 et a2 = 0. Par


(1)
conséquent, on a kJ(x)k1 = 1. L’équation 5.11 implique cs, rel (x) = |ks(xxk)1| kJ(x)k1 ce
qui implique :

(1) |x1 | + |x2 |


c s, rel(x) = (5.12)
|x1 + x2 |

où l’exposant (1) rappelle que nous avons choisi la norme 1 sur R2 . On considère
ensuite la norme k.k∞ sur R2 et la valeur absolue comme norme sur R, comme
cela est fait dans [136]. Par définition de la norme matricielle, on a kJ(x)k∞ =
maxkak∞ =1 |a 1 + a 2 | = 2 et le maximum est atteint, par exemple, pour a1 = 1 et
a2 = 1. L’équation 5.11 implique :

(∞ ) max(|x1 |, |x2|)
c s, rel (x) = 2 (5.13)
|x1 + x2 |

si x1 + x 2 6= 0. Qu’il s’agisse de la norme 1 menant à l’égalité 5.12 ou bien de la norme


infinie menant à l’égalité 5.13, les deux conditionnements sont grands lorsque :

|x 1 + x 2| ≈ 0 ou |x1 | + |x2| ≈ +∞.

C’est le cas lorsque x1 ≈ −x2, ce qui illustre le phénomène connu dans la littérature
anglophone sous le terme de catastrophic cancellation. Il s’agit de la perte de chiffres
significatifs lors de la soustraction de deux nombres très proches. Ce phénomène ap-
paraît, par exemple, lorsqu’on recherche les racines d’un polynôme de degré deux11
ou bien, comme nous l’observerons dans la section 9.3, lorsqu’on calcule une dérivée
approchée par une formule de différences finies.
11 Voir [45, 44].
88 Chapitre 5 • Convergence, erreurs et conditionnement

On peut, comme le fait G.W. Stewart dans [130] 12 , trouver un résultat similaire en
faisant un calcul qui n’implique pas la matrice jacobienne de la transformation. Soient
x 1 , x2 ∈ R. On considère la somme y = x1 + x 2. Soit  > 0 et soient  1 , 2 ∈ R tels que
| 1|, |1 | ≤ . On considère les données perturbées x̃1 = x1 (1 +  1 ) et x˜2 = x2 (1
+  2 ).
 x
Cela implique que x̃ 1 − x1 =  1x 1 et x̃2 − x2 = 2 x2 . Par conséquent x̃ − x = 1 1
2 x 2
ce qui implique :

kx̃ − xk 1 = |x 1|| 1| + |x 2||2 | ≤ (|x1 | + |x 2 |) = kxk1 

puisque, par hypothèse, on a | 1|, |2 | ≤ . Par conséquent, la définition 5.9 au sens de
la norme 1 implique e rel(x, x̃) ≤ . D’autre part :

ỹ − y = (x1 (1 +  1) + x2 (1 + 2 )) − (x 1 + x 2 )
= x1 1 + x22.

Par conséquent, on a |ỹ − y| ≤ |x 1||1 | + |x 2 || 2| ≤ kxk1. Cela implique :

|ỹ − y| kxk1 
e rel(y, y)
˜ = ≤ .
|y| |x1 + x 2 |
kxk1
Introduisons κ = |x 1+x 2 | . Nous obtenons :

erel (y, y˜) ≤ κ.

L’équation 5.12 montre que κ est le conditionnement du problème. En effet, la dis-


cussion est simplifiée par le fait que la pire perturbation (1 ,  2) est trouvée, ce qui
transforme l’inégalité en égalité. La définition permet, de plus, de changer facilement
de choix de norme.
Le mauvais conditionnement de la somme de deux nombres proches et de signes
opposés peut être observé dans de nombreux contextes. Par exemple, nous verrons
dans la section 9.3 que les formules de différences finies pour approcher une dérivée
sont mal conditionnées. Nous reviendrons également sur ce thème dans la section
11.5 lorsque nous analyserons la stabilité numérique des formules d’intégration de
Newton-Cotes.

5.8 Applications
5.8.1 Fiabilité d’une batterie
La loi exponentielle peut être utilisée pour modéliser la durée de vie d’un com-
posant 13. Une propriété importante de cette loi est qu’elle suppose que le composant
ne subit, en fonction du temps, ni détérioration (« vieillissement »), ni amélioration
(« défauts de jeunesse »). On dit que cette loi est « sans mémoire ».
Soit X la durée de vie d’une batterie de voiture en km. Supposons que X suit une
loi exponentielle de moyenne µ = 20000. En d’autres termes, la durée de vie moyenne
d’une telle batterie est de 20 000 km. On souhaite évaluer la probabilité que la durée de
12Voir chapitre 7, Floating point arithmetic, page 57.
13Voir [117], page 177.
5.8 • Applications 89

vie de la batterie soit inférieure à 10−12 km, c’est-à-dire 1 nanomètre. Cette probabilité
est, on s’en doute, très proche de zéro.x
Par définition de la loi exponentielle, la densité
de probabilité de X est f (x) = 1µ e− µ pour x ≥ 0. La fonction de répartition est :
x
F (x) = 1 − e −µ
pour x ≥ 0. La formule naïve pour évaluer la fonction de répartition est :
1 p = 1.0 - exp ( -x / mu ).
Une implémentation robuste14 de la fonction de répartition peut être fondée sur la
fonction expm1 :
1 p = - expm1 ( -x / mu )
qui est plus précise lorsque x est proche de zéro.
Par exemple, considérons les paramètres µ = 1 et x = 10 −12. La probabilité
exacte est P (X ≤ x) ≈ 5 × 10−17 avec 17 chiffres significatifs corrects. La session
Python suivante montre les résultats numériques de l’implémentation naïve et de
l’implémentation robuste.
1 >>> mu = 1.0
2 >>> x = 1. e -12
3 >>> 1.0 - exp (-x / mu )
4 0.0
5 >>> - expm1 ( -x / mu )
6 4.9 999 999 999 9999 99 e -17
On observe que l’implémentation naïve ne donne, dans ce cas, aucun chiffre significatif.
L’implémentation robuste donne, elle, le meilleur résultat possible avec des doubles.
Un problème similaire apparaît avec la fonction quantile F −1 , ce qui nécessite
d’utiliser la fonction log1p. La fonction quantile est la fonction qui évalue x en fonc-
tion de la probabilité p. Dans le cas de la loi exponentielle, cette fonction est définie
par l’équation :
F −1(p) = −µ log(1 − p)
pour p ∈ [0, 1). Une implémentation robuste de la fonction quantile peut être fondée
sur la fonction log1p :
1 >>> x = -mu * log1p (- p)
Cette implémentation est plus robuste que la formule naïve :
1 >>> x = -mu * log (1.0 - p)
lorsque p est proche de zéro.
Par exemple, considérons les paramètres µ = 1 et p = 10−20 . Le quantile exact est
x ≈ 10−20 avec 17 chiffres significatifs corrects. La session Python suivante montre
les résultats numériques de l’implémentation naïve et de l’implémentation robuste.
1 >>> mu = 1.0
2 >>> p = 1. e -20
3 >>> -mu * log (1.0 - p)
4 -0
5 >>> -mu * log1p (- p)
6 9.9 999 999 999 9999 95 e -21
14 Script Python : Methodes/Scripts/Py3/[Link].
90 Chapitre 5 • Convergence, erreurs et conditionnement

On observe que la fonction log1p produit un résultat précis, ce qui n’est pas le cas
de l’implémentation naïve.
Bien sûr, la probabilité que nous avons choisie ici est très proche de zéro, de telle
sorte que la situation présentée dans l’exemple précédent peut paraître possible, mais
peu fréquente. Cette impression est trompeuse, car la perte de chiffres significatifs est
en fait graduelle au fur et à mesure que la probabilité s’approche de zéro. Plus préci-
sément, si on n’utilise pas la fonction expm1 pour calculer la fonction de répartition,
on perd un nombre de chiffres significatifs qui dépend de la probabilité p. La conclu-
sion est que la formule naïve n’a aucun intérêt pratique quelle que soit la probabilité
choisie, puisqu’il existe une autre formule, robuste, qui donne toujours un résultat
plus précis pour un coût d’évaluation comparable.

5.8.2 Attaque cryptographique


La fonction log1p apparaît lorsqu’on considère un type d’attaque par force brute
des clés de hachage [152]. C’est une attaque cryptographique qui exploite une propriété
probabiliste associée au paradoxe des anniversaires.
On note H le nombre de sorties différentes d’une clé de hachage à b bits. On a alors
H = 2 b. Le nombre d’attaques n nécessaires pour obtenir une probabilité p ∈ [0, 1)
de générer une collision est :
p
n = −2H log(1 − p).

Pour augmenter la probabilité p qu’une collision soit générée, c’est-à-dire pour que
l’attaque réussisse, il est nécessaire d’augmenter le nombre n d’attaques. Au contraire,
lorsque le nombre n d’attaques est faible, la probabilité de collision p est proche de
zéro. Pour des faibles probabilités, c’est-à-dire lorsque p ≈ 0, une implémentation
naïve produit des valeurs de n très approchées. Au contraire, l’implémentation sui-
vante donne des résultats corrects :
1 n = sqrt ( -2.0 * H * log1p ( -p ))

Par exemple, évaluons le nombre de tentatives n nécessaires pour que la probabilité


d’une collision soit égale à p = 10−18 avec une clé sur b = 512 bits. Dans la session
Python suivante15 , on compare la formule naïve et la formule robuste.
1 >>> from math import log , log1p , sqrt
2 >>> p = 1. e -18
3 >>> nbits = 512
4 >>> H = 2 ** nbits
5 >>> sqrt ( -2.0 * H * log (1.0 - p) )
6 -0
7 >>> sqrt ( -2.0 * H * log1p ( -p ))
8 1.638 e +68

On observe que la formule naïve produit un nombre d’attaques égal à n = 0, tandis


que la formule robuste produit n = 1.638 × 1068 . Bien sûr, la différence entre les deux
formules se réduit lorsque p s’approche de 1, ce qui est la situation recherchée par
celui qui évalue la pertinence d’une telle attaque.
15Script Python : Methodes/Scripts/Py3/[Link].
5.9 • Conclusion 91

5.9 Conclusion
À l’aune des chapitres 4 sur les nombres à virgules flottante et 5 sur le condi-
tionnement, nous pouvons voir un point déterminant dans la pratique des méthodes
numériques et que nous avons déjà mis en avant dans l’avant-propos. On appelle im-
plémentation d’un algorithme sa transcription dans un langage de programmation
informatique déterminé, par exemple en Python. Souvent, l’implémentation d’un al-
gorithme est très différente de son expression mathématique. Par exemple, nous avons
vu dans la section 5.5 au sujet des fonctions expm1 et log1p qu’il peut exister deux
implémentations différentes du même concept mathématique. Nous observerons le
même phénomène apparaître dans les chapitres suivants et nous reviendrons sur ce
sujet dans la conclusion de ce livre.
Dans ce chapitre, nous avons analysé le concept de conditionnement d’une fonction
et nous l’avons illustré par exemple dans la section 5.7 sur le conditionnement de la
somme. Ce sujet, central, sera revu à de nombreuses reprises dans ce livre et nous
reviendrons sur ce sujet dans le chapitre 15 en conclusion de ce livre.

5.10 Notes et références


La référence principale de ce chapitre est [70] qui contient la plupart des éléments
cités ici. Pour approfondir les liens entre les nombres à virgule flottante et le condi-
tionnement, on peut consulter les leçons 5 à 8 de [130].
La section 5.1 est fondée sur [16]. L’exemple 5.2 est inspiré de [97]. La définition
5.10 ainsi que le théorème 5.3 (mais pas la preuve) sont donnés dans [136] pages 90.
L’exemple 5.3 et la figure 5.1 sont inspirés de [97], page 5, avec des modifications.
En particulier, les valeurs numériques sont issues d’une simulation Python créée pour
le manuel. La figure 5.2 est inspirée de [70], page 7, avec des modifications. La log-
erreur relative est présentée et utilisée par exemple dans [100], dans le cadre d’une série
d’articles consacrés à la mesure de la précision de plusieurs logiciels de statistiques.
Dans la section 5.8.1, nous avons analysé le calcul de la durée de vie d’une batterie
automobile. Cet exemple est inspiré de l’exemple 5.6a page 177 dans [117].

5.11 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.

Exercice 5.1 (Conditionnement d’un polynôme)


1. Calculer le conditionnement du polynôme P défini par P (x) = x2 − 1 pour tout
x ∈ R. Pour quelles valeurs de x le polynôme P est-il mal conditionné ?
2. Calculer le conditionnement du polynôme P défini par P (x) = x(x2 − 1) pour tout
x ∈ R. Pour quelles valeurs de x le polynôme P est-il mal conditionné ?

Exercice 5.2 (Convergence linéaire ou quadratique)


1 
1. Montrer que la suite 2i i≥0
converge linéairement vers zéro.
 
2. Montrer que la suite 1
i converge de manière quadratique vers zéro.
22 i≥0
92 Chapitre 5 • Convergence, erreurs et conditionnement

* Exercice 5.3 (Erreur relative, 2e définition) Soit x un réel et x̃ son approximation.


Supposons que x 6= 0 et que x 6= x̃. Montrer que :
e rel (x, x
˜) = ρ (5.14)
si et seulement si :

x̃ = x(1 ± ρ) (5.15)

où ρ > 0.

Exercice 5.4 (Rôle du dénominateur dans l’erreur relative) Supposons que x et x̃ sont
deux nombres réels tous les deux différents de zéro. Supposons que :
e rel (x, x
˜) ≤ ρ (5.16)

où ρ est un réel tel que ρ < 1. Alors :


ρ
erel (x̃, x) ≤ . (5.17)
1−ρ

Remarque 5.1 (Rôle du dénominateur dans l’erreur relative). L’exercice précédent est dé-
montré dans [130], chapitre 15, « Linear equations », section « Relative error », page 116.
En particulier, si ρ = 0.1 par exemple, alors ρ/(1 − ρ) = 0.1111. Cela montre que, si l’erreur
relative entre x et x̃ est relativement petite, alors l’erreur relative entre x̃ et x est du même
ordre de grandeur. L’exercice peut également être formulé avec une norme vectorielle au lieu
de la valeur absolue.

* Exercice 5.5 (Nombre de chiffres corrects avec un taux de convergence linéaire) Sup-
posons que la suite (xi) i≥0 converge vers x? . Supposons que x ? = 1. On suppose que :

ei+1 = µe i (5.18)

pour i = 0, 1, ..., où µ < 1.


1. Montrer que, pour tout entier b > 1, on a :

LREb (x ?, xi+1) = − log b (µ) + LRE b(x ? , xi ). (5.19)

2. Supposons que µ = 1
2
et considérons la base b = 2. Soit di le nombre de chiffres corrects
en base b :

di = LRE b(x? , x i). (5.20)

Montrer que :

di+1 = 1 + d i (5.21)

pour i = 0, 1, .... En d’autres termes, à chaque itération, le nombre de chiffres corrects


en base b = 2 augmente de 1.

Remarque 5.2. L’égalité 5.18 implique une convergence linéaire, mais la réciproque n’est pas
vraie. Toutefois, l’exercice précédent permet de comprendre le comportement d’une suite de
convergence linéaire lorsque i est grand. La méthode de la dichotomie n’a pas une convergence
exactement linéaire. En particulier, l’inégalité 5.18 n’est pas satisfaite. En revanche, à chaque
itération de la dichotomie, on a e i ≤ ` i où ` i est la longueur de l’intervalle à l’itération i, pour
i = 0, 1, .... La suite (` i )i≥0 satisfait, elle, l’égalité 5.18. Toutefois, il n’en reste pas moins
vrai que la méthode converge approximativement linéairement, avec un taux µ = 1/2. En
d’autres termes, l’exercice précédent montre que, si x? ≈ 1, alors la méthode de la dichotomie
permet de gagner environ un bit de précision à chaque itération.
5.11 • Exercices 93

* Exercice 5.6 (Nombre de chiffres corrects avec un taux de convergence d’ordre p) Sup-
posons que la suite (xi )i≥0 converge vers x? avec l’ordre p. Supposons, de plus, que x? = 1.
1. Montrer que :
ei+1 = O (epi ) quand i → +∞. (5.23)
En d’autres termes, montrer qu’il existe un entier i0 et un réel M > 0 tel que :
ei+1 ≤ M epi (5.24)
pour i ≥ i0 .
2. Montrer que, pour tout entier b > 1, on a
LRE b (x?, xi+1 ) ≥ − logb (M ) + p LREb(x ?, x i). (5.25)

3. Supposons que M = 1. Montrer que, à chaque itération, le nombre de chiffres corrects


en base b est multiplié par p.

Exercice 5.7 (Convergence de la dichotomie) On considère la méthode la dichotomie.


On note `0 la longueur de l’intervalle initial. On suppose que, à chaque itération i ≥ 1, la
longueur est divisée par deux, c’est-à-dire `i+1 = `2i pour i ≥ 0. Montrer que ` i = `20i pour
i ≥ 0.

Exercice 5.8 (Convergence de la méthode de Newton) On considère la méthode de


Newton. On note e i l’erreur absolue, pour i ≥ 1. On suppose que, à chaque itération i ≥ 1,
l’erreur absolue suit la récurrence ei+1 = ce2i pour i ≥ 0 où c est une constante positive.
i i
Montrer que ei = c2 −1 e 20 pour i ≥ 0.
En particulier, lorsque c = 1 et e0 = 1/2, on a ei = 12 i pour i ≥ 0. Les dix premiers
2
éléments de la suite16 sont :
1 i= 0, e= 0.5
2 i= 1, e= 0.25
3 i= 2, e= 0.0625
4 i= 3, e= 0. 003906 25
5 i= 4, e= 1 .5258 7890 625 e -05
6 i= 5, e= 2 .3283 0643 654 e -10
7 i= 6, e= 5 .4210 1086 243 e -20
8 i= 7, e= 2 .9387 3587 706 e -39
9 i= 8, e= 8 .6361 6855 509 e -78
10 i= 9, e= 7. 4583 40731 2 e -155

Exercice 5.9 (Sensibilité à un changement d’échelle) On suppose que x et x̃ sont différents


de zéro. Soit α > 0 un réel représentant un facteur de changement d’échelle.
1. Montrer que eabs(αx, αx˜) = αeabs (x, x).
˜
2. Montrer que erel (αx, αx
˜) = erel (x, x).
˜

* Exercice 5.10 (Conditionnement d’une fonction) Démontrer le théorème 5.2.

* Exercice 5.11 (Différents conditionnements) On considère une fonction f de classe


C 1 (R). Soit x ∈ R et y = f (x). On souhaite utiliser la définition 5.6 pour évaluer le condi-
tionnement de la fonction f au point x. Si x = 0 ou y = f (x) = 0, la définition classique du
conditionnement ne peut pas être utilisée : expliquer pourquoi. Supposons que x̃, ∆x, ỹ sont
des réels tels que y = f (x) et ỹ = f (x + ∆x).
16 Script Python : Methodes/Scripts/Py3/[Link].
94 Chapitre 5 • Convergence, erreurs et conditionnement

1 1 10

tan
cos
sin
0 0 0
−1 −1 −10

Cond. de tan
Cond. de cos
Cond. de sin 103
−5 0 5
103
−5 0 5
103
−5 0 5
102
100 100 101
10−3 10 −3 100
−5 0 5 −5 0 5 −5 0 5
x x x

Figure 5.5 – À gauche, conditionnement de la fonction sin. Au centre, conditionne-


ment de la fonction cos. À droite, conditionnement de la fonction tan.

1. Si f (x) = 0 et x 6= 0, on propose le conditionnement cAR(x) = lim ∆x→0 eeabs ((x,x)


y,y)
˜
˜
.
rel
Montrer que, dans ce cas :
0
c AR(x) = |xf (x)|. (5.27)

2. Si f (x) 6= 0 et x = 0, on propose le conditionnement cRA(x) = lim ∆x→0 eeabs


rel (y,y)
˜
(x,x)
˜
.
Montrer que, dans ce cas :
 0 
 f (x) 
c RA(x) =  . (5.28)
f (x) 

3. Si f (x) = 0 et x = 0, on propose le conditionnement cAA(x) = lim ∆x→0 eeabs (y,y)


˜
abs (x,x)
˜
.
Montrer que, dans ce cas :
0
cAA(x) = |f (x)|. (5.29)

L’équation 5.29 montre que le conditionnement absolu d’une fonction est égal à la dérivée
première de la fonction.

Exercice 5.12 (Conditionnement de fonctions élémentaires) Soit a une constante réelle


différente de 0. On rappelle que, lorsque a est réel, on a x a = e a log(x) pour tout x > 0.
1. Calculer le conditionnement des fonctions suivantes : f (x) = x + a pour tout x ∈ R,
f (x) = ax pour tout x ∈ R, f (x) = a/x pour tout x ∈ R et x 6= 0, f (x) = cos(x)
pour tout x ∈ R, f (x) = exp(x) pour tout x ∈ R, f (x) = log(x) pour tout x > 0,

f (x) = xa pour tout x > 0, f (x) = x pour tout x ≥ 0, f (x) = sin(x) pour tout
x ∈ R et f (x) = tan(x) pour tout x ∈ R différent de kπ + π2 où k est un entier.
2. Pour chaque fonction, préciser les valeurs de x pour lesquelles le conditionnement est
grand.
La figure 5.5 présente les conditionnements des fonctions sinus, cosinus et tangente 17 .

* Exercice 5.13 (Conditionnement de expm1) On considère la fonction expm1 présentée


dans la définition 5.8.
1. Calculer le conditionnement de la fonction expm1.
2. Expliquer pourquoi il y a une singularité apparente en x = 0.
17Script Python : Methodes/Scripts/Py3/[Link].
5.11 • Exercices 95

3. Montrer que lim x→0 c expm1(x) = 1 ce qui implique cexpm1 (0) = 1 par continuité.

Remarque 5.3 (Conditionnement d’une fonction et conditionnement d’un algorithme). Cet


exercice montre que la perte de chiffres significatifs de l’expression exp(x) − 1 lorsque x → 0
n’est pas due à un problème de conditionnement de la fonction exp(x) − 1 elle-même. La
cause principale de la perte de précision est due à la différence de nombres très proches.
Celle-ci est due au mauvais conditionnement de la somme entre deux nombres proches et de
signes opposés. C’est donc l’algorithme qui évalue la fonction qui est mal conditionné, mais
pas la fonction elle-même.

* Exercice 5.14 (Conditionnement de log1p) On considère la fonction log1p présentée


dans la définition 5.7.
1. Calculer le conditionnement de la fonction log1p.
2. Expliquer pourquoi il y a une singularité apparente en x = 0.
3. Montrer que lim x→0 c log1p(x) = 1 ce qui implique clog1p(0) = 1 par continuité.

* Exercice 5.15 (Élasticité constante) Soit f une fonction de classe C 1 sur l’intervalle
]0, +∞[ telle que f (x) > 0 pour tout x > 0. On définit l’élasticité s(x) par l’équation
xf0 (x)
s(x) = f (x) pour tout x tel que f (x) 6= 0. Montrer que l’unique fonction telle que l’élasticité
est constante est f (x) = axb pour tout réel x et tous paramètres réels a et b, avec a > 0.
Indication. On utilisera l’égalité :

d y0 (x)
log(y (x)) = (5.31)
dx y (x)

pour toute fonction y (x) telle que y(x) > 0, pour tout réel x.
Remarque 5.4 (Conditionnement et élasticité). Dans le domaine de la fiabilité des structures
[92], la fonction s est nommée élasticité mécanique. C’est un indice qui mesure la sensibilité
de la variation relative de la sortie y par rapport à une variation relative de l’entrée x. On
observe que la valeur absolue de la sensibilité est le conditionnement de f .

Exercice 5.16 (Erreur relative et delta) Supposons que x et x̃ sont deux réels différents
de zéro, où x̃ est une approximation de x.
1. Supposons que x̃ = x(1 + δ ) où δ est un réel. Montrer que e rel(x, x
˜) = |δ|.
2. Montrer la réciproque.

Exercice 5.17 (Erreur relative et log-erreur relative) Supposons que x et x̃ sont deux
réels différents de zéro, où x̃ est une approximation de x. Soit β ≥ 2 un entier. Supposons
˜) ≤ β−e où e est un entier positif. Montrer que :
que erel (x, x

LREβ (x, x
˜) ≥ e. (5.32)

Exercice 5.18 (Majoration d’un nombre réel en base b) Soit β ≥ 2 un entier représentant
la base d’un système flottant et p un entier positif représentant la précision. Considérons le
réel :
 
d2 dp
x = ± d1 + + . . . + p−1 (5.33)
β β

où d1 , ..., d p sont des entiers dans l’ensemble {0, 1, ..., β − 1} et d1 6= 0. Montrer que |x| < β .
96 Chapitre 5 • Convergence, erreurs et conditionnement

Exercice 5.19 (LRE et chiffres communs) Soit β ≥ 2 un entier représentant la base d’un
système flottant et p un entier positif représentant la précision. Supposons que x et x̃ sont
deux flottants différents de zéro dans un système à virgule flottante de base b et de précision
p. Supposons que x et x̃ sont normalisés. Supposons que les exposants de x et x̃ sont égaux,
c’est-à-dire blogβ (|x|)c = blogβ (|x
˜|)c. Montrer que, si x et x̃ ont leurs q premiers chiffres en
base b égaux, alors :

LREβ (x, x
˜ ) ≥ q − 1. (5.35)

Indication. Utiliser les exercices 5.18 et 5.17.


Remarque 5.5 (LRE et chiffres différents). Si les hypothèses spécifiées dans l’exercice 5.19
ne sont pas vérifiées, alors la conclusion ne peut être tirée. Plus précisément, si les exposants
de x et x̃ sont différents, alors il se peut que les deux nombres ne possèdent aucun chiffre
commun. Par exemple, considérons les deux nombres x = 1.000 et x̃ = 0.999 et considérons
la base β = 10. De toute évidence, on voit que x̃ peut être une approximation satisfaisante
de x, mais il est encore nécessaire de quantifier à quel point, et la log-erreur relative peut
y aider. Il s’avère que la log-erreur relative en base 10 est égale à 3.999, ce qui indique
que x̃ possède environ 4 chiffres corrects par rapport à x. Toutefois, il est évident que x
et x̃ n’ont aucun chiffres en commun. La cause de cette distinction est que leurs exposants
respectifs sont log10(|x|) = 0 et log10 (|x
˜|) = −4.343 × 10−5 ce qui implique blog10 (|x|)c = 0
et blog 10(|x|
˜ )c = −1. On observe que log 10 (|x|)
˜ est très proche de zéro : une augmentation
relativement petite de x̃ mènerait à un exposant égal à 0, ce qui permettrait de rentrer
dans le cadre de l’exercice 5.19. Cela serait le cas par exemple pour x̃ = 1.001, qui mène
à la log-relative erreur égale à 3.000 et possède, en effet, 3 chiffres communs avec x. Ainsi,
on peut certainement conclure que, en général, la log-relative erreur indique le nombre de
chiffres corrects, mais cela peut être faux dans certains cas particuliers. Cette situation arrive
lorsque les deux nombres sont proches, mais ne sont pas associés au même exposant.

Exercice 5.20 (Conditionnement d’une fonction vectorielle) Démontrer le théorème 5.3.

Exercice 5.21 (Conditionnement de la composition) Soit f, g ∈ C 1 (R). On considère


la fonction composée (f ◦ g)(x) = f (g (x)) pour tout x ∈ R. Soient cabs le conditionnement
absolu en entrée et en sortie de la fonction et crel le conditionnement relatif en entrée et en
sortie. Montrer que :
c abs abs abs
f ◦g (x) = cf (g (x)) cg (x)

pour tout x ∈ R et :
crel rel rel
f ◦g (x) = cf (g (x)) cg (x)

pour tout x 6= 0 tel que f (g (x)) 6= 0 et g(x) 6= 0.


Remarque 5.6. L’exercice précédent montre que le conditionnement d’une fonction composée
est égal au produit des conditionnements. On peut le mettre en lien avec le même problème
appliqué à la composition de deux opérateurs linéaires, comme on le voit dans l’exercice 7.3
page 168.
Chapitre 6

Vecteurs, Matrices

Nous introduisons dans ce chapitre les vecteurs et les matrices, ainsi que leurs
propriétés. Un point particulièrement important pour la suite est la notion de norme,
que nous développons tant pour les vecteurs que pour les matrices. L’objectif principal
de cette section est de préparer les bases théoriques pour le chapitre 7, consacré aux
systèmes d’équations linéaires, et dans lequel nous verrons que le conditionnement
du problème est lié la norme matricielle. Nous réutiliserons également ces notions
dans le chapitre 10 sur la méthode des moindres carrés linéaires. Nous y constaterons
le rôle fondamental que joue l’orthogonalité dans ce contexte. Bien sûr, le contenu
présenté dans ce document ne constitue pas un cours d’algèbre linéaire théorique
complet, de telle sorte que le lecteur peut avoir le sentiment que les déductions sont
parfois rapides. Le second objectif est de présenter suffisamment de matériel pratique
pour être capable, durant la séance de travaux pratiques en Python, de manipuler des
tableaux NumPy et ainsi de comprendre les calculs vectorisés que nous allons manipuler
dans la suite.
Dans ce chapitre, nous définissons les vecteurs, les matrices et les opérations les
plus fréquentes que nous pouvons effectuer sur ceux-ci. Un troisième objectif est de
présenter les algorithmes du produit scalaire entre deux vecteurs, du produit matrice-
vecteur et du produit matrice-matrice. Pour chaque opération, nous présentons le
code Python qui permet de l’implémenter. Par ce moyen, nous introduisons la notion
de complexité algorithmique, c’est-à-dire le nombre d’opérations arithmétiques néces-
saires pour évaluer le résultat. Enfin, nous examinons quelques matrices particulières
que nous utiliserons par la suite.
Nous avons adopté les notations suivantes qui sont classiques dans le contexte de
l’algèbre linéaire. Les scalaires sont désignés par des lettres grecques comme α, β, γ .
Les vecteurs sont désignés par des lettres latines minuscules en fonte grasse, par
exemple x, y, z. Les matrices sont désignées par des lettres latines en majuscule comme
A, B, C. Ces notations, presque universellement utilisées dans les livres de mathéma-
tiques numériques, permettent d’écrire les résultats de manière compacte et claire.

6.1 Vecteurs
Dans cette section, nous présentons les vecteurs et observons comment utiliser
la librairie NumPy pour les définir et les manipuler. Nous introduisons la somme de

97
98 Chapitre 6 • Vecteurs, Matrices

deux vecteurs et la multiplication d’un vecteur par un scalaire. Nous commençons par
définir un vecteur, qui est la généralisation multidimensionnelle du nombre réel.
Définition 6.1 (Vecteur). Soit n ≥ 1 un entier. Un vecteur x ∈ R n est un ensemble
de n valeurs réelles x 1 , x2, ..., x n, noté :
 
x1
x2 
 
x =  . .
 .. 
xn
On note R n l’ensemble des vecteurs réels à n composantes. Si i est un entier dans
l’ensemble {1, 2, ..., n}, on dit que x i est la i-ème composante de x. Si n = 1, on dit
que x est un scalaire.

Exemple 6.1. Le vecteur x ∈ R3 suivant est un vecteur réel en dimension 3 :


 
1
x = 2  .
3
La base canonique est une base de vecteurs dont une seule composante est non
nulle et égale à 1.
Définition 6.2 (Vecteurs de la base canonique). On note {ei ∈ Rn }i=1,2,...,n les
vecteurs de la base canonique :
 
 0  
1 1 0
0    .. 
    
e1 =  . , e 2 = 0 , . . . , en =  .  .
 ..  ..  0
.
0 1
0
Bien que la plupart des vecteurs que nous utiliserons sont des vecteurs colonnes,
on écrira parfois des vecteurs lignes.
Définition 6.3 (Vecteur ligne, colonne). Si x ∈ Rn est un vecteur colonne, alors x T
est le vecteur ligne correspondant :
xT = (x 1, x 2, ..., x n)
où x 1, x2, ..., xn sont les composantes de x.
En d’autres termes, l’opération de transposition revient à « renverser » le vecteur.
Le symbole mathématique xT se dit « x transposé ». En mathématiques (pas en Py-
thon), on n’écrit jamais un vecteur ligne directement : c’est toujours le transposé d’un
vecteur colonne. C’est pourquoi la phrase « x est un vecteur. » signifie implicitement
que x est un vecteur colonne.
Dans la session suivante1, nous définissons le vecteur x en Python avec la fonction
array du module NumPy. L’argument de la fonction array est une liste où chaque
élément représente une composante du vecteur.
1Script Python : Matrices/Scripts/Py3/[Link].
6.1 • Vecteurs 99

1 >>> from numpy import array


2 >>> x = array ([1.0 , 2.0 , 3.0])
3 >>> x
4 array ([1. 2. 3.])

Toute variable de type array possède un attribut shape, c’est-à-dire un tuple


contenant les dimensions de la variable. Dans le cas d’un tableau monodimensionnel,
ce tuple ne contient qu’un seul élément.
1 >>> from numpy import array
2 >>> x = array ([1.0 , 2.0 , 3.0])
3 >>> x. shape
4 (3 ,)
5 >>> x. shape [0]
6 3

Maintenant que nous savons définir des vecteurs, nous pouvons réaliser des opéra-
tions avec eux. Les deux opérations les plus communes sont la somme de deux vecteurs
et la multiplication d’un vecteur par un scalaire.

Définition 6.4 (Somme de deux vecteurs, multiplication par un scalaire). Soient


x, y ∈ Rn et α un réel. Les vecteurs x + y et αx ont pour composantes :

(x + y)i = xi + yi , (αx)i = αxi

pour i = 1, 2, ..., n.

En d’autres termes, pour la somme, on additionne composante par composante


et pour la multiplication par un scalaire, on multiplie chaque composante par α.
Dans la session suivante2, nous définissons deux vecteurs x et y en Python avec la
fonction array du module NumPy. Puis, nous évaluons la somme des deux vecteurs
avec l’opérateur +.
1 >>> x = array ([1.0 , 2.0 , 3.0])
2 >>> y = array ([4.0 , 5.0 , 6.0])
3 >>> x + y
4 array ([5. 7. 9.])

La session suivante montre comment on peut évaluer le produit d’un scalaire par
un vecteur avec l’opérateur *.
1 >>> alpha = 2.0
2 >>> x = array ([1.0 , 2.0 , 3.0])
3 >>> alpha * x
4 array ([2. 4. 6.])

Dans cette section, nous avons vu comment définir des vecteurs et effectuer des
opérations comme la somme de deux vecteurs et la multiplication d’un vecteur par
un scalaire. Une opération essentielle nous manque toutefois encore. En effet, nous
n’avons pas encore défini comment mesurer la longueur d’un vecteur, c’est-à-dire sa
norme : c’est un des objectifs de la prochaine section.
2Script Python : Matrices/Scripts/Py3/[Link].
100 Chapitre 6 • Vecteurs, Matrices

× y1 x1×y1
× +
× y2 x2×y2
+
x1 x2 x3 ... y3 x3×y3

...

...
Figure 6.1 – Produit scalaire de deux vecteurs x et y.

6.2 Produit scalaire et norme vectorielle


Nous introduisons dans cette section la notion de produit scalaire et nous pré-
sentons l’algorithme Python qui permet de l’évaluer par l’intermédiaire d’une boucle
itérative. Cet algorithme élémentaire va nous servir de base par la suite, puisque
nous allons l’étendre dans la section suivante pour obtenir le produit matrice-vecteur
(qui nécessite deux boucles imbriquées), puis le produit matrice-matrice (qui nécessite
trois boucles imbriquées). Nous présentons ensuite l’importante notion d’orthogonalité
entre deux vecteurs, sur laquelle nous reviendrons dans la section 6.10 où nous traite-
rons de la projection orthogonale. Enfin, nous introduisons la définition d’une norme
d’un espace vectoriel et présentons des exemples concrets de normes vectorielles.
Nous commençons par définir le produit scalaire entre deux vecteurs. Il s’agit
d’une opération qui considère en entrée deux vecteurs et qui produit un nombre réel
en sortie.
Définition 6.5 (Produit scalaire de deux vecteurs). Soient x, y ∈ R n. Alors le produit
scalaire de x par y est le réel :
n
X
hx, yi = xi yi. (6.1)
i=1

En anglais, produit scalaire se dit dot product. En pratique, on note souvent :

hx, yi = xT y.

L’exercice 6.1 présente plusieurs propriétés du produit scalaire, liées à la linéarité de


l’opérateur par rapport à chacun de ses deux arguments.
La figure 6.1 montre comment le produit scalaire xT y est évalué. On y voit, en par-
ticulier, comment la somme x 1y1 + x2 y 2 + . . . est calculée en accumulant ses différents
termes intermédiaires. On peut y observer comment la composante x 1 est multipliée
par la composante y 1 pour former le premier terme de la somme, c’est-à-dire x1 × y1
(représenté en haut à droite dans la figure). Le second terme de la somme peut alors
être formé, ce qui mène au terme x2 × y2 dans la somme, et ainsi de suite.
L’algorithme du produit scalaire est le suivant, où n est la taille commune des
deux vecteurs x et y. En sortie de l’algorithme, la variable p contient la valeur du
produit scalaire des vecteurs x et y. On commence par initialiser la variable p à la
valeur zéro. Puis la boucle for parcourt les indices de 0 à n - 1. Pour chaque élément
de la boucle, on ajoute le terme x[i] * y[i] dans la somme p.
1 p = 0.0
6.2 • Produit scalaire et norme vectorielle 101

2 for i in range ( n) :
3 p = p + x[ i] * y [i ]

Dans l’algorithme précédent, il y a n multiplications et n additions, soit un total


de 2n opérations. Par conséquent, la complexité algorithmique du produit scalaire est
égale à O(n) opérations arithmétiques (c’est-à-dire multiplications et additions).
La session suivante montre comment on peut évaluer le produit scalaire du vecteur
x par le vecteur y avec l’opérateur @.
1 >>> x = array ([1.0 , 2.0 , 3.0])
2 >>> y = array ([4.0 , 5.0 , 6.0])
3 >>> x @ y
4 32.

Notons que l’opérateur * possède dans ce contexte le sens de la multiplication


composante par composante comme le montre la session suivante.
1 >>> x = array ([1.0 , 2.0 , 3.0])
2 >>> y = array ([4.0 , 5.0 , 6.0])
3 >>> x * y
4 array ([ 4. , 10. , 18.])

La définition suivante étend la notion géométrique de perpendicularité à une di-


mension arbitraire. Elle s’appuie sur le produit scalaire que nous venons d’introduire.

Définition 6.6 (Vecteurs orthogonaux). Soient x, y ∈ Rn. Les vecteurs x et y sont


orthogonaux si et seulement si leur produit scalaire est nul, c’est-à-dire :

x T y = 0.

Exemple 6.2. Les vecteurs :


  
2 4
x= , y=
8 −1

sont orthogonaux car :


 
4
(2, 8) = 2 × 4 − 8 × 1 = 0.
−1

La figure 6.23 présente les deux vecteurs orthogonaux x et y. Lorsque l’on considère
des vecteurs, on peut souhaiter mesurer leur longueur ou bien, de façon équivalente,
mesurer la distance entre deux points de l’espace vectoriel. Pour cela, on introduit la
notion de norme vectorielle.

Définition 6.7 (Norme vectorielle). Une norme sur Rn est une fonction k·k : Rn → R
telle que, pour n’importe quels vecteurs x et y dans R n on a :
1. kxk = 0 si et seulement si x = 0,
2. kαxk = |α|kxk, pour tout réel α,
3. kx + yk ≤ kxk + kyk.
3Script Python : Matrices/Scripts/Py3/[Link].
102 Chapitre 6 • Vecteurs, Matrices

Vecteurs orthogonaux
x

x2
0 y

−5 0 5
x1

Figure 6.2 – Deux vecteurs orthogonaux : x = (2, 8)T et y = (4, −1)T .

Dans la définition précédente, le vecteur 0 est le vecteur de R n dont toutes les


composantes sont nulles. Puisque 0 est un vecteur, il est écrit en caractère gras. Dans
la définition précédente, la troisième propriété est nommée inégalité triangulaire. Dans
l’exercice 6.6, nous démontrons que les trois propriétés précédentes permettent de
démontrer qu’une norme vectorielle est positive ou nulle, c’est-à-dire que kxk ≥ 0 pour
tout vecteur x ∈ Rn . C’est pourquoi il n’est pas nécessaire d’inclure cette propriété
dans la définition.
On peut également créer une norme vectorielle, nommée norme duale, à partir
d’une norme vectorielle donnée. Il existe beaucoup de normes vectorielles intéres-
santes, mais les plus simples sont les normes 1, 2 et infinie.

Définition 6.8 (Norme 1, 2 et infinie). Soit x ∈ Rn un vecteur. Les normes un, deux
(euclidienne) et infinie de x sont :
v
n un
X uX
kxk1 = |xi |, kxk2 = t x 2i, kxk ∞ = max |x i|.
i=1,...,n
i=1 i=1

La norme 2 est étroitement liée au produit scalaire puisque kxk22 = hx, xi pour tout
vecteur x dans Rn . C’est la norme la plus « intuitive » dans le sens où elle correspond
à la notion usuelle de distance en géométrie. Toutefois, remarquons que son calcul
n’est pas si simple, puisqu’il faut évaluer une racine carrée. En conséquence, évaluer
la norme euclidienne est significativement plus complexe qu’évaluer les normes 1 ou
infinie.
Par définition, pour toute norme vectorielle k · k, la boule unité (fermée) de centre
l’origine est l’ensemble B 0,1 = {x ∈ R n | kxk ≤ 1} où le premier indice de B0,1 désigne
le centre de la boule (égal à l’origine du repère) et le second désigne le rayon. La
figure 6.34 présente la boule unité dans différentes normes vectorielles. Par définition,
la boule unité en dimension 2 est l’ensemble des points x ∈ R2 tels que kxk = 1 pour
les trois normes 1, 2 et infinie. On observe que la boule unité est un cercle de rayon 1
pour la norme euclidienne. Toutefois, pour les normes 1 et infinie, la « boule » possède
des angles et a la forme d’un carré.
4Script Python : Matrices/Scripts/Py3/[Link].
6.3 • Matrices 103

Norme 1 Norme 2 Norme infinie


1 1 1

x2
0 0 0
−1 −1 −1
−1 0 1 −1 0 1 −1 0 1
x1 x1 x1

Figure 6.3 – Boule unité pour différentes normes vectorielles.

La session suivante illustre la fonction [Link]. On utilise d’abord la


fonction matrix du module NumPy pour créer un vecteur x. Puis on utilise la fonction
norm pour calculer les normes 2, infinie et 1 du vecteur x (par défaut, la fonction norm
évalue la norme 2).
1 >>> from numpy import array , inf
2 >>> from numpy . linalg import norm
3 >>> x = array ([1.0 , 2.0 , 3.0])
4 >>> norm ( x)
5 3.742
6 >>> norm (x , inf )
7 3.
8 >>> norm (x , 1)
9 6.
Dans cette section, nous avons vu comment définir la norme d’un vecteur, ce qui
mène à un espace vectoriel normé. Dans la section suivante, nous introduisons les
matrices. Puis, dans la section 6.5, nous utiliserons à nouveau la norme vectorielle
pour définir la norme matricielle.

6.3 Matrices
Dans cette section, nous présentons les matrices et deux opérations sur les matrices
c’est-à-dire la somme de deux matrices et la transposée d’une matrice. La vision la
plus simple d’une matrice est celle d’un tableau.
Définition 6.9 (Matrice). Soient m, n ≥ 1 deux entiers. Une matrice A ∈ Rm×n est
un tableau :  
a 11 a12 . . . a 1n
 a 21 a22 . . . a 2n 
 
A = . .. ..  .
 .. . . 
am1 a m2 . . . amn
On note R m×n l’ensemble des matrices réelles à m lignes et n colonnes.
Dans ce cas, le nombre de lignes est m et le nombre de colonnes est n. La com-
posante de la i-ème ligne et de la j -ème colonne est notée aij . Dans certains textes 5 ,
5Comme par exemple [3] page 17.
104 Chapitre 6 • Vecteurs, Matrices

on note M m,n(R) l’ensemble des matrices réelles à m lignes et n colonnes, mais nous
utiliserons la notation 6 équivalente Rm×n.
La fonction array du module NumPy permet de créer des tableaux bidimensionnels
que l’on peut considérer comme des matrices. L’argument de la fonction array est une
liste imbriquée où chaque élément représente une ligne de la matrice. Dans l’exemple
suivant, le premier élément de la liste est une liste, qui représente la première ligne,
égale ici à [1.,2.].
1 >>> from numpy import array
2 >>> A = array ([[1.0 , 2.0] ,
3 [3.0 , 4.0] ,
4 [5.0 , 6.0] ,
5 [7.0 , 8.0]])
6 >>> A
7 array ([[ 1. , 2.] ,
8 [ 3. , 4.] ,
9 [ 5. , 6.] ,
10 [ 7. , 8.]])

Un array possède un attribut shape qui est un tuple décrivant la taille de la


matrice : le premier élément est le nombre de lignes tandis que le second élément est
le nombre de colonnes.
1 >>> A. shape
2 (4 , 2)
3 >>> A. shape [0]
4 4
5 >>> A. shape [1]
6 2

La fonction zeros du module NumPy produit une matrice de zéros, dont le nombre
de lignes et de colonnes est donné dans le tuple en argument.
1 >>> from numpy import zeros
2 >>> zeros ((3 , 4) )
3 array ([[ 0. , 0. , 0. , 0.] ,
4 [ 0. , 0. , 0. , 0.] ,
5 [ 0. , 0. , 0. , 0.]])

Une des opérations les plus simples consiste à additionner deux matrices de mêmes
tailles.

Définition 6.10 (Addition de deux matrices). Soient A, B ∈ R m×n deux matrices.


La matrice A + B ∈ Rm×n est définie par :

(A + B )ij = aij + bij

pour i = 1, 2, ..., m et j = 1, 2, ..., n.

En d’autres termes, on additionne composante par composante. Dans la session


Python suivante7, nous utilisons l’opérateur + pour évaluer la somme de deux ma-
trices.
6Comme dans [11] page 1.
7Script Python : Matrices/Scripts/Py3/[Link].
6.4 • Produit matrice-vecteur 105

1 >>> from numpy import array


2 >>> A = array ([[1.0 , 2.0] ,
3 [3.0 , 4.0] ,
4 [0.0 , 1.0]])
5 >>> A
6 array ([[1. , 2.] ,
7 [3. , 4.] ,
8 [0. , 1.]])
9 >>> B = array ([[5.0 , 6.0] ,
10 [7.0 , 8.0] ,
11 [ -1.0 , 1.0]])
12 >>> B
13 array ([[ 5. , 6.] ,
14 [ 7. , 8.] ,
15 [ -1. , 1.]])
16 >>> A + B
17 array ([[ 6. , 8.] ,
18 [10. , 12.] ,
19 [ -1. , 2.]])
Une des opérations les plus simples sur une matrice consiste à calculer sa trans-
posée, ce qui permute le nombre de lignes et le nombre de colonnes.
Définition 6.11 (Transposée d’une matrice). Soit A ∈ Rm×n une matrice. La matrice
AT ∈ Rn×m est définie par :  T
A ji = aij
pour i = 1, 2, ..., m et j = 1, 2, ..., n.
En d’autres termes, on fait une symétrie par rapport à la diagonale. Nous explorons
les propriétés de l’opération de transposition dans l’exercice 6.15. Nous utiliserons la
notion de transposée dans le chapitre 7 sur la résolution de systèmes d’équations
linéaires mais aussi, de manière plus profonde, dans le chapitre 10 sur la méthode des
moindres carrés linéaires.
Nous avons défini les vecteurs dans la section 6.1, puis les matrices dans la section
6.3. Toutefois, nous n’avons pas encore introduit d’opérations entre les matrices et les
vecteurs : c’est le but de la section suivante.

6.4 Produit matrice-vecteur


Nous introduisons maintenant le produit d’une matrice par un scalaire, le produit
matrice-vecteur et enfin le produit matrice-matrice. La multiplication la plus simple
est celle par un scalaire.
Définition 6.12 (Matrices : multiplication par un scalaire). Soit A ∈ Rm×n une
matrice et α un réel. La matrice αA ∈ Rm×n est définie par :
(αA)ij = αaij
pour i = 1, 2, ..., m et j = 1, 2, ..., n.
En d’autres termes, on multiplie chaque composante par α. Une des opérations
les plus intéressantes est le produit d’une matrice par un vecteur, ce qui produit un
vecteur en sortie de l’opération.
106 Chapitre 6 • Vecteurs, Matrices

× x1 ai1 ×x1
× +
× x2 ai2 ×x2
+
a i1 ai2 a i3 ... x3 ai3 ×x3

...

...
Figure 6.4 – Produit matrice-vecteur : produit de la i-ème ligne de la matrice A par
le vecteur x.

Définition 6.13 (Produit matrice-vecteur). Soit A ∈ Rm×n une matrice et x ∈ R n


un vecteur. Le vecteur Ax ∈ R m est défini par :
n
X
(Ax)i = aij xj
j=1

pour i = 1, 2, ..., m.
En d’autres termes, la i-ème composante Ax est le produit scalaire de la i-ème
ligne de A et du vecteur x. La figure 6.4 présente le produit matrice-vecteur et, plus
précisément, le calcul de la composante (Ax)i pour un certain indice i ∈ {1, . . . , n}.
On observe que seuls les éléments de la i-ème ligne de A apparaissent dans la figure,
alors que toutes les composantes de x sont mobilisées.
L’algorithme8 suivant implémente le produit matrice-vecteur Ax où A est une
matrice de taille m-par-n et x est un vecteur de taille n. On observe que deux boucles
for imbriquées sont désormais nécessaires. Dans ce cas, on commence par initialiser
le vecteur y par un vecteur de zéros.
1 from numpy import zeros
2 m = A. shape [0]
3 n = A. shape [1]
4 y = zeros (m)
5 for i in range ( m) :
6 for j in range ( n) :
7 y[i ] = y[ i] + A [i , j] * x [j ]
Dans l’algorithme précédent, il y a mn additions et mn multiplications pour un
total de 2mn opérations arithmétiques. En général, on simplifie l’analyse de la com-
plexité algorithmique en considérant le cas particulier m = n. On obtient, dans ce cas,
un total de 2n2 opérations. C’est pourquoi la complexité du produit matrice-vecteur
est égale à O(n2 ) opérations. Le script 9 suivant montre comment évaluer le produit
matrice-vecteur avec NumPy et l’opérateur @.
1 >>> from numpy import array
2 >>> A = array ([[1.0 , 2.0] ,
3 [3.0 , 4.0] ,
4 [5.0 , 6.0] ,
5 [7.0 , 8.0]])
8Script Python : Matrices/Scripts/Py3/[Link].
9Script Python : Matrices/Scripts/Py3/[Link].
6.4 • Produit matrice-vecteur 107

6 >>> A
7 array ([[1. , 2.] ,
8 [3. , 4.] ,
9 [5. , 6.] ,
10 [7. , 8.]])
11 >>> x = array ([1.0 , 2.0])
12 >>> x
13 array ([1. ,2.])
14 >>> y = A @ x
15 >>> y
16 array ([ 5. , 11. , 17. , 23.])
Dans ce contexte, l’opérateur * génère une matrice dont les colonnes sont celles
de A multipliées par celles de x.
1 >>> from numpy import array
2 >>> A = array ([[1.0 , 2.0] ,
3 [3.0 , 4.0] ,
4 [5.0 , 6.0] ,
5 [7.0 , 8.0]])
6 >>> x = array ([1.0 , 2.0])
7 >>> y = A * x
8 >>> y
9 array ([[ 1. , 4.] ,
10 [ 3. , 8.] ,
11 [ 5. , 12.] ,
12 [ 7. , 16.]])
Insistons sur ce point : la sémantique de l’opérateur * dépend de ses opérandes,
ce qui nécessite une attention de la part de l’utilisateur.
Nous sommes désormais en mesure d’introduire l’opération la plus complexe de ce
chapitre, c’est la dire le produit d’une matrice par une autre matrice, ce qui produit
une troisième matrice en sortie de l’opération.
Définition 6.14 (Produit matrice-matrice). Soient A ∈ Rm×p et B ∈ Rp×n . La
matrice AB ∈ Rm×n est définie par :
p
X
(AB) ij = aik b kj
k=1

pour i = 1, 2, ..., m et j = 1, 2, ..., n.


En d’autres termes, chaque composante ij de AB est le produit scalaire de la
ligne i de A et de la colonne j de B . Étant donné deux matrices A et B , on peut
parfois les multiplier ensemble, mais pas nécessairement, car les dimensions des deux
matrices doivent être cohérentes vis-à-vis de cette opération. C’est la même chose pour
beaucoup d’opérations que nous avons déjà vues, c’est pourquoi nous introduisons la
définition suivante.
Définition 6.15 (Matrices compatibles pour une opération). On dit que A et B sont
compatibles pour l’opération op si l’opération A op B est possible.
Exemple 6.3. On dit que A et x sont compatibles pour la multiplication si les
tailles de A et x sont telles que le produit Ax est possible. C’est le cas si le nombre
de colonnes de A est égal au nombre de lignes de x.
108 Chapitre 6 • Vecteurs, Matrices

Ces vérifications sont faites par toutes les fonctions Python, et produisent des
erreurs quand c’est approprié. La définition suivante introduit le concept de matrices
commutatives.
Définition 6.16 (Matrices commutantes). On dit que les matrices A ∈ R n×n et
B ∈ R n×n sont commutantes si AB = BA.

En effet, en général AB n’est pas nécessairement égal à BA sauf si les matrices sont
commutantes. C’est la raison pour laquelle on ne peut pas simplement « multiplier
par une matrice » comme on le fait avec un réel. Dans ce contexte, lorsqu’on multiplie
par une matrice, on doit préciser si on multiplie « à gauche » ou « à droite ». Plus
précisément, supposons que deux matrices A et B sont égales, c’est-à-dire supposons
que A = B. Si la matrice C est compatible, alors :

CA = CB.

En d’autres termes, on a multiplié à gauche par la matrice C . De même, si la matrice


C est compatible, alors :
AC = BC.
En d’autres termes, on a multiplié à droite par la matrice C .
L’algorithme du produit matrice-matrice AB est le suivant10 . On observe que trois
boucles for imbriquées sont désormais nécessaires.
1 from numpy import zeros
2 m = A. shape [0]
3 p = A. shape [1]
4 n = B. shape [1]
5 C = zeros (( m , n) )
6 for i in range ( m) :
7 for j in range ( n) :
8 for k in range (p) :
9 C[i , j ] = C[i , j ] + A[i , k ] * B[k , j ]

Si m = n = p, alors la complexité algorithmique cette opération est égale à O(n3 )


opérations. Le script suivant montre comment réaliser le produit matrice-matrice avec
NumPy.
1 >>> from numpy import array
2 >>> A = array ([[1.0 , 2.0] ,
3 [3.0 , 4.0] ,
4 [5.0 , 6.0] ,
5 [7.0 , 8.0]])
6 >>> A
7 array ([[1. , 2.] ,
8 [3. , 4.] ,
9 [5. , 6.] ,
10 [7. , 8.]])
11 >>> B = array ([[1.0 , 2.0 , 3.0] ,
12 [4.0 , 5.0 , 6.0]])
13 >>> B
14 array ([[1. , 2. , 3.] ,
10Script Python : Matrices/Scripts/Py3/[Link].
6.5 • Norme matricielle 109

15 [4. , 5. , 6.]])
16 >>> C = A @ B
17 >>> C
18 array ([[ 9. , 12. , 15.] ,
19 [19. , 26. , 33.] ,
20 [29. , 40. , 51.] ,
21 [39. , 54. , 69.]])
Résumons ce que nous avons vu jusqu’ici. Nous avons introduit les vecteurs dans la
section 6.1 et nous avons vu comment évaluer la norme de ces vecteurs dans la section
6.2. Dans la section 6.3, nous avons introduit les matrices et nous venons d’étudier,
dans la présente section, le produit matrice-vecteur et le produit matrice-matrice.
De manière analogue aux vecteurs, on peut évaluer la norme d’une matrice, ce que
nous verrons dans la section 6.5. Nous approfondirons le sujet dans la section 6.6, où
nous analyserons comment déterminer le vecteur optimal qui permet d’atteindre le
maximum impliqué dans la norme matricielle.

6.5 Norme matricielle


Dans la section 6.2, nous avons introduit la norme d’un vecteur, ce qui permet de
mesurer la « longueur » d’un vecteur. On peut se demander si, de la même manière,
il est possible de mesurer la « longueur » d’une matrice. Dans cette section, nous
introduisons la notion de norme matricielle. Celle-ci sera déterminante dans l’analyse
de la sensibilité de la solution d’un système d’équations linéaires dans le prochain
chapitre. La norme matricielle étend la notion de norme vectorielle que nous avons
déjà vue dans la définition 6.7.
Définition 6.17 (Norme d’une matrice). Une norme sur Rm×n est une fonction
k · k : Rm×n → R telle que, pour n’importe quelles matrices A et B dans R m×n, on
a:
1. kAk = 0 si et seulement si A = 0,
2. kαAk = |α|kAk, pour tout réel α,
3. kA + B k ≤ kAk + kB k.

Dans la définition précédente, la matrice 0 est la matrice de R m×n dont toutes les
composantes sont nulles. Pour créer une norme matricielle concrète, on peut utiliser
une norme vectorielle ce qui produit une norme matricielle induite.

Théorème 6.1 (Norme matricielle induite). Soit A ∈ Rm×n. Soit k · k une norme
vectorielle. Alors la fonction :

kAxk
kAk = max (6.2)
x6=0 kxk

est une norme matricielle, appelée norme matricielle induite.

Ce théorème est démontré dans l’exercice 6.5. Toutes les normes matricielles ne
sont pas des normes induites. Dans l’exercice 6.13 par exemple, nous présentons la
norme maximum, qui n’est pas une norme induite, et nous montrons que c’est une
norme matricielle. L’équation 6.2 utilise en réalité trois normes différentes, mais dont
110 Chapitre 6 • Vecteurs, Matrices

la notation est identique. Au dénominateur, la norme du vecteur x ∈ Rn est une norme


vectorielle sur Rn . Au numérateur, la norme du vecteur Ax ∈ R m est une norme
vectorielle sur Rm . La norme de la matrice A ∈ Rm×n est une norme matricielle.
La norme matricielle induite peut se comprendre en considérant l’application li-
néaire associée à la matrice A :

A : Rn → Rm
x → Ax.

Soit x ∈ R m un vecteur non nul. Lorsque le vecteur d’entrée x parcourt toutes les
valeurs possibles dans Rm, le vecteur de sortie Ax peut être plus ou moins long, en
fonction de ses coordonnées. Dans ce cas, le rapport kkAx k
xk mesure la dilatation obtenue
par l’application de la matrice A sur le vecteur x. En conséquence, l’équation 6.2
signifie que la dilatation maximale est la norme de la matrice A. En d’autres termes,
la norme matricielle induite est un facteur d’amplification. Observons maintenant les
deux normes matricielles concrètes les plus simples, c’est-à-dire les normes 1 et infinie.

Théorème 6.2 (Normes un et infinie). Soit A ∈ Rm×n . On a :


m
X n
X
kAk1 = max |aij| et kAk ∞ = max |aij |.
j =1,...,n i=1,...,m
i=1 j=1

Le théorème précédent est démontré dans les exercices 6.10 et 6.11. Il est facile de
voir que, pour toute matrice A réelle, on a :

kAk 1 = kAT k∞ .

Dans l’exercice 6.8, on calcule la norme de certaines matrices particulières.

Exemple 6.4. Considérons la matrice :


 
−2 9.2 3.8
A = −0.6 2.7 2.4  .
−1 4.9 −4.9

On a kAk∞ = 15. En effet, la somme des valeurs absolue des termes de la première
ligne est égale à | − 2| + |9.2| + |3.8| = 15. De plus la somme est égale à 5.7 pour la
seconde et égale à 10.8 pour la troisième ligne, et c’est la raison pour laquelle la norme
infinie est égale à 15. De même, on a kAk1 = 16.8. En effet, la somme des valeurs
absolue des termes de la deuxième colonne est égale à |9.2| + |2.7| + |49| = 16.8. De
plus la somme est égale à 3.6 pour la première colonne et égale à 11.1 pour la troisième
colonne, et c’est la raison pour laquelle la norme un est égale à 16.8.

On peut se demander pourquoi ne pas introduire plutôt la norme matricielle in-


duite de la norme vectorielle euclidienne. En fait, il s’avère que le calcul de kAk2 est
plus complexe (et plus coûteux) et mène à la notion de valeur propre que nous ne
traiterons dans ce livre.
La session suivante montre comment utiliser la fonction norm pour évaluer la norme
d’une matrice.
6.6 • Vecteur optimal (*) 111

1 >>> from numpy import array , inf


2 >>> from numpy . linalg import norm
3 >>> A = array ([[ -2.0 , 9.2 , 3.8] ,
4 [ -0.6 , 2.7 , 2.4] ,
5 [ -1.0 , 4.9 , -4.9]])
6 >>> A
7 array ([[ -2. , 9.2 , 3.8] ,
8 [ -0.6 , 2.7 , 2.4] ,
9 [ -1. , 4.9 , -4.9]])
10 >>> norm (A , inf )
11 15.0
12 >>> norm (A , 1)
13 16.80
Le théorème suivant est une conséquence importante de la définition de la norme
matricielle induite introduite dans le théorème 6.1.
Théorème 6.3 (Propriété de la norme matricielle induite). Soit k · k une norme
matricielle induite. Alors, pour toute matrice A ∈ Rm×n et tout vecteur x ∈ R n,
on a :

kAxk ≤ kAkkxk. (6.3)

De plus, pour toute matrice A ∈ R m×p et toute matrice B ∈ Rp×n , on a :

kABk ≤ kAkkBk. (6.4)

Les égalités précédentes sont démontrées dans les exercices 6.2 et 6.3 page 122.
Dans le prochain chapitre et plus précisément dans la section 7.3, nous utiliserons la
norme d’une matrice pour définir son conditionnement.

6.6 Norme matricielle induite et vecteur optimal (*)


Dans la section 6.5, nous avons vu comment définir une norme matricielle. En
particulier, nous avons introduit la norme matricielle induite, qui se déduit d’une
norme vectorielle et d’un opérateur de maximisation. Toutefois, la définition de norme
matricielle induite ne précise ni si le maximum peut être atteint par un vecteur, ni
comment déterminer, le cas échéant, ce vecteur. Dans cette section, pour une matrice
A donnée, on se demande s’il est possible de calculer un vecteur y non nul tel que :
kAyk
kAk = .
kyk
En d’autres termes, on recherche un procédé concret permettant de maximiser la
norme matricielle induite. Considérons par exemple le vecteur x ∈ R2 défini par :
 
cos(θ)
x=
sin(θ)

pour θ ∈ [0, 2π]. Lorsque θ parcourt l’intervalle [0, 2π], le vecteur x parcourt le cercle
de centre l’origine et de rayon 1. Pour tout θ ∈ [0, 2π], considérons le vecteur x et
formons le produit matrice-vecteur Ax. En fonction du choix de la norme vectorielle
112 Chapitre 6 • Vecteurs, Matrices

5
x

x2
0 Ax

−5
−10 0 10
x1

Figure 6.5 – Ensemble des produits matrice-vecteurs Ax pour x sur le cercle unité
en norme 2.

et en fonction du vecteur x, le vecteur Ax peut être plus ou moins long. La figure


6.5 11 présente l’ensemble des vecteurs x et Ax pour la matrice A suivante :
 
1 2
A= .
3 4

Puisque kxk 2 = 1, la longueur du vecteur Ax, c’est-à-dire la norme kAxk2 mesure le


ratio :
kAxk2
.
kxk 2
On observe qu’il existe un vecteur y pour lequel le vecteur Ay a la plus grande
longueur possible au sens de la norme euclidienne : c’est un vecteur dans la direction
nord-est. Pour ce vecteur y, on a :

kAyk2
kAk 2 = .
kyk 2

On observe sur la figure que le vecteur −y possède la même propriété. Puisque la


norme euclidienne mène à la notion de valeur propre et puisque cette notion est
en dehors du cours, nous n’explorerons pas davantage cette norme. L’exercice 6.10
montre comment calculer le vecteur y qui maximise la norme 1. Il s’avère que ce
vecteur optimal est un vecteur de la base canonique. Dans le cas particulier de la
matrice A précédente, on obtient le vecteur :
 
0
y= .
1

Pour ce vecteur, il est facile de vérifier que kyk1 = 1 et kAyk1 = 6, ce qui mène au
ratio kAyk1 /kyk1 = 6. Puisque kAk 1 = 6, le vecteur y possède la propriété requise.
La fonction Python suivante calcule le vecteur optimal en norme 1 pour une ma-
trice donnée. On utilise la fonction sum du module NumPy pour calculer la somme sur
les lignes. Puis la fonction argmax est utilisée pour calculer l’indice de la colonne de
la matrice A possédant la norme 1 la plus grande.
1 from numpy import argmax , sum
2 def v ecto rMax Norm 1 (A) :
11Script Python : Matrices/Scripts/Py3/[Link].
6.6 • Vecteur optimal (*) 113

3 k = argmax ( sum ( abs ( A) , 0) )


4 n = A. shape [1]
5 x = zeros ((n , 1) )
6 x[ k] = 1.0
7 return x
L’exercice 6.11 montre comment calculer le vecteur y qui maximise la norme infi-
nie. Il s’avère que ce vecteur optimal est un vecteur formé de -1, 0 ou 1, en fonction
du signe des composantes d’une ligne donnée de la matrice A. Dans le cas particulier
de la matrice A précédente, on obtient le vecteur :
 
1
y= .
1

Pour ce vecteur, il est facile de vérifier que kyk ∞ = 1 et kAyk∞ = 7, ce qui mène au
ratio kAyk∞ /kyk∞ = 7. Puisque kAk∞ = 7, le vecteur y possède la propriété requise.
La fonction Python suivante calcule le vecteur optimal en norme 1 pour une ma-
trice donnée. On utilise la fonction sum du module NumPy pour calculer la somme sur
les colonnes. Puis la fonction argmax est utilisée pour calculer l’indice de la ligne de
la matrice A possédant la norme 1 la plus grande.
1 from numpy import argmax , sum
2 def v ecto rMa xNor mIn f (A) :
3 k = argmax ( sum ( abs ( A) , 1) )
4 n = A. shape [1]
5 x = zeros ((n , 1) )
6 for j in range ( n) :
7 if A[k ,j ] > 0:
8 x[ j] = 1.0
9 elif A[k ,j ] < 0:
10 x[ j] = -1.0
11 return x
Ces deux fonctions seront utilisées dans le prochain chapitre sur la résolution d’un
système d’équations linéaires. Plus précisément, nous les utiliserons dans la remarque
7.7 page 164 où nous déterminerons la pire perturbation d’un système d’équations
linéaires. Cela nous permettra de créer des exemples permettant d’illustrer la sensi-
bilité de la solution d’un système d’équations linéaires à des perturbations du second
membre ou de la matrice.
Dans les sections précédentes, nous avons étudié des matrices générales, mais nous
n’avons pas encore rencontré de matrices ayant des structures particulières. Dans les
trois sections qui suivent, nous allons analyser des matrices dont les composantes ou
les valeurs ont des propriétés spécifiques qui peuvent être intéressantes dans certains
contextes. Dans la section 6.7, nous allons étudier les matrices carrées, diagonales et
triangulaires. Ces dernières joueront un rôle dans le chapitre 7 car elles apparaissent
dans l’algorithme du pivot de Gauss. Dans la section 6.8, nous étudions le produit
tensoriel. Ce produit permet de créer une matrice à partir de deux vecteurs. Le produit
tensoriel sera utilisé dans le chapitre 7 et plus précisément dans la section 7.5. Dans
la section 6.9, nous analysons les matrices identité, inverse et de permutation qui
seront, elles aussi, utilisées dans le chapitre 7. La section 6.10 présentera le concept
d’orthogonalité ce qui nous sera utile dans le chapitre 10 sur la méthode des moindres
carrés linéaires.
114 Chapitre 6 • Vecteurs, Matrices

6.7 Matrices particulières


Dans beaucoup de situations, les matrices que nous allons considérer aurons une
structure particulière et nous exploiterons cette structure pour faciliter nos calculs.
Dans cette section, nous présentons les matrices carrées, diagonales et triangulaires.
Dans une matrice carrée, le nombre de lignes est égal au nombre de colonnes.
Définition 6.18 (Matrice carrée). La matrice A ∈ Rm×n est carrée si m = n.
Dans une matrice diagonale, les termes extra-diagonaux sont nuls, de telle sorte
qu’il suffit d’écrire les termes diagonaux.
Définition 6.19 (Matrice carrée diagonale). La matrice carrée A ∈ Rn×n est diago-
nale si a ij = 0 pour i 6= j et i = 1, . . . , n, j = 1, . . . , n.
En d’autres termes, la matrice A est de la forme :
 
d1 0 ... 0
 .. .. 
 0 d2 . .
A =  . .


 .. .. ..
. 0
0 ... 0 dn
= diag(d 1, . . . , d n ).

Si une matrice est diagonale, alors on la note souvent par la lettre D.


Les matrices triangulaires vont souvent être considérées dans la suite de ce do-
cument. Dans une matrice triangulaire supérieure, les composantes situées dans le
triangle au-dessous de la diagonale sont nulles, de telle sorte que nous n’écrivons que
les termes au-dessus de la diagonale. Dans une matrice triangulaire inférieure, nous
n’écrivons que les termes sous la diagonale, car les termes au-dessus sont nuls.
Définition 6.20 (Matrice triangulaire inférieure, supérieure). La matrice U ∈ Rn×n
est triangulaire supérieure si :
 
u 11 u12 ... u1n
 0 u22 u 2n 
 
U=  . .. .. .. 
 .. . . . 
0 ... 0 unn

c’est-à-dire si uij = 0 pour i > j . La matrice L ∈ R n×n est triangulaire inférieure si :


 
`11 0 ... 0
 .. .. 
 `21 `22 . . 
L=  .


 .. ..
. 0 
`n1 `n2 . . . `nn

c’est-à-dire si `ij = 0 pour i < j.


La matrice U est triangulaire supérieure, ce qui est nommé upper triangular en
anglais, d’où la lettre « U ». La matrice L est triangulaire supérieure, ce qui est nommé
lower triangular en anglais, d’où la lettre « L ».
6.8 • Produit tensoriel 115

Nous utiliserons les matrices diagonales et triangulaires dans plusieurs chapitres


de ce livre. En particulier, nous les utiliserons dans le contexte de la résolution d’un
système d’équations linéaires dans le chapitre 7 où ces matrices apparaîtront par
l’intermédiaire de la décomposition matricielle P A = LU . Les matrices triangulaires
seront à nouveau utilisées dans le chapitre 10 sur la méthode des moindres carrés
linéaires, où la décomposition matricielle QR sera utilisée.

6.8 Produit tensoriel


Dans certains algorithmes, le produit tensoriel apparaît et il est intéressant de
pouvoir l’identifier. Nous observerons son utilité dans le contexte du pivot de Gauss
que nous analyserons dans le chapitre suivant, dans la section 7.5. Le produit tensoriel
est une opération qui considère deux vecteurs en entrée et qui produit une matrice.
Définition 6.21 (Produit tensoriel). Soient x ∈ Rm et y ∈ Rn . Alors, le produit
tensoriel de x par y est la matrice dans Rm×n définie par :
a ij = x i yj
pour i = 1, ..., m et j = 1, ...n. On le note xyT .
Le produit tensoriel est occasionnellement noté x ⊗ y. On peut remarquer l’oppo-
sition entre, d’un côté, le produit scalaire qui produit un nombre réel à partir de deux
vecteurs et, de l’autre, le produit tensoriel, qui produit une matrice à partir de deux
vecteurs. Le premier réduit la dimension tandis que le second l’augmente. En anglais,
on nomme parfois le produit scalaire inner product tandis que le produit tensoriel est
nommé outer product ou tensor product.
Exemple 6.5 (Produit tensoriel). On a :
   
1   0 1 2 3
0 1 2 3 = .
2 0 2 4 6
En Python, la fonction outer du module NumPy permet de calculer le produit
tensoriel de deux vecteurs.
1 >>> from numpy import array , outer
2 >>> x = array ([1.0 , 2.0])
3 >>> y = array ([0.0 , 1.0 , 2.0 , 3.0])
4 >>> z = outer (x , y )
5 >>> z
6 array ([[0. , 1. , 2. , 3.] ,
7 [0. , 2. , 4. , 6.]])
Nous reviendrons sur le thème du produit tensoriel dans l’exercice 7.8 page 170.

6.9 Matrice identité, inverse et permutation


Nous présentons dans cette section trois sujets qui seront utilisés dans le prochain
chapitre, c’est-à-dire la matrice identité, la matrice inverse et la matrice de permu-
tation. Nous allons observer, de plus, les propriétés du produit matrice-matrice pour
ces matrices particulières. La matrice identité est certainement l’une des matrices les
plus simples.
116 Chapitre 6 • Vecteurs, Matrices

Définition 6.22 (Matrice identité). La matrice identité d’ordre n est la matrice


diagonale :  
1 0 ··· 0
 0 1 · · · 0
 
In =  .  = diag(1, 1, ..., 1).
 0 0 . . 0
0 0 ··· 1

La matrice identité possède des propriétés particulières du point de vue du produit


matrice-matrice.

Théorème 6.4 (Matrice identité : propriété). Pour toute matrice carrée A d’ordre n,
on a :
AI n = In A = A.

En d’autres termes, la matrice identité est l’élément neutre pour la multiplication.


La définition suivante montre que la notion d’inverse peut se généraliser aux matrices.

Définition 6.23 (Inverse d’une matrice). Une matrice carrée A ∈ Rn×n est inversible
s’il existe une matrice B ∈ R n×n telle que :

AB = BA = In .

Dans ce cas, la matrice B est l’inverse de A, notée A−1 .

Le théorème suivant présente deux propriétés de l’inverse.

Théorème 6.5 (Inverse d’une matrice : propriétés). Pour toutes matrices carrées A
et B d’ordre n inversibles, on a :

(A−1 )−1 = A et (AB )−1 = B−1A −1.

Ce théorème est démontré dans l’exercice 6.16. Dans le prochain chapitre sur la
résolution de systèmes d’équations linéaires, nous allons utiliser les matrices suivantes,
qui sont particulièrement simples puisqu’elles ne sont constituées que de 0 et de 1, en
des positions soigneusement choisies.

Définition 6.24 (Matrice de permutation). Soit P ∈ Rn×n. La matrice P est une


matrice de permutation si :
— les coefficients sont 0 ou 1 ;
— il y a un seul 1 par colonne ;
— il y a un seul 1 par ligne.

En d’autres termes, une matrice de permutation est une matrice identité dont les
lignes sont réordonnées. Pour illustrer cette propriété, considérons l’exemple suivant,
dans lequel on considère une matrice de permutation d’ordre 4.

Exemple 6.6. La permutation :


 
1 2 3 4
π=
4 1 3 2
6.9 • Matrice identité, inverse et permutation 117

est associée à la matrice de permutation :


 
0 0 0 1
1 0 0 0
P =0
.
0 1 0
0 1 0 0

On l’obtient en réordonnant les lignes de la matrice identité de taille 4 :


 
1 0 0 0
0 1 0 0
I4 = 0
.
0 1 0
0 0 0 1

La première ligne de la permutation étant toujours 1, 2, ..., n, on écrit plus simplement


π = (4, 1, 3, 2). Faire le produit matrice-matrice P A réordonne les lignes de A :
   
0 0 0 1 0 1 2 3
1 0 0 0  4 5 6 7
P = 0 0 1 0 
, A = 
 8 9 10 11 ,

0 1 0 0 12 13 14 15
 
12 13 14 15
0 1 2 3 
PA =  
 8 9 10 11 .
4 5 6 7
En d’autres termes, multiplier à gauche par P réordonne les lignes de A. Dans ce cas
particulier, les lignes de la matrice P A sont, dans l’ordre, la quatrième ligne de A,
puis la première, puis la troisième et enfin la seconde.

En Python, il est plutôt rare de créer une matrice de permutation par ses com-
posantes, car ce n’est pas nécessaire en général : au lieu de cela, nous utiliserons
directement le tableau des indices représentant la permutation. En effet, c’est tout
aussi pratique et beaucoup plus économique en mémoire et en temps de calcul, comme
nous allons le voir. La session Python suivante12 montre comment créer une matrice
de permutation à partir de la matrice identité correspondante que nous avons créé
avec la fonction eye. Puis, nous utilisons l’instruction I[p, :] pour créer une nou-
velle matrice dont les lignes sont réordonnées. Enfin, nous définissons la matrice A et
nous appliquons le produit matrice-matrice.
1 >>> from numpy import array , eye
2 >>> p = [3 , 0 , 2, 1]
3 >>> I = eye (4)
4 >>> I
5 array ([[1. , 0. , 0. , 0.] ,
6 [0. , 1. , 0. , 0.] ,
7 [0. , 0. , 1. , 0.] ,
8 [0. , 0. , 0. , 1.]])
9 >>> P = I[p , :]
12 Script Python : Matrices/Scripts/Py3/[Link].
118 Chapitre 6 • Vecteurs, Matrices

10 >>> P
11 array ([[0. , 0. , 0. , 1.] ,
12 [1. , 0. , 0. , 0.] ,
13 [0. , 0. , 1. , 0.] ,
14 [0. , 1. , 0. , 0.]])
15 >>> A = array ( range (16) )
16 >>> A = A. reshape ((4 , 4) )
17 >>> A
18 array ([[ 0 , 1, 2, 3] ,
19 [ 4, 5, 6, 7] ,
20 [ 8, 9, 10 , 11] ,
21 [12 , 13 , 14 , 15]])
22 >>> P @ A
23 array ([[12. , 13. , 14. , 15.] ,
24 [ 0. , 1. , 2. , 3.] ,
25 [ 8. , 9. , 10. , 11.] ,
26 [ 4. , 5. , 6. , 7.]])
Nous observons que le produit matrice-matrice a réordonné les lignes de la ma-
trice A. C’est la raison pour laquelle, en pratique, nous utiliserons plutôt l’instruction
A[p, :] qui produit le même résultat de manière plus économique.
1 >>> from numpy import array , eye
2 >>> p = [3 , 0 , 2, 1]
3 >>> A = array ( range (16) )
4 >>> A = A. reshape ((4 , 4) )
5 >>> A[p , :]
6 array ([[12. , 13. , 14. , 15.] ,
7 [ 0. , 1. , 2. , 3.] ,
8 [ 8. , 9. , 10. , 11.] ,
9 [ 4. , 5. , 6. , 7.]])
Dans le prochain chapitre, nous étudierons comment utiliser la méthode du pivot
de Gauss avec permutation des lignes pour résoudre un système d’équation linéaires.
Nous analyserons alors dans la section 7.5 comment utiliser les propriétés d’une ma-
trice de permutation dans ce contexte.

6.10 Orthogonalité
Dans la section 6.2, nous avons introduit le produit scalaire de deux vecteurs.
Dans cette section, nous présentons la notion d’angle entre deux vecteurs ainsi que la
définition de la projection orthogonale. Ces deux notions seront approfondies dans le
chapitre 10 sur la méthode des moindres carrés linéaires. Bien que l’angle entre deux
vecteurs se conçoive le plus facilement en deux dimensions d’espace, on peut l’étendre
à une dimension arbitraire grâce au théorème suivant.
Théorème 6.6 (Angle entre deux vecteurs). Soient x, y ∈ Rn . Alors l’angle θ ∈
[0, 2π] entre x et y est tel que :

xT y = kxk 2kyk2 cos(θ). (6.5)

La partie gauche de la figure 6.6 illustre le lien entre le produit scalaire, la projec-
tion du vecteur x sur le vecteur y et l’angle entre les deux vecteurs. Des liens peuvent
6.11 • Application : robotique 119

x x

𝜃 x-λy
𝜃
‖x‖cos(𝜃) y λy y

Figure 6.6 – À gauche, produit scalaire, projection et angle entre deux vecteurs. À
droite, projection orthogonale de x sur y.

être tissés entre cette définition et le théorème de Cauchy-Schwartz. La projection


orthogonale d’un vecteur sur un autre généralise à une dimension arbitraire la notion
de projection usuelle en dimension deux.

Définition 6.25 (Projection orthogonale). Soient x et y deux vecteurs dans Rn . On


fait l’hypothèse que y est non nul. Le projeté orthogonal de x sur y est λy où λ est
le réel défini par l’équation :

xT y
λ= = kxk 2 cos(θ).
kyk 22

La partie droite de la figure 6.6 montre la projection orthogonale du vecteur x sur


le vecteur y. On montre facilement que :

hy, x − λyi = 0.

En d’autres termes, le projeté λy est orthogonal au vecteur x − λy, comme on peut


le voir sur la figure. En effet :

hy, x − λyi = hy, xi − λhy, yi


= hy, xi − λkyk22
= 0

par la définition 6.25.


La notion d’orthogonalité est prépondérante dès lors que l’on considère la pro-
jection orthogonale d’un objet mathématique sur une base de dimension finie. En
particulier, nous reviendrons en détail sur le thème de l’orthogonalité dans le chapitre
10 sur le thème des moindres carrés linéaires.

6.11 Application : robotique


Dans le domaine de la robotique, on utilise des vecteurs et des matrices pour
calculer les coordonnées des articulations. Dans ce contexte, on utilise des vecteurs,
représentant les coordonnées des points, et des matrices, représentant des translations
et des rotations. Pour pouvoir traiter les rotations et les translations dans le même
cadre, on considère les coordonnées homogènes. Cela consiste à ajouter une compo-
sante « virtuelle » de valeur 1 aux composantes réelles du vecteur. Cette composante
n’est pas utilisée directement, mais sert, comme nous allons le voir, à faciliter le calcul.
120 Chapitre 6 • Vecteurs, Matrices

4
2 B

y
2
0 A

0
0.0 2.5 5.0 −2.5 0.0 2.5
x x

Figure 6.7 – À gauche, rotation et translation d’un point du plan. À droite, robot
plan à deux bras.

Soit (x 0, y 0 )T ∈ R2 le vecteur représentant les coordonnées d’un point du plan.


Soit θ ∈ [0, 2π] un réel représentant un angle et `x, `y ∈ R deux réels représentants
les translations horizontales et verticales. Alors les coordonnées du vecteur (x1 , y 1)T
associé à la rotation d’un angle θ et d’une translation de vecteur (`x , `y) T sont :

x1 = cos(θ)x 0 − sin(θ)y0 + ` x (6.6)


y 1 = sin(θ)x0 + cos(θ)y0 + ` y . (6.7)

Il s’avère qu’il est possible d’exprimer les équations précédentes sous la forme d’un
produit matrice-vecteur. Ainsi, on peut obtenir l’équation suivante :
    
x1 cos(θ) − sin(θ) `x x0
y1  =  sin(θ) cos(θ) ` y  y0  .
1 0 0 1 1

Dans l’équation précédente, la dernière composante du vecteur de droite est mul-


tipliée successivement par `x puis par `y, ce qui permet d’exprimer la translation. La
dernière composante du membre de gauche exprime simplement l’inoffensive égalité
1=1 et semble inutile. En fait, ajouter systématiquement une telle composante va
nous permettre, comme nous allons le voir de combiner les mouvements du robot.
La partie gauche de la figure 6.713 présente la transformation précédente avec les
paramètres suivants :
       
x0 3 π `x 1
= , θ= , = .
y0 −1 4 `y 2

Le point initial (x0, y 0)T est représenté avec une croix, le point intermédiaire est
représenté par un rond vert et le point final (x1, y 1 )T est représenté par un triangle
rouge. On peut vérifier que le point initial subit d’abord une rotation d’angle θ, puis
une translation d’un vecteur (`x , ` y )T .
La partie droite de la figure 6.7 présente un robot plan (en deux dimensions) à deux
bras. Le robot est ancré au centre du domaine, c’est-à-dire au point de coordonnées
(0, 0)T . Le premier bras, noté A dans la suite, de longueur ` 1 = 2, représenté en
13Script Python : Matrices/Scripts/Py3/[Link].
6.12 • Conclusion 121

bleu, présente un angle θ = π4 avec l’axe X. Le second bras, noté B dans la suite, de
longueur `2 = 3, représenté en rouge, présente un angle θ = π3 avec le bras A.
Soit (x1 , y1 )T les coordonnées de la seconde articulation, représentée par un tri-
angle vert sur la figure. Les coordonnées de ce point satisfont l’équation :
    
x1 cos(θ) − sin(θ) 0 1 0 `1
 y 1 = sin(θ) cos(θ) 0 0 1 0 
1 0 0 1 0 0 1
   
cos(φ) − sin(φ) 0 1 0 `2 0
sin(φ) cos(φ) 0 0 1 0  0  .
0 0 1 0 0 1 1
Pour comprendre cette transformation, on peut lire l’équation de la droite vers la
gauche. Le point de départ est le centre du domaine, de coordonnées homogènes
(0, 0, 1)T . On effectue d’abord une translation de longueur ` 2 selon l’axe x, puis une
rotation d’angle φ, ce qui positionne le bras B. On réalise ensuite une translation
d’une longueur `1 selon l’axe x, puis une rotation d’angle θ , ce qui positionne le bras
A.

6.12 Conclusion
Dans ce chapitre, nous avons présenté les vecteurs et les matrices ainsi que leur
implémentation en Python. Nous nous appuierons sur ces connaissances dans le cha-
pitre 7 sur la résolution d’un système d’équations linéaires. Nous utiliserons également
ces notions dans le chapitre 8 sur l’interpolation et le chapitre 10 sur la résolution de
problèmes de moindres carrés linéaires.
Pour aller plus loin sur ce thème, on peut approfondir la notion d’orthogonalité
et celle de projection orthogonale. Un théorème pertinent dans ce contexte est le
théorème de Cauchy-Schwarz, une inégalité particulièrement importante en mathé-
matiques. On peut analyser les librairies qui implémentent les calcul vectoriels et
matriciels, dans un contexte plein ou creux14 . Un autre sujet important est l’analyse
des vecteurs et valeurs propres. Ces sujets ne seront pas traités dans ce livre. On peut
consulter [132] chapitre 6 page 283 au sujet du problème aux valeurs propres.

6.13 Notes et références


Certainement une des meilleures références sur ce sujet est le livre de Gilbert
Strang [132]. En particulier, les quatre espaces fondamentaux (noyau et image de A
et AT ) sont présentés dans le chapitre 3, et les valeurs et vecteurs propres dans le
chapitre 6. Plus de détails sur ce thème sont disponibles dans [55, 115]. Plus de détails
sur la librairie Python NumPy sont donnés dans [89].
Les figures 6.1 et 6.4 sont inspirées de [148], avec des modifications.

6.14 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
14 En anglais, creux se dit sparse.
122 Chapitre 6 • Vecteurs, Matrices

présente cette classification.

Exercice 6.1 (Propriétés du produit scalaire) Soient x, y, z trois vecteurs dans Rn . On


considère le produit scalaire défini par l’équation 6.1, page 100.
1. Montrer que hx, yi = hy, xi. Cela montre que le produit scalaire est symétrique par
rapport à ses arguments.
2. Montrer que hx + y, zi = hx, zi + hy, zi.
3. Montrer que hαx, yi = αhx, yi, pour tout réel α.
4. Montrer que hx, y + zi = hx, yi + hx, zi.
5. Montrer que hx, αyi = αhx, yi, pour tout réel α.

Remarque 6.1 (Propriétés du produit scalaire réel). L’exercice précédent permet de voir que
le produit scalaire est linéaire par rapport à ses deux arguments. Notons que les propriétés
précédentes sont vraies pour des vecteurs dans R n, mais ne sont pas vraies pour des vecteurs
dans C n. En effet, la définition du produit scalaire de deux vecteurs complexes mène au
produit scalaire hermitien, qui fait intervenir le conjugué du second vecteur, et mène à des
propriétés différentes.

Exercice 6.2 (Propriété de la norme matricielle induite pour le produit matrice-vecteur)


Sous les hypothèses du théorème 6.3 page 111, démontrer l’inégalité 6.3.

Exercice 6.3 (Propriété de la norme matricielle induite pour le produit matrice-matrice)


Sous les hypothèses du théorème 6.3 page 111, démontrer l’inégalité 6.4.

* Exercice 6.4 (Produit matrice-vecteur et vecteur de la base canonique) Soit A ∈ R m×n


une matrice. Pour j = 1, ..., n, soit ej ∈ Rn le j-ème vecteur de la base canonique, au sens
de la définition 6.2 page 98. Soit a j ∈ R m la j-ème colonne de A :
 
a1,j
 a2,j 
aj = 
 .. 

.
a m,j

pour tout j = 1, ..., n. Montrer que :

Aej = a j (6.8)

pour tout j = 1, ..., n.

** Exercice 6.5 (Norme matricielle induite) Soit A ∈ Rm×n une matrice. Soit k · k
deux normes vectorielles sur Rm et sur R n . On considère la norme matricielle induite définie
par l’équation 6.2 page 109. Dans les trois questions qui suivent, on montre que la norme
matricielle induite est, en effet, une norme matricielle.
1. Montrer que kAk = 0 si et seulement si A = 0. Indication. Cette question, non triviale,
peut être résolue en utilisant les vecteurs de la base canonique ej , pour j = 1, ..., n.
2. Puis, montrer que kαAk = |α|kAk, pour tout réel α.
3. Enfin, montrer que kA + B k ≤ kAk + kB k.

* Exercice 6.6 (Positivité de la norme vectorielle) Soit k · k une norme vectorielle sur Rn .
Montrer que, pour tout x ∈ R n , on a kxk ≥ 0.
6.14 • Exercices 123

Remarque 6.2 (Positivité de la norme vectorielle). En effet, la positivité de la norme d’un


vecteur se déduit des trois propriétés énoncées en cours. C’est pourquoi cette propriété
(pourtant proposée par plusieurs ouvrages d’algèbre linéaire) n’a pas à être incluse dans la
définition d’une norme vectorielle.

Exercice 6.7 (Norme matricielle et boule unité) Montrer que, pour toute norme matricielle
induite k · k, on a kAk = max kxk=1 kAxk pour toute matrice A.

Exercice 6.8
1. (Norme de la matrice identité) Montrer que, pour toute norme matricielle induite k· k,
on a kIn k = 1, où In est la matrice identité de dimension n.
2. (Norme de la matrice diagonale) Soit D ∈ Rn×n une matrice diagonale, c’est-à-dire
D = diag(d1, ..., d n), où d1 , ..., d n ∈ R. Montrer que kD k 1 = kD k∞ = maxi=1,...,n |di |.

Remarque 6.3 (Norme 2 d’une matrice diagonale). Il est facile de déterminer la norme 2
d’une matrice diagonale. En fait, on a également kD k2 = max i=1,...,n |d i |, mais il faut, pour
cela, introduire la notion de valeur propre, ce que nous n’avons pas vu dans le cours.

*** Exercice 6.9 (Norme matricielle : le maximum est atteint) On considère la norme
matricielle induite k · k. Soit A ∈ Rm×n une matrice. L’objectif de cet exercice est de montrer
kAxk
qu’il existe un vecteur x ∈ Rm non nul tel que kAk = kxk . Soit C ⊆ Rm l’ensemble des
vecteurs de norme 1, c’est-à-dire soit C = {x ∈ Rm | kxk = 1}. Soit f : C → R + la fonction
définie par l’équation f (x) = kAxk pour tout x ∈ C .
1. Montrer que la fonction f est continue.
2. Montrer que l’ensemble C est compact.
3. Conclure.
Remarque 6.4 (Norme matricielle : le maximum est atteint). Analysons le résultat introduit
dans l’exercice 6.9.
— La démonstration utilise le théorème de Bolzano-Weierstrass, qui suppose que l’espace
vectoriel est fini, ce qui est le cas dans notre exercice. Si l’espace vectoriel n’est pas
fini, alors la démonstration proposée ici ne fonctionne pas.
— L’exercice 6.9 montre qu’un vecteur x existe, mais ne fournit pas de moyen constructif
pour le calculer explicitement. L’exercice 6.10 fournit la solution du problème pour la
norme matricielle 1 et l’exercice 6.11 pour la norme infinie.

* Exercice 6.10 (Norme matricielle 1) On souhaite montrer que, pour toute matrice
A ∈ Rm×n , on a :
X
m

kAk 1 = max |aij |. (6.10)


j =1,...,n
i=1
Pm
Pour cela, on introduit α = maxj =1,...,n i=1
|a ij |.
m×n
1. Montrer que, pour toute matrice A ∈ R , on a :

kAk1 ≤ α. (6.11)

2. Montrer qu’il existe un vecteur y non nul tel que :

kAyk1 = αkyk1 . (6.12)

Indication. Calculer kAej k1 où e j ∈ Rm est un vecteur de la base canonique.


124 Chapitre 6 • Vecteurs, Matrices

3. Conclure.
Remarque 6.5. Le raisonnement utilisé dans la solution de la question 3 précédente est indé-
pendant du choix particulier de la norme, à condition qu’il s’agisse d’une norme matricielle
induite. C’est pourquoi nous utiliserons le même raisonnement dans le contexte de l’exercice
6.11, où nous l’utiliserons pour la norme infinie.

** Exercice 6.11 (Norme matricielle infinie) On souhaite montrer que, pour toute matrice
A ∈ Rm×n , on a :

X
n

kAk ∞ = max |aij |. (6.13)


i=1,...,m
j=1

Pn
Soit α = max i=1,...,m j=1
|a ij|. On souhaite démontrer que kAk∞ = α.

1. Montrer que, pour toute matrice A ∈ Rm×n, on a :

kAk∞ ≤ α. (6.14)

2. Si A est non nulle, montrer qu’il existe un vecteur y non nul tel que kyk∞ = 1 et tel
que :

kAyk∞ = αkyk ∞ . (6.15)

3. Conclure.

Remarque 6.6 (Normes matricielles et calcul de perturbation). Dans la section 6.6, nous
avons vu le lien entre norme matricielle induite et l’allongement maximal. Les exercices 6.10
et 6.11 trouvent une application dans le contexte du calcul de la pire perturbation possible
pour la résolution d’un système d’équations linéaires : plus de détails sur ce thème sont
présentés dans la remarque 7.7, page 164.

** Exercice 6.12 (Matrice de permutation) Soit P une matrice de permutation. Montrer


que P T P = P P T = I.
En d’autres termes, l’inverse d’une matrice de permutation est sa transposée, c’est-à-dire
P −1 = P T .
Remarque 6.7 (Orthogonalité d’une matrice de permutation). L’exercice précédent montre
qu’une matrice de permutation est orthogonale (voir l’exercice 7.5 page 169). En conséquence,
le conditionnement en norme 2 d’une matrice de permutation est égal à 1 (voir l’exercice
7.6).

** Exercice 6.13 (Norme matricielle maximum) Pour toute matrice A ∈ Rm×n , on


définit la fonction :

kAk max = max |aij |. (6.18)


i,j

Montrer que k · k max est une norme matricielle.


Remarque 6.8 (Norme matricielle maximum). La norme précédente est un exemple de norme
matricielle qui n’est pas une norme induite. Nous utiliserons la norme matricielle maximum
dans le chapitre 7, à l’occasion de la définition du facteur de croissance, c’est-à-dire la défi-
nition 7.12, page 153.
6.14 • Exercices 125

** Exercice 6.14 (Norme matricielle maximum et autres normes) Pour tout matrice
A ∈ Rm×n , montrer que :

kAkmax ≤ kAk∞ . (6.19)

Nous utiliserons ce résultat dans l’exercice 7.12 page 172.


Remarque 6.9 (Norme matricielle maximum et autres normes). La démonstration permet de
voir que, de même, on a kAk max ≤ kAk2 et kAk max ≤ kAk1 .

* Exercice 6.15
1. (Transposée du produit matrice-vecteur) Pour toute matrice A ∈ Rm×n et tout vecteur
x ∈ Rn , montrer que (Ax)T = xT AT .
2. (Transposée du produit matrice-matrice) Pour toutes matrices A ∈ Rm×p et B ∈ Rp×n ,
montrer que (AB )T = BT AT .
3. (Transposée de l’inverse) Pour toute matrice A ∈ Rn×n inversible, montrer que
(AT )−1 = (A −1)T .
4. (Produit scalaire et transposée) Soit A ∈ Rm×n une matrice, x ∈ Rn et y ∈ Rm .
Montrer que hAx, yi = hx, AT yi.

Exercice 6.16
1. (Inverse de l’inverse ) Soit A ∈ Rn×n une matrice inversible. Montrer que (A −1 )−1 = A.
2. (Inverse du produit) Soit A, B ∈ R n×n deux matrices inversibles. Montrer que
(AB )−1 = B−1 A −1.
3. (Matrice inversible et inverse à gauche) Soit A ∈ Rn×n une matrice inversible. Sup-
posons qu’il existe une matrice B telle que BA = In. Alors A−1 = B.

Remarque 6.10 (Inverse et inverse à gauche ou à droite). La question 3. de l’exercice précédent


montre que, si A est inversible et si B est un inverse à gauche de A, alors l’inverse de A est
B . De même, on peut montrer que, si A est inversible et si B est un inverse à droite de A,
alors l’inverse de A est B .

* Exercice 6.17 (Matrices triangulaires)


1. Soient A, B ∈ Rn×n deux matrices triangulaires inférieures. Montrer que AB est tri-
angulaire inférieure.
2. Soient A, B ∈ Rn×n deux matrices triangulaires supérieures. Montrer que AB est
triangulaire supérieure.
Dans le but d’introduire l’exercice 6.18, nous introduisons maintenant les calculs matri-
ciels associés à la rotation plane d’un point. Soit (x0, y 0 )T ∈ R 2 le vecteur représentant les
coordonnées d’un point du plan. Soit θ ∈ [0, 2π ] un réel représentant un angle et `x , `y ∈ R
deux réels représentants les translations horizontales et verticales. Alors les coordonnées du
vecteur (x1, y 1 ) T associé à la rotation d’un angle θ et d’une translation de vecteur (`x , `y )T
sont données par les équations 6.6 et 6.7, page 120. Il s’avère qu’il est possible d’exprimer
les équations précédentes sous la forme d’un produit matrice-vecteur. Ainsi, on peut obtenir
l’équation suivante :
! ! !
x1 cos(θ ) − sin(θ ) ` x x0
y 1 = sin(θ ) cos(θ) `y y0 .
1 0 0 1 1
126 Chapitre 6 • Vecteurs, Matrices

Exercice 6.18 (Rotation plane) On considère la situation de la partie gauche de la


figure 6.7, page 120. Supposons que (x0, y 0) T sont les coordonnées du point intermédiaire,
représenté en rouge dans la figure. Notons (r0, θ 0 ) les coordonnées polaires du pointp(x0 , y 0)T .
−1
On a x0 = r 0 cos(θ0 ) et y0 = r 0 sin(θ0 ). Cela implique θ0 = tan (y 0/x 0 ) et r0 = x20 + y02 .
Alors, les coordonnées du point intermédiaire sont :

x0 = r0 cos(θ 0 + θ) (6.23)
0
y = r0 sin(θ 0 + θ). (6.24)

En déduire que :
0
x1 = x + `x (6.25)
0
y1 = y + `y . (6.26)

Indication. On utilisera les formules trigonométriques :

cos(θ0 + θ) = cos(θ0 ) cos(θ) − sin(θ0 ) sin(θ) (6.27)


sin(θ 0 + θ) = sin(θ0 ) cos(θ ) + cos(θ0 ) sin(θ ). (6.28)

L’exercice montre que ce point intermédiaire est obtenu par une rotation d’angle θ dont
le centre est l’origine du domaine et le rayon est r.
Deuxième partie

Méthodes numériques

127
Chapitre 7

Systèmes d’équations linéaires

Après avoir présenté plusieurs thèmes préparatoires dans les chapitres précédents,
nous abordons désormais la résolution de systèmes d’équations linéaires, un sujet
qui apparaît dans un grand nombre de problèmes d’ingénierie. Par exemple, calculer
les forces statiques dans une structure mécanique fondée sur des poutres revient à
résoudre un système d’équations linéaires. Une autre illustration est présentée à la fin
de ce chapitre, où nous aborderons le calcul des courants dans un réseau électronique.
La résolution de systèmes d’équations linéaires intervient également comme brique
de base pour construire d’autres méthodes numériques. Par exemple, en interpolation
polynomiale, nous analyserons dans le chapitre 8 comment utiliser cette méthode pour
calculer les coefficients du polynôme interpolant par l’intermédiaire de la matrice de
Vandermonde. Nous utiliserons aussi ces méthodes dans le chapitre 10 consacré aux
problèmes de moindres carrés linéaires.
Dans ce chapitre, nous présentons un algorithme de résolution d’un système
d’équations linéaires nommé, probablement de manière impropre, pivot de Gauss.
En effet, l’algorithme est mentionné dans un livre chinois daté du premier siècle après
J.C. de telle sorte qu’il est difficile de l’attribuer à C.F. Gauss1. D’autre part la re-
cherche dans les années 1950, à une époque où cet algorithme a commencé à être mis
en œuvre sur les premiers ordinateurs, a mis en évidence la recherche de pivots et
l’échange de lignes comme déterminante dans l’algorithme. Dans ce contexte, il serait
tout aussi légitime de mentionner la contribution de J.H. Wilkinson, mathématicien
britannique2.
Nous commençons par présenter la définition d’un ensemble de vecteurs linéaire-
ment indépendants, puis la définition du rang d’une matrice. Nous présentons ensuite
la méthode de Gauss et montrons pourquoi calculer l’inverse de la matrice pour déter-
miner la solution d’un système d’équations linéaires n’est, ni nécessaire, ni utile. Nous
analysons ensuite les aspects algorithmiques de la méthode du pivot de Gauss avec
permutation des lignes, puis montrons l’équivalence avec la décomposition P A = LU .
Nous analysons la sensibilité de la méthode aux erreurs d’arrondi et déterminons le
conditionnement du problème. Dans la dernière partie, nous montrons l’impact de
perturbations sur la matrice ou sur le second membre.
1Carl Friedrich Gauss est né en 1777 et mort en 1855.
2James H. Wilkinson est né en 1919 et mort en 1986, auteur de [154].

129
130 Chapitre 7 • Systèmes d’équations linéaires

a2 a1
2.5 a1 0.0

x2

x2
−2.5 a2
0.0
0 5 −5 0 5
x1 x1

Figure 7.1 – À gauche, deux vecteurs linéairement indépendants. À droite, deux


vecteurs linéairement dépendants.

7.1 Dépendance et indépendance


Avant de définir un algorithme permettant de déterminer la solution d’un système
d’équations, nous nous intéressons à l’existence et à l’unicité de cette solution. Dans
cette section, nous présentons comment définir un ensemble de vecteurs linéairement
indépendants. En effet, c’est une condition nécessaire et suffisante pour que la solution
d’un système d’équations linéaires soit unique. Sans anticiper excessivement sur la
suite, nous découvrirons dans les sections suivantes pourquoi il est intéressant de
s’intéresser également au cas où les vecteurs sont presque linéairement dépendants,
sans l’être toutefois de manière exacte.
Plusieurs vecteurs sont linéairement indépendants si la seule combinaison linéaire
menant à un vecteur nul est constituée de composantes nulles.
Définition 7.1 (Vecteurs linéairement indépendants). Soient a1 , ..., an des vecteurs
dans R m. Soient α1 , ..., α n ∈ R. Ces vecteurs sont linéairement indépendants si l’équa-
tion :
Xn
α i ai = 0
i=1
implique que α 1 = α2 = ... = αn = 0. Sinon, les vecteurs sont linéairement dépen-
dants.
Si deux vecteurs sont linéairement dépendants, on dit qu’ils sont colinéaires. Si plus
de deux vecteurs sont linéairement dépendants, on parle de multicolinéarité, un terme
souvent utilisé en statistique, et en particulier dans le contexte de la régression linéaire.
La définition précédente peut paraître abstraite. Cependant, dans le cas particulier
de vecteurs bidimensionnels, il est facile de voir si deux vecteurs sont linéairement
indépendants en les dessinant dans le plan (x1 , x2 ), comme nous le montrons dans
l’exemple suivant.
Exemple 7.1 (Deux vecteurs linéairement indépendants). Considérons les vecteurs :
   
1 3
a1 = et a 2 = .
2 4

La partie gauche de la figure 7.13 présente les deux vecteurs a1 et a2 . Dans la figure,
on a choisi l’origine comme point de départ des deux vecteurs. On observe que les
3Script Python : SysLin/Scripts/Py3/[Link].
7.1 • Dépendance et indépendance 131

deux directions sont différentes, ce qui montre graphiquement que les deux vecteurs
sont linéairement indépendants. Dans la suite, nous allons le prouver par le calcul.
Cherchons deux réels α 1 et α 2 tels que α1 a1 + α2 a 2 = 0. Par conséquent :
   
1 3
α1 + α2 = 0.
2 4

Cela implique :
(
α1 + 3α2 = 0
2α 1 + 4α2 = 0.

On multiplie la première équation par 2 et on soustrait la seconde équation :


(
α 1 + 3α2 = 0
−2α2 = 0.

On en déduit :
(
α 1 + 3α2 = 0
α2 = 0.

On remplace α2 dans la première équation, ce qui implique α1 = 0 et α2 = 0. Cela


montre que les vecteurs sont linéairement indépendants.
Toujours dans le cas bidimensionnel, l’exemple suivant montre comment voir si
deux vecteurs sont linéairement dépendants.
Exemple 7.2 (Deux vecteurs linéairement dépendants). Considérons les vecteurs :
   
1 −2
a1 = et a2 = .
2 −4

Cherchons deux réels α 1 et α 2 tels que α1 a1 + α2 a 2 = 0. Par conséquent :


   
1 −2
α1 + α2 = 0.
2 −4

Cela implique :
(
α1 − 2α2 = 0
2α 1 − 4α2 = 0.

La première équation implique α1 = 2α2 . On choisit α 2 = 1, ce qui implique α 1 = 2.


Par conséquent :    
1 −2
2· +1· = 0.
2 −4
Puisque α1 6= 0 et α2 6= 0, cela implique que les vecteurs sont linéairement dépendants.
La partie droite de la figure 7.1 présente les deux vecteurs a1 et a 2 . On observe que
les deux vecteurs représentent la même droite, ce qui implique qu’ils sont linéairement
dépendants. Dans la suite, nous vérifierons cela par le calcul.
132 Chapitre 7 • Systèmes d’équations linéaires

7.2 Rang et inverse


Dans cette section, nous montrons le lien entre le fait que les colonnes de la ma-
trice A sont linéairement indépendantes et le caractère unique de la solution du sys-
tème d’équations linéaires Ax = b. Dans ce but, nous introduisons le rang d’une
matrice. Précisons toutefois dès le début que, lorsqu’on effectue des calculs avec des
nombres à virgule flottante, le rang n’est pas une très bonne mesure pour quantifier
de manière fine le fait qu’un système d’équations linéaires est facile à résoudre ou
non : nous étudierons pour cela le conditionnement de la matrice, dont l’application
est, en pratique et aussi en théorie, plus pertinente dans notre contexte4 . Le rang
d’une matrice caractérise les propriétés de l’espace vectoriel formé par les colonnes
de la matrice. Dans la définition suivante, nous considérons une matrice rectangulaire
constituée de m lignes et n colonnes.
Définition 7.2 (Rang-colonne). Soit A une matrice dans Rm×n . Le rang-colonne
de A, noté rang(A), est le nombre maximal de vecteurs colonnes de A linéairement
indépendants.
Dans la définition précédente, les « colonnes » de la matrice A sont les vecteurs
définis par les composantes de A dans chaque colonne. Par exemple, la i-ème colonne
de A est le vecteur :  
a1,i
 .. 
 . 
am,i
pour i = 1, ..., n. Par définition, on a 1 ≤ rang(A) ≤ min(m, n) pour toute matrice
A ∈ R m×n. La définition suivante présente les deux cas les plus importants lorsqu’on
considère le rang d’une matrice rectangulaire.
Définition 7.3 (Rang plein). Soit A une matrice dans Rm×n .
— Si rang(A) = min(m, n), on dit que la matrice est de rang plein.
— Si rang(A) < min(m, n), on dit que la matrice est de rang dégénéré.
En particulier, si la matrice A est carrée, alors m = n. Dans ce cas, la matrice A
est de rang plein si et seulement si rang(A) = n. Le théorème suivant établit un lien
entre le rang et l’inversibilité d’une matrice carrée, au sens de la définition 6.23.
Théorème 7.1 (Existence de l’inverse d’une matrice carrée). Soit A une matrice
dans R n×n. Les conditions suivantes sont équivalentes :
(i) rang(A) = n ;
(ii) A est inversible.
On ne démontrera pas ce théorème dans ce livre5 .
Exemple 7.3 (Un système de deux équations linéaires). Nous avons déjà vu le sys-
tème d’équations linéaires :
(
α1 + 3α 2 = 0
2α1 + 4α 2 = 0.
4Voir [55] page 275 sur la notion de rang numérique.
5Voir [94], [33] théorème 9.7.2 page 162 ou [123] théorème 2.5.9 page 91.
7.2 • Rang et inverse 133

Il s’écrit sous la forme du produit matrice-vecteur :


  
1 3 α1
=0
2 4 α2

c’est-à-dire Aα = 0 avec :
   
1 3 α1
A= et α= .
2 4 α2

Nous pouvons maintenant introduire l’objet principal de ce chapitre, c’est-à-dire


la définition formelle d’un système d’équations linéaires.
Définition 7.4 (Système d’équations linéaires). Soit A une matrice dans R n×n et
b ∈ Rn. Un système d’équations linéaires est une équation de la forme Ax = b où A
est le membre de gauche, b est le membre de droite et x ∈ Rn est l’inconnue.
Un système d’équations linéaires peut se développer sous la forme :

 a1,1x 1 + a1,2 x2 + . . . + a1,n xn = b1



 a2,1x 1 + a2,2 x2 + . . . + a2,n xn = b2
 ..

 .


an,1 x1 + a n,2 x 2 + . . . + a n,n xn = bn .

Exemple 7.4 (Un système 3 × 3). Considérons la matrice utilisée dans l’exemple 6.4
page 110. Plus précisément, considérons le système de trois équations linéaires à trois
inconnues suivant :
    
−2 9.2 3.8 x1 15
 −0.6 2.7 2.4  x 2 = 5.7  . (7.1)
−1 4.9 −4.9 x3 1

On peut aussi l’écrire sous la forme :



 −2x 1 + 9.2x 2 + 3.8x3 = 15
 (L1 )
−0.6x1 + 2.7x 2 + 2.4x3 = 5.7 (L2 )


−x 1 + 4.9x 2 − 4.9x3 = 1. (L3 )

Dans l’exemple 7.9, nous utiliserons la méthode du pivot de Gauss et nous mani-
pulerons directement les lignes du système d’équations précédent. Toutefois, dans le
but de nous familiariser avec la notation matricielle, nous n’utiliserons pas le sys-
tème d’équations précédent dans la suite et nous utiliserons plutôt l’équation 7.1. La
solution est :  
−1
x=  1
1
qu’on peut vérifier en utilisant les équations :
    
−2 9.2 3.8 −1 15
−0.6 2.7 2.4   1  
= 5.7 .
−1 4.9 −4.9 1 1
134 Chapitre 7 • Systèmes d’équations linéaires

4 3x1 + x 2 = 9 4 3x1 + x 2 = 9

x2

x2
3x1 + x 2 = 7 x1 − x 2 = −1
2 2 (2, 3)

1 2 3 1 2 3
x1 x1

Figure 7.2 – À gauche, un système de deux équations linéaires pour lequel il n’y a
aucune solution. À droite, un système de deux équations linéaires pour lequel il y a
une solution unique.

En deux dimensions, les solutions d’un système d’équations linéaires peuvent se


comporter de la manière suivante.
1. Le système n’a aucune solution (droites parallèles).
2. Le système a une infinité de solutions (droites superposées).
3. Le système a une seule solution (droites sécantes).
La partie gauche de la figure 7.26 présente le cas 1 et la partie droite présente le cas
3.
Nous terminons cette section en établissant le lien entre le rang-colonne et le rang-
ligne.
Définition 7.5 (Rang-ligne). Le rang-ligne de A est le nombre maximal de vecteurs
lignes de A linéairement indépendants.
La théorème suivant indique comment lier le rang-ligne d’une matrice et son rang-
colonne.
Théorème 7.2 (Rang-colonne et rang-ligne). Soit A une matrice dans Rm×n . Le
rang-colonne de A est égal au rang-ligne de A. On le note rang(A) et on a rang(A) =
rang(A T ).
En d’autres termes, le rang de A est égal au rang de la transposée de A. On ne
démontrera pas ce théorème dans ce livre7. Ce résultat est une conséquence du fait
que la dimension de l’image de A est égale à la dimension de l’image de A T . Plus de
détails sur les quatre espaces fondamentaux sont donnés dans la remarque 10.6 page
274 et, en particulier, dans la figure 10.6.

7.3 Conditionnement d’un système d’équations li-


néaires
En pratique, les coefficients de A ou b ne sont pas toujours connus exactement.
C’est la raison pour laquelle on doit tenir compte des erreurs, en particulier des er-
reurs d’arrondis. Dans cette section, on analyse l’impact de ces perturbations sur la
précision de la solution x. Nous montrons comment le conditionnement du problème
6Script Python : SysLin/Scripts/Py3/[Link].
7Voir [94] page 39 ou [8] corollaire 5.2 page 133.
7.3 • Conditionnement d’un système d’équations linéaires 135

est déterminé par le conditionnement de la matrice A. Précisons que l’analyse présen-


tée dans cette section ne dépend pas de l’algorithme utilisé pour résoudre le système
d’équations. Plus précisément, nous présentons ici comment la solution du problème
évolue en fonction de perturbation dans les données, quel que soit le procédé concret
pour parvenir à cette solution. Dans la prochaine section, nous étudierons une mé-
thode pour évaluer la solution, c’est-à-dire la méthode du pivot de Gauss, et nous
étudierons ensuite l’influence des erreurs d’arrondi sur cette méthode dans la section
7.9.
Pour analyser le conditionnement du problème, nous introduisons des perturba-
tions dans les données du problème et observons les changements dans la solution.
Dans le contexte d’un système d’équations linéaires, les données du problème sont
la matrice A et le second membre b et la solution est le vecteur x. Dans le but de
simplifier l’analyse, commençons par perturber uniquement le second membre b. Pour
cela, considérons le système :

Ax = b. (7.2)

Puis considérons le second membre perturbé b + ∆b. Soit x + ∆x la solution du


système perturbé :

A(x + ∆x) = b + ∆b. (7.3)

On cherche à calculer le changement relatif sur x, en fonction du changement


relatif sur b. Il s’avère que ce changement dépend du conditionnement de la matrice A,
introduit dans la définition suivante.
Définition 7.6 (Conditionnement d’une matrice). Soit k · k une norme matricielle
induite. Le conditionnement de la matrice carrée A inversible est :

κ(A) = kAkkA −1k. (7.4)

Dans la définition précédente, l’hypothèse que la norme matricielle est induite


d’une norme vectorielle est fondamentale. En effet, si la norme est simplement ma-
tricielle (et pas induite), alors le théorème 7.3 ne peut pas être démontré. De toute
évidence, si on change la norme matricielle induite, le conditionnement change, ce que
montre l’exemple suivant.
Exemple 7.5 (Conditionnement du problème en norme 1 et en norme infinie). Conti-
nuons l’exercice débuté dans l’exemple 6.4 page 110. Considérons la matrice :
 
−2 9.2 3.8
A =  −0.6 2.7 2.4  .
−1 4.9 −4.9

Nous avons détaillé dans l’exemple 6.4 pourquoi kAk∞ = 15 et kAk1 = 16.8. L’inverse
de A est :  
416.5 −1062 −197
A−1 =  89 −226.7 −42  .
4 −10 −2
On en déduit kA −1k∞ = 1675 et kA−1 k1 = 1298. Cela implique κ∞ (A) = 15 × 1675 =
25128 et κ1 (A) = 16.8 × 1298 = 21812. Précisons que, dans les calculs précédents,
136 Chapitre 7 • Systèmes d’équations linéaires

nous avons réalisé l’évaluation avec des nombres flottants de type IEEE 754 sur 64
bits, arrondis à 4 chiffres significatifs. Cette matrice a été sélectionnée dans le but
d’obtenir un conditionnement très grand.
Dans l’exemple suivant, nous montrons comment évaluer le conditionnement d’une
matrice en Python avec le module NumPy.
Exemple 7.6 (Conditionnement d’une matrice de taille 3-par-3). Considérons la
matrice de l’exemple 7.4. Le calcul du conditionnement d’une matrice peut être réalisé
grâce à la fonction cond du module [Link], comme dans le script suivant8. Le
second argument de la fonction permet de préciser la norme matricielle à considérer.
Puisque nous souhaitons utiliser la norme infinie, nous utilisons la constante inf du
module ce qui permet de calculer κ∞(A).
1 >>> from numpy import array , inf
2 >>> from numpy . linalg import cond
3 >>>
4 >>> A = array ([[ -2.0 , 9.2 , 3.8] ,
5 [ -0.6 , 2.7 , 2.4] ,
6 [ -1.0 , 4.9 , -4.9]])
7 >>> cond (A , inf )
8 25128.

On observe que la matrice n’est pas particulièrement bien conditionnée.


Dans l’exercice 7.3, on montre que κ(A) ≥ 1 pour toute matrice carrée A inversible.
Si la matrice A n’est pas inversible, alors κ(A) n’est pas fini. Si la matrice A est proche
d’une matrice singulière, alors κ(A) est très grand. Seul l’ordre de grandeur de κ(A)
compte : le minimum est égal à 1 et, avec des doubles, le maximum est environ 1016 . En
pratique, le conditionnement est souvent entre 10 et 100, mais il est parfois beaucoup
plus grand. Le théorème suivant montre le rôle du conditionnement dans la sensibilité
de la solution du système d’équations linéaires Ax = b à des perturbations dans le
second membre b.

Théorème 7.3 (Sensibilité à b). Soit A une matrice réelle carrée inversible de taille
n-par-n et b un vecteur réel non nul de taille n. Soit x la solution du système d’équa-
tions linéaires 7.2. Soit ∆b un vecteur réel de taille n et soit ∆x le vecteur solution
du système linéaire perturbé 7.3. Alors :

k∆xk k∆bk
≤ κ(A) . (7.5)
kxk kbk

La preuve de ce théorème est donnée dans l’exercice 7.1 page 164.


Remarque 7.1 (Hypothèses du théorème 7.3). Dans le théorème 7.3, les hypothèses
impliquent que x est non nul. En effet, puisque la matrice A est inversible, on a
x = A−1 b. Puisque, par hypothèse, on a b 6= 0, alors x 6= 0. Par définition de
la norme vectorielle, cela implique kxk 6= 0. Par conséquent, on peut légitimement
diviser par kxk dans l’équation 7.5.
Dans l’inégalité 7.5, le second membre est le pire cas que l’on peut rencontrer. En
pratique, dans la plupart des situations, l’erreur relative observée est très inférieure
8Script Python : SysLin/Scripts/Py3/[Link].
7.3 • Conditionnement d’un système d’équations linéaires 137

à la borne supérieure décrite par l’inégalité 7.5. Plus de détails sur ce thème sont
donnés dans la remarque 7.6 page 164. L’exemple suivant montre toutefois que cette
borne peut être atteinte, à condition de choisir soigneusement la perturbation.
Exemple 7.7 (Perturbation du second membre). Considérons le système d’équations
présenté dans l’exemple 7.4 page 133 et modifions, dans le second membre, la deuxième
décimale après la virgule :
 
15.01
b̃ = b + ∆b =  5.69  .
0.99

La solution du système d’équations perturbé 7.3 est :


 
15.75
x̃ = x + ∆x = 4.577 .
1.16
On observe que la solution change radicalement par rapport à la solution initiale
x = (−1, 1, 1) T . Il s’avère que cette matrice n’est pas très bien conditionnée. En effet,
nous avons vu dans l’exemple 7.6 que κ(A)∞ = 25128. De plus, nous avons choisi b,
x, b̃ et x̃ en fonction de la matrice A dans le but de maximiser l’amplitude d’une
perturbation. Dans ce cas particulier, on a :
k∆bk∞ k∆xk ∞
= 6.667 × 10−2 et = 1675
kbk∞ kxk∞
de telle sorte que l’égalité suivante est vérifiée :
k∆xk k∆bk
= κ(A) .
kxk kbk
En d’autres termes, nous avons considéré la pire perturbation possible, ce qui permet
d’atteindre la borne supérieure. En pratique, une perturbation de cette ampleur est
plutôt rare. Plus de détails sur ce thème sont donnés dans les remarques 7.6 et 7.7
page 164.
Le théorème 7.3 met en avant le rôle du conditionnement de la matrice A sur la
solution d’un système d’équations linéaires. En fait, on peut inverser l’argument et
considérer qu’il s’agit du conditionnement du produit matrice-vecteur, comme nous
le montrons dans la remarque suivante.
Remarque 7.2 (Sensibilité du produit matrice-vecteur). Considérons alors le théorème
7.3 du point de vue inverse. En d’autres termes, échangeons les rôles de x et b et
appliquons le théorème à la matrice A −1. Soient A une matrice carrée inversible et
x ∈ Rn. Soit b la solution du système d’équations linéaires A −1b = x. Soit ∆x ∈ R n
donné. Soit ∆b solution de l’équation :

A−1 (b + ∆b) = x + ∆x.

Le théorème 7.3 implique :


k∆bk k∆xk
≤ κ(A −1) .
kbk kxk
138 Chapitre 7 • Systèmes d’équations linéaires

L’équation 7.4 qui définit le conditionnement implique que, si A est une matrice
inversible, alors :

κ(A −1) = kA−1 kk(A−1) −1k = kA−1 kkAk = kAkkA−1 k = κ(A)

puisque (A −1)−1 = A. Par conséquent, on a :


k∆bk k∆xk
≤ κ(A) .
kbk kxk
Puisque b = Ax, nous venons de démontrer que le conditionnement de la matrice A
permet de quantifier la sensibilité du produit matrice-vecteur Ax à une perturbation
de x.
Dans le théorème 7.3, nous avons perturbé le second membre du système d’équa-
tions linéaires et observé que le changement dans la solution est déterminé par le
conditionnement de la matrice. Le phénomène est similaire pour la matrice A : dans
l’exercice 7.2, on montre que, si considère la matrice perturbée A + ∆A, alors la
perturbation sur x dépend de κ(A).

7.4 Méthode de Gauss


Dans cette section, nous présentons la méthode de Gauss pour la résolution d’un
système d’équations linéaires. Nous montrons comment l’algorithme se développe sur
un exemple de 3 équations à 3 inconnues. Nous montrons ensuite comment utili-
ser la fonction solve du module NumPy pour la mettre en œuvre en Python. Dans
la prochaine section, nous présenterons un algorithme Python qui implémente cette
méthode.
Pour être tout à fait précis, nous présentons la méthode du pivot de Gauss avec
permutation des lignes. En effet, la méthode la plus simple consiste à utiliser la mé-
thode du pivot de Gauss sans échanger ni les lignes, ni les colonnes : c’est cette
méthode que l’on appelle communément pivot de Gauss. Toutefois, la recherche a
montré que cet algorithme pouvait être instable dans certaines situations9 . Une pre-
mière amélioration pour limiter l’impact des erreurs d’arrondi consiste à échanger les
lignes du système d’équations, ce qui limite grandement l’effet des erreurs d’arrondi :
cette méthode est nommée « pivot de Gauss avec permutation des lignes » ou encore
« pivot de Gauss avec pivot partiel ». Dans le but de diminuer encore l’impact des
erreurs d’arrondi, une seconde amélioration consiste à échanger à la fois les lignes et
les colonnes : cette méthode est nommée « pivot de Gauss avec pivot complet ».
L’analyse théorique montre que, pour la plupart des matrices, le saut qualitatif ap-
porté par l’échange de lignes est très significatif. Bien que d’autres stratégies puissent
être, dans certains cas, plus avantageuses, le compromis le plus souvent utilisé consiste
à utiliser l’algorithme du pivot de Gauss avec échange des lignes10 . Lorsque la matrice
possède une structure particulière, par exemple lorsqu’elle est symétrique et définie
positive (s.d.p.), la méthode du pivot de Gauss sans permutation des lignes est appro-
priée. En effet, dans ce cas particulier, on peut démontrer que l’algorithme n’échange
pas les lignes11 . Ce cas particulier, qui n’est pas le seul, n’élimine pas l’intérêt pour
9Voir [70] chapitre 9 page 158 et en particulier la perspective historique page 183.
10Voir [70], page 79.
11Voir [70], page 196.
7.4 • Méthode de Gauss 139

l’algorithme avec échange de ligne pour les matrices générales, et c’est la raison pour
laquelle nous présentons cet algorithme dans ce livre.
Le théorème suivant présente le lien entre la solution d’un système d’équations
linéaires et l’inverse de la matrice.
Théorème 7.4 (Solution d’un système d’équations linéaires). Soit A une matrice
dans Rn×n de rang plein et b ∈ Rn . Alors la solution du système d’équations linéaires
Ax = b est x = A−1b.
Démonstration. Puisque, par hypothèse, la matrice A est inversible, on a Ax =
AA−1 b = I n b = b ce qui conclut la preuve.
Pourtant, si nous voulons calculer x, nous ne calculerons jamais A−1 parce que
c’est inutile, coûteux et numériquement moins précis que la méthode du pivot de
Gauss avec permutation des lignes. Pour le voir, nous montrons dans l’exemple suivant
pourquoi évaluer d’abord l’inverse puis effectuer une multiplication est moins précis
que la division.
Exemple 7.8 (L’inversion peut nuire). Résolvons l’équation suivante :
6x = 8
avec un arrondi au plus proche avec 3 chiffres décimaux après la virgule. En d’autres
termes, nous souhaitons résoudre l’équation à une inconnue ax = b avec a = 6 et
b = 8. La solution est x = 86 = 1.333. Il y a deux moyens pour faire ce calcul.
Premièrement, on peut évaluer la division ab , puis arrondir à 3 chiffres après la virgule.
Deuxièmement, on peut évaluer l’inverse a−1, arrondir cet inverse à 3 chiffres après
la virgule, multiplier par b et, finalement, arrondir le résultat. Pour simuler un calcul
avec 3 chiffres après la virgule, nous utilisons dans la session suivante12 la fonction
around du module NumPy. Cette fonction permet d’arrondir un nombre flottant à un
nombre de décimales données.
1 import numpy as np
2

3 a = 6.0
4 b = 8.0
5 x1 = b / a
6 x1 = np . around (x1 , decimals =3)
7 print ( " x1 =" , x1 )
Le script précédent affiche :
1 x1 = 1.333
On observe que ce résultat est égal à la valeur exacte, avec 3 chiffres corrects après
la virgule : l’erreur absolue est nulle. L’autre méthode consiste à évaluer l’inverse
d’abord, puis à multiplier par le second membre.
1 a_inver se = 1.0 / a
2 a_inver se = np . around ( a_inverse , decimals =3)
3 print ( " a_inverse = " , a_i nverse )
4 x2 = a_i nverse * b
5 x2 = np . around (x2 , decimals =3)
6 print ( " x2 =" , x2 )
12 Script Python : SysLin/Scripts/Py3/[Link].
140 Chapitre 7 • Systèmes d’équations linéaires

Le script précédent affiche :


1 a_inver se = 0.167
2 x2 = 1.336
L’erreur absolue de x2 est égale à 3 × 10−3 . En analysant le calcul de plus près, on
constate que l’inverse de a est arrondi au plus proche avec la meilleure représentation
possible avec 3 chiffres après la virgule, puisque le résultat exact est a−1 = 16 = 0.1667.
L’erreur absolue de représentation de a−1 est égale à 10−3 . Cette erreur est ensuite
multipliée par 3 lorsque l’on évalue le produit entre a_inverse et b, ce qui amène
à amplifier la magnitude de l’erreur. Cela permet de comprendre pourquoi utiliser
l’inverse n’est pas une bonne idée. Premièrement, il faut deux opérations au lieu
d’une : une inversion et une multiplication au lieu d’une division. Deuxièmement,
le résultat est numériquement moins précis. La cause de cette imprécision est due à
l’erreur d’évaluation de l’inverse de a, après quoi la multiplication ne fait qu’amplifier
le problème.
Dans la suite du texte, nous allons effectuer des combinaisons linéaires des lignes
d’un système d’équations linéaires.
Définition 7.7 (Combinaison de deux lignes d’un système d’équations linéaires).
Soient i, j ∈ {1, . . . , n} deux entiers et soit α un nombre réel. Nous notons Li la i-ème
ligne du système d’équations :

a i1 x1 + ai2 x2 + . . . + ain xn = bi (7.6)

pour i = 1, . . . , n. L’opération :

L i ← Li + α × L j

signifie que nous remplaçons la i-ème équation par :

(ai1 + αaj1 )x1 + (ai2 + αa j2 )x2 + . . . + (ain + αajn)x n = b i + αbj . (7.7)

L’équation L i + α × Lj est la somme de la i-ème équation et du produit de la


j -ème équation par α. L’opération « ← » signifie « est substitué par ». En effet, le
produit de α par la j -ème équation est :

αaj1x1 + αa j2x 2 + . . . + αajn xn = αbj .

La somme de l’équation 7.6 et de l’équation précédente mène à l’équation 7.7. Il n’est


pas si facile de comprendre l’algorithme du pivot de Gauss avec permutation des lignes
dans le cadre général. C’est pourquoi nous commençons par le mettre en œuvre dans
l’exemple suivant sur un système de 3 équations à 3 inconnues.
Exemple 7.9 (Mise en œuvre de la méthode du pivot de Gauss sur un système de
3 équations linéaires). Considérons à nouveau le système d’équations présenté dans
l’exemple 7.4. Dans la première étape, nous devons éliminer x1 des lignes 2 et 3. Le
coefficient devant l’inconnue x1 dans la première équation est égal à -2 : on l’appelle
le pivot, car c’est cette équation que l’on va utiliser pour éliminer l’inconnue x1 dans
la seconde et la troisième équation. Pour éliminer x1 des lignes L 2 et L3 , on introduit
les deux multiplicateurs suivants. Le premier multiplicateur est −0 .6
−2 = 0.3, tandis que
le second est −1
−2 = 0.5. C’est pourquoi on effectue les opérations suivantes :
7.4 • Méthode de Gauss 141

• L2 ← L2 − 0.3 × L 1 ;
• L3 ← L3 − 0.5 × L 1.
Nous précisons que l’opération s’applique à la fois sur le membre de gauche et sur le
membre de droite. Cela change le système d’équations en :
    
−2 9.2 3.8 x1 15
 0 −0.06 1.26  x 2 =  1.2  .
0 0.3 −6.8 x3 −6.5

Dans la seconde étape, nous devons éliminer x2 de la ligne 3. Mais le pivot (le co-
efficient de x2 dans L2) est -0.06, qui est plus petit en valeur absolue que 0.3 (le
coefficient de x 2 dans L 2). C’est pourquoi on échange les lignes 2 et 3 : cette étape
est déterminante dans le cas général : nous reviendrons sur ce sujet dans la suite.
L’équation est désormais :
    
−2 9.2 3.8 x1 15
0 0.3 −6.8 x 2 = −6.5  .
0 −0.06 1.26 x3 1.2
−0.06
Pour éliminer x 2 de la ligne 3, le multiplicateur est 0.3 = −0.2. C’est pourquoi on
effectue l’opération suivante :
• L3 ← L3 + 0.2 × L 2.
L’équation est :     
−2 9.2 3.8 x1 15
 0 0.3 −6.8 x2  =  −6.5 .
0 0 −0.1 x3 −0.1
La dernière équation est −0.1x3 = −0.1 ce qui implique x3 = 1. La seconde équation
est 0.3x2 − 6.8x 3 = −6.5 ce qui implique :

0.3x 2 = −6.5 + 6.8x 3 .

On substitue x 3 dans l’équation précédente :

0.3x2 = −6.5 + 6.8 = 0.3

ce qui implique x2 = 1. La première équation est −2x1 + 9.2x 2 + 3.8x 3 = 15 ce qui


implique :
−2x1 = 15 − 9.2x2 − 3.8x3 .
On substitue x 3 et x 2 dans l’équation précédente, et on obtient −2x1 = 15−9.2 −3.8 =
2, ce qui implique x 1 = −1.

L’exemple précédent est instructif, mais nous utilisons plutôt Python pour ré-
soudre ce type de problèmes. Dans la session Python suivante13, on utilise la fonction
solve du module [Link] pour résoudre le même système de trois équations à
trois inconnues. On utilise la fonction array pour définir la matrice A puis le second
membre b. Enfin, on évalue la solution x en appelant la fonction solve.
13 Script Python : SysLin/Scripts/Py3/[Link].
142 Chapitre 7 • Systèmes d’équations linéaires

1 >>> from numpy import matrix


2 >>> from numpy . linalg import solve
3 >>>
4 >>> A = array ([[ -2.0 , 9.2 , 3.8] ,
5 [ -0.6 , 2.7 , 2.4] ,
6 [ -1.0 , 4.9 , -4.9]])
7 >>> A
8 array ([[ -2. , 9.2 , 3.8] ,
9 [ -0.6 , 2.7 , 2.4] ,
10 [ -1. , 4.9 , -4.9]])
11 >>> b = array ([15.0 , 5.7 , 1.0])
12 >>> b
13 array ([15. , 5.7 , 1. ])
14 >>> x = solve (A , b )
15 >>> x
16 array ([ -1. , 1. , 1.])
Nous avons vu dans cette section la méthode du pivot de Gauss avec permutation
des lignes dans plusieurs cas particuliers. Sur la base d’exemples, nous avons analysé
pourquoi privilégier la division et ne pas utiliser l’inverse. Nous avons également
observé comment échanger les équations en identifiant le plus grand pivot en valeur
absolue. Nous sommes désormais prêts pour introduire l’algorithme du pivot de Gauss
pour un nombre arbitraire d’équations linéaires. Dans la section suivante, nous allons
présenter la décomposition matricielle LU avec permutation des lignes. Nous verrons
ensuite dans la section 7.6 comment utiliser cette décomposition pour résoudre un
système d’équations linéaires.

7.5 Décomposition LU avec permutations


Dans les exemples précédents, nous avons vu comment mettre en oeuvre la mé-
thode du pivot de Gauss et réaliser, si nécessaire, les échanges de lignes. D’une part,
cette présentation est limitée et on souhaiterait pouvoir concevoir un algorithme sus-
ceptible de résoudre un nombre arbitraire d’équations linéaires. D’autre part, l’analyse
de l’algorithme itératif n’est pas si simple et il n’est pas nécessairement facile de quan-
tifier l’impact des erreurs d’arrondi lorsqu’on utilise des nombres à virgule flottante.
Une idée alternative consiste à formuler l’algorithme sous la forme d’une décom-
position de matrices, puis d’exploiter cette représentation matricielle pour réaliser
l’analyse de la propagation des erreurs d’arrondi. Dans cette section, nous présentons
l’algorithme de la méthode du pivot de Gauss avec permutation des lignes et nous
nous analysons une implémentation en Python. Puis, nous formalisons cet algorithme
en explicitant les multiplicateurs de Gauss. Enfin, nous exprimons l’algorithme du
pivot de Gauss sous la forme de la décomposition matricielle P A = LU , la première
décomposition de ce type dans ce manuel. Dans la section 7.6, nous étudierons com-
ment utiliser cette décomposition matricielle, puis nous analyserons dans la section
7.7 comment les échanges de lignes modifient les valeurs numériques des matrices im-
pliquées dans la décomposition, en particulier la matrice L. Nous examinerons dans
la section 7.8, comment exprimer les étapes intermédiaires de l’algorithme grâce à des
matrices et en particulier grâce à la matrice de transformation de Gauss. Enfin dans
la section 7.9, nous serons en mesure d’analyser la propagation des erreurs d’arrondi
dans la méthode du pivot de Gauss.
7.5 • Décomposition LU avec permutations 143

Dans le but de pouvoir analyser le code Python du pivot de Gauss, nous décrivons
maintenant l’algorithme de manière formelle. Les étapes sont les suivantes :
— descente : pour la ligne k = 1, ..., n − 1 ;
— recherche du meilleur pivot dans les lignes k à n de la colonne k ;
— échange des lignes ;
— élimination de x k dans les lignes k + 1 à n ;
— remontée : pour la ligne k = n, n − 1, ..., 1 (boucle rétrograde) ;
— calcul de x k ;
— substitution de x k dans les lignes k − 1 à 1.
Dans l’algorithme, le meilleur pivot est celui dont la valeur absolue est la plus grande.
La fonction lu_decomposition suivante 14 implémente l’algorithme du pivot de Gauss
avec permutation des lignes. Elle prend en entrée un array A et retourne en sortie les
matrices L, U (également de type array) et la liste p.
1 from numpy import argmax , tril , triu , outer
2

3 def l u_de com posi tio n (A) :


4 n = A. shape [0]
5 p = list ( range (n) )
6 for k in range ( n - 1) :
7 # Re cherche dans la co lonne k
8 m = argmax ( abs ( A[ k:n , k ]) )
9 m = m + k
10 # Echange les lignes
11 if m != k:
12 A [[ k , m] , :] = A [[m , k ], :]
13 p[ m] , p[ k] = p [k ], p [m ]
14 if A[k , k] == 0.0: # Le pivot est nul
15 raise Va lueErr or ( " Error : zero pivot !" )
16 # Calcule les m ulti plic ateu rs
17 A[k + 1 : n , k] = \
18 A[ k + 1 : n , k ] / A[k , k ]
19 A[k + 1 : n , k + 1 : n] = \
20 A[ k + 1 : n , k + 1 : n ] \
21 - outer (A[ k + 1 : n , k ],
22 A[k , k + 1 : n ])
23 L = tril (A , -1) + eye (n)
24 U = triu ( A)
25 return L , U , p

La fonction précédente appelle quelques commentaires. L’instruction A[[k, m],


:] = A[[m, k],:] permet d’échanger les lignes k et m de la matrice A. D’autre part,
nous avons déjà vu la fonction outer dans la section 6.8. L’instruction outer(A[k
+ 1:n, k], A[k, k + 1:n]) permet de générer la matrice fondée sur le produit
tensoriel des multiplicateurs du vecteur A[k + 1:n, k] et du vecteur A[k, k + 1:n].
Dans l’exemple qui suit, nous considérons un système linéaire de 3 équations et nous
observons la première étape de l’algorithme.
14 Script Python : Scripts-Eleves/Py3/[Link].
144 Chapitre 7 • Systèmes d’équations linéaires

Exemple 7.10. On considère à nouveau les données de l’exemple 7.4 et on considère


l’algorithme du pivot de Gauss à la première étape de l’algorithme, lorsqu’on effectue
les opérations L 2 ← L2 − 0.3 × L1 et L3 ← L 3 − 0.5 × L1 . À cette étape, il n’y a
pas de permutation des lignes. Les instructions suivantes15 permettent d’observer les
multiplicateurs ainsi que la matrice issue du produit tensoriel.
1 >>> from numpy import array , outer
2 >>>
3 >>> A = array ([[ -2.0 , 9.2 , 3.8] ,
4 [ -0.6 , 2.7 , 2.4] ,
5 [ -1.0 , 4.9 , -4.9]])
6 >>> n = A . shape [0]
7 >>> k = 0
8 >>> m = 0
9 >>> A [k + 1:n , k ] = A[ k + 1:n , k ] / A[k , k ]
10 >>> A
11 array ([[ -2. , 9.2 , 3.8] ,
12 [ 0.3 , 2.7 , 2.4] ,
13 [ 0.5 , 4.9 , -4.9]])
14 >>> A [k + 1:n , k ]
15 array ([0.3 , 0.5])
16 >>> A [k , k + 1: n]
17 array ([9.2 , 3.8])
18 >>> outer (A[ k + 1:n , k ], A [k , k + 1: n ])
19 array ([[2.76 , 1.14] ,
20 [4.6 , 1.9 ]])

Puisque k = 0, la variable A[k + 1:n, k] correspond aux lignes d’indices Python


1 et 2 (c’est-à-dire la deuxième et la troisième ligne de la matrice) de la colonne
d’indice Python 0 (c’est-à-dire la première colonne). L’instruction A[k + 1:n, k]
/ A[k, k] permet de calculer les multiplicateurs en divisant par le pivot A[k, k],
égal à -2.0. On observe que la variable A[k + 1:n, k] contient les multiplicateurs
0.3 et 0.5 que nous avons déjà observés lorsque nous avons utilisé la méthode dans
l’exemple 7.4. Lorsqu’on effectue les opérations L 2 ← L2 − 0.3 × L 1 et L3 ← L3 −
0.5 × L1 , on observe qu’il faut multiplier la ligne 1 d’abord par 0.3, puis par 0.5.
L’instruction outer(A[k + 1:n, k], A[k, k + 1:n]) permet de réaliser ces deux
opérations en une seule fois, de manière vectorisée. La vectorisation consiste ici à
réaliser une opération de multiplication. En effet, le résultat de l’opération 0.3 ×L 1 est
égal à (2.76, 1.14) et le résultat de l’opération 0.5×L1 est égal à (4.6, 1.9). Cela explique
pourquoi le produit tensoriel est égal à array([[2.76, 1.14], [4.6 , 1.9 ]]).
Dans l’algorithme, le résultat du produit tensoriel est ensuite soustrait à la variable
A[k + 1 : n, k + 1 : n], avant de passer à l’itération suivante. L’opération de
soustraction est, elle aussi, vectorisée puisqu’on réalise une opération entre deux array
de taille 2-par-2.

Remarque 7.3 (Vectorisation en Python). Dans le script précédent, nous avons vu


comment l’utilisation de la fonction outer ainsi que la soustraction permettent de
vectoriser l’algorithme. Cette vectorisation permet d’obtenir un code plus lisible et
plus performant, en évitant d’écrire des boucles for en Python. Dans le cas par-
ticulier de l’algorithme précédent, sans vectorisation, deux boucles for imbriquées
15Script Python : SysLin/Scripts/Py3/[Link].
7.5 • Décomposition LU avec permutations 145

supplémentaires seraient nécessaires. La vectorisation est une des techniques les plus
utilisées pour obtenir un code performant dans un langage interprété16 .
Le but des définitions qui suivent est de formaliser les matrices qui apparaissent
dans l’algorithme du pivot de Gauss avec permutation des lignes. La définition sui-
vante introduit les multiplicateurs de Gauss.
Définition 7.8 (Multiplicateurs de Gauss). Soit A (1) = A la matrice initiale. Pour
k = 1, . . . , n, notons A(k) la matrice intermédiaire issue de l’algorithme à l’étape k.
Dans l’algorithme du pivot de Gauss, les multiplicateurs sont :

(k) a (ikk)
ti = (k)
(7.8)
a kk

pour i = k + 1, ..., n.
Nous sommes désormais en mesure d’exprimer l’algorithme du pivot de Gauss avec
permutation des lignes sous la forme de la décomposition matricielle P A = LU .
Définition 7.9 (Décomposition P A = LU ). Soit A ∈ Rn×n une matrice inversible.
La méthode du pivot de Gauss avec permutation des lignes permet de calculer les
matrices L, U et P telles que :
P A = LU
où :
— L est une matrice triangulaire inférieure contenant les multiplicateurs durant
l’élimination ;
— U est une matrice triangulaire supérieure contenant les coefficients de la matrice
finale ;
— P est une matrice de permutation représentant les échanges de lignes.
La matrice L est définie par :
 (k)

ti si i > k
`ik = 1 si i = k (7.9)


0 sinon

(k)
pour i, k = 1, ..., n où ti est le multiplicateur de la ligne i à l’étape k. La matrice U
est définie par :
(k)
u kj = akj (7.10)

pour j, k = 1, ..., n et k ≤ j.
On dit qu’il s’agit de la décomposition P A = LU de la matrice A. On peut parfois
évoquer plus simplement la « décomposition LU », mais cette expression ne permet
pas de préciser si on utilise une permutation des lignes. L’équation 7.10 indique que
la k-ième ligne de la matrice U est issue de la k -ième étape de l’algorithme. Dans
l’exemple suivant, nous observons la décomposition associée à une matrice carrée
d’ordre 3.
16 Voir [142].
146 Chapitre 7 • Systèmes d’équations linéaires

Exemple 7.11. On considère à nouveau les données de l’exemple 7.4. La décompo-


sition P A = LU de la matrice A précédente est :
   
1 0 0 −2 9.2 3.8

L = 0.5 1 0 , U =  0 0.3 −6.8  ,
0.3 −0.2 1 0 0 −0.1
 
1 0 0

P = 0 0 1.
0 1 0

Dans la session suivante17 , nous créons la matrice A. Puis nous appelons la fonction
lu_decomposition pour calculer les matrices L et U, ainsi que le vecteur p.
1 >>> from numpy import array
2 >>> from linalg import linalg
3 >>>
4 >>> A = array ([[ -2.0 , 9.2 , 3.8] , [ -0.6 , 2.7 , 2.4] ,
5 [ -1.0 , 4.9 , -4.9]])
6 >>> L , U , p = l u_de com posi tio n (A)
7 >>> L
8 array ([[ 1. , 0. , 0. ],
9 [ 0.5 , 1. , 0. ] ,
10 [ 0.3 , -0.2 , 1. ]])
11 >>> U
12 array ([[ -2. , 9.2 , 3.8] ,
13 [ 0. , 0.3 , -6.8] ,
14 [ 0. , 0. , -0.1]])
15 >>> p
16 [0 , 2 , 1]

Dans la session précédente, on observe que p est une liste d’indices représentant
la matrice de permutation P . En effet, nous allons voir que cette liste est suffisante
en pratique pour résoudre le problème, de telle sorte que stocker explicitement la
matrice P est en fait inutile. L’intérêt de la décomposition P A = LU est que, une fois
la décomposition effectuée, il est facile et économique de résoudre le système Ax = b,
ce qui est le sujet de la section suivante.

7.6 Utiliser la décomposition PA=LU pour résoudre


un système d’équations linéaires
Dans cette section, nous montrons comment calculer la solution du système d’équa-
tions linéaires Ax = b en exploitant la décomposition P A = LU . Nous montrons
comment permuter les équations puis comment résoudre le système triangulaire su-
périeur associé à la matrice U . Enfin, nous analysons brièvement la complexité de
l’algorithme, c’est-à-dire le nombre d’opérations nécessaires. Multiplions l’équation
Ax = b à gauche par P :
P Ax = P b.
17Script Python : SysLin/Scripts/Py3/[Link].
7.6 • Utiliser la décomposition PA=LU 147

La décomposition P A = LU implique :

LU x = P b.

Soit y le vecteur défini par y = U x. Cela implique que y est solution de l’équation
Ly = P b. Soit c = P b. Par conséquent Ly = c. C’est pourquoi la méthode de
résolution est la suivante :
— calculer les matrices L, U et P telles que P A = LU grâce à l’algorithme du
pivot de Gauss avec échange de lignes ;
— calculer c tel que c = P b par permutation des lignes de b ;
— calculer y tel que Ly = c par l’algorithme de descente ;
— calculer x tel que U x = y par l’algorithme de remontée.
Nous allons maintenant détailler chacune des trois dernières étapes. Commençons
par voir comment traiter l’étape de permutation du second membre nécessaire dans
la deuxième étape de l’algorithme. Pour cela, considérons le produit matrice-vecteur
c = P b où P est une matrice de permutation. Pour calculer le produit matrice-
vecteur P b, il suffit d’appliquer la permutation P au vecteur b en échangeant les
lignes correspondantes du vecteur b comme le montre le script suivant18 .
1 >>> from numpy import array
2 >>>
3 >>> p = [0 , 2, 1]
4 >>> b = array ([15.0 , 5.7 , 1.0])
5 >>> c = b [p ]
6 >>> c
7 array ([15. , 1. , 5.7])

Remarque 7.4 (Résoudre un système d’équations permutées). Soit P ∈ Rn×n une


matrice de permutation et b ∈ Rn un vecteur. Cherchons x ∈ Rn solution du système
d’équations linéaires P x = b. Dans l’exercice 6.12, page 124, on montre que P T P =
In . C’est pourquoi la solution est x = P T b. Bien que l’équation précédente exprime
la solution comme le produit de la matrice P T par le vecteur b, la résolution pratique
ne nécessite que d’échanger les composantes appropriées de b (ce qui est plus rapide).
Analysons comment résoudre le système d’équations linéaires triangulaire supé-
rieur qui apparaît dans la quatrième étape de l’algorithme. Plus précisément, consi-
dérons le système d’équations linéaires :

U x = b.

Le principe de l’algorithme de remontée est le suivant :


— réaliser une boucle rétrograde sur k = n, n − 1, ..., 1 ;
— calculer xk = bk /ukk , si ukk 6= 0 (sinon, s’arrêter) ;
— substituer x k dans les équations 1, 2, ..., k − 1 en modifiant le second membre.
En Python, l’algorithme de remontée est le suivant.
18 Script Python : SysLin/Scripts/Py3/[Link].
148 Chapitre 7 • Systèmes d’équations linéaires

1 from numpy import zeros


2 x = zeros (( n , 1) )
3 for k in range ( n - 1, -1 , -1) :
4 x[ k] = b [k ] / U[k , k ]
5 b [0: k] = b [0: k] - U [0: k , k ] * x[ k]

L’algorithme précédent utilise la fonction range qui permet de réaliser une boucle
rétrograde, comme le montre la session suivante.
1 >>> n = 4
2 >>> range (n - 1, -1 ,- 1)
3 [3 , 2 , 1, 0]

Plus de détails sur l’algorithme de remontée sont donnés dans l’exercice 7.19. Enfin,
analysons le système triangulaire inférieur qui apparaît dans la troisième étape de
l’algorithme. Pour résoudre le système d’équations linéaires :

Lx = b

où L est une matrice triangulaire inférieure, on utilise un algorithme de descente. Cet


algorithme est très similaire à l’algorithme de remontée précédent. Plus de détails sur
l’algorithme de descente sont donnés dans l’exercice 7.20.
Enfin, tentons de déterminer la complexité de l’algorithme, c’est-à-dire le nombre
d’opérations arithmétiques (additions, soustractions, multiplications et divisions) né-
cessaires dans l’algorithme. La complexité des algorithmes est la suivante :
— décomposition P A = LU : O(n 3 ) opérations ;
— résoudre LU x = P b : O(n 2 ) opérations.
C’est pour cette raison que la procédure classique consiste à calculer d’abord la dé-
composition P A = LU (qui est coûteuse), puis à résoudre le système LU x = P b (ce
qui est peu coûteux). C’est particulièrement pertinent dans le cas où on dispose de
plusieurs membres de droites : dans ce cas, la décomposition est réalisée une fois pour
toutes 19.

7.7 La permutation des lignes


Dans cette section, nous montrons pourquoi la permutation des lignes permet de
garantir que les multiplicateurs impliqués dans la méthode du pivot de Gauss sont
bornés. Cette propriété explique la stabilité de l’algorithme et s’avère déterminante
pour comprendre les propriétés de cette méthode. Dans la section 7.9 nous constate-
rons que la méthode du pivot de Gauss est déterminée par son facteur de croissance et
que ce facteur dépend des propriétés des multiplicateurs choisis dans l’algorithme. Le
théorème suivant permet d’établir une borne sur les multiplicateurs lorsqu’on utilise
l’algorithme du pivot de Gauss avec permutation des lignes.

Théorème 7.5 (Pivots dans la décomposition P A = LU avec permutation des


lignes). On suppose que les pivots de l’algorithme sont non nuls pour k = 1, ..., n
(sinon l’algorithme s’arrête). La permutation des lignes est fondée sur la recherche de
19Voir [55] page 108.
7.7 • La permutation des lignes 149

la ligne possédant le plus grand pivot en valeur absolue. La définition du pivot donnée
par l’équation 7.8 implique :
 
 (k)
 ti  ≤ 1 (7.11)

pour i = k + 1, ..., n, ce qui implique :


|`ik | ≤ 1 (7.12)
pour i, k = 1, ..., n.
Démonstration. Soit k ∈ {1, ..., n}. Par hypothèse, les pivots de l’algorithme sont non
(k)
nuls ce qui implique akk 6= 0. La stratégie de recherche de pivot  par
 permutation

 (k)   (k)
des lignes implique que, après permutation des lignes, on a aik  ≤ a kk  pour i =
k + 1, ..., n. Cela implique :  
 (k) 
a ik 
 (k)  ≤ 1
 
a kk 
pour i = k + 1, ..., n. La définition du pivot donnée par l’équation 7.8 implique l’équa-
tion 7.11. L’équation 7.9 combinée à l’équation 7.11 implique l’équation 7.12.
En d’autres termes, la permutation des lignes garantit que les termes dans la
matrice L sont bornés. L’exemple suivant permet de mieux localiser à la fois la position
et la valeur des multiplicateurs.
Exemple 7.12. On considère à nouveau l’exemple 7.4. On obtient, après permutation
(1) (1) (2)
des lignes, les multiplicateurs t2 = 0.5, t3 = 0.3 et t 3 = −0.2. La matrice L est
alors :    
1 0 0 1 0 0
 (1) 
L = t2 1 0 =  0.5 1 0 .
(1)
t3
(2)
t3 1 0.3 −0.2 1
On peut se demander ce qui peut se passer si les hypothèses du théorème 7.5 ne
sont pas vérifiées, c’est-à-dire ce qui advient lorsqu’on n’échange pas les lignes de la
matrice. Pour le comprendre sur un exemple aussi simple que possible, observons par
exemple le système de deux équations suivant.
Exemple 7.13 (Un système à deux équations à permuter). Considérons le système
d’équations linéaires :     
0 1 x1 1
= .
1 1 x2 2
La solution de ce système d’équations linéaires est x = (1, 1)T . Résoudre ce système
d’équations ne devrait poser aucun problème, puisque la matrice A est inversible.
Lorsqu’on utilise la méthode du pivot de Gauss avec permutation des lignes, on obtient
les matrices :      
1 0 1 1 0 1
L= , U = , P = .
0 1 0 1 1 0
On observe que la matrice P est associée à la permutation des lignes 1 et 2. Si,
au contraire, on ne permute pas les lignes, alors l’algorithme échoue dès le début,
car il détecte un pivot nul : de toute évidence, on obtient a1,1 = 0, ce qui empêche
l’algorithme de progresser.
150 Chapitre 7 • Systèmes d’équations linéaires

L’exemple précédent montre que si l’on n’échange pas les lignes lorsque c’est né-
cessaire, on peut obtenir un pivot nul et, en conséquence, un multiplicateur infini. On
pourrait penser que ce n’est pas un problème, puisque la division par zéro qui s’ensuit
avertit l’utilisateur d’une difficulté et que l’on peut alors utiliser un algorithme plus
approprié. En fait, la situation est plus complexe, car le pivot peut être non nul tout
en étant très proche de zéro, comme le montre l’exemple suivant.
Exemple 7.14 (Perturbation d’un système à deux équations à permuter). Considé-
rons le système d’équations linéaires légèrement perturbé :
    
 1 x1 1+
=
1 1 x2 2

avec  = 10−15 . La solution de ce système d’équations linéaires est x = (1, 1)T .


Lorsque l’on utilise l’algorithme du pivot de Gauss avec permutation des lignes sur
un système à nombres flottants de type IEEE 754 avec 64 bits, on obtient une erreur
absolue kx − x̃k = 2.220 × 10−16 , ce qui est un résultat très précis. Au contraire, si
on utilise l’algorithme du pivot de Gauss sans permutation des lignes, on obtient :
 
0.8882
x̃ = .
1

On observe que la première composante de la solution calculée x̃ ne possède aucun


chiffre correct. De plus, on obtient kx − x̃k = 0.1118. L’algorithme ne permet donc
pas de calculer une solution précise car le pivot est 10−16, ce qui est bien trop proche
de zéro.
L’exemple précédent montre que, sans échange de lignes, l’algorithme peut pro-
duire une solution très imprécise. Le but des deux sections qui suivent est de com-
prendre quand et pourquoi la méthode du pivot de Gauss peut être sensible aux
erreurs d’arrondi.

7.8 Analyse matricielle du pivot de Gauss


Dans cette section, nous présentons comment l’algorithme du pivot de Gauss avec
permutation des lignes produit la décomposition P A = LU . Plus précisément, nous
montrons comment les matrices intermédiaires produites par l’algorithme peuvent
être combinées pour faire apparaître les matrices P , L et U . Dans la section 7.9, nous
allons voir comment les matrices intermédiaires permettent de définir le facteur de
croissance. Nous y verrons que cela permet d’analyser la stabilité de la décomposition
matricielle P A = LU . La matrice de transformation de Gauss est la matrice qui
permet d’éliminer des termes dans une colonne donnée de la matrice.
Définition 7.10 (Matrice de transformation de Gauss). On considère l’algorithme
du pivot de Gauss sans permutation des lignes pour une matrice carrée A inversible,
de taille n × n. Pour k = 1, 2, . . . , n − 1, durant l’étape k de l’algorithme, on note
t (k) ∈ R n le vecteur des multiplicateurs :
 T
(k) (k)
t = 0, . . . , 0, tk+1, . . . , t (nk)
| {z }
k
7.8 • Analyse matricielle du pivot de Gauss 151

(k) (k)
où tk+1, . . . , t n sont les multiplicateurs. La matrice de transformation de Gauss est
la matrice Mk définie par :
Mk = I − t(k)e Tk
où ek est le k-ième vecteur de la base canonique en dimension n.
En d’autres termes, la matrice Mk est une matrice triangulaire inférieure contenant
l’opposé des multiplicateurs de la k-ième étape. Plus de détails sur la matrice de
transformation de Gauss sont donnés dans l’exercice 7.9. Dans l’algorithme du pivot
de Gauss, observons comment la matrice de transformation de Gauss intervient. Nous
allons voir que cela permet d’observer comment la matrice triangulaire supérieure U
est construite au fil de l’algorithme. À l’étape k, nous considérons l’opération sur la
ligne i suivante :
(k)
Li ← L i − t i Lk
avec i = k + 1, ..., n. Cela revient à effectuer les opérations :
(k+1) (k) (k) (k)
aij = a ij − ti a kj (7.13)
(k+1) (k) (k) (k)
bi = bi − ti b k (7.14)

pour i = k + 1, ..., n et j = k, ..., n. L’exercice 7.10 montre que, lors de la k-ième étape
du pivot de Gauss, la définition des multiplicateurs permet d’introduire des zéros dans
la k-ième colonne de la matrice A. En d’autres termes, pour tout i = k + 1, ..., n et
(k+1)
j = k, on a aik = 0. L’égalité 7.13 peut être exprimée sous une forme matricielle,
ce qui mène à l’égalité :
MkA (k) = A(k) − t(k)A (k,•
k)

où A k,• est la k-ième ligne de la matrice A(k) . En d’autres termes, appliquer les opé-
rations sur les lignes de A(k) est donc bien équivalent à appliquer le produit matrice-
matrice Mk A(k) .
Dans l’algorithme du pivot de Gauss, la matrice initiale est A(0) = A. Les matrices
intermédiaires obtenues sont :

A (k+1) = Mk Pk A(k)

pour k = 1, ..., n − 2, où la matrice Pk est la matrice de permutation associée à


l’échange éventuel de lignes à l’itération k . À la fin de l’algorithme on a A(n−1) = U ,
une matrice triangulaire inférieure. Les matrices qui interviennent dans l’algorithme
du pivot de Gauss avec permutation des lignes sont :
— Pk, k = 1, ..., n − 1 : matrice de permutation associée à l’échange de lignes ;
— Mk , k = 1, ..., n − 1 : matrice de transformation de Gauss ;
— U : matrice triangulaire inférieure finale.
L’algorithme du pivot de Gauss avec permutation des lignes mène à la matrice trian-
gulaire supérieure suivante :

U = M n−1Pn−1 . . . M 2P2 M1 P1 A.

Dans l’exercice 7.11, nous montrons qu’on peut réécrire cette équation sous la forme :

L1 L2 . . . Ln−1 U = Pn−1 . . . P 2P1A


152 Chapitre 7 • Systèmes d’équations linéaires

où la matrice Lk s’obtient en fonction de Mk en permutant les lignes et en chan-


geant le signe des multiplicateurs sous la diagonale. Soient L = L1L 2 . . . L n−1 et
P = Pn−1 . . . P2P 1 . Alors l’exercice 7.11 montre que P A = LU . En d’autres termes,
l’algorithme du pivot de Gauss permet de calculer les matrices P , L et U de la dé-
composition P A = LU . L’exemple suivant montre les matrices intermédiaires qui
apparaissent dans l’algorithme.

Exemple 7.15 (Analyse matricielle du pivot de Gauss avec permutation des lignes).
Considérons la matrice présentée dans l’exemple 7.4 :
 
−2 9.2 3.8
A = −0.6 2.7 2.4  .
−1 4.9 −4.9

On a :
   
1 0 0 1 0 0
P1 = 0 1 0 , M 1 = −0.3 1 0 ,
0 0 1 −0.5 0 1

   
1 0 0 1 0 0
L1 =  0.5 1 0  , P2 = 0 0 1  ,
0.3 0 1 0 1 0

   
1 0 0 1 0 0
M2 = 0 1 0 , L 2 = 0 1 0 .
0 0 .2 1 0 −0.2 1

Plus de détails sur ce thème sont donnés dans les exercices 7.8, 7.9 et 7.11.

7.9 Le facteur de croissance (*)


Dans la section 7.3, nous avons vu qu’une perturbation du second membre b ou
de la matrice A peut induire un changement dans la solution du système d’équations
linéaires. De plus, nous avons vu que le changement relatif est borné par un terme
dépendant du conditionnement de la matrice. Or lorsque nous utilisons l’algorithme
du pivot de Gauss avec permutation des lignes sur une machine à virgule flottante,
nous introduisons des erreurs d’arrondi qui sont similaires à des perturbations de ce
type. Toutefois, le théorème 7.3 n’est pas spécifique à l’algorithme que nous choisis-
sons pour résoudre le problème. En d’autres termes, le théorème n’indique pas quelle
est la perturbation introduite par l’algorithme du pivot de Gauss avec permutation
des lignes : il se contente d’indiquer comment la solution est perturbée lorsqu’une
perturbation donnée est appliquée. C’est la raison pour laquelle on peut se deman-
der quel est le rôle particulier de l’algorithme du pivot de Gauss avec permutation
des lignes dans la propagation des erreurs d’arrondi. Dans cette section, on montre
comment un théorème, démontré par J.H. Wilkinson, permet de mettre en avant le
rôle du conditionnement de la matrice A, ainsi qu’un terme dépendant des matrices
intermédiaires durant l’algorithme du pivot de Gauss : le facteur de croissance.
7.9 • Le facteur de croissance (*) 153

Lorsqu’on considère la résolution d’un système d’équations linéaires, on peut se


demander si la solution calculée par l’algorithme, que l’on note x̃, est proche de la
solution exacte x. Toutefois, en général, on ne connaît pas la solution exacte et on ne
peut donc pas calculer l’erreur absolue. Puisque la solution exacte vérifie l’équation
Ax − b = 0, on peut se demander si Ax̃ − b est également proche de zéro, ce qui
mène à la définition du résidu.
Définition 7.11 (Résidu). Soient A ∈ Rn×n une matrice carrée inversible et b ∈ Rn
un vecteur. Soit x ∈ Rn la solution du système d’équations linéaires Ax = b. Soit x̃
une approximation de x. Le résidu est :
r = Ax̃ − b.

Nous allons voir que l’algorithme d’élimination de Gauss avec permutation des
lignes garantit que les résidus sont petits. Pour cela, nous introduisons le facteur de
croissance qui caractérise l’amplitude des matrices intermédiaires dans l’algorithme.
Définition 7.12 (Facteur de croissance). Soit A ∈ Rn×n une matrice inversible. Pour
k = 1, 2, ..., n, on note A(k) les matrices intermédiaires durant l’élimination de Gauss
avec permutation des lignes :
A(1) = A, A (2), ..., A (n) = U

où U est la matrice triangulaire supérieure obtenue à la fin de l’algorithme. Le facteur


de croissance est défini par :
 
 (k) 
maxi,j,k aij 
ρn = . (7.15)
maxi,j |aij |
Puisque la matrice U contient les termes les plus grands en valeur absolue dans
les matrices A(1), ..., A (n) , on a :
maxi,j |u ij |
ρn = . (7.16)
maxi,j |aij |
Lorsqu’on utilise l’algorithme du pivot de Gauss sans échange de ligne, on peut
obtenir un pivot nul. En conséquence, le facteur de croissance n’est pas borné pour
cet algorithme. Au contraire, l’exercice 7.13 démontre que l’algorithme du pivot de
Gauss avec permutation des lignes permet de borner le facteur de croissance par 2n−1 .
De plus, cette borne supérieure peut être atteinte20 . Lorsqu’on échange à la fois les
lignes et les colonnes de la matrice, le facteur de croissance peut encore être réduit.
Toutefois, en pratique, il s’avère que le facteur de croissance ρn est rarement plus
grand que 10 lorsqu’on échange les lignes de la matrice sans échanger les colonnes.
La définition suivante s’appuie sur la précision machine u précisée dans la définition
4.11 page 61.
Définition 7.13. Pour tout entier n tel que nu < 1, on note :
nu
γn = (7.17)
1 − nu
où u est la précision machine.
20 Voir [131], exemple 4.13 page 237.
154 Chapitre 7 • Systèmes d’équations linéaires

Le développement de Taylor de la fonction 1/(1 + x) quand x → 0 implique :

γn = nu + O(u2), u → 0.

Comme nous allons le voir, l’utilisation de γn permet d’obtenir des inégalités simples
au lieu d’inégalités faisant intervenir la notation de Landau. Nous pouvons maintenant
présenter le théorème suivant qui constitue une analyse backward de l’algorithme du
pivot de Gauss. Il montre que l’algorithme du pivot de Gauss permet de produire une
solution approchée qui est la solution exacte d’un problème perturbé.

Théorème 7.6 (J.H. Wilkinson). Soit A ∈ Rn×n une matrice inversible et b ∈ R n


un vecteur. Alors la solution calculée x̃ par le pivot de Gauss avec permutation des
lignes satisfait l’équation :

(A + ∆A) x̃ = b (7.18)

où la matrice de perturbation ∆A est telle que :

k∆Ak∞ ≤ n 2γ3n ρnkAk ∞. (7.19)

Le théorème précédent est démontré dans l’exercice 7.12. Dans de nombreux ou-
vrages, l’inégalité 7.19 est écrite en réalisant un développement de Taylor de γn. On
obtient :

k∆Ak∞ ≤ 3n3 ρ n ukAk∞ + O(u 2)

quand u → 0. L’inégalité précédente fait apparaître un polynôme de degré 3 en la


taille n de la matrice. Dans le théorème suivant, nous analysons d’une part le résidu
et d’autre part l’erreur relative de l’algorithme du pivot de Gauss avec échange de
lignes.

Théorème 7.7 (J.H. Wilkinson). Soient A ∈ Rn×n une matrice inversible et b ∈ R n


un vecteur. On considère la solution calculée x̃ par le pivot de Gauss avec permutation
des lignes. Alors le résidu est tel que :

kAx̃ − bk ∞
≤ n2 γ3n ρn (7.20)
kAk∞ kx̃k ∞

si x̃ 6= 0. De plus, l’erreur relative sur x est :

kx − x̃k ∞
≤ n 2γ3n ρn κ∞ (A) (7.21)
k x̃k∞

si x̃ 6= 0 où κ∞ (A) est le conditionnement de A en norme infinie :

κ∞ (A) = kAk∞ kA−1 k∞ .

Le théorème précédent est démontré dans l’exercice 7.14 page 172. Dans certains
ouvrages, l’inégalité 7.20 est écrite sous la forme :

kAx̃ − bk∞
≤ 3n 3uρn + O(u2 )
kAk∞kx̃k∞
7.10 • Chiffres significatifs dans la solution 155

quand u → 0. De même, l’inégalité 7.21 est parfois écrite sous la forme :


kx − x̃k∞
≤ 3n3 uρn κ ∞ (A) + O(u2 )
kx̃k∞
quand u → 0. Dans l’inégalité 7.20, le point important est que le second membre est
indépendant du conditionnement κ(A). De plus, le terme γ3n est, lorsque n n’est pas
trop grand, un multiple de la précision machine u. En d’autres termes, le résidu issu
du pivot de Gauss avec permutation des lignes est, la plupart du temps, relativement
petit, indépendamment du conditionnement de la matrice A. Dans l’inégalité 7.21, le
point important est que le second membre dépend du conditionnement κ∞ (A). En
d’autres termes, l’erreur relative sur x est petite si le conditionnement de A est petit.

7.10 Chiffres significatifs dans la solution


Dans cette section, nous souhaitons déterminer la précision du résultat lorsqu’on
utilise l’algorithme du pivot de Gauss avec permutation des lignes. Si la solution x
est différente de zéro (ce qui est, nous le supposons, le plus fréquent), nous devrions
utiliser l’erreur relative. C’est pourquoi nous proposons d’utiliser la log-erreur relative
en base 10 qui correspond au nombre de chiffres décimaux corrects. Cela nécessite
toutefois de connaître la solution x et on peut penser que ce n’est pas une situation
très fréquente en général (sinon nous n’utiliserions pas de méthode numérique pour en
calculer une approximation). À l’aune du théorème 7.7, on pourrait souhaiter évaluer
le membre de droite de l’équation 7.21. Pour cela, nous devons évaluer le facteur de
croissance ρ n ce qui est problématique, car il dépend de matrices intermédiaires dans
l’algorithme du pivot de Gauss : en général, ces matrices ne sont pas connues. C’est
pourquoi nous proposons dans cette section de déterminer le nombre minimum de
chiffres corrects en fonction du conditionnement de la matrice qui peut être évalué
plus facilement en pratique.
On définit le nombre de chiffres décimaux significatifs dans x par rapport à une
approximation x̃ par :
 
kx − x̃k∞
LRE10 (x, x̃) = − log10 .
kxk∞
La définition précédente revient à considérer une erreur relative en norme, et non
pas composante par composante. Supposons que l’on utilise l’algorithme du pivot de
Gauss avec permutation des lignes. Si le facteur de croissance est égal à 1, alors le
nombre de chiffres décimaux de x est approximativement tel que :

LRE10 (x, x̃) & LRE min


10 (A)

où LREmin
10 est définie par :

LREmin 2
10 (A) = − log 10(3n γ n κ∞ (A) M ).

L’inégalité précédente est démontrée dans l’exercice 7.16. Le nombre LREmin


10 (A) peut
être interprété comme le nombre minimum de chiffres significatifs dans x. Souvent
l’approximation précédente est plutôt pessimiste, dans le sens où la plupart des cas
pratiques mènent à une précision plus favorable. En effet, la théorie définit une borne
d’erreur maximale, correspondant au pire cas.
156 Chapitre 7 • Systèmes d’équations linéaires

Définition 7.14 (Nombre maximum approximatif de chiffres décimaux perdus à


cause du conditionnement d’une matrice). Le nombre maximum approximatif de
chiffres décimaux de x perdus à cause du conditionnement de A est :
d perdus (A) = log 10 (κ∞ (A)).
Au vu du théorème 7.6, on pourrait penser que la norme matricielle infinie, asso-
ciée au conditionnement κ ∞ , est le conditionnement le plus approprié pour mesurer la
difficulté numérique du problème. En fait, ce choix est plutôt guidé par des considéra-
tions pratiques puisqu’il est, d’une part, plus facile de dériver une inégalité en norme
infinie. D’autre part, dans un espace vectoriel de dimension finie, toutes les normes
sont équivalentes21. Puisque l’ensemble des matrices réelles est un espace isomorphe
à un espace vectoriel réel22 , ce résultat s’applique également aux normes matricielles.
Cela implique que la valeur précise du conditionnement peut dépendre de la dimen-
sion de la matrice et du choix particulier de la norme, mais que si une matrice de taille
modérée est mal conditionnée selon une norme, elle est mal conditionnée selon toute
autre norme matricielle. C’est pourquoi, dans la définition précédente, le choix de la
norme matricielle associée au conditionnement importe peu pour la plupart des ma-
trices de petite taille. Seule la facilité pratique d’estimer le conditionnement devrait
guider le choix de la norme.
Exemple 7.16. Supposons que A ∈ R3×3 est une matrice inversible dont le condi-
tionnement est :
κ∞ (A) = 103.
On considère des nombres à virgule flottante de type IEEE 754 avec 64 bits dont 53
bits de précision (c’est-à-dire des « doubles ») :
 M = 2−52.
La log-erreur relative minimum en base 10 est alors :
LREmin
10 (A) = 9.176.

Sous l’hypothèse vraisemblable que le facteur d’amplification soit modéré, alors la


solution x possède au moins approximativement 9 chiffres significatifs. Analysons
chacun des termes l’un après l’autre. Le nombre de chiffres significatifs dans les don-
nées initiales était − log10 ( M) = 15.65. Le nombre approximatif de chiffres perdus à
cause du conditionnement de A est inférieur à :
dperdus (A) = log10 (κ ∞ (A)) = 3.
Le nombre de chiffres perdus à cause de la taille de la matrice est inférieur à :
log 10 (3n3 ) = 1.462.
Dans cet exemple, comme dans la plupart des cas pratiques associés à des matrices
de taille modérée, le nombre de chiffres significatifs est essentiellement guidé par le
conditionnement de la matrice. Avec des doubles, on peut estimer que, puisque le
nombre de chiffres significatifs est égal à 16 et que 3 chiffres ont étés perdus à cause
du conditionnement de la matrice, il y a approximativement au moins 13 chiffres
significatifs dans la solution x du système d’équation linéaire.
21Voir [55] page 69.
22Voir [55] page 71.
7.11 • Effet géométrique d’une perturbation 157

Bien conditionné Mal conditionné


x2 x2

x1 x1

Figure 7.3 – Différence entre un système bien (à gauche) et mal conditionné (à


droite).

7.11 Effet géométrique d’une perturbation sur des


cas extrêmes
Les sections précédentes ont permis de quantifier le rôle du conditionnement d’une
matrice sur la sensibilité du problème à des perturbations dans la matrice ou dans
le second membre. Nous avons, de plus, présenté des exemples concrets de cette sen-
sibilité. Le but de cette section est de présenter des exemples pour lesquels nous
montrons l’effet géométrique de la sensibilité, ce qui va nous permettre de « voir »
l’effet du conditionnement.
Dans cette section, nous observons géométriquement l’effet d’une perturbation
des équations sur la solution d’un système linéaire de 2 équations. Nous menons
cette étude de trois manières différentes. Nous recherchons dans un premier temps
l’ensemble des solutions approchées associées à un résidu de norme euclidienne donnée.
Dans un second temps, nous observons l’effet d’une perturbation du second membre
sur la solution exacte du système d’équations linéaires. Nous observons enfin l’effet
d’une perturbation de la matrice sur la solution exacte. Pour conclure cette section,
nous présentons les cas extrêmes de conditionnement d’une matrice.
Considérons un système non singulier de deux équations linéaires à deux inconnues.
L’ensemble des solutions de chacune des deux équations séparées forme deux droites
dans le plan et la solution du système d’équations est à l’intersection de ces deux
droites, comme nous l’avons vu dans la figure 7.2, page 134. La figure 7.3 présente
deux situations caractéristiques en deux dimensions. On a représenté en trait plein les
solutions des équations exactes. Lorsque le système est bien conditionné (à gauche),
les deux droites sont presque orthogonales, ce qui favorise un bon conditionnement.
Au contraire, lorsque le système est mal conditionné (à droite), les deux droites sont
quasiment parallèles, ce qui favorise un mauvais conditionnement.
Premièrement, recherchons l’ensemble des solutions approchées du système d’équa-
tions linéaires Ax = b au sens de l’erreur forward. Pour cela, considérons le résidu
que nous avons introduit dans la définition 7.11. Si le point x est une solution exacte
du système d’équations linéaires, alors le résidu est nul. Si le point est une solution
approchée, alors le résidu est non nul et possède une norme non nulle. Nous allons
rechercher l’ensemble des points associés à un résidu de norme euclidienne donnée.
Supposons que A ∈ Rn×n est une matrice carrée inversible et b ∈ Rn un vecteur.
Nous considérons la norme vectorielle euclidienne k · k2 . Pour un réel  donné, nous
notons F l’ensemble des solutions approchées x̃ dont l’erreur forward est inférieure
158 Chapitre 7 • Systèmes d’équations linéaires

ou égale à  :
F = {x̃ ∈ Rn | kAx̃ − bk 2 ≤ }.
Puisque Ax = b, les points dans cet ensemble doivent satisfaire l’inégalité :

kAx̃ − Axk2 = kA(x̃ − x)k2 ≤ .

Soit δ = x̃ − x. L’inégalité précédente est équivalente à kAδ k 2 ≤ . Soit z = Aδ.


L’ensemble des vecteurs z ∈ R2 tels que kzk2 ≤  est le cercle de centre l’origine et
de rayon  que l’on note C(0, ). Puisque A est, par hypothèse, inversible, l’équation
δ = A −1z implique que l’ensemble des vecteurs δ recherché est l’image par l’inverse
de A de ce cercle c’est-à-dire δ ∈ A−1 (C (0, )). L’équation x̃ = x + δ implique :

x̃ ∈ F  = x + A −1 (C (0, )) .

Dans l’exemple suivant, nous considérons une matrice parfaitement bien condi-
tionnée.
Exemple 7.17 (Influence d’une perturbation de la matrice sur l’erreur forward).
Considérons la matrice :
 
1 −1
A= , κ ∞(A) = 2.
1 1

On observe que les deux colonnes de la matrice A sont orthogonales, cequi  implique
2
que le conditionnement est très bon. Considérons la solution exacte x = ainsi que
3
le second membre b = Ax. La partie gauche de la figure 7.423 présente la situation
géométrique associée à cette matrice. Le cercle vert représente l’ensemble F pour
 = 1. L’ensemble des points situés sur ce cercle est tel que le résidu associé est de
norme euclidienne inférieure ou égale à 1.
Dans l’exemple suivant, nous considérons une matrice moins bien conditionnée
que dans l’exemple précédent.
Exemple 7.18 (Influence d’une perturbation de la matrice sur l’erreur forward).
Considérons la matrice :
 
1 −1
A= , κ ∞ (A) = 13.33.
1 −0.7

Cette seconde matrice est moins bien conditionnée. La partie droite de la figure 7.4
présente la situation géométrique dans le cas de cette seconde matrice. On observe
que l’ensemble F est plus grand dans le cas où la matrice est mal conditionnée.
Deuxièmement, analysons l’effet d’une perturbation du second membre sur les
solutions exactes du système d’équations linéaires. La figure 7.5 présente l’effet d’une
perturbation du second membre b pour une matrice A inchangée. Dans cette figure,
on a représenté en trait pointillé des droites pour lesquelles on a légèrement changé
l’ordonnée à l’origine pour perturber le second membre b (mais sans changer la pente).
L’ensemble des droites perturbées se trouve donc entre les droites en pointillé. On a
23Script Python : SysLin/Scripts/Py3/[Link].
7.11 • Effet géométrique d’une perturbation 159

κ∞ = 2.00 κ ∞ = 13.33

5 5

x2

x2
0 0

−5 0 5 −5 0 5
x1 x1

Figure 7.4 – Ensemble F  des solutions approchées du système d’équation linéaire


au sens de l’erreur forward pour  = 1.

Bien conditionné Mal conditionné


x2 x2

δ2
δ2

δ1 x1 δ1 x1

Figure 7.5 – Solutions d’un système d’équation linéaire dont le second membre b
est perturbé.

représenté en gris la zone contenant l’intersection des deux zones : elle représente
l’ensemble des points d’intersection des droites perturbées. Lorsqu’on projette ces
ensembles sur les axes x1 et x2, on obtient les intervalles contenant toutes les valeurs
de x1 et x 2 possibles. La largeur de l’intervalle sur l’axe x1 (resp. x2 ) est notée δ1
(resp. δ2 ). On observe que la zone grise dans la figure de gauche (bien conditionnée)
est plus réduite que dans la figure de droite (mal conditionnée). En particulier, les
longueurs δ 1 et δ 2 sont beaucoup plus réduites à gauche qu’à droite.
Troisièmement, considérons l’ensemble des solutions exactes d’un système d’équa-
tions linéaires associé à une matrice perturbée. Il est plus délicat de représenter l’effet
d’une perturbation sur la matrice A, car celle-ci change la pente des droites : la zone
d’intersection est alors plus difficile à représenter. Pour cela, nous considérons l’expé-
rience suivante : nous générons une matrice de perturbation E de petite amplitude et
nous calculons le vecteur x solution du système d’équations linéaires associé à la ma-
trice perturbée A + E . Pour réaliser cette expérience, nous considérons une première
matrice bien conditionnée et une seconde matrice moins bien conditionnée.

Exemple 7.19 (Perturbation de la matrice). La première matrice est définie par :


 
1 −1
A= , κ∞ (A) = 2.
1 1
160 Chapitre 7 • Systèmes d’équations linéaires

On observe que les deux colonnes de la matrice A sont orthogonales, ce qui implique
que le conditionnement est très bon. On considère ensuite la seconde matrice :
 
1 −1
A= , κ ∞ (A) = 13.33.
1 −0.7

Cette seconde matrice est moins bien conditionnée. Pour chacune de ces deux matrices,
nous considérons la solution exacte :
 
2
x=
3

ainsi que le second membre b = Ax. Ainsi, la solution exacte est à chaque fois la
même. On considère la matrice de perturbation E ∈ R2×2 définie par :
 
e 11 e 12
E=
e 21 e 22

où e11 , e12, e21 , e22 ∈ R sont des nombres aléatoires de loi uniforme entre -0.1 et 0.1,
c’est-à-dire :
e11 , e12 , e21 , e 22 ∼ U (−0.1, 0.1).
En d’autre termes, on considère une matrice E contenant des perturbations aléatoires
d’amplitudes maximales égales à 0.1. Pour chaque réalisation de la matrice aléatoire
E, on calcule la solution x̃ du système perturbé :

(A + E )x̃ = b.

Nous générons un échantillon de taille 1000, ce qui mène à 1000 solutions perturbées x̃ :
la figure 7.624 présente le résultat. On observe que les solutions perturbées x̃ sont plus
dispersées dans la figure de droite, avec une tâche qui s’étend largement, tant sur l’axe
des abscisses que sur l’axe des ordonnées. La forme particulière de la zone contenant
les solutions perturbées est une conséquence de la perturbation choisie : en perturbant
la matrice A, nous perturbons les pentes des deux droites sans perturber l’ordonnée
à l’origine. C’est la raison pour laquelle la tâche est plus allongée vers le haut et la
droite.
Au lieu de perturber la matrice A, nous aurions pu perturber le second membre b
par un algorithme similaire. Dans ce cas, nous aurions obtenu une figure très similaire
à la figure 7.4, c’est-à-dire un nuage de points principalement contenu dans l’ellipsoïde
central.
Les expériences précédentes n’indiquent pas quels types de matrices sont bien ou
mal conditionnés. En fait, nous allons voir que certaines familles de matrices sont
particulièrement bien conditionnées. De plus, même une matrice mal conditionnée
peut mener à des résultats précis. En effet, c’est seulement lorsque la perturbation du
second membre ou de la matrice est très particulière que la pire perturbation, prédite
par le conditionnement de la matrice, est atteinte. De manière plus générale, les deux
situations extrêmes sont les suivantes.
— Le système est très bien conditionné lorsque la matrice A est une matrice ortho-
gonale. En particulier, nous montrons dans l’exercice 7.6 que le conditionnement
24Script Python : SysLin/Scripts/Py3/[Link].
7.12 • Application : calcul d’un réseau électronique 161

Perturb. de A, κ∞ = 2.00 Perturb. de A, κ∞ = 13.33

5 5
x2

x2
0 0

0 5 0 5
x1 x1

Figure 7.6 – Effet d’une perturbation aléatoire E sur la matrice A pour deux
matrices A bien puis mal conditionnée : un ensemble de 1000 solutions du système
d’équations perturbé (A + E )x̃ = b.

en norme 2 d’une matrice orthogonale est égal à 1. C’est le cas en particulier


pour la matrice identité (voir l’exercice 7.3). C’est également le cas pour une
matrice de permutation, puisqu’une telle matrice est orthogonale (voir l’exer-
cice 6.12). En deux dimensions, cela revient à dire que les deux droites sont
perpendiculaires.
— Le système est mal conditionné lorsque certaines colonnes de la matrice sont
presque linéairement dépendantes. En deux dimensions, cela correspond à deux
droites presque parallèles. Dans un contexte statistique, ce problème est nommé
la multicolinéarité.
Il arrive fréquemment qu’une matrice A mal conditionnée soit pourtant associée
à une précision acceptable dans la solution x. En effet, les situations pratiques dans
lesquelles un mauvais conditionnement mène à un calcul désastreux sont, tout compte
fait, relativement rares. Plus de détails sur ce thème sont présentés dans la remarque
7.6 page 164.

7.12 Application : calcul d’un réseau électronique


Dans cette section, nous présentons un réseau électronique formé d’une source de
courant et de plusieurs résistances. Nous montrons que les courants circulant dans les 3
boucles du réseau sont solutions d’un système d’équations linéaires que nous résolvons
avec la méthode du pivot de Gauss avec permutation des lignes. On considère le réseau
de résistances présenté dans la figure 7.7, dans lequel vs est la tension d’alimentation
constante et R est la résistance (en Ohms).
La loi de Kirchhoff appliquée au réseau de résistances implique :

2Ri1 + R(i 1 − i2 ) = vs , (boucle i1 ),


2Ri 2 + R(i2 − i1 ) + R(i 2 − i3 ) = 0, (boucle i2 ),
3Ri3 + R(i 3 − i2 ) = 0, (boucle i3 ).
162 Chapitre 7 • Systèmes d’équations linéaires

R R R

Vs i1 R i2 R i3 R

R R R
Figure 7.7 – Un réseau de résistances.

Cela mène au système d’équations Ai = b où :


     
3R −R 0 i1 vs

A = −R 4 R − R ,  i = i 2 ,
 b = 0.

0 −R 4R i3 0

On considère les paramètres R = 1Ω et vs = 10V . Le script suivant 25 permet de


définir les données du problème.
1 import numpy as np
2

3 R = 1.0
4 vs = 10.0
5 A = np . array ([[3.0 * R , -R , 0.0] ,
6 [-R , 4.0 * R , -R] ,
7 [0.0 , -R , 4.0 * R ]])
8 b = np . array ([ vs , 0.0 , 0.0])

Le script suivant permet de le résoudre.


1 from linalg import lu _decomposit ion , forwa rd_elim ination ,
bac kwa rd_ sub sti tut ion
2

3 L , U , p = lu_ dec ompo sit ion (A )


4 c = b[ p]
5 y = for war d_e lim ina tio n (L , c )
6 i = ba ckw ard _su bst itu tio n (U , y )

On obtient la solution i suivante :


1 [[3.659]
2 [0.9756]
3 [0.243 9]]

avec 4 chiffres significatifs.


Le conditionnement en norme infinie est égal à κ∞ = 2.387, ce qui implique
que l’on peut perdre au plus log10 (κ∞) = 0.3779 chiffres significatifs à cause du
conditionnement dans ce cas particulier. Cela implique que ce problème est plutôt
bien conditionné. Puisque nous utilisons un système flottant de type IEEE 754 avec
64 bits, nous disposons d’environ 16 chiffres significatifs au maximum : la solution
possède donc à peine moins de 16 chiffres significatifs corrects.
25Script Python : SysLin/Scripts/Py3/[Link].
7.13 • Conclusion 163

7.13 Conclusion
Pour aller plus loin sur ce thème, on peut approfondir les techniques pour résoudre
Ax = b, par exemple la méthode du pivot de Gauss avec permutation des lignes et des
colonnes. Lorsque la matrice a des propriétés particulières (par exemple, lorsqu’elle
est symétrique), d’autres méthodes numériques existent notamment la factorisation
de Cholesky. On peut également élargir le problème aux matrices creuses. Enfin, on
peut utiliser des méthodes itératives pour résoudre ces systèmes d’équation linéaires.
Ces méthodes ne seront pas traitées dans le cadre de ce cours. Plus de détails sur ces
sujets sont présentés dans [55, 119].
Beaucoup d’autres applications de la résolution de systèmes d’équations linéaires
peuvent être trouvées dans l’ingénierie. Parmi celles-ci, on peut citer le calcul des
forces statiques dans une structure en treillis, le calcul des débits hydrauliques dans un
réseau ou encore l’approximation de la solution d’une équation aux dérivées partielles
par la méthode des éléments finis. Certaines de ces applications sont traitées dans le
contexte de Python dans le chapitre 2 de [81].

7.14 Notes et références


La référence utilisée principalement pour cette section est [104]. Un exemple par-
ticulièrement intéressant est donné dans le chapitre 2 « Linear equations », section
2.3 « A 3-by-3 example ». Parmi les références bibliographiques sur ce thème, on peut
citer [55] chapitre 3 page 105. Plus de détails sur l’histoire de l’élimination de Gauss
sont donnés dans [57]. Le module linalg de SciPy est présenté dans [25].
La notation γn introduite dans la définition 7.13 est utilisée par Nicholas J. Higham
dans [70]. La définition de γn est donnée en particulier dans le chapitre 3 « Basics »
section 3.1 « Inner and outer products » Lemme 3.1 page 63. Le théorème 7.6 est pré-
senté par Higham dans le chapitre 9 « LU factorization and linear equations » section
9.3 « Error analysis » théorème 9.5 page 165. D’après [70] page 185, le théorème est
dû à J.H. Wilkinson [153].
Plus de détails sur le rôle du facteur de croissance ρn sont présentés dans [70],
chapitre 9 « LU factorization and linear equations », section « 9.4. The growth factor »
page 166. On peut également consulter [131], chapitre 3 « Gaussian elimination »
section « On scaling and growth factors » page 235 ainsi que [136] « Lecture 22 :
Stability of gaussian elimination » section « Growth factors » page 164.
L’exemple 7.8 est une variante d’un exemple présenté dans [46], p.31. Les exemples
7.13 et 7.14 page 149 sont classiques dans l’analyse de l’algorithme du pivot de Gauss.
L’exemple 7.13 est cité par exemple dans [136], chapitre « Gaussian elimination »,
page 152. L’exemple 7.14 est cité par exemple dans [115], chapitre 3 « Direct methods
for the solution of linear systems » pages 88 et 107. La borne d’erreur donnée dans
l’exercice 7.2 est présentée dans [131], dans la section « 3.1 Normwise bounds ». En
particulier, l’inégalité 7.31 est présentée dans l’équation 3.7 page 211.
La table 7.1 présente les fonctions du module [Link] développé pour ce livre.

7.15 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
164 Chapitre 7 • Systèmes d’équations linéaires

backward_substitution Résout un système triangulaire supérieur


forward_elimination Résout un système triangulaire inférieur
lu_decomposition Décomposition P A = LU
lu_no_pivoting Décomposition A = LU

Table 7.1 – Fonctions du module [Link].

présente cette classification.

Exercice 7.1 (Sensibilité par rapport à b) On considère les hypothèses du théorème 7.3
page 136.
1. Montrer l’inégalité 7.5.
2. Montrer que, pour toute matrice A, il existe des vecteurs x, b et ∆b tels que :
k∆xk k∆bk
= κ(A) (7.22)
kxk kbk
Indication. Pour cette question difficile, utiliser l’exercice 6.9.

Remarque 7.5 (Impact du conditionnement sur la sensibilité par rapport à b). En d’autres
termes, l’exercice précédent montre que la sensibilité de la solution x par rapport à une
perturbation dans b dépend du conditionnement κ(A). De plus, l’inégalité 7.5 est optimale,
dans le sens où, pour toute matrice A, il existe un second membre b et une perturbation ∆b
tels que la solution x possède une perturbation ∆x maximale. On peut voir, comme nous
l’avons fait, l’égalité 7.5 comme la sensibilité de la solution x par rapport à une perturbation
dans b. On peut également le voir comme la sensibilité du produit matrice-vecteur b par
rapport à une perturbation dans x :
k∆bk k∆xk
≤ κ(A)
kbk kxk

puisque κ(A −1 ) = κ(A).


Remarque 7.6 (Rareté de l’impact d’un mauvais conditionnement). La seconde question
de l’exercice montre que le vecteur b qui permet d’atteindre la borne maximale est très
particulier, puisque c’est l’unique vecteur maximisant la norme matricielle induite de A. De
plus, la perturbation ∆b est, de même, déterminée en fonction de A −1 . En conséquence,
les situations dans lesquelles le mauvais conditionnement de la matrice a un impact sur la
solution x sont, tout compte fait, relativement rares. Dans le cas particulier d’une matrice
de différences finies à pas constant en dimension 1, la matrice est mal conditionnée, mais la
solution du système d’équations linéaires est précise, comme le montre [3], chapitre 5, page
85, section « Conditioning of a finite difference matrix ».

Remarque 7.7 (Calcul de la pire perturbation dans le second membre). La démonstration de


l’exercice 7.1 suggère un procédé de calcul de la pire perturbation dans le second membre.
Plus précisément, on fait l’hypothèse que la matrice A est donnée. On recherche un moyen
constructif de calculer les vecteurs x, b et ∆b. Pour cela, on considère les étapes suivantes :
1. calculer un vecteur x non nul tel que kAxk = kAkkxk ;
2. calculer le vecteur b = Ax ;
3. calculer un vecteur y non nul tel que kA−1yk = kA −1 kkyk ;
4. calculer le vecteur ∆b = y ;
5. calculer le vecteur ∆x solution de l’équation A∆b = ∆x .
7.15 • Exercices 165

À l’issue de ces quatre calculs, l’égalité 7.22 est vérifiée. Les étapes 2 et 4 ne posent pas de
difficulté : ce sont les étapes 1 et 3 qui sont délicates. La solution de ce problème dépend
de la norme vectorielle choisie. Pour les normes 1 et infinie, la solution est donnée dans
l’exercice 6.10 pour la norme 1 et l’exercice 6.11 pour la norme infinie. Pour la norme 1, la
méthode pour calculer le vecteur x non nul tel que kAxk1 = kAk1kxk 1 est la suivante. Pour
une matrice A donnée, soit `(A) l’indice de la colonne de A telle que :

X
m X
m

max |aij | = |ai`(A)|.


j =1,...,n
i=1 i=1

Alors le vecteur x = e`(A) possède la propriété requise. Lors de l’étape 3, pour calculer y
non nul tel que kA−1 yk1 = kA−1k1 kyk1, il suffit de considérer le vecteur y = e`(A −1 ) .
Pour la norme infinie, la méthode pour calculer le vecteur x non nul tel que kAxk∞ =
kAk∞kxk∞ est la suivante. Pour une matrice A donnée, soit `(A) l’indice de la ligne de A
telle que :

X
n X
n

max |aij | = |a`(A)j |. (7.28)


i=1,...,m
j=1 j=1

Le vecteur x dont les composantes sont :



0 si akj = 0
xj = 1 si akj > 0

−1 si akj < 0

possède la propriété requise. Lors de l’étape 3, pour calculer y non nul tel que kA−1yk∞ =
kA−1 k∞ kyk∞ il suffit de considérer le vecteur y = e`(A−1 ). La fonction Python suivante
implémente le calcul de la pire perturbation du second membre en norme 1. Elle repose sur
la fonction vectorMaxNorm1 26 présentée dans la section 6.6, page 111.
1 import numpy as np
2

3 def w ors tCas eRH SNo rm1 (A ):


4 x = vecto rMa xNor m1 (A)
5 b = np . dot (A , x )
6 invA = np . linalg . inv (A )
7 deltaB = ve ctor MaxN orm 1 ( invA )
8 deltaX = np . linalg . solve (A , deltaB )
9 return (x , deltaX , b , deltaB )
La fonction Python suivante implémente le calcul de la pire perturbation du second membre
en norme infinie.
1 import numpy as np
2

3 def w ors tCa seR HSNo rmI NF (A ):


4 x = vect orM axNo rmI nf (A)
5 b = np . dot (A , x )
6 invA = np . linalg . inv (A )
7 deltaB = vecto rMax Nor mInf ( invA )
8 deltaX = np . linalg . solve (A , deltaB )
9 return (x , deltaX , b , deltaB )
26 Script Python : SysLin/Scripts/Py3/[Link].
166 Chapitre 7 • Systèmes d’équations linéaires

Matrice de Hilbert
1017

Conditionnement
1
2
1011

105

5 10
Taille de la matrice

Figure 7.8 – Conditionnement de la matrice de Hilbert.

Considérons par exemple la matrice de Hilbert de taille n-par-n, définie par :

1
aij =
i+j −1

pour i, j = 1, ..., n. Cette matrice apparaît lorsque l’on cherche à créer une approximation
d’une fonction f (x) donnée sur l’intervalle [0, 1]. Dans ce cas, on considère un problème
de moindres carrés linéaires associé à la base polynomiale canonique. Plus précisément, on
considère le polynôme P :

P (x) = βnxn−1 + ... + β2 x + β1

pour x ∈ [0, 1]. On recherche les coefficients β1 , ..., βn tels que l’intégrale suivante est mini-
misée : Z 1
(f (x) − P (x))2 dx.
0

Dans ce cas, les équations normales mènent au second membre et à la matrice suivants :
Z 1 Z 1
i
bi = f (x)x dx, a ij = x i+jdx
0 0

pour i, j = 1, ..., n. La figure 7.827 présente l’évolution du conditionnement de la matrice de


Hilbert de taille n pour n entre 1 et 14. On observe que les trois conditionnements en norme
1, 2 et infinie sont très proches et que le conditionnement de la matrice de Hilbert augmente
très rapidement. Par exemple, la matrice de Hilbert de taille 6 possède un conditionnement
en norme 1 égal à 2.907 × 10 7. Considérons alors la matrice de Hilbert de taille 6 :
 
1 1
2
1
3
1
4
1
5
1
6
 12 1 1 1 1 1 
1 3
1
4
1
5
1
6
1
7
1 
 
A =  31 4
1
5
1
6
1
7
1
8
1 .
4 5 6 7 8 9 
1 1 1 1 1 1 
5 6 7 8 9 10
1 1 1 1 1 1
6 7 8 9 10 11

Le script suivant permet d’obtenir la perturbation optimale pour la norme 1.


27Script Python : SysLin/Scripts/Py3/[Link].
7.15 • Exercices 167

1 import scipy
2

3 A = scipy . linalg . hilbert (6)


4 x , deltaX , b , deltaB = wo rstC ase RHS Norm 1 (A)
T
Pmle vecteur x = (1, 0, 0, 0, 0, 0) . En effet, l’indice de la colonne qui
On obtient dans ce cas
maximise la somme i=1 |a i`(A)| est `(A) = 1. On en déduit le vecteur :
 T
1 1 1 1 1
b = 1, , , , , .
2 3 4 5 6
Cela mène à la perturbation sur le second membre ∆b = (0, 0, 0, 0, 1, 0)T . La perturbation
sur la solution est :

∆x = 7.56 × 103, −2.205 × 105 , 1.512 × 10 6,
T
−3.969 × 10 6 , 4.410 × 106 , −1.746 × 106 .
On observe que, bien que la perturbation sur le second membre soit de norme relativement
faible puisque k∆bk1 = 1, la norme de la perturbation ∆x est égale à k∆xk 1 = 1.187 × 107 .
Cela mène aux ratios :
k∆xk1 k∆bk1
= 1.187 × 10 7 , = 4.082 × 10−1 .
kxk1 kbk1
Or le conditionnement en norme 1 est égal à κ 1(A) = 2.907 × 107 . On vérifie donc que la
borne supérieure de l’inégalité est atteinte, puisque :
1.187 × 107 /4.082 × 10−1 = 2.907 × 10 7.
Le script suivant permet d’obtenir la perturbation optimale pour la norme 1.
1 x , deltaX , b , deltaB = wo rst Cas eRH SNor mIN F (A)
cas le vecteur x = (1, 1, 1, 1, 1, 1)T . En effet, l’indice de la ligne qui
On obtient dans ce P
n
maximise la somme j=1 |a`(A)j | est `(A) = 1. On en déduit le vecteur :

b = (2.45, 1.593, 1.218, 0.9956, 0.8456, 0.7365)T .


Cela mène à la perturbation sur le second membre : ∆b = (1, −1, 1, −1, 1, −1)T . La pertur-
bation sur la solution est :

∆x = 2.192 × 10 4, −6.189 × 105, 4.161 × 106 ,
T
−1.078 × 10 7 , 1.187 × 107 , −4.665 × 106 .
Cela mène aux ratios :
k∆xk∞ k∆bk∞
= 1.187 × 10 7 , = 4.082 × 10 −1 .
kxk ∞ kbk∞
Le conditionnement en norme infinie est égal à κ∞ (A) = 2.907 × 107 : c’est le même que le
conditionnement en norme 1, puisque la matrice est symétrique. On vérifie donc une nouvelle
fois que la borne supérieure de l’inégalité est atteinte.

* Exercice 7.2 (Sensibilité par rapport à A) Soient A ∈ Rn×n une matrice non singulière,
b ∈ Rn et un vecteur x ∈ Rn tels que :
Ax = b. (7.29)
Soient ∆x un vecteur dans Rn et ∆A une matrice dans R n×n tels que :
(A + ∆A)(x + ∆x) = b. (7.30)
168 Chapitre 7 • Systèmes d’équations linéaires

1. Montrer que :
k∆xk k∆Ak
≤ κ(A) (7.31)
kx̃k kAk

où κ(A) = kAkkA−1 k et x̃ = x + ∆x.


2. Montrer que, pour toute matrice A, il existe une matrice ∆A et un vecteur b tels que :
k∆xk k∆Ak
= κ(A) . (7.32)
kx̃k kAk

Puisque la matrice A est, par hypothèse, non singulière, elle est par conséquent non
nulle. Par définition de la norme matricielle, cela implique que kAk 6= 0, de telle sorte que le
dénominateur dans le second membre de l’égalité 7.32 ne pose pas de difficulté.
Remarque 7.8 (Impact du conditionnement sur la sensibilité par rapport à A). Bien sûr,
l’exercice précédent fait intervenir le terme k∆xk/kx̃k, alors que, en toute rigueur, l’erreur
relative sur x ferait plutôt intervenir l’expression k∆xk/kxk. L’exercice 7.15 montre que, si
k∆xk/kx̃k < 1 alors les deux erreurs relatives ne sont pas très éloignées.

Exercice 7.3
1. (Conditionnement de la matrice identité) Montrer que κ(I n) = 1.
2. (Conditionnement d’une matrice) Soit A ∈ Rn×n une matrice carrée inversible. Mon-
trer que κ(A) ≥ 1.
3. (Conditionnement du produit) Soit A, B ∈ Rn×n deux matrices carrées inversibles.
Montrer que κ(AB ) ≤ κ(A)κ(B).
4. (Conditionnement de la matrice diagonale) Soit D ∈ Rn×n une matrice diagonale
inversible. Montrer que κ1 (D ) = κ∞ (D ) = |d 1 |/|dn | où |d1 | ≥ |d 2 | ≥ ... ≥ |dn | > 0
sont les termes diagonaux triés par ordre décroissant.
Remarque 7.9. L’exercice précédent montre que le conditionnement du produit de deux
matrices est inférieur ou égal au produit des conditionnements. On peut le mettre en lien
avec la composition de deux fonctions scalaires, que nous avons étudié dans l’exercice 5.21
page 96.

Exercice 7.4   
1 3
1. On considère les vecteurs a1 = et a2 = . Montrer que les vecteurs a1 et a2
2 4
sont linéairement indépendants.
  
1 −2
2. On considère les vecteurs a1 = et a2 = . Montrer que les vecteurs a1 et
2 −4
a2 sont linéairement dépendants.

Définition 7.15 (Matrice orthogonale). Soit Q ∈ Rn×n une matrice. On dit que Q est
orthogonale si :

Q T Q = In. (7.38)

Remarque 7.10 (Matrice orthogonale). On observe, d’une part, que les colonnes de la matrice
Q sont orthogonales, c’est-à-dire que les produits scalaires de deux colonnes différentes de
Q sont nuls. Cela implique que les termes extra-diagonaux de QT Q sont nuls. On observe,
d’autre part, que la norme euclidienne d’une colonne de la matrice Q est égale à 1. On appelle
une telle matrice « orthogonale », mais le terme « orthonormal » serait plus approprié.
7.15 • Exercices 169

** Exercice 7.5 Les questions suivantes portent sur les propriétés des matrices orthogo-
nales.
1. (Orthogonalité et indépendance) Soient a1 , a2 , ..., a n ∈ R m des vecteurs orthogonaux
non nuls. Montrer que les vecteurs sont linéairement indépendants.
2. (Orthogonalité des colonnes d’une matrice orthogonale) Soit Q ∈ Rn×n une matrice
orthogonale. Soient q1 , q 2 , ..., qn les colonnes de Q. Montrer que les colonnes de Q sont
orthogonales, c’est-à-dire montrer que, pour i, j = 1, ..., n, on a hqi , q ji = 0 si i 6= j.
De plus, montrer que leur norme 2 est égale à 1, c’est-à-dire montrer que kqi k 2 = 1
pour i = 1, ..., n.
3. (Inversibilité des matrices orthogonales) Soit Q ∈ Rn×n une matrice orthogonale.
Montrer que Q est inversible.
4. (Inverse d’une matrice orthogonale) Soit Q ∈ Rn×n une matrice orthogonale. Montrer
que :

Q−1 = QT . (7.39)

Indication. Utiliser l’exercice 6.16 page 125. En déduire que :

QQ T = I n . (7.40)

** Exercice 7.6 (Propriétés d’une matrice orthogonale)


1. Soit Q ∈ R n×n une matrice orthogonale. Montrer que, pour tout vecteur x ∈ Rn , on a
kQxk2 = kxk 2, où k · k2 est la norme euclidienne (norme 2). En d’autres termes, une
matrice orthogonale conserve la norme euclidienne. Indication. On montrera que :

hQx, Qxi = hx, xi. (7.42)

2. Soit Q ∈ Rn×n une matrice orthogonale. Montrer que, pour tous vecteurs x, y ∈ Rn ,
on a :

hQx, Qyi = hx, yi. (7.43)

3. Soit Q ∈ R n×n une matrice orthogonale. Montrer que, pour la norme matricielle
induite de la norme euclidienne, on a kQk2 = 1.
4. Soit Q ∈ R n×n une matrice orthogonale. Montrer que Q−1 est orthogonale.
5. Soit Q ∈ Rn×n une matrice orthogonale. Montrer que κ2(Q) = 1 où κ 2 (Q) =
kQk2kQ−1 k2.
6. Pour toute matrice Q ∈ Rn×n , montrer que les égalités 7.42 et 7.43 sont équivalentes,
pour tous vecteurs x, y ∈ Rn . En d’autres termes, montrer l’équivalence entre les
deux propriétés sans utiliser l’hypothèse d’orthogonalité. Indication. Évaluer hQ(x +
y), Q(x + y)i.

** Exercice 7.7 (Propriétés d’une matrice orthogonale (2))


1. Soit A ∈ R n une matrice telle que :

kAxk2 = kxk 2. (7.44)

Montrer que A est orthogonale. Indication. Soient a1 , ..., an les colonnes de A. Montrer
qu’elles sont orthogonales et que leur norme est égale à 1, puis conclure.
2. Soient A, B ∈ Rn×n deux matrices orthogonales. Montrer que la matrice AB est
orthogonale.
170 Chapitre 7 • Systèmes d’équations linéaires

La question 1. montre que les égalités 7.38 et 7.44 sont équivalentes : elles peuvent toutes
les deux servir à définir une matrice orthogonale.
Le but des exercices 7.8 et 7.9 est de mieux maîtriser les matrices de transformation de
Gauss qui sont utilisées dans l’exercice 7.11. Dans l’exercice suivant, nous utilisons le produit
tensoriel, introduit dans la définition 6.21 page 115.

Exercice 7.8 (Produit tensoriel) Soient u, v ∈ Rn et soient e1 , . . . , en les vecteurs de la


base canonique en dimension n.
1. Calculer les composantes de la matrice uv T .
2. Calculer ue T1 .
3. Calculer ue Tk pour k = 1, . . . , n.

* Exercice 7.9 (Matrice de transformation de Gauss) Cet exercice porte sur la définition
7.10 définissant la matrice de transformation de Gauss.
1. Écrire les composantes de la matrice de transformation de Gauss M k.
2. Soit C ∈ R n×n . Montrer que :
MkC = C − t (k) Ck,• (7.45)

où C k,• est la k-ième ligne de la matrice C .


3. Montrer que l’inverse de Mk est M −1k = I+ t
(k) T
e k , c’est-à-dire qu’il suffit de prendre
les multiplicateurs (au lieu de leur opposé) pour inverser la matrice.

* Exercice 7.10 (Pivot de Gauss et annulation des termes sous la diagonale) Soit k =
1, ..., n l’indice de l’étape du pivot de Gauss. On fait l’hypothèse que le pivot de Gauss n’est
(k)
pas nul, c’est-à-dire on suppose que a kk 6= 0. Montrer que lors de la k -ième étape du pivot de
Gauss, la définition des multiplicateurs permet d’introduire des zéros dans la k -ième colonne
de la matrice A. En d’autres termes, montrer que, pour tout i = k + 1, ..., n et j = k, on a
(k+1)
a ik = 0.

** Exercice 7.11 (Factorisation PA=LU) Soit A ∈ R n×n . On considère l’algorithme du


pivot de Gauss avec permutation des lignes. L’algorithme génère les matrices M k et P k de
telle sorte que :

U = Mn−1 Pn−1 . . . M 1 P1 A (7.47)

où U est une matrice triangulaire supérieure, les matrices P k sont des matrices de permu-
tation et les matrices Mk sont des matrices de transformation de Gauss. L’objectif de cet
exercice est de montrer qu’il existe des matrices L k telles que :

LU = P A (7.48)

où :
L = L 1 L2 · · · L n−1 (7.49)

et :

P = P n−1 · · · P 2P1 . (7.50)

1. Montrer que si Pk est la matrice de permutation des lignes impliquée dans la k -ième
étape de l’algorithme, alors :
Pk Pk = I (7.51)
pour k = 1, . . . , n − 1.
7.15 • Exercices 171

2. Considérer le cas n = 4 et démontrer l’égalité 7.48.


3. Soit :

Mk0 = Pn−1 . . . P k+1 Mk P k+1 . . . Pn−1 (7.52)

pour k = 1, . . . , n − 1. Soit :

L k = (M0k) −1 (7.53)

pour k = 1, . . . , n − 1. Démontrer l’égalité 7.48 dans le cas général, c’est-à-dire pour


toute valeur de n.
4. Montrer que :
 
Lk = Pn−1 . . . Pk+1 I + t(k) e Tk Pk+1 . . . P n−1 (7.54)

pour k = 1, ..., n − 1.
5. Montrer que :
 
Pk+1 I + t (k) e Tk Pk+1 = I + P k+1 t(k) eTk (7.55)

pour k = 1, ..., n − 1.
6. En déduire que :

Lk = I + P n−1 · · · Pk+1 t(k) eTk (7.56)

pour k = 1, ..., n − 1.
7. En déduire que les matrices Lk sont triangulaires inférieures.

Remarque 7.11. L’égalité 7.54 montre que pour obtenir les matrices Lk en fonction des
matrices M k, il suffit de changer le signe des multiplicateurs et de réaliser les permutations
de lignes associées aux matrices Pk+1 à P n−1.

Théorème 7.8 (J.H. Wilkinson). Soit A ∈ Rn×n une matrice et b ∈ R n. On suppose que
l’algorithme du pivot de Gauss produit des facteurs L̂ et Û, ainsi qu’une approximation x̃ de
l’équation Ax = b. Alors :

(A + ∆A)x̃ = b (7.60)

où la matrice de perturbation ∆A est telle que :

|∆A| ≤ γ 3n |L̂||Û |. (7.61)

Dans l’inégalité précédente, la valeur absolue d’une matrice est égale à une matrice dont
chaque composante est égale à la valeur absolue. On ne démontrera pas le théorème précédent
dans ce livre. En effet, la démonstration s’appuie sur l’analyse des erreurs d’arrondis dans
les différentes opérations arithmétiques de l’algorithme du pivot de Gauss28 .
Remarque 7.12 (Analyse de l’erreur de la décomposition LU). L’inégalité 7.61 montre l’in-
térêt d’utiliser l’algorithme du pivot de Gauss avec permutation des lignes, plutôt que sans
permutation. En effet, sans permutation, les termes dans la matrice L̂Û ne sont pas bornés.
Cela implique que, sans permutation, le ratio k|L̂||
kAk
Û|k
peut être arbitrairement grand. Par
exemple, considérons la matrice :  
 1
A() =
1 1
28 Voir [70] page 164.
172 Chapitre 7 • Systèmes d’équations linéaires

où  ∈ R. Lorsque  → 0, la matrice A() converge vers la matrice :


 
0 1
lim A() =
→0 1 1

qui est inversible. On peut démontrer que, lorsque  → 0, le ratio k|kA L̂||Û|k
()k
est de l’ordre
de . En d’autres termes, sans permutation, le facteur de croissance ρ n n’est pas borné. En
revanche, avec permutation des lignes, on peut démontrer que :

ρn ≤ 2 n−1 . (7.62)

C’est une conséquence du fait que |` ij | ≤ 1 pour i ≥ j grâce à la permutation des lignes29 .

** Exercice 7.12 (Analyse de l’erreur de la décomposition LU) En utilisant le théorème


7.8 page 171, démontrer le théorème 7.6 page 154.
Remarque 7.13 (Analyse de l’erreur de la décomposition LU). Comme N.J. Higham le sou-
ligne dans [70], page 165, la démonstration suivante n’est valide que pour les matrices L et
U exactes, alors qu’il aurait fallu utiliser les matrices L̂ et Û calculées par l’algorithme du
pivot de Gauss avec des nombres à virgule flottante. D’après N.J. Higham, cette faille est
sans conséquence par rapport aux objectifs poursuivis.

* Exercice 7.13 (Borne supérieure du facteur de croissance) On considère l’algorithme


du pivot de Gauss avec permutation des lignes. Montrer que ρ n ≤ 2n−1.

** Exercice 7.14 (Rôle du facteur de croissance) On considère le système d’équations


linéaires Ax = b où A ∈ R n×n et b ∈ R n. On suppose que A est inversible. On suppose que
x̃ est calculé par la méthode du pivot de Gauss avec permutation des lignes. On note u la
précision machine et ρn le facteur de croissance. L’objectif de cet exercice est de démontrer
le théorème 7.7.
1. Utiliser le théorème 7.6 et montrer que l’égalité 7.20 page 154 est vérifiée. Indication.
On montrera que :
kb − Ax̃k ∞ ≤ n 2γ3n ρn kAk ∞k x̃k∞ .

2. Montrer que l’inégalité 7.21 page 154 est vérifiée.

Exercice 7.15 (Erreur relative) Soit x ∈ Rn la solution exacte et soit x̃ = x + ∆x une


solution approchée. On suppose que x et x̃ sont non nuls. Soit e = kkx̃k
∆xk
.
k∆xk
1. Montrer que si e < 1 alors kxk
≤ e
1−e
.
k∆xk k∆xk a
2. Supposons que k x̃k ≤ a où a est un réel. Montrer que si a < 1 alors kxk ≤ 1−a .
k∆Ak
3. Considérons les mêmes hypothèses que l’exercice 7.2. Supposons que γ = kAk
. Mon-
k∆xk γκ(A)
trer que si κ(A)γ < 1, alors kxk
≤ 1−γκ(A) .

Remarque 7.14 (Développement de Taylor). Si 0 < e ≤ 0.1 alors e


1−e
≤ 0.11. De plus :
e 2
= e + O (e ) quand e → 0.
1−e
29Voir [70] chapitre 9 « LU factorization and linear equations », section « 9.4. The growth factor »
p.166.
7.15 • Exercices 173

Cela montre que dans les résultats précédents, diviser par kxk ou bien par kx̃k ne change
finalement presque rien en pratique tant que l’erreur relative est inférieure à 0.1. Dans le cas
contraire, on voit que l’erreur relative est mauvaise, de telle sorte que x̃ est une mauvaise
approximation de x.

Exercice 7.16 (Conditionnement et précision) Soit A ∈ Rn×n une matrice inversible et


b ∈ Rn . On souhaite résoudre le système d’équations linéaires Ax = b où x ∈ R n. Supposons
que x̃ 6= 0 est l’approximation produite par l’algorithme du pivot de Gauss avec permutation
des lignes. Supposons que le conditionnement de la matrice est κ∞(A). Soit M la précision
machine.
1. Montrer que :
 
kx − x̃k∞
− log10 ≥ − log10 (3n 2 γnρ nκ∞ (A)M ). (7.66)
kx̃k ∞

2. Supposons que :
n 2γ 3nρ n κ ∞ (A)M < 1.
Supposons que le facteur de croissance est proche de 1, c’est-à-dire ρn ≈ 1. Sous ces
hypothèses, montrer que :
LRE10(x, x̃) & − log10 (3n 2γ n κ ∞ (A)M ) (7.67)
où :
 
kx − x̃k∞
LRE10(x, x̃) = − log 10 . (7.68)
kxk∞

Remarque 7.15 (Analyse approchée du nombre de chiffres significatifs dans la solution d’un
système d’équations linéaires). Le terme − log10 (M ) représente le nombre de chiffres si-
gnificatifs avec des nombres à virgule flottante. Pour des doubles (c’est-à-dire pour des
nombres à virgule flottante IEEE 754 sur 64 bits dont 53 bits pour la partie intégrale),
on a M = 2−52 ≈ 10 −16 , comme nous l’avons vu dans le chapitre 4, dans la définition 4.11,
page 61. Cela implique que le nombre de chiffres significatifs avec des nombres à virgule flot-
tante de type double c’est-à-dire − log10(M ) ≈ 16. L’équation 7.67 signifie que le nombre
maximal de chiffres perdus à cause du conditionnement est égal à log10 (κ ∞ (A)). Plus de
chiffres peuvent être perdus si n est grand ou si le facteur de croissance ρn est grand. En
pratique, nous n’avons pas nécessairement le contrôle de la taille n de la matrice A de telle
sorte que le premier facteur ne peut pas toujours être facilement réduit. En revanche, l’im-
portance du second facteur peut être limitée par la permutation des lignes dans l’algorithme
du pivot de Gauss. Toutefois, en général, la situation extrême dans laquelle la borne est
atteinte est plutôt rare. C’est pourquoi, à défaut de représenter exactement le nombre de
chiffres perdus, le terme log10(κ ∞(A)) a tout de même l’avantage de quantifier la difficulté
numérique du problème.

* Exercice 7.17 (Algorithme de remontée : exemple concret) On considère la matrice U


et le second membre b suivants :
! !
10 −7 0 7
U= 0 2.5 5 , b = 2.5 .
0 0 6.2 6.2
Résoudre le système d’équations Ux = b et démontrer que la solution x est :
!
0
x= −1 .
1
174 Chapitre 7 • Systèmes d’équations linéaires

Pour cela, vous ferez passer à chaque étape les termes précédemment calculés dans le second
membre.

* Exercice 7.18 (Algorithme de descente : exemple concret) On considère la matrice L et


le second membre b suivants :
! !
1.6 0. 0 3.2
L= 1 1.9 0 , b= 0.1 .
1 −2 1.3 4

Résoudre le système d’équations Lx = b, et démontrer que la solution x est :


!
2
x= −1 .
0

Pour cela, vous ferez passer à chaque étape les termes précédemment calculés dans le second
membre.
Introduisons l’algorithme de remontée dans le but de préparer l’exercice 7.19. On consi-
dère une matrice U ∈ R n×n triangulaire supérieure et b ∈ R n. Dans cet exercice, nous
analysons l’algorithme de remontée permettant de résoudre le système d’équations linéaires
Ux = b. La fonction Python suivante30 retourne la solution du système Ux = b, dans le cas
où U est de type matrix.

1 from numpy import zeros


2

3 def b ack war d_s ubs tit uti on (U , b) :


4 n = U. shape [0]
5 x = zeros (( n , 1) )
6 for k in range ( n - 1 , -1, -1):
7 x[k ] = b[ k] / U [k ,k ]
8 b [0: k ] = b [0: k] - U [0:k , k ] * x[ k]
9 return x

Le but de l’exercice est de comprendre le corps de la fonction backsubs.

* Exercice 7.19 (Algorithme de remontée) L’objectif de cet exercice est de comprendre


l’algorithme de remontée.
1. Résoudre le système d’équations linéaires :

 u1,1 x 1 + u 1,2 x2 + u1,3 x3 = b 1
u 2,2 x2 + u2,3 x3 = b 2

u3,3 x3 = b 3

en utilisant le même algorithme. Pour cela, vous définirez judicieusement les nouvelles
variables b01 , b02 et b001 , représentant le second membre modifié à chaque étape de l’al-
gorithme.
2. Dans le cas particulier d’une matrice triangulaire supérieure de taille n=3, pour chaque
étape de la fonction backsubs, écrire les instructions Python exécutées étape par étape.
Plus précisément, écrire les valeurs de k utilisées et les instructions Python à chaque
itération de la boucle for. La solution à cette question est un script Python d’une
douzaine de lignes.
30Script Python : Scripts-Eleves/Py3/[Link].
7.15 • Exercices 175

3. Dans cette question, on considère le cas général où U est une matrice triangulaire
supérieure et on tente d’analyser le script Python de la fonction backsubs. Soit k un
indice fixé dans l’ensemble 0, 1, ..., n - 1. Écrire une version non vectorisée de
l’instruction :
1 b [0: k] = b [0: k] - U [0:k , k ] * x[ k]
c’est-à-dire écrire la boucle for qui réalise le même calcul.

* Exercice 7.20 (Algorithme de descente) L’objectif de cet exercice est de comprendre


l’algorithme de descente pour résoudre le système d’équations linéaires Lx = b lorsque L
est une matrice triangulaire inférieure. La fonction suivante résout le système d’équations
linéaires Lx = b, où L est une matrice triangulaire inférieure.
1 from numpy import zeros
2

3 def f orw ard _el imin ati on (L , b) :


4 n = L. shape [0]
5 x = zeros ((n , 1) )
6 for k in range ( n) :
7 x[k ] = b[ k] / L [k , k]
8 b[k + 1 : n ] = b[ k + 1 : n] \
9 - L[ k + 1 : n , k ] * x[ k]
10 return x
Utiliser la même méthode que celle de l’exercice 7.19 pour comprendre cet algorithme.
1. Résoudre le système d’équations linéaires :

`1,1x1 = b1
`2,1x1 + ` 2,2 x2 = b2

`3,1x1 + ` 3,2 x2 + `3,3 x3 = b3
en utilisant le même algorithme. Pour cela, vous définirez judicieusement les nouvelles
variables b02 , b03 et b 003 , représentant le second membre modifié à chaque étape de l’al-
gorithme.
2. Dans le cas particulier d’une matrice triangulaire inférieure de taille n=3, pour chaque
étape de la fonction forward, écrire les instructions Python exécutées étape par étape.
Plus précisément, écrire les valeurs de k utilisées et les instructions Python à chaque
itération de la boucle for. La solution de cette question est un script Python d’une
douzaine de lignes.
3. Dans cette question, on considère le cas général où L est une matrice triangulaire
inférieure et on tente d’analyser le script Python de la fonction forward. Soit k un
indice fixé dans l’ensemble 0, 1, ..., n - 1. Écrire une version non vectorisée de
l’instruction :
1 b[ k + 1: n] = b [k + 1: n] - L[ k + 1:n , k ] * x[ k]
c’est-à-dire écrire la boucle for qui réalise le même calcul.

Exercice 7.21 (Maximum de l’inverse) Soit α ∈ R tel que α > 0 et soit β ∈ R un nombre
réel fini. Soit C un sous-ensemble fermé de Rn . Soit f une fonction continue de C dans R telle
que, pour tout x ∈ C , on a :
α ≤ f (x ) ≤ β. (7.70)
Soient λ = minx∈C f (x) et µ = maxx∈C 1
f(x)
.
176 Chapitre 7 • Systèmes d’équations linéaires

1. Montrer que µ ≤ 1
λ
.
1
2. Montrer que λ ≥ µ.

3. En déduire que λ = µ.
1

* Exercice 7.22 (Norme de l’inverse) Soit A ∈ Rn×n une matrice inversible. Soit k · k
une norme matricielle induite.
1. Montrer que :
 −1
1
min kAxk = max . (7.71)
kxk=1 kxk=1 kAxk

2. Montrer que :
1
kA−1 k = kAxk
. (7.72)
min kxk=1 kxk

Remarque 7.16 (Norme de l’inverse et conditionnement). L’exercice précédent implique que


le conditionnement de la matrice A est κ(A) = µλ où :

kAxk kAxk
λ = min et µ = max .
kxk=1 kxk kxk=1 kxk

En effet, on a kAk = µ par définition de la norme matricielle et kA −1 k = 1λ par l’équation


7.72. Le conditionnement peut donc être vu comme le rapport entre le plus grand facteur
d’amplification kAxk/kxk et le plus petit. Pour une matrice A inversible, on a λ > 0. Pour
une matrice singulière, on a λ = 0 ce qui mène à un conditionnement infini.
Chapitre 8

Interpolation

Étant donné une table de valeurs issue d’une fonction réelle et inconnue, l’interpo-
lation consiste à créer une fonction qui permette de reproduire les valeurs imposées.
Dans ce but, nous allons définir une fonction, nommée fonction interpolatrice ou in-
terpolateur, associée à des paramètres que nous allons déterminer. Ainsi, nous serons
capables d’évaluer l’interpolateur en des nouveaux points qui ne sont pas nécessaire-
ment présents dans la table. Le premier objectif de ce chapitre sur l’interpolation est
de présenter les principes de cette méthode, ainsi que ses limitations. De plus, nous
allons pratiquer ces méthodes sur des problèmes simples, mais riches d’enseignements.
Nous découvrirons dans la section 8.4 comment les méthodes étudiées dans le cha-
pitre 7 sur la résolution de systèmes d’équations linéaires peuvent être utilisées dans
le contexte de l’interpolation polynomiale pour calculer les coefficients du polynôme
interpolateur. Plus précisément, nous introduirons la matrice de Vandermonde, dont
nous analyserons le conditionnement en fonction de la répartition des nœuds d’inter-
polation. Enfin, l’interpolation polynomiale est à la base de plusieurs autres méthodes
numériques. Par exemple, les méthodes de différentiation que nous étudierons dans le
chapitre 9 sont (implicitement) fondées sur des méthodes d’interpolation, comme le
montre l’exercice 9.16. De même, nous utiliserons les méthodes d’interpolation pour
construire des méthodes d’intégration, ce que nous analyserons dans le chapitre 11.
Il y a une différence importante entre interpolation et ajustement de courbe. Lors-
qu’on utilise l’interpolation, on suppose que les données y sont exactes : on souhaite
que l’interpolation passe par les points de la table. Au contraire, lorsqu’on utilise un
ajustement de courbe, on suppose que les données y sont bruitées : on souhaite que
la courbe s’ajuste aux points de la table au mieux. Plus précisément, en ajustement
de courbe, on peut introduire un modèle probabiliste pour caractériser l’écart entre
le modèle et les observations ; en interpolation, ce n’est pas nécessaire. De plus, le
nombre d’observations doit être égal au nombre de paramètres du modèle lorsqu’on
utilise une méthode d’interpolation ; en ajustement de courbe, cette hypothèse n’est
pas nécessaire. La figure 8.11 présente la différence entre ajustement de courbe et
interpolation. Tandis que l’interpolation est le sujet du présent chapitre, nous ana-
lyserons les méthodes d’ajustement dans le chapitre 10, consacré aux méthodes de
moindres carrés linéaires.

1Script Python : Interp/Scripts/Py3/[Link].

177
178 Chapitre 8 • Interpolation

4
Interpolation
2 Ajustement

y
0
0 2 4
x

Figure 8.1 – Ajustement de courbe et interpolation.

1 1

0 0
y

y
−1 −1
0 2 4 6 0 2 4 6
x x

Figure 8.2 – À gauche, les points associés à des données à interpoler. À droite,
interpolation constante par morceaux.

Exemple 8.1 (Données de l’interpolation). La table suivante présente les valeurs


d’une fonction y = f (x) trigonométrique inconnue (et mystérieuse). Dans cette table,
on a y k = f (x k ) pour k = 1, ..., 7. En d’autres termes, cette table présente n = 7
valeurs de l’abscisse x k et les valeurs de la fonction yk correspondantes. La partie
gauche de la figure 8.22 présente le nuage de points associé aux données.
i 1 2 3 4 5 6 7
xk 0 1 2 3 4 5 6
yk 0 0.8415 0.9093 0.1411 -0.7568 -0.9589 -0.2794

On peut se demander comment estimer f (x) pour une valeur x qui n’est pas dans
la table (sans évaluer la fonction f ) . Les méthodes d’interpolation permettent de
répondre à cette question. La méthode d’interpolation la plus simple est l’interpolation
constante par morceaux. Étant donné x, le principe est de localiser le point x k le plus
proche, puis d’utiliser la valeur y k correspondante. La partie droite de la figure 8.23
présente ce type d’interpolation. Le problème de cette méthode est qu’elle est peu
précise. En particulier, le modèle est toujours discontinu (puisqu’il est continu par
morceaux), alors que la fonction f peut être continue.
L’interpolation linéaire par morceaux consiste à localiser les points xk et x k+1 qui
encadrent x. Puis, on utilise une valeur dépendant de y k et yk+1 (nous analyserons
le calcul détaillé par la suite). La partie gauche de la figure 8.3 4 présente ce type
2Script Python : Interp/Scripts/Py3/[Link].
3Script Python : Interp/Scripts/Py3/[Link].
4Script Python : Interp/Scripts/Py3/[Link].
179

1 1

0 0

y
−1 −1
0 2 4 6 0 2 4 6
x x

Figure 8.3 – À gauche, interpolation linéaire par morceaux. À droite, interpolation


polynomiale globale.

d’interpolation. Cette méthode est plus précise que la méthode constante par mor-
ceaux, mais il existe une méthode plus fine encore, fondée sur un polynôme unique
interpolateur les points sur l’intervalle [x1, x n]. La définition suivante présente ce type
d’interpolation.
Définition 8.1 (Polynôme interpolateur). Soient xk, y k ∈ R pour k = 1, 2, ..., n des
nombres réels tels que x 1 < x 2 < . . . < xn . On dit que les points x1 , ..., xn sont les
nœuds de l’interpolation. On considère le polynôme :

P (x) = c1x n−1 + c 2x n−2 + . . . + cn−1 x + cn (8.1)

pour tout réel x ∈ [x1, x n]. On dit que le polynôme est interpolateur si les coefficients
c1, . . . , c n sont tels que :

P (xk) = yk (8.2)

pour k = 1, . . . , n.
Dans la définition précédente, un point important est que les nœuds d’interpo-
lation doivent être deux à deux distincts. Ainsi, les équations 8.2 sont distinctes ce
qui mène à n équations potentiellement indépendantes pour identifier les coefficients
du polynôme. Rappelons qu’une puissance de la forme xp est un monôme. Un po-
lynôme est donc une combinaison linéaire de monômes. L’équation   8.1 exprime le
polynôme P en fonction des polynômes de la base canonique xk k≥0 . Dans la défi-
nition précédente, on observe que le polynôme interpolateur est de degré n − 1. De
plus, au contraire des approximations locales (par exemple constante par morceaux
ou linéaire par morceaux) ce polynôme est unique, défini sur tout l’intervalle [x 1, xn ].
Comme nous allons le voir par la suite, cette propriété a plusieurs conséquences, en
particulier sur la stabilité de l’interpolation. La partie droite de la figure 8.35 présente
ce type d’interpolation. Le polynôme présenté dans la figure est :

P (x) = − 0.0001523x6 − 0.003126x 5 + 0.07319x4 − 0.3577x3


+ 0.2255x2 + 0.9038x. (8.3)

Bien que les équations précédentes utilisent la base canonique des polynômes, la
remarque suivante montre que cela peut poser des difficultés.
5Script Python : Interp/Scripts/Py3/[Link].
180 Chapitre 8 • Interpolation

Remarque 8.1 (Pourquoi éviter d’utiliser la base canonique). En observant les coef-
ficients impliqués dans l’équation 8.3, on constate que ceux qui sont associés à des
degrés polynômiaux élevés sont plus proches de zéro en valeur absolue. Par exemple,
le coefficient devant x6 , égal à −0.0001523, est bien plus grand en valeur absolue que
celui devant x, égal à 0.9038. C’est une conséquence de deux choix, dont le premier
est le domaine de définition des données et le second est le choix de la base canonique
pour interpoler les données. Dans cet exemple, le domaine de définition est [0, 12], de
telle sorte que la valeur prise par le monôme x6 en x = 6 est 66 = 46656, ce qui est
très grand relativement à la plage de variation des ordonnées, comprises approxima-
tivement entre y = −1 et y = 1. Pour obtenir une valeur du polynôme entre -1 et
1, le coefficient multiplicateur de x6 doit donc être petit. C’est une des raisons pour
lesquelles on devrait en général éviter d’utiliser la base canonique pour réaliser une
interpolation avec un polynôme de degré élevé. Si toutefois cela doit être mené, on
peut normaliser les données, comme cela est présenté dans la remarque 10.4, page
265. Nous reviendrons en détail sur les conséquences de cette remarque tout au long
de ce chapitre.
Dans la section qui suit, nous allons préciser comment définir l’interpolation poly-
nomiale. Dans la section 8.4, nous montrerons une méthode qui permet d’évaluer les
polynômes du polynôme interpolateur, ce qui permettra de voir comment nous avons
déterminé les coefficients dans l’équation 8.3.

8.1 Le polynôme de Lagrange


Il y a plusieurs manières de déterminer un polynôme interpolateur. La première,
présentée dans cette section, consiste à utiliser le polynôme de Lagrange, ce qui per-
met d’évaluer le polynôme en tout point de l’intervalle. Nous examinerons comment
implémenter cette méthode en Python dans la section 8.2. Une des limites de cette
approche est que l’on a pas accès directement aux coefficients du polynôme. Cela peut
être problématique, par exemple si on souhaite pouvoir dériver d’autres informations
à partir du polynôme, comme sa dérivée première ou seconde. C’est pourquoi une
autre méthode consiste à évaluer les coefficients du polynôme interpolateur en utili-
sant la matrice dite de Vandermonde, ce que nous verrons dans la section 8.4. Une
alternative consiste à utiliser la forme de Newton du polynôme interpolateur, mais
nous n’étudierons pas cette méthode dans ce livre 6.
Dans cette section, nous analysons comment le polynôme de Lagrange permet
d’évaluer le polynôme interpolateur défini par un nombre arbitraire de nœuds. Dans
le but de commencer notre analyse par un exemple plus simple, nous considérons
d’abord l’interpolation avec deux points seulement.

Théorème 8.1 (Droite d’interpolation). Soient x1 et x2 deux réels tels que x1 < x2
et y1 et y 2 deux réels. Alors la droite qui interpole les points (x1, y 1) et (x2, y 2 ) est :

x − x2 x − x1
P (x) = y1 + y2 (8.4)
x1 − x 2 x 2 − x1

pour tout x ∈ [x1 , x 2].


6Voir [28] page 358.
8.1 • Le polynôme de Lagrange 181

y
y2
y1

x1 x2 x
Figure 8.4 – Interpolation linéaire entre deux points.

Dans le théorème précédent, l’hypothèse x1 < x 2 permet de garantir que les dé-
nominateurs des fractions impliquées dans la droite d’interpolation sont correctement
définis. Le théorème précédent est démontré dans l’exercice 8.4 et une preuve alter-
native est donnée dans l’exercice 8.2. L’exemple suivant présente l’exemple d’interpo-
lation linéaire le plus simple qui soit.
Exemple 8.2 (Interpolation linéaire entre deux points). La figure 8.4 présente la
droite d’interpolation entre deux points. On observe que l’interpolation revient ici à
tracer un segment de droite entre les points de coordonnées (x1 , y 1 ) et (x2 , y 2).
On observe que le polynôme défini par l’équation 8.4 est une combinaison linéaire
des ordonnées y1 et y2 . Dans le cas plus général, où il y a plusieurs abscisses x 1, . . . , xn
et plusieurs ordonnées y 1, . . . , y n , on peut généraliser cette idée, ce qui mène au poly-
nôme interpolateur de Lagrange que nous allons maintenant introduire. Dans Q le but
de mieux comprendre la définition suivante, nous rappelons que la notation permet
de représenter le produit de plusieurs termes :
n
Y
xi = x1 × x 2 × · · · × x n
i=1
Q
où x1, ...,P
xn ∈ R. En d’autres termes, le symbole est à la multiplication ce que le
symbole est à l’addition. Le polynôme interpolateur de Lagrange exprime l’inter-
polateur polynomial comme une combinaison des valeurs de la fonction aux nœuds
d’interpolation.
Définition 8.2 (Polynôme interpolateur de Lagrange). Soient xk, yk ∈ R, pour k =
1, 2, ..., n des nombres réels, avec x1 < x2 < . . . < xn. Pour k = 1, ..., n, on définit le
polynôme Lk par l’équation :
Yn
x − xj
L k(x) = (8.5)
x − xj
j=1 k
j 6=k

pour tout réel x ∈ [x1 , xn ]. Alors le polynôme interpolateur de Lagrange est :


n
X
P (x) = L k(x)y k (8.6)
k=1

pour tout réel x ∈ [x1 , xn ].


Dans la définition précédente, un point important est que les nœuds d’interpolation
doivent être deux à deux distincts. Cela implique que le dénominateur de l’équation
182 Chapitre 8 • Interpolation

Polynômes de Lagrange
1 L1
L2
0 L3
L4
−1 0 1
x

Figure 8.5 – Les polynômes de Lagrange L 1 , L2 , L 3 et L4 dans le cas où n = 4.

8.5 est non nul. On peut facilement voir que le polynôme P est de degré n − 1,
comme nous l’avions déjà vu dans la définition 8.1. En effet, chaque polynôme L k
est le produit de n − 1 termes, et c’est pourquoi L k est de degré n − 1. De plus, le
polynôme P est une somme de n polynômes L k, ce qui implique que le polynôme P
est de degré n − 1. En comparant les équations 8.1 et 8.6, peut observer la similarité
des expressions, qui font intervenir dans les deux cas des combinaisons linéaires de
polynômes. En effet,  les polynômes impliqués dans l’équation 8.1 sont ceux de la
base canonique x k≥0 tandis que les polynômes impliqués dans l’équation 8.6 sont
k

les polynômes de Lagrange {L k}k≥0 . Cela montre que l’utilisation des polynômes de
Lagrange revient à exprimer le polynôme initial dans une autre base de polynômes.
À première vue, l’équation 8.5 peut sembler quelque peu abstraite. L’exemple suivant
permet d’observer les polynômes de Lagrange dans le cas particulier où l’on dispose
de 4 nœuds.
Exemple 8.3 (Polynômes de Lagrange avec 4 nœuds). La figure 8.5 7 présente les
polynômes de Lagrange L 1 , L2 , L3 et L4 dans le cas où n = 4 avec quatre nœuds
régulièrement répartis entre -1 et 1 : x 1 = −1, x 2 = −1/3, x3 = 1/3 et x4 = 1. On
observe que le polynôme L 1 est égal à un au nœud x1 et égal à zéro aux nœuds x2 , x3
et x 4. De même, le polynôme L 2 est égal à un au nœud x 2 et égal à zéro aux nœuds
x 1 , x3 et x4 .
Le polynôme de Lagrange est unique, comme le montre le théorème suivant.
Théorème 8.2 (Unicité du polynôme interpolateur de Lagrange). Soient x k, yk ∈ R,
pour k = 1, 2, ..., n des nombres réels, avec x1 < x 2 < . . . < xn . Le polynôme de
Lagrange est l’unique polynôme de degré inférieur ou égal à n − 1 tel que :

P (x k ) = yk (8.7)

pour k = 1, ..., n.
La preuve de ce théorème est donnée dans l’exercice 8.3. Analysons les termes de
l’équation 8.6 et démontrons le théorème de manière informelle. Il y a n termes dans
la somme et n − 1 termes dans chaque produit. C’est pourquoi le polynôme P est
bien de degré n − 1. Évaluons le polynôme P au nœud x ` pour ` = 1, ..., n et vérifions
que P (x` ) = y ` . La valeur P (x` ) est une somme de n produits : le `-ième produit est
7Script Python : Interp/Scripts/Py3/[Link].
8.1 • Le polynôme de Lagrange 183

Le polynôme x3 − 2x2 + 1
2.5
0.0

y
−2.5

0 2
x

Figure 8.6 – Le polynôme interpolateur de degré trois : P (x) = x3 − 2x 2 + 1.

égal à 1 tandis que les autres valent 0. L’équation 8.6 permet alors de conclure que
P (x` ) = 1 × y` = y ` . Dans l’exemple suivant, nous mettons en œuvre l’interpolation
de Lagrange sur un exemple fondé sur 4 nœuds.
Exemple 8.4 (Interpolation sur 4 nœuds). La table suivante présente des couples
(x, y ) que l’on se propose d’interpoler :
x -1 0 1 2
f (x) -2 1 0 1
La figure 8.68 présente les données de cette table ainsi que le polynôme P (x) =
x3 − 2x2 + 1 que nous avons utilisé pour obtenir ces valeurs numériques. Utilisons les
équations 8.6 et 8.6 pour déterminer le polynôme interpolateur de Lagrange dans cet
exemple. Le polynôme interpolateur de Lagrange est :
(x − 0)(x − 1)(x − 2) (x + 1)(x − 1)(x − 2)
P (x) = (−2) + (1)
(−1 − 0)(−1 − 1)(−1 − 2) (0 + 1)(0 − 1)(0 − 2)
(x + 1)(x − 0)(x − 2) (x + 1)(x − 0)(x − 1)
+ (0) + (1)
(1 + 1)(1 − 0)(1 − 2) (2 + 1)(2 − 0)(2 − 1)
x(x − 1)(x − 2) (x + 1)(x − 1)(x − 2)
= (−2) + (1)
(−6) (2)
(x + 1)x(x − 2) (x + 1)x(x − 1)
+ (0) + (1)
(−2) (6)
ce qui mène à :
1 1
P (x) = x(x − 1)(x − 2) + (x + 1)(x − 1)(x − 2)
3 2
1
+ (x + 1)x(x − 1)
6
pour tout x ∈ [−1, 2]. Il est facile de voir que ce polynôme est de degré trois, puisque
c’est la somme de quatre polynômes de degrés trois. On peut également vérifier que
le polynôme interpole les valeurs données dans la table. Par exemple :
1 2
P (0) = (0 + 1)(0 − 1)(0 − 2) = = 1.
2 2
8Script Python : Interp/Scripts/Py3/[Link].
184 Chapitre 8 • Interpolation

En général, on n’utilise pas directement la formulation de Lagrange, mais plutôt


une combinaison linéaire de monômes de la forme P (x) = x3 −2x2 +1. C’est pourquoi,
dans la section suivante, nous allons tenter de déterminer les coefficients du polynôme
interpolateur, ce qui mène à la matrice de Vandermonde.

8.2 Implémentation de l’interpolateur de Lagrange


Dans cette section, nous montrons comment implémenter la méthode d’interpola-
tion fondée sur le polynôme de Lagrange. Nous montrons ensuite le comportement de
la méthode sur un exemple simple fondé sur 6 points d’interpolation. Nous allons voir
que l’interpolation polynomiale globale peut être instable sur les bords de l’intervalle
lorsqu’on utilise des nœuds équidistants. La fonction polynomial_interpolation,
développée pour ce cours, permet d’évaluer le polynôme interpolateur P en des points
u donnés. Sa séquence d’appel est :
1 v = po lyn omi al_ int er pol ati on (x , y , u )
où :
— le tableau x contient les abscisses x à interpoler ;
— le tableau y contient les ordonnées y à interpoler ;
— le tableau u contient les abscisses où évaluer P ;
— le tableau v contient la valeur de P en u.
En sortie de la fonction, le tableau v satisfait l’égalité :
1 v[ k] = P (u [k ])
pour les indices k = 0, ..., p - 1 où p est la taille des tableaux u et v. La fonction
polynomial_interpolation est mise en œuvre dans l’exemple suivant.
Exemple 8.5 (Interpolation polynomiale). Reprenons les données présentées dans
l’exemple 8.4 et utilisons la fonction polynomial_interpolation pour évaluer le
polynôme interpolateur. Dans le script suivant9, nous commençons par définir les
tableaux x et y qui contiennent les données à interpoler. Puis, nous définissons les
abscisses u auxquelles nous souhaitons évaluer le polynôme P et nous appelons la
fonction polynomial_interpolation pour calculer les ordonnées v.
1 import numpy as np
2 from interp import polyn om ial _in ter pol ati on
3 from pylab import plot
4 x = np . array ([ -1.0 , 0.0 , 1.0 , 2.0])
5 y = np . array ([ -2.0 , 1.0 , 0.0 , 1.0])
6 u = np . li nspace ( -1.25 , 2.25 , 100)
7 v = po lyn omi al_ int er pol ati on (x , y , u )
8 plot (x , y , "o " )
9 plot (u , v , " -" )
Le script précédent produit la figure 8.6, qui présente le polynôme interpolateur de
degré trois P (x) = x 3 − 2x − 5 pour x ∈ [−1, 2]. On peut observer que l’interpolation
est satisfaisante pour ces données. En revanche, l’extrapolation (en dehors des valeurs
de y observées) est de qualité inconnue, car les données ne permettent pas de valider
le résultat.
9Script Python : Interp/Scripts/Py3/[Link].
8.2 • Implémentation de l’interpolateur de Lagrange 185

La fonction polynomial_interpolation suivante10 présente l’implémentation de


l’algorithme. Cette fonction évalue le polynôme interpolateur en chaque point du ta-
bleau u. La boucle externe, sur k, réalise une boucle sur les nœuds contenus dans la
table x. La boucle interne, sur j, évalue le polynôme Lk sur tous les points de u en
utilisant l’équation 8.5. Elle considère les indices de 0 à n - 1, à l’exception de k. Puis
la mise à jour de v utilise l’équation 8.6 pour définir la valeur du polynôme interpo-
lateur. L’évaluation est vectorisée, c’est-à-dire qu’elle opère simultanément sur toutes
les cases du tableau u. En effet, sans vectorisation, trois boucles seraient nécessaires :
la première sur le nombre de points dans la table u, la seconde sur les nœuds d’indice
k et la troisième sur j.
1 from numpy import zeros , ones
2 def p oly no mia l_i nte rpo lat io n (x , y , u) :
3 n = size ( x)
4 v = zeros ( size (u) )
5 for k in range ( n) :
6 w = ones ( size (u) )
7 # j = 0 , ... , k - 1 , k + 1, ... , n - 1
8 for j in range ( k) + range ( k + 1, n ):
9 w = w * (u - x[j ]) / ( x[ k] - x[ j ])
10 v = v + w * y [k ]
11 return v

Le problème de l’interpolation polynomiale globale, fondée sur un unique poly-


nôme pour tout l’intervalle [x1, x n ], est que cette méthode peut être instable quand
le degré du polynôme augmente. C’est particulièrement le cas lorsque les nœuds sont
équidistants, comme le montre l’exemple suivant.

Exemple 8.6 (Instabilité de l’interpolation polynomiale globale). Nous proposons


d’interpoler les données suivantes :

x 0 1 2 3 4 5
f (x) 5 4 2 -2 1 3

La figure 8.7 11 présente le polynôme interpolateur pour ces données. On observe que
le polynôme oscille beaucoup entre les points d’interpolation, spécialement sur le
premier et le dernier intervalle. Le polynôme surestime les changements des données
et l’interpolation est de mauvaise qualité.

Il y a plusieurs solutions pour résoudre le problème. Une méthode consiste à chan-


ger la position des nœuds et d’utiliser, par exemple, les racines du polynôme de
Chebyshev, que nous étudierons dans la section 8.3. Il y a des situations dans les-
quelles on ne peut pas choisir la position des nœuds de telle sorte qu’on ne peut pas
toujours utiliser les racines du polynôme de Chebyshev. Une autre solution consiste
à utiliser des polynômes de degré faible, par exemple, n ≤ 2, 3 et locaux (différents
pour chaque sous-intervalle). Dans la section 8.5, nous présentons la méthode la plus
simple, c’est-à-dire la méthode d’interpolation linéaire par morceaux qui utilise des
polynômes locaux de degré 1. Nous étudierons dans la section 8.9 comment utiliser
des polynômes locaux de degré 3 nommés splines cubiques.
10 Script Python : Scripts-Eleves/Py3/[Link].
11 Script Python : Interp/Scripts/Py3/[Link].
186 Chapitre 8 • Interpolation

5 Données
Linéaire

y
0 Polynomial

0.0 2.5 5.0


x

Figure 8.7 – Comparaison de l’interpolation linéaire par morceaux et de l’interpo-


lation polynomiale globale.

Une des limites de l’interpolateur de Lagrange est qu’il ne permet pas d’accéder
directement aux coefficients du polynôme. C’est la raison pour laquelle la section 8.4
présente une méthode alternative, fondée sur la matrice de Vandermonde. Nous obser-
verons que l’utilisation des nœuds de Chebyshev permet de limiter le conditionnement
de cette matrice. Lorsqu’on utilise une méthode d’interpolation, on peut se demander
si la méthode est suffisamment précise. Dans la section 8.6, nous étudierons la préci-
sion de l’interpolation polynomiale. Nous y vérifierons que la convergence est guidée
par le nombre de nœuds, leur position et la dérivée n-ème de la fonction f . Nous
analyserons alors la spectaculaire amélioration induite par l’utilisation des nœuds de
Chebyshev, que nous présentons dans la section suivante.

8.3 Nœuds de Chebyshev


Dans cette section, nous présentons les racines des polynômes de Chebyshev et
nous montrons comment utiliser ces nœuds pour l’interpolation polynomiale. Lors-
qu’on utilise l’interpolation polynomiale, une des difficultés est que l’erreur peut être
trop grande, en particulier aux bords de l’intervalle. Ce problème est dû aux oscilla-
tions du polynôme, qui sont plus marquées pour les valeurs élevées de |x|. Pour limiter
cette difficulté, on peut utiliser les racines des polynômes de Chebyshev, ce qui a pour
effet d’augmenter la densité des nœuds sur les bords de l’intervalle. Les polynômes
de Chebyshev12 sont construits à partir de la fonction cos et son inverse arccos.

Définition 8.3. (Polynômes de Chebyshev) Pour tout x ∈ [−1, 1], le polynôme de


Chebyshev de première espèce de degré n est défini par :

Tn (x) = cos(n arccos(x)) (8.8)

pour n ≥ 0.

On peut démontrer que la fonction T n définie par l’équation 8.8 est un polynôme de
degré n. La figure 8.8 présente 13 le polynôme de Chebyshev de degré 7. On a représenté
les 8 racines de ce polynôme sur l’axe des abscisses. On observe que les racines sont
plus rapprochées aux bords gauche et droit du domaine. On voit également que la
fonction est comprise entre -1 et 1, avec des oscillations d’amplitude constante. Le
12En français, on écrit parfois le nom avec l’orthographe Tchebychev.
13Script Python : Interp/Scripts/Py3/[Link].
8.4 • Matrice de Vandermonde 187

Polynôme de Chebyshev
1

−1
−1 0 1

Figure 8.8 – Polynôme de Chebyshev de degré 7 et ses racines.

théorème suivant introduit les racines des polynômes de Chebyshev et montre que ces
racines sont faciles à évaluer à partir de la fonction cosinus.

Théorème 8.3. ( Racines des polynômes de Chebyshev) Le polynôme de Chebyshev


de degré n possède n racines simples réelles dans l’intervalle ouvert ] − 1, 1[, définies
par :
 
2k − 1
xk = cos π (8.9)
2n

pour k = 1, . . . , n.

Nous verrons tout au long de ce chapitre que l’utilisation des racines des polynômes
de Chebyshev comme nœuds d’interpolation peut permettre de diminuer l’erreur de
l’interpolation polynomiale. Nous reviendrons en particulier sur ce thème dans la
remarque 8.5, où nous évoquerons le conditionnement de la matrice de Vandermonde
introduite dans la section suivante.

8.4 Matrice de Vandermonde


Dans cette section, nous introduisons la matrice de Vandermonde et montrons
comment utiliser cette matrice pour calculer les coefficients du polynôme interpola-
teur. Nous allons voir que cela mène à la résolution d’un système d’équations linéaire
pour lequel nous utiliserons les méthodes déjà présentées dans le chapitre 7. On ob-
serve que les coefficients du polynôme interpolateur :

P (x) = c1x n−1 + c 2x n−2 + . . . + cn−1 x + cn (8.10)

satisfont les équations :


 n−1 n−2    
x1 x1 ... x1 1 c1 y1
 . .. ..   ..   .. 
 .. . . 1  .  =  .  . (8.11)
n−1
xn n−2
xn . . . xn 1 cn yn

Le système d’équations précédent mène à la matrice de Vandermonde, présentée dans


la définition suivante.
188 Chapitre 8 • Interpolation

Définition 8.4 (Matrice de Vandermonde). Soient xk ∈ R pour k = 1, 2, ..., n des


nombres réels. La matrice de Vandermonde V ∈ Rn×n est :

vkj = xnk −j (8.12)

pour k, j = 1, . . . , n.
Observons la matrice qui apparaît dans l’équation 8.11. La première colonne
contient les puissances n − 1 des nœuds, la seconde colonne contient les puissances
n − 2, jusqu’à la dernière colonne qui contient les puissances 0, c’est-à-dire les 1.
L’équation 8.12 montre que la matrice de Vandermonde ne dépend que des nœuds
x 1 , . . . , xn. Plus précisément, soit x = (x 1 , . . . , xn )T le vecteur des nœuds. En toute
rigueur, on devrait écrire V = V (x). Dans le but de conserver des expressions aussi
simples que possible, nous utiliserons la lettre V pour désigner succinctement la ma-
trice de Vandermonde. Dans certains cas, on utilise la notation V n pour préciser la
taille n de la matrice. L’exemple suivant permet de voir avec un exemple de petite
taille pourquoi il est plus facile de lire la matrice de Vandermonde colonne par colonne.
Exemple 8.7 (Matrice de Vandermonde). Supposons que n = 3 et considérons les
nœuds x 1 , x 2 , x3 ∈ R. La matrice de Vandermonde associée est :
 2 
x1 x 1 1
V =  x22 x 2 1 .
x23 x 3 1

Le théorème suivant montre que le vecteur des coefficients du polynôme inter-


polateur est solution d’un système d’équations linéaires impliquant la matrice de
Vandermonde.
Théorème 8.4 (Coefficients du polynôme interpolateur). Pour k = 1, 2, ..., n, soient
x k , yk ∈ R des nombres réels avec x1 < x2 < . . . < xn. Les coefficients c ∈ R n du
polynôme interpolateur satisfont le système d’équations linéaires V c = y où V ∈ Rn×n
est la matrice de Vandermonde.
Le théorème précédent est démontré dans l’exercice 8.5. Dans l’exemple suivant,
nous montrons comment calculer la matrice de Vandermonde en Python avec le mo-
dule NumPy.
Exemple 8.8 (Utilisation de la matrice de Vandermonde de taille 3). Utilisons à
nouveau les données présentées dans l’exemple 8.4 et tentons de déterminer les coef-
ficients du polynôme de degré 3 qui interpole ces données. Dans le script suivant 14 ,
nous utilisons la fonction vander du module NumPy pour calculer la matrice de Vander-
monde, puis nous utilisons la fonction solve pour calculer les coefficients du polynôme
interpolateur.
1 from numpy import vander , arange , array
2 from numpy . linalg import solve
3 x = array ([ -1.0 , 0.0 , 1.0 , 2.0])
4 print ( "x =" , x)
5 V = vander ( x)
6 print ( "V =" )
14Script Python : Interp/Scripts/Py3/[Link].
8.4 • Matrice de Vandermonde 189

7 print (V)
8 y = array ([ -2.0 , 1.0 , 0.0 , 1.0])
9 print ( "y =" , y)
10 c = solve (V , y )
11 print ( "c =" , c)

Le script précédent produit la sortie suivante.


1 x= [ -1. 0. 1. 2.]
2 V=
3 [[ -1. 1. -1. 1.]
4 [ 0. 0. 0. 1.]
5 [ 1. 1. 1. 1.]
6 [ 8. 4. 2. 1.]]
7 y= [ -2. 1. 0. 1.]
8 c= [ 1. -2. 0. 1.]
La solution du problème est donc le polynôme :

P (x) = 1 × x3 − 2 × x 2 + 0 × x + 1 = x3 − 2x2 + 1

pour tout x ∈ [−1, 2].

Le script suivant15 montre le calcul de la matrice de Vandermonde dans le cas


général avec m lignes et n colonnes.
1 from numpy import zeros
2 V = zeros (( m , n) )
3 for i in range ( m) :
4 for j in range ( n) :
5 V[i , j] = x [i ] ** ( n - j - 1)

L’algorithme est fondé sur deux boucles imbriquées. La première boucle sur i = 0,
..., m - 1 est une boucle sur les lignes de V. La seconde boucle sur j = 0, ...,
n - 1 est une boucle sur les colonnes de V. Pour chaque entrée [i,j], on évalue ensuite
l’expression xni −j−1. On constate qu’il y a une petite différence dans l’exposant entre
cette expression et l’équation 8.12 de la définition 8.4, qui est dûe au fait que le
langage Python utilise des indices entre 0 et n − 1, au lieu des indices entre 1 et n.
Si, par exemple, on a j = n - 1, alors l’expression est égale à x0i = 1, ce qui est la
valeur attendue.
Si les nœuds sont distincts, alors la matrice de Vandermonde est non singulière16 .
On peut alors résoudre le système d’équations linéaires V c = y ce qui mène au
vecteur des coefficients c. Nous avons montré dans le chapitre 7 que la solution du
système d’équations linéaires peut être sensible aux erreurs d’arrondi. En particulier,
nous avons étudié le rôle du conditionnement de la matrice et c’est pourquoi il peut
être intéressant de connaître le conditionnement de la matrice de Vandermonde. En
fonction du choix de la position des nœuds, la matrice de Vandermonde peut être plus
ou moins bien conditionnée.
Théorème 8.5 (Conditionnement de la matrice de Vandermonde). Considérons des
nœuds équidistants sur l’intervalle [−1, 1], définis par xk = 2(n−1
k−1)
− 1 pour k =
15 Script Python : Interp/Scripts/Py3/[Link].
16 Voir [28] page 228.
190 Chapitre 8 • Interpolation

1, 2, ..., n. Alors le conditionnement en norme infinie de la matrice de Vandermonde


est asymptotiquement égal à17 :
  1 π
κ∞ V nE ∼ e − 4 en (4 + 2 log(2))
π 1

π
quand n → ∞ où VnE est la matrice de Vandermonde associée aux nœuds équidistants,
e est le nombre d’Euler et log est la fonction logarithmique de base e. Si on utilise les
nœuds de Chebyshev sur [−1, 1], on obtient18 :
 33/4
 √
κ∞ V nC
∼ (1 + 2)n
4
quand n → ∞ où V n ∈ R
C n×n
est la matrice de Vandermonde associée aux nœuds de
Chebyshev.
   
Puisque log π4 + 12 log(2) = 3.102, on obtient κ∞ VnE = O(3.102n) avec les
√  
nœuds équidistants. Puisque 1 + 2 = 2.414, on obtient κ∞ VnC = O(2.414 n ) avec
les nœuds de Chebyshev. La situation est donc un peuaméliorée  avec les nœuds de
Chebyshev. Avec n = 40 par exemple
 C
19
, on obtient κ ∞ V E
40 = 6. 701 × 10 18 avec les
nœuds équidistants et κ∞ V40 = 1.166 × 10 15 avec les nœuds de Chebyshev.
L’analyse précédente montre que l’utilisation des nœuds de Chebyshev peut ré-
duire le conditionnement de la matrice de Vandermonde, mais que la matrice résul-
tante n’est pas nécessairement particulièrement bien conditionnée. Cela ne disqualifie
toutefois pas les nœuds de Chebyshev sur le principe, car, nous l’avons vu dans le
chapitre 7, tous les seconds membres ne sont pas susceptibles de générer une per-
turbation significative dans la solution d’un système d’équations linéaires. De plus,
nous découvrirons dans la section 8.6, et plus précisément dans le théorème 8.11, que
l’erreur d’interpolation peut être significativement réduite si on utilise les nœuds de
Chebyshev.

8.5 Interpolation linéaire par morceaux


Lorsqu’on peut choisir la position des nœuds de l’interpolateur polynomial global,
les nœuds de Chebyshev sont, nous allons le voir par la suite, un excellent choix.
Cependant, il arrive que l’on soit contraint d’utiliser des nœuds pré-définis ou équi-
distants. Dans ce cas, il est plus prudent d’utiliser des polynômes locaux de degré
faible sur des sous-intervalles plus petits, dans le but d’éviter des oscillations trop im-
portantes de l’interpolateur. L’interpolation linéaire par morceaux consiste à utiliser
un polynôme de degré 1 sur chaque sous-intervalle. Nous commençons par observer
le comportement graphique de cet interpolateur. Puis, nous présentons la description
mathématique de la méthode. Il est facile de réaliser une interpolation linéaire par
morceaux avec la librairie graphique Matplotlib en Python comme nous allons le voir
dans l’exemple suivant.
Exemple 8.9 (Interpolation linéaire par morceaux). Considérons les données pré-
sentées dans l’exemple 8.6 et utilisons la librairie Matplotlib pour afficher le polynôme
interpolateur par morceaux correspondant. Le script suivant20 présente l’utilisation
17Voir [48] équation 6.3 page 345.
18Voir [48] équation 6.5 page 346.
19Script Python : Interp/Scripts/Py3/[Link].
20Script Python : Interp/Scripts/Py3/[Link].
8.5 • Interpolation linéaire par morceaux 191

de la fonction plot de la librairie Matplotlib. La fonction arange du module NumPy a


la même syntaxe que la fonction range, mais renvoie une variable de type array, tan-
dis que range renvoie une liste. Dans l’exemple suivant, l’appel à la fonction arange
permet de créer un array contenant les flottants 0.0, 1.0, ..., 5.0.
1 from numpy import arange , array
2 from pylab import plot
3 x = arange (0.0 , 6.0)
4 y = array ([5.0 , 4.0 , 2.0 , -2.0 , 1.0 , 3.0])
5 plot (x , y , "o " )
6 plot (x , y , " -" )
La figure 8.7 présente le résultat. Lorsqu’on dessine un nuage de points en reliant les
points par des traits avec la fonction plot, Matplotlib utilise une interpolation linéaire
par morceaux. On observe que le polynôme interpolateur linéaire par morceaux ne
présente pas d’oscillation, au contraire de ce que nous avions vu dans l’exemple 8.6
avec un polynôme global de degré 3.
La définition suivante introduit l’interpolation linéaire par morceaux de manière
plus précise.
Définition 8.5 (Interpolation linéaire par morceaux). Pour tout x ∈ [xk , xk+1 [,
l’interpolateur linéaire par morceaux est :
y k+1 − yk
P (x) = yk + (x − x k ) .
x k+1 − xk
Soit s la variable locale définie par l’équation :
s = x − xk (8.13)

pour tout x ∈ [x k, xk+1 [. En toute rigueur, la pente dépend de l’abscisse, de telle


sorte que nous devrions plutôt écrire s(x). Dans le but de conserver des notations
concises, nous conservons la notation s. La pente locale correspondant au sous-
intervalle [x k, x k+1 [ est :
y k+1 − y k
δk = (8.14)
xk+1 − x k
pour k = 1, ..., n − 1. Alors, l’interpolateur P linéaire par morceaux est :

P (x) = yk + sδk (8.15)

pour k = 1, ..., n − 1. On remarque que le sous-intervalle [xk, x k+1 [ est fermé à gauche
au point xk , mais ouvert à droite au point xk+1 . Ainsi, l’union des sous-intervalles
locaux forme l’intervalle global [x1 , xn [, puisque :

[x 1, x 2[ ∪ [x 2, x3 [ ∪ [x n−1 , xn[ = [x1 , xn [.

Notons que, pour chaque sous-intervalle d’indice k, l’interpolateur a une évaluation


qui diffère et dépend de yk et δ k. Plus précisément, il y a un polynôme sur l’intervalle
[x1 , x2 [, un autre polynôme sur l’intervalle [x 2, x3[, etc. et tous ces polynômes sont, en
général, différents. Par conséquent, la fonction P n’a pas nécessairement de régularité.
Pourtant, on montre facilement que la fonction P a les propriétés présentées dans le
théorème suivant.
192 Chapitre 8 • Interpolation

Théorème 8.6 (Régularité de l’interpolation linéaire par morceaux). Soit P l’inter-


polateur linéaire par morceaux introduit dans la définition 8.5. La fonction P interpole
les valeurs (xk , yk ). De plus, la fonction P (x) est continue. Enfin, la dérivée de P (x)
est discontinue, puisque :
yk+1 − yk
P 0 (x) = δ k =
x k+1 − x k
pour x ∈ [x k , xk+1 [ et k = 1, 2, ..., n − 1.

Le théorème précédent est démontré dans l’exercice 8.6. La phrase : « la fonction


P interpole les valeurs (xk, yk ) » signifie que l’équation yk = P (x k) est satisfaite pour
k = 1, . . . , n. La fonction P est, par construction, continue, mais pas sa dérivée. En
effet, comme cela est indiqué dans le théorème, les pentes δ1 , . . . , δ n−1 sont en général
différentes, ce qui implique que la fonction P 0 n’est pas nécessairement continue aux
nœuds xk. De plus, l’interpolation linéaire par morceaux est peu précise au centre de
l’intervalle [xk , xk+1 [, comme nous allons le voir dans la section 8.6.
La fonction piecewise_linear_naive21 suivante réalise une interpolation linéaire
sur les données x et y. Elle fait l’hypothèse que la table x est triée par ordre croissant.
Le polynôme interpolateur est évalué sur les abscisses u et la fonction retourne les
ordonnées correspondantes v. Le module interp qui accompagne le cours fournit la
fonction piecewise_linear qui est une implémentation vectorisée de cet algorithme.
1 import numpy as np
2 def p iec ewi se_ lin ea r_n aiv e (x , y , u) :
3 n = np . size ( x)
4 m = np . size ( u)
5 v = np . zeros (( m ))
6 for i in range ( m) :
7 # Re cherche l ’ indice k
8 if u[i ] < x [0]:
9 # Extra pola tion vers la gauche
10 k = 0
11 elif u[i ] > x[ n - 1]:
12 # Extra pola tion vers la droite
13 k = n - 2
14 else :
15 # Inter pola tion
16 for j in range ( n - 1) :
17 if u[i ] < x[ j + 1]:
18 k = j
19 break
20 # Calcule la pente
21 delta = (y [k + 1] - y[k ]) / \
22 (x [k + 1] - x [k ])
23 # Evalue l ’ i nter polat eur
24 s = u [i ] - x [k ]
25 v[i ] = y[ k] + s * delta
26 return v

Supposons que les variables x et y sont des tableaux de taille n et que u est un
tableau de taille m. Alors la fonction retourne un tableau v de taille m. La boucle
21Script Python : Interp/Scripts/Py3/[Link].
8.6 • Erreur d’interpolation 193

externe, sur i, itère sur les indices du tableau u. Puis l’algorithme recherche la valeur
de l’indice k correspondant au sous-intervalle local. Plus précisément, si u[i] < x[0],
alors on réalise une extrapolation à gauche et on affecte k = 0. Si u[i] > x[n - 1],
alors on réalise une extrapolation à droite et on affecte k = n - 2. Sinon on recherche
l’indice k associé au sous-intervalle [xk, xk+1 [ contenant u[i].

8.6 Erreur d’interpolation


Nous disposons désormais de trois méthodes d’interpolation polynomiale : l’in-
terpolation polynomiale globale avec des nœuds équidistants ou avec les nœuds de
Chebyshev et l’interpolation linéaire par morceaux. Dans le but de choisir une mé-
thode appropriée, il peut être pertinent d’étudier l’erreur d’interpolation et de voir
comment cette erreur évolue lorsque le nombre de nœuds augmente. Plus précisément,
nous allons voir comment utiliser une forme particulière de la formule de Taylor pour
évaluer l’erreur d’interpolation en un point de l’intervalle.
Dans cette section, nous souhaitons déterminer l’écart entre la fonction f à ap-
procher et le polynôme interpolateur dans le but de préciser l’erreur commise par
l’interpolation. Celle-ci fait apparaître le polynôme nodal dont les racines, simples,
sont les nœuds d’interpolation.

Définition 8.6 (Le polynôme nodal ωn ). Soit x1 , x2, ..., xn ∈ R un ensemble de n


points tels que x1 < x 2 < . . . < xn . Le polynôme nodal est la fonction ω n définie par :

ω n (x) = (x − x 1 )(x − x2 ) · · · (x − xn ) (8.16)

pour tout réel x ∈ [x1 , xn ].

Le polynôme nodal est un polynôme monique, ce qui signifie que le premier terme
de son développement est le monôme xn. En d’autres termes, le coefficient associé à
son monôme de plus haut degré est égal à 1. Le théorème suivant est la clé qui permet
d’analyser l’erreur d’interpolation d’un polynôme.

Théorème 8.7 (Formule de Taylor pour l’interpolation). Soit f ∈ Cn (R). Soit


x1 , x2, ..., x n ∈ R un ensemble de n points tels que x1 < x 2 < . . . < xn . Soit P (x)
le polynôme interpolateur f aux points x1 , x 2, . . . , x n. Pour tout réel x ∈ [x 1, xn ], il
existe ξ ∈]x1 , xn [ tel que :

f (n) (ξ)
f (x) = P (x) + ω n(x). (8.17)
n!
La preuve de ce théorème est donnée dans l’exercice 8.8. Une extension du théo-
rème précédent est donnée dans le théorème 11.16, dans lequel on interpole également
la dérivée de la fonction f , ce que l’on appelle interpolation d’Hermite. Dans le théo-
rème précédent, il est important de noter que le réel ξ dépend du point x. Il indique
que l’erreur maximum d’approximation du polynôme interpolateur sur l’intervalle
[x1 , xn ] dépend de la n-ième dérivée de f ainsi que de la fonction ωn (x).
Sur la base de l’équation 8.17, on peut obtenir une majoration simple de l’erreur
d’interpolation.
194 Chapitre 8 • Interpolation

Théorème 8.8 (Majoration de l’erreur : cas équidistant). Sous les hypothèses du


théorème 8.9, supposons que la dérivée n-ième de f est bornée, c’est-à-dire supposons
que :
|f (n)(x)| ≤ M n (8.18)

pour tout x ∈ [x1 , x n ]. Alors :


Mn
|f (x) − P (x)| ≤ (xn − x1 )n (8.19)
n!
pour tout x ∈ [x1 , x n ].
La démonstration du théorème précédent est proposée dans l’exercice 8.10. Le
théorème précédent montre que l’erreur d’interpolation tend vers zéro lorsque M n! (xn −
n

x 1 ) tend vers zéro. En particulier, si les bornes de l’intervalle [x1 , xn] sont fixées, l’er-
n

reur tend vers zéro si Mn!n tend vers zéro, c’est-à-dire si n! tend vers l’infini plus vite
que Mn , c’est-à-dire plus vite qu’un majorant de la dérivée n-ième. Dans le cas parti-
culier d’une grille de nœuds équidistants, on peut obtenir une borne moins pessimiste
en travaillant sur la majoration du polynôme nodal, ce qui mène au théorème suivant.
Théorème 8.9 (Majoration du polynôme nodal dans le cas équidistant). Soient
x 1 , x2, ..., x n ∈ R un ensemble de n points tels que x k = x1 +h(k−1) pour k = 2, 3, ..., n
où h est la longueur constante de chaque intervalle :
xn − x 1
h= . (8.20)
n−1
Soit Wn = maxx∈[x 1,xn ] |ωn (x)|. Alors :
 n
x n − x1 (n − 1)!
Wn ≤ . (8.21)
n−1 4
Nous démontrons ce théorème dans l’exercice 8.11. Dans le théorème précédent,
notons que h dépend de n par l’équation 8.20. La figure 8.922 présente la fonction
ωn (x) pour n = 3, 4, 5, 6 dans l’intervalle [−1, 1]. Dans cette figure, on peut observer
que Wn , c’est-à-dire l’amplitude de la fonction, décroît lorsque n est croissant. Plus
précisément, on observe que W3 ≈ 0.4, W4 ≈ 0.2, W 5 ≈ 0.11 et W 6 ≈ 0.06.
La borne supérieure 8.21 peut sembler pessimiste. Considérons la fonction ωn (x)
pour x ∈ [−1, 1]. Dans le but de calculer une approximation de Wn pour n =
2, 3, ..., 50, nous évaluons la fonction ωn (x) pour N = 1000n valeurs régulièrement
réparties y 1, ..., y N ∈ [−1, 1]. Puis, nous évaluons la valeur empirique :
f
Wn = max(|ωn (y1 )|, ..., |ωn (y N )|)

qui est une approximation grossière de Wn . La figure 8.1023 présente le résultat. On


observe que la borne supérieure Wn est légèrement supérieure à la valeur approchée
f
Wn , de telle sorte que l’ordre de grandeur semble correct. On observe que la courbe
empirique est en dents de scie, avec des points hauts pour n impair, et des points bas
pour n pair.
Forts de la majoration précédente de Wn , on peut obtenir le théorème suivant.
22Script Python : Interp/Scripts/Py3/[Link].
23Script Python : Interp/Scripts/Py3/[Link].
8.6 • Erreur d’interpolation 195

n=3 n=4
0.4 0.4
ω3 (x)

ω4 (x)
0.0 0.0
−0.4 −0.4
−1 0 1 −1 0 1
x x
n=5 n=6
0.4 0.4
ω5 (x)

ω6 (x)
0.0 0.0
−0.4 −0.4
−1 0 1 −1 0 1
x x

Figure 8.9 – Le polynôme nodal ωn (x) pour n = 3, 4, 5, 6 dans l’intervalle [−1, 1].

10−2 fn
W
Borne sup.
10−6

20 40
n

Figure 8.10 – Comparaison entre la borne supérieure Wn et l’approximation empi-


rique f
Wn du maximum du polynôme nodal ω n(x) pour n = 2, 3, ..., 50 et x ∈ [−1, 1].
196 Chapitre 8 • Interpolation

Erreur abs.
0.1 Lin. p. m.
Polynôme

0.0
0 5
x

Figure 8.11 – Erreur d’interpolation pour l’interpolation linéaire par morceaux et


pour l’interpolation par un polynôme.

Théorème 8.10 (Majoration de l’erreur : cas équidistant). Sous les hypothèses du


théorème 8.9, supposons que la dérivée n-ième de f est bornée, c’est-à-dire supposons
que |f (n) (x)| ≤ Mn pour tout x ∈ [x1, x n ]. Alors :
 n
M n xn − x1
|f (x) − P (x)| ≤ (8.22)
4n n−1
pour tout x ∈ [x1 , x n ].
La démonstration du théorème précédent est présentée dans l’exercice 8.12.
L’exemple suivant montre comment mettre en application le théorème précédent
lorsque l’on dispose de 2 nœuds d’interpolation.
Exemple 8.10 (Erreur de l’interpolation linéaire). Soit n = 2 le nombre de nœuds.
Supposons que x1 < x 2 et utilisons le théorème 8.10 pour déterminer l’erreur de
l’interpolation linéaire. Notons h = x 2 − x 1 > 0 la longueur de l’intervalle. L’équation
8.22 implique :
M2 2
|f (x) − P (x)| ≤ h
8
pour tout x ∈ [x1, x2 ]. L’équation précédente montre que l’erreur maximale de l’in-
terpolation linéaire sur l’intervalle [x1 , x 2] est de l’ordre de h 2 .

Exemple 8.11 (Erreur de l’interpolation). Considérons à nouveau les données de


l’exemple 8.1 et évaluons l’erreur absolue d’interpolation dans le cas de l’interpola-
tion linéaire par morceaux et dans le cas de l’interpolation par un polynôme. Plus
précisément, pour chaque point x ∈ [0, 6], évaluons la valeur absolue de la différence
entre la fonction sin et l’interpolateur P , c’est à dire | sin(x) − P (x)|. La figure 8.1124
présente l’évolution de l’erreur absolue en fonction de x pour x ∈ [0, 6]. On observe
que l’erreur est nulle en chaque nœud d’interpolation, ce qui est normal puisque
sin(x) = P (x) en ces points. Cependant, entre deux nœuds, l’erreur augmente puis
décroît. On observe que l’erreur de l’interpolation linéaire par morceaux est supé-
rieure à celle de l’interpolation globale. On observe toutefois que pour le polynôme
global l’erreur d’interpolation est d’amplitude plus grande sur les bords du domaine
(c’est-à-dire pour x proche de x = 0 ou proche de x = 6), ce qui correspond aux
oscillations du polynôme nodal ω n sur les bords du domaine.
24Script Python : Interp/Scripts/Py3/[Link].
8.6 • Erreur d’interpolation 197

Le phénomène de Runge
1
f (x)
6 pts

y
0 10 pts

−1 0 1
x

Figure 8.12 – Le phénomène de Runge.

Introduisons une norme qui permet de mesurer les fonctions.


Définition 8.7 (Norme infinie). Soit f une fonction définie sur l’intervalle [a, b]. La
norme infinie de f est :

kf k∞ = max |f (x)|. (8.23)


x∈[a,b]

Lorsque les dérivées de f ne sont pas bornées ou bien que la borne, Mn , augmente
lorsque n augmente, les choses peuvent se passer plus mal. C’est le cas par exemple
pour la fonction de Runge que nous analysons maintenant.
Exemple 8.12 (Le phénomène de Runge). Soit f la fonction définie par :
1
f (x) =
1 + 25x2
pour x ∈ [−1, 1]. La figure 8.1225 montre ce qu’il arrive lorsqu’on interpole cette
fonction avec n = 6 et n = 10 points régulièrement espacés entre -1 et 1. Dans ce
cas, les polynômes sont de degré 5 et 9, respectivement. On observe que le polynôme
interpolateur oscille de plus en plus lorsque n augmente : la méthode d’interpolation
polynomiale ne converge plus. La figure 8.1326 présente les trois premières dérivées
de f . On observe
 (que les
 dérivées de f ont une amplitude de variation de plus en plus
grande et que f (x) ∞ augmente rapidement.
 n)

Le phénomène de Runge a dissuadé beaucoup de personnes d’utiliser l’interpola-


tion polynomiale globale, en partie à tord. En effet, le théorème suivant indique que,
si la fonction f est suffisamment régulière et si on utilise les racines du polynôme de
Chebyshev au lieu de choisir des nœuds équidistants, alors l’interpolation polynomiale
possède d’excellentes propriétés de convergence.
Théorème 8.11. ( Convergence du polynôme interpolateur de Chebyshev (D. Jack-
son)) Soit f ∈ C r([−1, 1]) où r ≥ 0 est un entier. Soit P le polynôme interpolateur de
degré n−1 interpolant la fonction f aux racines x1, . . . , xn du polynôme de Chebyshev
de degré n − 1. Alors :  
kf − P k ∞ = O n −r
quand n → ∞.
25 Script Python : Interp/Scripts/Py3/[Link].
26 Script Python : Interp/Scripts/Py3/[Link].
198 Chapitre 8 • Interpolation

Dérivées de la fonction de Runge

y = f 0 (x)
1

y = f (x)
2.5
0.0
−2.5
0
−1 0 1 −1 0 1
x x

y = f 000 (x)
y = f 00 (x)

0 500
0
−50 −500
−1 0 1 −1 0 1
x x

Figure 8.13 – Dérivées de la fonction de Runge. En haut, à gauche : y = f (x). En


haut, à droite : y = f 0(x). En bas, à gauche : y = f 00(x). En bas, à droite : y = f 000(x).

Dans le cas particulier de la fonction de Runge, l’interpolation par polynôme de


Chebyshev est convergente27 . Par exemple, avec 32 nœuds de Chebyshev, l’interpo-
lateur est visuellement superposé avec la fonction de Runge. Le théorème précédent,
dû à D. Jackson28 , indique que la convergence dépend du degré de régularité de la
fonction f . Si la fonction est C ∞([−1, 1]), alors la convergence est plus rapide que
toute puissance de n. Cette propriété est partagée par les méthodes fondées sur la
décomposition de fonctions en fonctions ou polynômes orthogonaux, ce que l’on ap-
pelle convergence spectrale. Un théorème plus général permet d’élargir le périmètre
d’application du théorème précédent en relâchant d’une unité de r l’exigence de régu-
larité. Ce théorème requiert une fonction telle que f, f 0 , . . . , f (r−1) sont absolument
continues sur [−1, 1] et telle que f (r) est de variation bornée. Par exemple, la fonction
f (x) = |x| est absolument continue et la fonction
 f 0 est de variation bornée (égale à
2). Dans ce cas, on a kf − P k ∞ = O n−1 . Cette performance est étonnante pour
une fonction aussi peu régulière que la fonction |x|. En appliquant ce théorème avec
r = 0, on peut aussi comprendre la convergence de l’interpolation de Chebyshev sur
une fonction discontinue de variation bornée.

8.7 La constante de Lebesgue (*)


Dans cette section, nous présentons la constante de Lebesgue qui est définie en
fonction des polynômes de Lagrange. Nous allons voir que cette constante permet de
quantifier l’écart entre f et le polynôme interpolateur en fonction de l’écart entre la
fonction et le meilleur polynôme interpolateur possible. Dans la section 8.8, nous com-
prendrons pourquoi la constante de Lebesgue intervient dans l’évaluation du condi-
tionnement du problème de l’interpolation. La borne d’erreur que nous allons obtenir
dépend d’une constante qui mesure la valeur des fonctions Lk sur les points x k.

27Voir [98] page 146.


28Voir [75] et [135] pages 61 et 64.
8.7 • La constante de Lebesgue (*) 199

Constante de Lebesgue

Équidistants
2 1014
Chebyshev
λ5 (x)

Λn
106
1
−1 0 1 0 50
x n

Figure 8.14 – À gauche, fonction de Lebesgue λn pour n = 5 points équidistants


dans l’intervalle [−1, 1]. À droite, constante de Lebesgue Λn asymptotique pour l’in-
terpolation polynomiale globale avec n nœuds équidistants ou égaux aux racines du
polynôme de Chebyshev pour n = 2, ..., 79.

Définition 8.8 (Fonction de Lebesgue). Soit X = {xk } k=1,...,n ∈ R des nombres


réels, avec x1 < x2 < . . . < x n. La fonction de Lebesgue associée aux nœuds X est :
n
X
λn(x) = |L k(x)| (8.24)
k=1

pour tout x ∈ [x 1, xn] où L k est le polynôme introduit dans la définition 8.2.


La partie gauche de la figure 8.1429 montre la fonction de Lebesgue λn pour n = 5
points équidistants dans l’intervalle [−1, 1]. On observe que l’amplitude de la fonction
de Lebesgue est plus grande lorsque x est proche des bords -1 ou 1. Au contraire,
lorsque x est proche de zéro, les différentes puissances impliquées dans la fonction de
Lebesgue sont proches de zéro.
Définition 8.9 (Constante de Lebesgue). Soit X = {xk }k=1,...,n ∈ R des nombres
réels, avec x1 < x 2 < . . . < x n. La constante de Lebesgue associée aux nœuds X est :
n
X
Λn (X ) = max |Lk (x)|. (8.25)
x∈[x 1 ,xn ]
k=1

En d’autres termes, la constante de Lebesgue est le maximum de la fonction


de Lebesgue. Nous allons comparer le polynôme interpolateur P aux nœuds X =
{xk }k=1,...,n avec l’ensemble des polynômes de degré n − 1.
Définition 8.10 (Meilleur polynôme d’approximation). Soit une fonction f définie
sur l’intervalle réel [a, b]. Le meilleur polynôme d’approximation de degré n − 1 de f
est le polynôme P ? tel que, pour tout polynôme P de degré n − 1, on a :

kf − P ? k∞ ≤ kf − P k∞ . (8.26)

Bien sûr, le meilleur polynôme P ? interpole f en certains points x. Mais ces points
sont, en général, inconnus et différents des points x1, ..., x n dont nous disposons. Ainsi,
29 Script Python : Interp/Scripts/Py3/[Link].
200 Chapitre 8 • Interpolation

si on fixe a priori les nœuds d’interpolation X = {xk}k=1,...,n , alors le polynôme P


qui interpole f aux nœuds X n’est généralement pas le meilleur. Le théorème suivant
prédit la différence entre f et P en fonction de la différence entre f et P ?.

Théorème 8.12 (Constante de Lebesgue et interpolation). Soient xk ∈ R, pour


k = 1, 2, ..., n des nombres réels, avec x1 < x2 < . . . < x n. Soit f une fonction définie
sur l’intervalle [x1, xn ] et soient y k des réels tels que yk = f (x k) pour k = 1, 2, ..., n.
Soit P le polynôme de degré n − 1 interpolateur f aux nœuds X = {x k}k=1,...,n et aux
ordonnées {y k}k=1,...,n . Soit P ? le meilleur polynôme d’approximation de degré n − 1
de f . Soit Λ n(X ) la constante de Lebesgue associée aux nœuds X . Alors :

kf − P k∞ ≤ (1 + Λ n(X ))kf − P ? k∞ . (8.27)

En d’autres termes, l’erreur absolue maximale réalisée par le polynôme P est


inférieure à l’erreur absolue maximale réalisée par le meilleur polynôme P ? , multipliée
par 1+Λ n(X ). Le théorème précédent est démontré dans l’exercice 8.9. On comprends
alors pourquoi on souhaite obtenir une constante Λ n (X ) la plus petite possible, car
cela garantit que le polynôme interpolant P produit une erreur qui n’est pas très
éloignée de l’erreur produite par le meilleur polynôme P ?. Dans le meilleur des cas,
on a Λ n(X ) = 0, ce qui implique kf − P k∞ = kf − P ? k∞ .
Dans la section suivante, nous allons voir comment la constante de Lebesgue in-
tervient dans le conditionnement du problème de l’interpolation.

8.8 Conditionnement de l’interpolation (*)


On peut souhaiter analyser la sensibilité de l’interpolation vis-à-vis de perturba-
tions dans les paramètres du problème. Dans cette section, nous analysons le condi-
tionnement de l’interpolation. Pour l’interpolation polynomiale, deux problèmes de
conditionnement peuvent être identifiés.
1. La sensibilité de la valeur du polynôme interpolateur P (x) par rapport à une
perturbation des valeurs de la fonction. Dans ce cas, le conditionnement est la
constante de Lebesgue, comme nous allons le voir par la suite.
2. La sensibilité des coefficients du polynôme interpolateur P (x) par rapport à une
perturbation des valeurs de la fonction. Or le vecteur des coefficients du poly-
nôme est la solution d’un système d’équations linéaires et nous avons analysé
dans le chapitre 7 le conditionnement d’un tel problème. Dans ce cas, le condi-
tionnement est le conditionnement de la matrice de Vandermonde, que nous
avons déjà étudié dans la remarque 8.5 page 189. Ce conditionnement dépend
de la base polynomiale choisie et des nœuds d’interpolation.
Dans le théorème suivant, nous analysons la sensibilité de la valeur du polynôme
interpolateur en fonction de perturbations dans la valeur de la fonction et montrons
qu’elle est liée à la constante de Lebesgue.

Théorème 8.13 (Conditionnement absolu de la valeur du polynôme interpolateur).


Soient x k ∈ R, pour k = 1, 2, ..., n, des nombres réels avec x1 < x2 < . . . < x n. Soit f
une fonction définie sur l’intervalle [x 1 , xn ] et soit y = (y1 , ..., yn )T ∈ Rn le vecteur
tel que :
yk = f (xk )
8.9 • Les splines (*) 201

pour k = 1, 2, ..., n. Soit P (y) le polynôme de degré n − 1 interpolateur les va-


leurs y. Soit Λ n(X ) la constante de Lebesgue associée aux nœuds X . Soit ∆y =
(∆y1 , ..., ∆yn)T ∈ R n un vecteur de perturbations des valeurs de la fonction f . Soit
P (y + ∆y) le polynôme de degré n − 1 interpolateur les valeurs y + ∆y. Alors :

kP (y + ∆y) − P (y)k∞
≤ Λn (X )
k∆yk ∞

pour tout ∆y non nul où Λ n (X ) est la constante de Lebesgue avec n nœuds.


Considérons la fraction dans le membre de gauche de l’équation précédente. Le
numérateur implique une norme fonctionnelle, qui détermine la norme infinie de la
fonction associée à la différence entre les deux interpolateurs. Le dénominateur im-
plique une norme vectorielle associée au vecteur des différences entre les ordonnées y
et les ordonnées perturbées y + ∆y. Le théorème précédent montre que le condition-
nement absolu de l’interpolation polynomiale par rapport à la valeur du polynôme
est la constante de Lebesgue. Il est démontré dans l’exercice 8.13. Lorsque les nœuds
sont équidistants, alors la constante de Lebesgue est asymptotiquement30 égale à :
  2n
Λn X E ∼
en log(n)

lorsque n est grand où X E est le vecteur des nœuds équidistants et e est le nombre
d’Euler. La partie droite de la figure 8.14 31 présente la valeur de la constante de
Lebesgue asymptotique pour n = 2, ..., 79. On observe que la constante de Lebesgue
est, même pour des valeurs modérées de n, assez élevée si on utilise des nœuds équi-
distants. Lorsqu’on utilise les nœuds de Chebyshev, la constante de Lebesgue est
asymptotiquement32 égale à :
  2
Λn X C ∼ log(n) + 0.9625
π
lorsque n est grand où X C est le vecteur des nœuds de Chebyshev. Le résultat pré-
cédent donne une indication de l’amélioration fournie par les racines des polynômes
de Chebyshev pour l’interpolation par rapport à l’interpolation avec des nœuds équi-
distants. En d’autres termes, l’interpolation par polynômes de Chebyshev est presque
optimale.

8.9 Les splines (*)


Nous avons vu dans les sections précédentes que l’interpolation polynomiale fondée
sur un polynôme global, unique, sur tout l’intervalle [a, b] n’est pas nécessairement
une méthode stable, en particulier sur une grille régulière. Une alternative consiste à
utiliser des polynômes locaux différents sur chaque sous-intervalle. Nous avons déjà
présenté l’interpolation linéaire par morceaux et nous avons vu que cette méthode
est stable, mais possède l’inconvénient d’approcher la fonction f par une fonction
continue, mais non dérivable : pour certaines fonctions f très régulières, ou bien
30 Voir [125] et [139].
31 Script Python : Interp/Scripts/Py3/[Link].
32 Voir [115] page 434 et [98] page 161.
202 Chapitre 8 • Interpolation

lorsque le nombre de nœuds n’est pas très grand, cela peut mener à une très mauvaise
approximation. La spline cubique33 peut représenter une méthode intéressante, car
elle est à la fois locale - et par conséquent stable - et précise dans beaucoup de
situations.
Cette méthode utilise la base polynomiale d’Hermite, ce qui permet d’assurer
la continuité de la fonction et de sa dérivée première. Les splines cubiques sont un
procédé d’interpolation stable, car le degré de chaque polynôme local est fixé et égal
à 3. Ainsi l’interpolation par splines cubiques est plus stable que l’interpolation par
un polynôme global de degré élevé car les splines produisent moins d’oscillations.
Lorsque l’interpolation cubique par morceaux permet de contrôler les valeurs de la
dérivée de la spline, on la nomme spline cubique d’Hermite par opposition à d’autres
variantes de splines 34. Le système d’équations associé aux splines est non singulier
si x1 < x 2 < . . . < xn . En conséquence, on peut le résoudre par l’algorithme du
pivot de Gauss, sans permutation des lignes35 . Dans le cas particulier d’une matrice
tridiagonale, cela conduit à l’algorithme de Thomas, qui est souvent utilisé pour le
résoudre.
La spline cubique interpolatrice possède n inconnues associées aux pentes de la
spline aux nœuds d’interpolation. D’un autre côté, les conditions de continuité de
la spline et de sa dérivée imposent n − 2 équations. Par conséquent, il manque deux
équations pour pouvoir déterminer entièrement la spline cubique et les différents types
de splines ont pour but de répondre à ce problème. Dans ce livre, nous évoquons deux
types de splines cubiques. Pour la spline cubique complète, la dérivée de la fonction
est connue aux extrémités. Dans ce cas, on a P 0 (x1 ) = f 0(x 1) et P 0 (x n) = f 0(x n ) où
f 0 (x1) et f 0 (xn ) sont des valeurs connues de la dérivée de la fonction. Avec la spline
naturelle, on impose que la dérivée seconde de l’interpolateur soit nulle aux extrémités.
Dans ce cas, on a P 00 (x1 ) = 0 et P 00 (xn ) = 0. L’avantage de la spline naturelle est
qu’elle nécessite moins d’informations, puisque seule la valeur de la fonction est requise
aux nœuds d’interpolation. Comme nous allons le voir par la suite, l’inconvénient est
que la spline naturelle est moins précise sur les bords du domaine. Au contraire, la
spline cubique complète nécessite plus d’information, mais peut être plus précise. Dans
le cas particulier où les points sont régulièrement espacés, l’erreur d’approximation
de la spline complète trouve une expression relativement simple présentée dans le
théorème36 suivant.

Théorème 8.14 (Erreur d’approximation de la spline complète). Soient x 1, x2 , ...,


x n ∈ R un ensemble de n points tels que x k = x1 + h(k − 1) pour i = 2, 3, ..., n,
où h = xnn−1 −x 1
est la longueur constante de chaque intervalle. On suppose que P
est une spline cubique complète approchant les valeurs de la fonction f aux nœuds
{x k}k=1,...,n . Supposons que f ∈ C 4 ([x1 , xn ]). Soit M 4 = kf (4)k ∞ . Alors, pour tout
x ∈ [x1 , xn ], on a :

5 4
|f (x) − P (x)| ≤ h M4 . (8.28)
384
33Voir [28] page 417.
34Voir [13] page 39.
35Voir [13] page 43.
36Voir [122] page 112 et [61].
8.10 • Application à un problème de fiabilité 203

xk 0.0 0.7143 1.429 2.143 2.857 3.571 4.286 5.0


yk -0.3010 -0.6242 -1.116 -1.794 -2.670 -3.751 -5.040 -6.543

Table 8.1 – Logarithme décimal de l’indice de fiabilité de Hasofer-Lind avec 8 nœuds


équidistants.

x n−x1
Puisque h = n−1 , l’équation 8.28 implique37 :
 
kf − P k∞ = O n−4 . (8.29)

Cette section, courte, présente la méthode des splines de manière relativement


superficielle. Pour approfondir ce sujet, des références bibliographiques sont présentées
dans la section 8.12.

8.10 Application à un problème de fiabilité des


structures
Dans cette section, nous considérons une fonction issue du domaine de la fiabilité
des structures et interpolons cette fonction avec les méthodes que nous avons présen-
tées. Lorsqu’on soumet une structure à une sollicitation mécanique, celle-ci peut se
déformer sans créer de dommage, ou bien rompre si la sollicitation est supérieure à
la résistance de la structure38. Sous l’hypothèse que l’écart entre la résistance et la
sollicitation peut être modélisé par une variable aléatoire gaussienne, la probabilité
de défaillance de la structure pf est liée à l’indice de Hasofer-Lind39 β. Cet indice
mesure la distance, dans un espace standardisé, entre l’origine du repère et le point
de défaillance le plus probable. La relation est :

pf = Φ(−β )

pour β ≥ 0, où Φ est la fonction de répartition de la loi gaussienne standard :


Zx
1 t2
Φ(x) = √ e− 2 dt.
2π −∞

Nous reviendrons sur cette loi de probabilité dans la section 11.11, où nous l’utiliserons
dans le contexte d’un problème d’intégration. Lorsqu’on s’intéresse à des probabilités
proches de zéro, il est plus pertinent de considérer le logarithme décimal de cette
relation. En d’autres termes, on considère la fonction y = f (x) où y = log10 (pf ) et :

f (x) = log10 (Φ(−x))

pour x ≥ 0 où x représente l’indice de fiabilité de Hasofer-Lind β . La table 8.1 présente


8 points de la fonction f , associés à des nœuds équidistants. La figure 8.1540 présente
le logarithme décimal de la probabilité en fonction de l’indice β de Hasofer-Lind.
37 Voir [13] page 40.
38 Voir [92].
39 Voir [92] page 88.
40 Script Python : Interp/Scripts/Py3/[Link].
204 Chapitre 8 • Interpolation

log10 (Pf )
−5

0 5
β

Figure 8.15 – Logarithme décimal de la probabilité en fonction de l’indice β de


Hasofer-Lind.

xk 0.048 0.4213 1.111 2.012 2.988 3.889 4.579 4.952


yk -0.3180 -0.4727 -0.8753 -1.656 -2.852 -4.298 -5.631 -6.435

Table 8.2 – Logarithme décimal de l’indice de fiabilité de Hasofer-Lind avec 8 nœuds


de Chebyshev.

Pour produire les éléments présentés dans la table 8.1, nous utilisons la fonction
norm du module [Link], qui implémente plusieurs propriétés de la loi gaus-
sienne. La fonction logcdf, en particulier, permet d’évaluer la fonction Φ. Puis, nous
générons 8 points régulièrement répartis entre 0 et 5.
1 import numpy as np
2 from scipy . stats import norm
3 def p rob ab ili te_ def ail lan ce ( beta ) :
4 pf_log10 = norm . logcdf (- beta ) / np .log (10.0)
5 return pf_log10
6

7 nu mbe r_o f_d ata _po int s = 8


8 beta_da ta = np . linsp ace (0.0 , 5.0 , nu mbe r_o f_d ata _po int s )
9 pflog _data = p rob abi lit e_d efa ill anc e ( b eta_dat a )
Le script suivant stocke les données déterminées dans le script précédent et permet
de définir la table de valeurs numériques à interpoler. Cela limite la précision de
l’interpolation, puisque les valeurs ont étés arrondies avec 4 chiffres significatifs.
1 beta_da ta = np . array ([0.0 , 0.7143 , 1.429 , 2.143 ,
2 2.857 , 3.571 , 4.286 , 5.0])
3 pflog _data = np . array ([ -0.3010 , -0.6242 , -1.116 , -1.794 ,
4 -2.670 , -3.751 , -5.040 , -6.543])
5 nu mbe r_o f_d ata _po int s = len ( bet a_data )
Nous souhaitons comparer les méthodes précédentes qui utilisent des points équi-
distants avec l’interpolation polynomiale fondée sur les nœuds de Chebyshev. Pour
cela, nous utilisons la fonction compute_Chebyshev_roots dans le script suivant.
1 beta_da ta = interp . comp ute _Ch eby she v_ roo ts ( nu mber_o f_dat a_poin ts ,
0.0 , 5.0)
2 pflog _data = p rob abi lit e_d efa ill anc e ( b eta_dat a )
Puis, on stocke les valeurs numériques dans des tableaux associés à 4 chiffres signifi-
catifs. Les valeurs numériques sont présentées dans la table 8.2. On suppose que l’on
8.10 • Application à un problème de fiabilité 205

Méthode log10 (pf ) Erreur absolue


Exact -5.469
Interp. linéaire par morceaux -5.490 2.166 × 10−2
Interp. globale, équidistant -5.467 2.269 × 10−3
Spline -5.474 5.207 × 10−3
Interpolation de Chebyshev -5.468 4.376 × 10−4

Table 8.3 – Interpolation de log10 (pf ) pour β = 4.5 par quatre méthodes d’inter-
polation.

veut évaluer le logarithme décimal de la probabilité en β = 4.5. Nous avons choisi


ce point car il est relativement proche du bord droit du domaine, ce qui défavorise
la méthode d’interpolation polynomiale globale, à cause des oscillations du polynôme
nodal.
1 beta_ cible = 4.5
2 pflo g_exac t = pro bab ili te_ de fai lla nce ( beta_ci ble )
3 print ( " pf _exact =%.3 f " % ( pflog_e xact ))

Le script précédent affiche la valeur numérique suivante.


1 pf_exact = -5.469

On utilise les méthodes d’interpolation linéaire par morceaux, d’interpolation poly-


nomiale globale et d’interpolation par spline. Nous utilisons la spline « naturelle »,
c’est-à-dire dont la dérivée seconde est nulle aux extrémités de l’intervalle. La table 8.3
présente les résultats. On constate que l’interpolation globale fondée sur des nœuds
équidistants produit une erreur comparable à celle obtenue par une spline. Nous avons
séparé l’interpolation de Chebyshev des trois premières méthodes, car celle-ci utilise
d’autres données. On constate que l’interpolation fondée sur les nœuds de Cheby-
shev obtient la meilleure précision égale à 4.376 × 10−4. On remarque que cette erreur
absolue est inférieure à la précision des données, qui sont fournies avec 4 chiffres signi-
ficatifs. L’interpolation linéaire par morceaux produit une erreur égale à 2.166 × 10−2 ,
ce qui est bien plus grand que celle de l’interpolation polynomiale de Chebyshev. Les
deux autres méthodes ont des précisions intermédiaires.
Nous pourrions présenter la figure représentant la valeur du logarithme décimal
de la probabilité en fonction de β , mais les valeurs interpolées sont graphiquement
très proches des valeurs exactes, et la comparaison n’est pas très intéressante. Dans
la figure 8.16, nous présentons l’erreur absolue en échelle logarithmique en fonction
de β . La courbe « Équidistant » correspond à l’interpolation polynomiale globale avec
des nœuds équidistants tandis que la courbe « Chebyshev » correspond aux nœuds
de Chebyshev. Pour analyser le graphique, nous devons prendre en compte le fait que
les données sont fournies aux algorithmes d’interpolation avec seulement 3 chiffres
après la virgule, arrondis au plus proche. Par conséquent, dans la figure 8.16, la ligne
horizontale correspondant à une erreur absolue égale à 10−3 est la ligne de référence.
En effet, l’erreur absolue est, par définition, calculée vis-à-vis de la valeur exacte
et non pas vis-à-vis des valeurs présentées dans les tables 8.1 et 8.2. Ainsi, si une
méthode produit une erreur absolue supérieure à 10 −3, cela signifie que le calcul
produit une erreur supérieure à la précision des données. On observe que l’erreur
est oscillante et atteint son maximum entre deux nœuds d’interpolation. On observe
206 Chapitre 8 • Interpolation

Interpolation
Lin. p. m.
10 −2

Erreur abs.
Équidistant
Chebyshev
10 −3
Spline

10 −4
0 2 4
β

Figure 8.16 – Erreur absolue en fonction de l’indice β de Hasofer-Lind pour diffé-


rentes méthodes d’interpolation.

que l’erreur de l’interpolation linéaire par morceaux est souvent supérieure à l’erreur
produite par les autres méthodes. L’interpolation par polynôme global donne de bons
résultats, mais l’erreur absolue est supérieure à 10−3 sur le bord droit de l’intervalle.
L’erreur de l’interpolation par spline est plus grande sur les bords, ce qui est le résultat
attendu pour la spline naturelle : pour améliorer la précision, il faudrait connaître la
valeur de la dérivée de la fonction aux extrémités. On observe un léger avantage pour
l’interpolation de Chebyshev, qui ne produit jamais une erreur absolue supérieure à
10−3 .
On peut se demander comment évolue l’erreur lorsque le nombre de nœuds d’in-
terpolation augmente. Pour le savoir, nous faisons varier le nombre de nœuds et nous
utilisons les valeurs exactes de la fonction f pour générer les observations, au lieu de
les arrondir à 4 chiffres significatifs comme dans l’expérience précédente. La figure
8.17 présente l’évolution de la norme infinie de l’écart entre la fonction et le polynôme
interpolateur :
kf − P k ∞ = max |f (x) − P (x)|
x∈[a,b]

que nous avons déjà introduite dans la définition 8.7 page 197. Pour évaluer cette
norme, nous avons utilisé une grille régulière associée à un nombre de points d’éva-
luation égal à 100n où n est le nombre de nœuds d’interpolation. On observe que
l’interpolation de Chebyshev converge très rapidement et atteint un minimum pour
n ≥ 20 environ. La précision de l’interpolation linéaire par morceaux est comparable
à celle des splines dans ce cas.

8.11 Conclusion
Nous présentons dans la table 8.4 l’erreur de plusieurs méthodes d’interpolation.
De toute évidence, utiliser les nœuds de Chebyshev permet d’obtenir une erreur ré-
duite. De plus, plus la fonction est régulière, plus le polynôme interpolateur de Che-
byshev est précis. Avec les nœuds de Chebyshev, l’erreur absolue est uniforme sur le
domaine : on peut utiliser l’interpolateur tant à l’intérieur de l’intervalle que sur les
bords. Si on ne peut pas choisir la position des nœuds, l’interpolation polynomiale
globale peut être intéressante, mais peut produire des oscillations sur les bords, en
8.12 • Notes et références 207

Linéaire p. m.
10 −3

kf − P k ∞
Équidistant
−7
10 Chebyshev
10−11 Spline

10 20 30
n

Figure 8.17 – Convergence de l’erreur absolue en fonction du nombre de nœuds


d’interpolation.

Méthode Hypothèse Erreur


Poly. avec n nœuds de Chebyshev f ∈ Cr([−1, 1]) O(n −r)
 (n)  (xn−x 1 )n
Poly. avec n nœuds équi. f ∈ Cn([x 1 , xn ]) f 
∞ n! 
kf (2)k∞ xn−x 1 2
Linéaire p. [Link] n nœuds équi. f ∈ Cn([x 1 , xn ]) 8 n−1
 (2)  (x2 −x1) 2
Linéaire avec 2 nœuds x1 < x 2 f ∈ C 2 ([x1 , x 2 ]) f 
8
 ∞   x −x  4
5  (4)
Spline complète avec n nœuds équi. f ∈ C4 ([x1 , x n]) 384 f ∞
n
n−1
1

Table 8.4 – Erreur kf − P k∞ de plusieurs méthodes d’interpolation.

particulier si les dérivées de la fonction f ne sont pas bornées. Dans ce contexte, il


peut être prudent d’utiliser l’interpolateur polynomial global à l’intérieur du domaine,
mais pas au voisinage des bords. Si des oscillations apparaissent, alors on peut utiliser
soit l’interpolation linéaire par morceaux, soit les splines. Une des limites de l’interpo-
lation linéaire par morceaux est que les nœuds doivent être relativement rapprochés,
faute de quoi l’erreur peut devenir importante entre deux nœuds. L’interpolation par
spline cubique peut être une alternative intéressante pour améliorer la précision, mais
l’erreur peut être plus importante aux extrémités du domaine si on utilise la spline
naturelle. C’est la raison pour laquelle l’erreur présentée pour la spline complète dans
la table 8.4 ne peut pas être atteinte pour la spline naturelle.
Les méthodes d’interpolation polynomiales sont la base des méthodes de Newton-
Cotes pour l’intégration numérique et c’est la raison pour laquelle nous reviendrons sur
ce sujet dans le chapitre 11 sur l’intégration. Pour aller plus loin sur ce sujet, on peut
approfondir l’interpolation par les polynômes de Chebyshev41 et, plus généralement,
par des polynômes orthogonaux. Nous reviendrons sur ce thème dans la conclusion
du chapitre sur l’intégration.

8.12 Notes et références


Les figures 8.6 et 8.7 sont inspirées de [104] chapitre 3, avec des modifications. En
particulier, nous avons généré ces figures en Python. La figure 8.1 est inspirée de [81]3
41 Voir [98] page 150.
208 Chapitre 8 • Interpolation

polynomial_interpolation Évalue le polynôme interpolateur


piecewise_linear Interpolation linéaire par morceaux
spline_interpolation Interpolation par spline
spline_slopes_not_a_knot Pentes de la spline not-a-knot
spline_slopes_natural Pentes de la spline naturelle
tridiagonal_solve Résout un système d’équations
linéaires tridiagonal
compute_Chebyshev_roots Racines du polynôme de Chebyshev
compute_Chebyshev_polynomial Évalue le polynôme de Chebyshev
compute_Chebyshev_extremas Extremums du polynôme de Chebyshev

Table 8.5 – Fonctions du module [Link].

page 104, avec des modifications. Abramowitz et Stegun [2] consacrent le chapitre 25
sur le thème « Numerical interpolation, differentiation and integration » page 884.
Plus de détails sur le thème du conditionnement de l’interpolation polynomiale sont
présentés dans [141], chapitre 9 « Interpolation », section 9.3.8 « The conditioning of
polynomial interpolation ». L’interpolation par la méthode des différences divisées et la
formulation de Newton du polynôme interpolateur est approfondie dans [49], section
« Newton’s formula » page 93. On peut consulter [115], chapitre 8, « Polynomial
interpolation » page 333. La démonstration du théorème 8.12 est donnée dans [122],
section 3.2 « More error bounds » page 90. Elle est présentée dans [115], section
8.1.2 « Drawbacks of polynomial interpolation on equally spaced nodes and Runge’s
counterexample » page 330. Sur ce thème, on peut consulter [125].
Dans la section 8.4, nous avons brièvement évoqué l’utilisation des polynômes de
Chebyshev pour l’interpolation. Une présentation des polynômes de Chebyshev est
disponible dans [28], page 198. L’utilisation des nœuds de Chebyshev pour l’interpo-
lation est présentée dans [49], page 86. Le thème des polynômes de Chebyshev et en
particulier l’interpolation est présenté en détail dans [98]. Nous avons introduit les
splines dans la section 8.9. Celles-ci sont présentées brièvement dans [115] page 355,
plus longuement dans [28], page 417 et en détail dans [51], section 3.3, page 168. Une
introduction complète aux splines, beaucoup plus développée que le présent texte, est
présentée dans [13].
La table 8.5 présente les fonctions du module [Link] développé pour ce livre.

8.13 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.

Exercice 8.1 (Un exemple d’interpolation simple) On considère les données suivantes.
xk -1 0 1 2
yk 1 -1 -1 1
1. Calculer la matrice de Vandermonde associée à ces abscisses.
2. Écrire le système d’équations linéaires satisfait par les coefficients du polynôme inter-
polant.
8.13 • Exercices 209

3. À l’aide de Python, calculer la solution du système d’équations linéaires et écrire le


polynôme interpolant.

Exercice 8.2 (Polynôme interpolant deux points) Soient x 1, y 1 , x2 , y2 ∈ R des réels tels
que x1 < x2 . On recherche les coefficients a et b d’une droite d’équation P (x) = ax + b pour
x ∈ [x1 , x2] telle que P (x 1) = y 1 et P (x 2 ) = y2 .
1. Montrer que les coefficients satisfont le système d’équations :

ax 1 + b = y1 (8.30)
ax 2 + b = y2 . (8.31)

2. Montrer que la solution de système d’équations est :


y2 − y1
a = (8.32)
x2 − x1
y2 − y 1
b = y1 − x1 . (8.33)
x2 − x1
3. Exprimer alors le polynôme sous la forme :
x − x2 x − x1
P (x) = y1 + y 2. (8.34)
x1 − x2 x 2 − x1

L’exercice qui va suivre fait usage du théorème suivant.

Théorème 8.15 (Théorème fondamental de l’algèbre). Soit P un polynôme non nul de degré
n à coefficients complexes. Alors P possède, en comptant les racines multiples, exactement
n racines.

* Exercice 8.3 (Polynôme interpolant n points) On suppose que x1, x2, ..., x n sont des
réels strictement différents et que y 1, y 2, ..., yn sont n réels. Pour k = 1, ..., n, on définit le
polynôme Lk par l’équation 8.5 pour tout réel x ∈ [ x1 , x n]. Ainsi, par définition, le polynôme
interpolant de Lagrange est défini par l’équation 8.6, page 181 pour tout réel x ∈ [x 1, xn].
1. Montrer que, pour k = 1, ..., n, on a Lk(x k) = 1.
2. Montrer que, pour tout m, k ∈ {1, ..., n} tels que m 6= k , on a Lk (xm ) = 0.
3. En déduire que le polynôme de Lagrange est interpolant, c’est-à-dire qu’il vérifie l’équa-
tion P (xm ) = ym pour m = 1, ..., n.
4. En déduire qu’il est unique. Indication. Utiliser le théorème 8.15.

Exercice 8.4 (Droite d’interpolation) Démontrer le théorème 8.1.

Exercice 8.5 (Coefficients du polynôme interpolant) Démontrer le théorème 8.4.

Exercice 8.6 (Interpolation linéaire par morceaux) Démontrer le théorème 8.6.


Dans l’exercice suivant, nous démontrons la formule de Taylor pour l’interpolation, c’est-
à-dire le théorème 8.7 page 193. Cette démonstration fait appel au théorème de Rolle (théo-
rème 3.2, page 39). Souvent associé au théorème de Rolle, nous présentons ci-dessous le
théorème de la valeur moyenne.

Théorème 8.16 (Théorème de la valeur moyenne). Soit f une fonction de classe C1 sur
l’intervalle [a, b]. Alors, il existe un réel ξ ∈]a, b[ tel que :
f (b) − f (a)
= f0 (ξ ).
b−a
210 Chapitre 8 • Interpolation

Le théorème précédent est démontré dans [9], section 6.2 « The mean value theorem »
et ne sera pas démontré dans ce document. Le théorème suivant est l’analogue du théorème
3.8 page 46 utilisé pour la démonstration de la formule de Taylor.

Théorème 8.17 (Théorème de super-Rolle pour les zéros). Soit n ≥ 1 et soit F ∈ C n([a, b]).
Supposons que la fonction F possède n + 1 zéros distincts, c’est-à-dire supposons qu’il existe
ξ 1, ξ2 , ..., ξ n+1 ∈ [a, b] avec ξ1 < ξ2 < ... < ξ n+1 tels que F (ξi ) = 0 pour i = 1, ..., n + 1. Alors
la fonction F (n) possède un zéro dans l’intervalle ]a, b[ c’est-à-dire qu’il existe ξ ∈]a, b[ tel
que F (n)(ξ ) = 0.

** Exercice 8.7 (Théorème de super-Rolle pour les zéros) Démontrer le théorème 8.17.
Indication. Utiliser le théorème de Rolle 3.2.

** Exercice 8.8 (Formule de Taylor pour l’interpolation) On souhaite démontrer le


théorème 8.7 page 193, c’est-à-dire démontrer que l’équation 8.17 est satisfaite.
1. Montrer que l’égalité 8.17 est satisfaite pour x = xi, pour i = 1, 2, ..., n.
2. Dans la suite, on suppose que x 6= xi, pour i = 1, 2, ..., n. Cela implique ω n(x) 6= 0.
Puisque le réel x est fixé, il existe nécessairement une constante c ∈ R telle que f (x) =
P (x) + cωn (x). En effet, si l’on inverse l’égalité précédente, on obtient c = f (xω)− P (x)
n(x)
.
On considère la fonction F définie par F (t) = f (t)− P (t)− cωn(t) pour tout t ∈ [x1, x n ].
Montrer que x est un zéro de F .
3. Montrer que, pour i = 1, 2, ..., n, le point x i est un zéro de F .
4. En déduire l’égalité 8.17. Indication. Utiliser le théorème 8.17 pour montrer que F (n)
possède un zéro.

Exercice 8.9 (Constante de Lebesgue et interpolation) Démontrer le théorème 8.12.

** Exercice 8.10 (Majoration de l’erreur : cas équidistant) Démontrer le théorème 8.8.

** Exercice 8.11 (Majoration du polynôme nodal dans le cas équidistant)


Soient x1, x 2, ..., xn ∈ R un ensemble de n points tels que :

xi = x 1 + h(i − 1) (8.37)

pour i = 1, 2, ..., n, où h est la longueur constante de chaque intervalle h = xnn−1


−x 1
. Soit
W n = kω n k∞ où ωn est le polynôme nodal et k · k ∞ est la norme infinie introduite dans la
définition 8.7.
1. On considère la variable s définie par :
x − x1
s=1+ (8.38)
h
pour tout x ∈ [ x1 , xn ]. Cela implique que s ∈ [1, n]. Montrer que :
 n n
Y
xn − x1
Wn = max |s − j |. (8.39)
n−1 s∈[1,n]
j=1

2. Par récurrence sur n, montrer que, pour tout n ≥ 2, on a :

i!(n − i)! ≤ (n − 1)! (8.40)

pour i = 1, ..., n − 1.
8.13 • Exercices 211

3. Montrer que :
Y
n
(n − 1)!
|s − j | ≤ (8.41)
4
j=1

et en déduire que :
x n
n− x1 (n − 1)!
Wn ≤ . (8.42)
n−1 4

** Exercice 8.12 (Majoration de l’erreur : cas équidistant) Démontrer le théorème 8.10.

** Exercice 8.13 (Conditionnement de l’interpolation) Démontrer le théorème 8.13.


Chapitre 9

Différentiation

Étant donné une fonction réelle f , l’objectif des méthodes que nous présentons
dans ce chapitre est de calculer une approximation de f 0 (x). Dans ce but, nous fai-
sons l’hypothèse que l’on peut évaluer f (x) pour tout x ∈ R mais pas f 0 (x), sinon la
méthode n’a pas d’intérêt. De plus, on recherche une approximation de f 0(x) aussi pré-
cise que possible. Il y a plusieurs méthodes numériques dans lesquelles on peut avoir
besoin d’évaluer des dérivées. Par exemple, considérons la résolution d’une équation
non-linéaire, que nous introduirons dans le chapitre 13. Cela signifie que l’on recherche
un point x tel que f (x) = 0. Dans ce cas, on a parfois besoin de la dérivée première
f 0 (x), en particulier lorsqu’on utilise la méthode de Newton. En optimisation numé-
rique, lorsqu’on cherche le point x minimisant la fonction f , on peut avoir besoin de
la dérivée première f 0(x) (et, dans certains cas, de f 00(x)), comme nous l’étudierons
dans le chapitre 14.
Pour cela, nous allons analyser les méthodes de différences finies pour approcher
la dérivée première f 0 (et éventuellement la dérivée seconde f 00) d’une fonction f
donnée. De plus, nous présentons la méthode permettant d’obtenir ces formules de
différences finies. Enfin, nous considérons la limitation de la précision pour le calcul
de f 0 due à l’utilisation des nombres à virgule flottante que nous avons présentés dans
le chapitre 4.
L’interpolation polynomiale, introduite dans le chapitre 8, est liée aux deux mé-
thodes que sont d’une part la différentiation et d’autre part l’intégration. Première-
ment, pour obtenir les formules de différences finies, on peut se fonder sur la méthode
suivante qui montre le lien entre l’interpolation et la différentiation. On commence
par déterminer le polynôme interpolateur de la fonction f en certains points, en uti-
lisant par exemple les méthodes présentées dans le chapitre 8. Puis on approche la
dérivée f0 (x) par la dérivée du polynôme. Si le polynôme interpolateur est une bonne
approximation de la fonction, alors la dérivée du polynôme interpolateur est une ap-
proximation satisfaisante de la dérivée de la fonction. C’est l’approche présentée dans
l’exercice 9.16. Deuxièmement, nous étudierons le lien entre interpolation et intégra-
tion dans le chapitre 11 consacré à ce sujet.
Avant de détailler les méthodes, il est important de voir les particularités du calcul
de la dérivée. La dérivée est la pente locale d’une fonction. La figure 9.1 présente le
lien entre la dérivée d’une fonction et la tangente en un point. Elle montre la droite

213
214 Chapitre 9 • Différentiation

Tangente de sin au point a = 2

1 f (x) = sin(x)
f (a) + (x − a)f 0(a)

y
0
−1
0.0 2.5 5.0
x

Figure 9.1 – Lien entre la dérivée d’une fonction et la tangente en un point.

tangente à la fonction f au point a. L’équation de cette droite est :

y(x) = f (a) + (x − a)f 0 (a).

La pente de la droite est f 0 (a), c’est-à-dire la dérivée de f en x = a. L’équation


précédente est la troncature de la formule de Taylor à l’ordre 1 appliquée à la fonction
f au point a. Dans l’exemple suivant, nous observons la pente de la fonction sinus.
Exemple 9.1 (Tangente). On considère la fonction f (x) = sin(x) pour tout x ∈ R
et le point a = 2. La tangente de la fonction f au point a est :

y(x) = sin(a) + (x − a) cos(a)

pour tout x ∈ R. Le script suivant produit la figure 9.11 .


1 import numpy as np
2 import pylab as pl
3

4 # Fonction
5 x = np . li nspace (0.0 , 2.0 * np . pi )
6 y = np . sin (x )
7 # Tangente
8 a = 2.0
9 t = np . sin (a ) + (x - a) * np . cos (a)
10 # Graphiq ue
11 pl . figure ()
12 pl . plot (x , y , " -" , label = "f (x )= sin (x )" )
13 pl . plot (x , t , " --" , label = "f (a ) +( x -a )f ’( a) " )
14 pl . xlabel ( "x " )
15 pl . ylabel ( "y " )
16 pl . legend ()

La définition suivante introduit la dérivée comme limite d’une pente.


Définition 9.1 (Dérivée). Soit f une fonction réelle continue et dérivable sur un
intervalle [a, b]. Alors, pour tout x ∈ [a, b], la dérivée de f en x est :
f (x + h) − f (x)
f 0 (x) = lim .
h→0 h
1Script Python : Diff/Scripts/Py3/[Link].
215

Sécante de sin au point a = 2 avec h = 1


2.5
f (x) = sin(x)
f (a) + (x − a)f 0(a)
y
0.0
a a+h f (a) + (x − a)d
−2.5
0.0 2.5 5.0
x

Figure 9.2 – Calcul de la dérivée comme limite de la pente de la tangente en un


point.

La figure 9.2 présente le calcul de la dérivée comme limite de la pente de la tangente


en un point. La droite sécante coupe la courbe de la fonction f aux points x et x + h.
Lorsque h tend vers zéro, la sécante tend vers la courbe tangente de f en x. Dans
l’exemple suivant, on observe la différence entre la dérivée et une approximation de
la pente par une différence finie.
Exemple 9.2 (Tangente). On considère la fonction f (x) = sin(x) pour tout x ∈ R,
le point a = 2 et le pas de différentiation h = 1. La sécante de la fonction f au point
a est :
y(x) = f (a) + (x − a)d
pour tout x ∈ R où d est la différence finie :
f (a + h) − f (a)
d= .
h
On complète le script précédent avec les instructions suivantes2 , ce qui produit la
figure 9.2.
1 h = 1.0
2 d = ( np . sin ( a + h) - np . sin (a) ) / h
3 s = np . sin (a ) + (x - a) * d
4 pl . plot (x , s , ": " , label = "f (a ) +( x - a) d" )

La différentiation et l’intégration sont des problèmes très différents du point de


vue de la régularité du résultat. En effet, la différentiation peut faire apparaître des
discontinuités, de telle sorte que f peut être continue et f 0 discontinue. Au contraire,
l’intégration régularise, c’est-à-dire que la primitive de f est toujours plus régulière
que la fonction f . Ce lien apparaît plus clairement dans le théorème suivant.
Théorème 9.1 (Théorème fondamental de l’analyse). Soif f une fonction réelle
continue et intégrable sur un intervalle [a, b]. Soit F la fonction définie par :
Z x
F (x) = f (t)dt.
a

Alors la fonction F est continue sur [a, b], différentiable sur (a, b) et F 0 (x) = f (x)
pour tout x ∈ (a, b).
2Script Python : Diff/Scripts/Py3/[Link].
216 Chapitre 9 • Différentiation

P(x)
P'(x)
Différentiation

Intégration
P'''(x) P''(x)
x

Figure 9.3 – Lien entre la différentiation et l’intégration dans le cas particulier d’un
polynôme de degré 3 par morceaux (une spline).

C’est pourquoi les fonctions F et F 0 = f sont continues. En conséquence, la fonc-


tion F est plus « régulière » ou plus « douce » que f au sens où elle possède plus de
dérivées. La figure 9.3 présente le lien entre la différentiation et l’intégration dans le
cas particulier d’un polynôme de degré trois par morceaux. Plus précisément, il s’agit
d’une spline cubique, une méthode d’interpolation fondée sur des polynômes cubiques
locaux. On observe que P est une fonction qui semble régulière. En dérivant, la fonc-
tion P 0(x) apparaît encore régulière, mais la fonction P 00 (x) est linéaire par morceaux
et la dérivée troisième est constante par morceau. En sens inverse, si on intègre la fonc-
tion P 000 (x), on obtient la fonction P 00(x), qui est continue. En continuant à intégrer,
on obtient une fonction P 0(x) encore plus régulière et ainsi de suite.

9.1 Différences finies


Dans cette section, nous analysons les formules de différences finies pour f 0 et
f 00 et, en particulier, les formules décentrées et centrées d’ordre 1 et 2. Puis nous
définissons l’ordre de précision d’une formule de différence finie et nous observons
expérimentalement la précision obtenue sur des exemples.
Dans les équations qui vont suivre, nous utilisons le pas de différentiation h > 0.
Nous faisons l’hypothèse, pour le moment, que ce paramètre est donné par l’utilisa-
teur. Nous verrons dans la section 9.2 un critère qui permet déterminer ce paramètre
de manière optimale. Le théorème suivant présente plusieurs formules de différences
finies pour la dérivée première et la dérivée seconde.
Théorème 9.2 (Formules pour f 0 et f 00 ). Pour tout x ∈ R,
— si f est de classe C 3 (R), alors on a la formule décentrée à droite :
f (x + h) − f (x) h
f0 (x) = − f 00(x) + O(h 2) (9.1)
h 2
lorsque h → 0 ;
— si f est de classe C 4 (R), on a la formule centrée :

0 f (x + h) − f (x − h) h 2 (3)
f (x) = − f (x) + O(h 3) (9.2)
2h 6
9.1 • Différences finies 217

quand h → 0 ;
— si f est de classe C 5(R), on a la formule centrée :

f 00(x)
f (x + h) − 2f (x) + f (x − h) h2 (4)
= − f (x) + O(h3 ) (9.3)
h2 12
quand h → 0.
La preuve de ce théorème est donnée dans l’exercice 9.1.
Remarque 9.1 (Hypothèses de régularité). Dans le théorème précédent, nous avons
fait l’hypothèse d’une régularité supérieure à celle strictement requise pour obtenir
le terme d’erreur. Par exemple, l’équation 9.1 nécessite que f ∈ C3 (R). De manière
moins contraignante, si f ∈ C2 (R), on a :

f (x + h) − f (x)
f 0 (x) = + O(h)
h
lorsque h → 0. L’avantage du théorème 9.2 est de présenter l’expression détaillée de
l’erreur, ce qui sera utile dans la suite pour obtenir des formules de différences finies
de précision supérieure.
Dans la remarque suivante, nous analysons pourquoi une variante de l’équation
9.1 peut être utilisée dans le cas où la fonction f est définie sur un intervalle borné.
Remarque 9.2 (Utilité des formules décentrées pour les fonctions définies sur un inter-
valle). La formule décentrée à gauche s’obtient en considérant la formule décentrée à
droite avec le pas −h :
f (x) − f (x − h) h 00
f 0 (x) = + f (x) + O(h 2) (9.4)
h 2
lorsque h → 0. Les formules décentrées à droite 9.1 et à gauche 9.4 peuvent être
utile lorsque le domaine de définition de la fonction f empêche l’évaluation du point
x + h ou x − h. Par exemple, si la fonction f est définie sur l’intervalle [a, b] et qu’on
souhaite évaluer une approximation de f 0(a) on peut utiliser l’équation 9.1 tandis que
l’équation 9.4 peut être utilisée pour approcher f 0 (b).
Le mot stencil en anglais signifie pochoir. Le stencil d’une formule de différence
finie est une image qui représente les abscisses des points x où la fonction f est évaluée.
La figure 9.4 présente le stencil de trois formules de différences finies pour le calcul de
f 0 . Les points où f est évaluée sont représentés par des cercles vides. Les formules de
différences finies se distinguent par leur erreur, ce que l’on mesure en termes d’ordre
de précision.
Définition 9.2 (Ordre de précision). Pour tout réel x, la formule de différence finie
dh f (x) pour le calcul de f 0(x) est d’ordre p au point x si :

f 0 (x) = d hf (x) + O(hp ) quand h → 0.

La définition précédente signifie que l’erreur absolue entre dh f (x) et f 0 (x) est
d’ordre hp . Dans les deux exemples qui suivent, nous appliquons la définition précé-
dente à des formules de différences finies pour la dérivée première.
218 Chapitre 9 • Différentiation

Décentrée à Décentrée à Centrée


gauche droite

x-h x x x+h x-h x x+h


Figure 9.4 – Points d’évaluation de la fonction f de trois formules de différences
finies pour le calcul de f 0 .

Exemple 9.3 (Ordre de précision de la formule décentrée à droite). Pour la formule


décentrée à droite, on a :
f (x + h) − f (x)
d h f (x) = (9.5)
h
et le théorème 9.2 montre que la formule décentrée est d’ordre 1, puisque f 0 (x) =
dh f (x) + O(h) lorsque h → 0.
Exemple 9.4 (Ordre de précision de la formule centrée). Pour la formule centrée,
on a :
f (x + h) − f (x − h)
dh f (x) = (9.6)
2h
et le théorème 9.2 montre que la formule centrée est d’ordre 2, puisque f 0 (x) =
dh f (x) + O(h2 ) lorsque h → 0. La formule centrée d’ordre 2 est donc plus précise que
la formule décentrée à droite d’ordre 1.
Dans l’exemple suivant, nous mettons en œuvre les formules de différences finies
pour la dérivée première en Python.
Exemple 9.5 (Utilisation de formules de différences finies pour f 0 ). Dans le script
suivant3, on expérimente les formules de différences finies décentrées et centrées pour
approcher la dérivée de la fonction y = sin(x) au point x = 1. On utilise le pas
h = 10 −4. Dans ce script, nous utilisons la fonction computeDigits du module floats
(développé pour ce cours) qui évalue le nombre de chiffres corrects au sens de la log-
erreur relative en base 10.
1 import numpy as np
2 from floats import co mput eDigi ts
3 x = 1.0
4 h = 1.0e -4
5 g = ( np . sin ( x + h) - np. sin ( x) ) / h
6 print ( "g =" , g)
7 exact = np . cos (x)
8 print ( " exact = " , exact )
9 d = comp uteD igit s (exact , g , 10)
10 print ( "d =" , d)
Le script précédent affiche les résultats suivants :
1 g= 0.5403
2 exact = 0.5403
3 d= 4.109
3Script Python : Diff/Scripts/Py3/[Link].
9.2 • Limitation de la précision 219

Si on utilise une formule centrée avec le script suivant :


1 g = ( np . sin ( x + h) - np. sin ( x - h) ) / (2.0 * h )
2 print ( "g =" , g)
3 d = comp uteD igit s (exact , g , 10)
4 print ( "d =" , d)

on obtient :
1 g= 0.5403
2 d= 8.778

On observe que la formule de différence centrée est plus précise que la formule décen-
trée puisqu’on obtient plus de 8 chiffres corrects avec la formule d’ordre 2 alors qu’on
obtient seulement 4 chiffres corrects avec la formule d’ordre 1.

Décrivons maintenant la méthode générale pour obtenir une formule de différence


finie d’ordre p pour la dérivée d’ordre d. Soit f ∈ C(d+p) (R) une fonction et soit
x ∈ R un point où nous souhaitons approcher la dérivée f (d) (x). On obtient une
approximation de la dérivée f (d) en considérant le développement de Taylor :

hd (d)
f (x + h) = f (x) + hf 0(x) + . . . + f (x) + . . .
d!
h d+p  
+ f (d+p) (x) + O hd+p+1
(d + p)!

quand h → 0. En réalisant des combinaisons linéaires des expressions précédentes pour


différentes valeurs du pas h, on peut éliminer les premiers termes de ce développement
de Taylor et ne conserver que f (d) (x). Le premier terme que l’on ne peut éliminer,
d+p
noté (hd+p)! f (d+p)(x) dans l’expression précédente, détermine l’ordre de précision de
la formule de différence finie. De plus, l’expression de la formule de différence finie
d
implique nécessairement de diviser par hd! pour obtenir une approximation de f (d) (x).
d+p
Pour cette raison, la formule de différence finie est d’ordre hhd = h p, c’est-à-dire
d’ordre p. Par exemple, l’équation 9.2 correspond au cas où d = 1 et p = 2. De même,
l’équation 9.3 correspond au cas où d = 2 et p = 2.
Les équations du théorème 9.2 montrent que, en théorie, plus h est petit, plus
l’erreur est petite. En pratique, lorsqu’on fait des calculs avec des nombres à virgule
flottante, nous allons voir dans la section suivante qu’on ne peut pas choisir h trop
petit.

9.2 Limitation de la précision


L’analyse présentée dans la section précédente est correcte si on réalise les calculs
en arithmétique exacte, mais pas si on utilise des nombres à virgule flottante. En
effet, nous allons voir dans cette section que les erreurs d’arrondi peuvent dominer si
le pas de différentiation h est très petit. En d’autres termes, l’erreur d’une formule
de différentiation est limitée par un compromis dans lequel h ne doit être ni trop
petit, ni trop grand. Dans cette section, nous calculons le pas h optimal pour évaluer
la dérivée première par une formule de différence finie à droite lorsqu’on utilise des
nombres à virgule flottante. Nous analyserons en détail l’origine de la limitation dans
220 Chapitre 9 • Différentiation

Calcul de f 0 par différences finies


10−2 Observé
Modèle

eabs
10−6

10 −10 10−4
h

Figure 9.5 – Erreur absolue en fonction du pas de discrétisation h.

la section 9.3. Puis, dans la section 9.4, nous analyserons le conditionnement des for-
mules de différences finies, ce qui permettra d’interpréter le problème comme un effet
de la sensibilité du résultat vis-à-vis de perturbations dans la valeur de la fonction.
La manière d’implémenter la formule de différences finies compte beaucoup dans la
précision du résultat. Nous analyserons dans la section 9.5 comment évaluer le pas
de différentiation pour diminuer l’effet des erreurs d’arrondi dans la représentation
du pas h par un nombre à virgule flottante. Dans l’exemple suivant, nous observons
l’erreur absolue associée à la formule de différence finie pour l’approximation d’une
dérivée première. Comme nous allons le voir, l’erreur absolue peut augmenter si le
pas de différentiation h est trop petit.

Exemple 9.6. On considère la fonction f (x) = x2 pour tout x ∈ R. Sa dérivée est


f 0 (x) = 2x pour tout réel x. On considère le point x = 1 et on prend des pas de
différentiation h de plus en plus petits. Plus précisément, on prend les pas h = 10−1 ,
10−2 , etc. On évalue la formule de différence finie à droite grâce à l’équation 9.5 et
on calcule l’erreur absolue eabs(h) = |dh f (x) − f 0 (x)|. La figure 9.54 présente l’erreur
absolue en fonction du pas de différentiation h en échelle logarithmique. En lisant le
graphique de la droite vers la gauche, on observe que, lorsque le pas de différentiation h
diminue, l’erreur absolue commence par diminuer, puis augmente à nouveau. L’erreur
absolue minimale est atteinte pour h ≈ 10 −8 . Lorsque h est trop grand (h > 1) ou
trop petit (h < 10−16 ), alors l’erreur absolue est plus grande que 1 environ. Comme la
valeur exacte est f 0 (1) = 2, cela implique qu’il n’y a aucun chiffre significatif correct
dans le résultat évalué par la formule de différence finie. La courbe en pointillés
représente le modèle d’erreur que nous analyserons par la suite. Tandis que la partie
droite de la figure montre une évolution régulière, on observe que la partie gauche
présente une variation qui semble moins régulière, voire aléatoire. La cause de ce
phénomène est analysée plus en détail dans la démonstration de l’exercice 9.15.

Pour comprendre l’exemple précédent, nous allons analyser l’erreur associée à une
formule de différence finie. Considérons la formule décentrée et l’équation 9.1. L’erreur
d’évaluation de la formule de différence finie est, sous l’hypothèse que la fonction f
4Script Python : Diff/Scripts/Py3/[Link].
9.2 • Limitation de la précision 221

est évaluée de manière exacte, c’est-à-dire sans erreurs d’arrondis :


 
f (x + h) − f (x) 
e abs (h) =  − f (x)
0
h
 
h 00 
=  f (x) + O(h )
2
2

pour tout h > 0. Par conséquent, l’erreur absolue asymptotique, égale à h2|f 00 (x)|,
tend vers zéro lorsque h → 0. On voit que l’analyse que nous venons de mener ne
permet pas d’expliquer la figure 9.5. Dans l’évaluation de la formule de différence
finie, il y a deux sortes d’erreurs. D’une part, l’erreur de troncature existe, car on
considère un nombre limité de termes dans la formule de Taylor. Par exemple, dans
la formule décentrée à droite d’ordre un, on a ignoré le terme d’ordre deux. L’erreur
d’évaluation de f apparaît, d’autre part, lorsqu’on fait des calculs avec des nombres à
virgule flottante, car la fonction f est évaluée avec une précision limitée. Par exemple,
avec des doubles, la précision maximum sur les nombres x est généralement d’environ
16 chiffres décimaux (certains x sont représentés de manière exacte, mais ils sont
relativement peu nombreux). De même, l’erreur d’évaluation sur f (x) mène à une
précision inférieure ou égale à environ 16 chiffres décimaux√ corrects : certains f (x)
peuvent être évalués de manière exacte (par exemple 4 = 2) mais d’autres le sont
de manière beaucoup moins précise.
On peut comprendre l’influence des erreurs en considérant la fonction approchée
f˜(x) = f (x) + (x) au lieu de f (x) où (x) est la différence d’évaluation de la fonction
f . Cela implique que la formule de différence finie appliquée à la fonction perturbée
f˜ est :

(f (x + h) +  1) − (f (x) + 2)
d hf˜(x) =
h
f (x + h) − f (x)  1 − 2
= +
h h
où 1 = (x + h) et 2 = (x) sont les différences d’évaluation de f en x + h et x. Par
conséquent, la différence dûe à l’arrondi, égale à 1 −
h , peut devenir grande lorsque
2

h → 0. On peut formaliser la démonstration plus rigoureusement, ce qui mène au


théorème suivant.

Théorème 9.3 (Erreur absolue asymptotique pour la formule de différence finie


décentrée). Soit f ∈ C 3(R). Soit x ∈ R un réel tel que f (x) =
6 0 et f 00(x) =
6 0. Pour
tout h > 0, on considère la formule de différence finie donnée par l’équation 9.1. On
fait les hypothèses suivantes.
H1 La représentation flottante de x est exacte : fl(x) = x.
H2 La représentation flottante de h est exacte : fl(h) = h.
H3 La représentation flottante de la somme x + h est exacte : fl(x + h) = fl(x)+fl(h).
H4 La représentation flottante de la valeur de f est :

fl(f (x)) = f (x)(1 + δ ) (9.7)

pour tout x ∈ R avec |δ| ≤  où  > 0 est indépendant de x.


222 Chapitre 9 • Différentiation

H5 La représentation flottante de la différence entre fl(f (x + h)) et fl(x) est exacte :

f l (f (x + h) − f (x)) = fl(f (x + h)) − fl(f (x)).

H6 La division par h est exacte.


Soit e abs(h) l’erreur totale entre la représentation flottante de la formule de diffé-
rence finie et la dérivée exacte, c’est-à-dire e abs (h) = | fl(dhf (x)) − f 0 (x)| pour tout
h > 0. L’erreur précédente se décompose entre une erreur d’arrondi et une erreur
de troncature de la manière suivante. Soit er (h) l’erreur d’arrondi entre la repré-
sentation flottante de la formule de différence finie et sa valeur exacte, c’est-à-dire
e r (h) = | fl(d hf (x)) − dh f (x)| où :
 
f (x + h) − f (x)
fl(dh f (x)) = f l
h

pour tout h > 0. Soit et (h) l’erreur de troncature entre la valeur exacte de la formule
de différence finie et la dérivée exacte, c’est-à-dire et (h) = |dh f (x) − f 0 (x)| pour tout
h > 0. Alors l’erreur absolue d’arrondi asymptotique est :

2|f (x)|
e r (h) = (9.8)
h
l’erreur de troncature asymptotique est :

|f 00 (x)|h
et(h) = (9.9)
2
et l’erreur absolue asymptotique (totale) est :

2|f (x)| |f 00 (x)|h


eabs (h) = + (9.10)
h 2
pour tout h > 0.
L’équation 9.7 implique que l’erreur relative d’évaluation de f est |δ| et que cette
erreur est inférieure à  pour tout x. Si f (x) = 0, alors on doit utiliser une erreur
absolue, ce qui mène à l’équation fl(f (x)) = f (x) + δ où |δ| ≤ . Sous cette hypothèse,
l’équation 9.10 devient :

2 |f 00 (x)|h
eabs (h) = + .
h 2
Le théorème précédent est démontré dans l’exercice 9.15. Examinons les hypo-
thèses du théorème 9.3. L’hypothèse H1 semble facile à vérifier en pratique, puisque
la valeur de x est fournie par l’utilisateur sous la forme d’un nombre flottant. L’hypo-
thèse H2 n’est pas toujours vérifiée, car, comme nous allons le voir, le pas h peut être
issu d’un calcul. Toutefois, puisque seul l’ordre de grandeur de h importe, on peut
utiliser une puissance de 2, ce qui mène à une représentation exacte avec des doubles.
L’hypothèse H3 n’est pas nécessairement satisfaite et dépend de l’implémentation de
la formule de différence finie. Nous reviendrons sur ce sujet en détail dans la section
9.5. L’hypothèse H5 montre que la cause profonde du problème n’est pas dans le cal-
cul de la différence entre les valeurs de la fonction, mais dans l’erreur d’évaluation
9.2 • Limitation de la précision 223

de la fonction f : lorsque la différence f (x + h) − f (x) est évaluée, le mal est déjà


fait. En d’autres termes, la difficulté principale n’est pas liée à une erreur d’arrondie
causée par l’opération de différence. Au contraire, même si la différence est évaluée de
manière exacte, ce sont les erreurs qui précèdent qui ont le plus d’impact sur l’erreur
totale, et, en particulier, les erreurs d’évaluation de la fonction f . L’hypothèse H6
pourrait être levée en intégrant une erreur supplémentaire dans le calcul. Toutefois,
cette erreur dans la division est négligeable devant les erreurs d’évaluation de f , de
telle sorte que cela ne changerait que peu de choses dans le résultat.
L’équation 9.7 fait l’hypothèse que l’erreur relative d’évaluation de la fonction f (x)
est |δ |. En pratique, on peut penser que l’erreur relative d’évaluation de f (x) peut être
nulle dans le meilleur des cas, ou très grande dans les cas moins favorables. Dans la
plupart des situations, on peut penser que les fonctions les plus précises sont associées
à une erreur relative qui est un multiple de la précision machine M . Par conséquent,
on pourrait considérer que  = bM , où b est une petite constante. L’équation 9.10 fait
alors apparaître le terme 2|f (x)| = 2b|f (x)|M . En choisissant le paramètre c = 2b,
on obtient le théorème suivant.
Théorème 9.4 (Pas optimal pour la formule de différence finie décentrée). Soit
f ∈ C 2 (R). Soit x ∈ R un réel tel que f (x) 6= 0 et f 00(x) 6= 0. On considère la
formule de différence finie donnée par l’équation 9.1. On suppose que l’erreur totale
est la somme d’un terme représentant l’erreur d’évaluation et d’un terme représentant
l’erreur de troncature :
c|f (x)|M |f 00 (x)|h
eabs (h) = + (9.11)
h 2
où M > 0 est la précision machine et c > 0 est une (petite) constante associée à
l’erreur relative d’évaluation de f et aux coefficients de la formule de différence finie.
Alors le pas h qui minimise l’erreur est :
s
2c|f (x)| √
h? = M . (9.12)
|f 00 (x)|
De plus l’erreur optimale est :
p √
eabs (h? ) = 2c|f (x)||f00 (x)| M . (9.13)
Si 2c|f (x)| ≈ 1 et |f 00(x)| ≈ 1 alors :
√ √
h? ≈ M , eabs (h? ) ≈ M . (9.14)
Cette approximation s’obtient en calculant la dérivée e0abs (h) par dérivation de
l’expression, puis en recherchant le pas h qui annule la dérivée. La démonstration de ce
théorème est donnée dans l’exercice 9.3, page 245. En d’autres termes, l’équation 9.11
fait l’hypothèse que l’erreur absolue d’arrondi lors de l’évaluation de f (x + h) − f (x)
est |f (x)|cM . Dans la remarque suivante, nous analysons le cas particulier dans lequel
la valeur de la fonction est nulle au point x où nous cherchons à approcher la dérivée.
Remarque 9.3 (Si la fonction est nulle). Si f (x) = 0, le théorème précédent ne peut pas
être appliqué directement. Dans ce cas, on peut faire l’hypothèse que l’erreur absolue
d’évaluation est inférieure à cM . Sous cette hypothèse, l’équation 9.12 devient :
s
2c √
h? = M
|f 00 (x)|
224 Chapitre 9 • Différentiation

et l’équation 9.13 devient :


p √
e abs (h? ) = 2c|f 00(x)| M .

Considérons des nombres à virgule flottante sur 64 bits avec 53 bits de précision,
c’est-à-dire des doubles. Sous les hypothèses et les approximations du théorème 9.4,
le pas optimal et l’erreur minimale sont h ≈ 10−8 et eabs (h? ) ≈ 10−8 . Dans l’exemple
suivant, nous montrons que, bien que les hypothèses précédentes ne soient pas toujours
vérifiées, le modèle permet de déterminer le pas optimal dans certains cas.
Exemple 9.7 (Modèle d’erreur pour la fonction sinus). On considère à nouveau les
données de l’exemple 9.5, et nous considérons la formule décentrée. L’équation 9.11
appliquée à la fonction f (x) = sin(x) implique :

c| sin(x)|M | sin(x)|h
eabs (h) = + (9.15)
h 2
pour tout h > 0. Le modèle d’erreur précédent est présenté dans la figure 9.5, page 220.
On observe que le modèle prédit correctement le comportement de l’erreur absolue
dans ce cas particulier et que le pas optimal est effectivement proche de 10 −8.
Le théorème 9.4 indique le pas optimal pour la formule décentrée pour le calcul
de la dérivée première. Dans le théorème suivant, nous généralisons ce résultat pour
l’appliquer à toute formule de différence finie et tout ordre de dérivation.
Théorème 9.5 (Pas optimal pour f (d) (x) par une formule de différence finie). Soient
d ≥ 1 un entier représentant l’ordre de dérivation et p ≥ 1 un entier représentant
l’ordre de précision. Soit f ∈ C d+p (R) une fonction. Soit x ∈ R un réel tel que f (x) =
6
0 et f (x) 6= 0. On considère une formule de différence finie d’ordre de précision
(d)

p pour approcher la dérivée f (d)(x). On suppose que l’erreur totale asymptotique est
la somme d’un terme représentant l’erreur d’évaluation et d’un terme représentant
l’erreur de troncature :
c|f (x)|M |f (d+p) (x)|hp
eabs (h) = + (9.16)
hd b
où M > 0 est la précision machine, c ≥ 1 est une (petite) constante multiplicative
associée à l’erreur d’évaluation de f et b > 0 est un paramètre associé à l’erreur de
troncature de la formule de différence finie. Alors le pas h qui minimise l’erreur est :
  d+1 p
? bcd |f (x)| 1
h = d+p
M . (9.17)
p |f (d+p) (x)|

De plus l’erreur optimale est :


  dd+p
|f (d+p)(x)| d + p  p  d+p d+pp
d
p
?
eabs (h ) = (c|f (x)|) d+p
M . (9.18)
b p d

|f (d+p) (x)| d+p


p  d+
d
Si c|f (x)| ≈ 1, b ≈ 1 et p d
p
≈ 1 alors :
1 p

h ? ≈ M
d+p
, eabs (h ?) ≈ Md+p . (9.19)
9.2 • Limitation de la précision 225

h? e?abs
1/2 1/2
f 0(x) (f (x + h) − f (x))/h O(h) M M
1/3 2/3
f 0(x) (f (x + h) − f (x − h))/(2h) O(h2 ) M M
1/4 1/2
f 00(x) (f (x + h) − 2f (x) + f (x + h))/h2 O(h2 ) M M

Table 9.1 – Ordre de précision, pas optimal et erreur absolue optimale pour plusieurs
formules de différences finies.

La preuve du théorème précédent est donnée dans l’exercice 9.4. Dans la table 9.1,
on présente plusieurs formules de différences finies, ainsi que l’ordre de précision, le pas
optimal et l’erreur absolue obtenue pour ce pas. Les valeurs de h? et e?abs sont exactes,
sous les hypothèses du théorème 9.4. La table permet d’observer les deux mouvements
contraires de ce problème : lorsqu’on utilise une formule d’ordre de précision plus élevé
l’erreur peut être réduite à condition d’utiliser un pas de différentiation plus grand
de telle sorte que l’on puisse réduire l’influence des erreurs d’arrondi. En effet, sous
1/3
les hypothèses du théorème 9.5, le pas utilisé par la formule centrée est M ≈ 10 −6 ,
1/2
ce qui est plus grand que le pas de la formule décentrée, égal à M ≈ 10 −8. Au
2/3
contraire, l’erreur associée à la formule centrée est M ≈ 10−11 , ce qui est plus petit
1/2
que l’erreur associée à la formule décentrée, égale à M ≈ 10 −8. Dans l’exemple
suivant, nous appliquons les formules indiquées dans la table 9.1 pour le calcul de la
dérivée première.
Exemple 9.8 (Utilisation du pas optimal pour la fonction sinus). On considère à
nouveau les données de l’exemple 9.5, mais nous expérimentons cette fois l’influence
du choix du pas optimal. Pour obtenir la précision machine, nous utilisons l’attribut
float_info.epsilon du module sys. Dans le script suivant5 , nous calculons une
approximation g1 de la dérivée première par la formule décentrée en utilisant le pas
indiqué dans la table. De même, nous calculons une approximation g2 par la formule
centrée. Dans les deux cas, nous calculons le nombre de chiffres corrects d1 et d2 par
chacune des deux formules.
1 import sys
2 x = 1.0
3 eps = sys . float _info . epsilo n
4 # Formule d ’ ordre 1
5 h = eps ** (1.0 / 2.0)
6 g1 = ( np . sin (x + h ) - np . sin (x )) / h
7 exact = np . cos (x)
8 d1 = c omput eDig its ( exact , g1 , 10)
9 # Formule d ’ ordre 2
10 h = eps ** (1.0 / 3.0)
11 g2 = ( np . sin (x + h ) - np . sin (x - h) ) / (2.0 * h )
12 d2 = c omput eDig its ( exact , g2 , 10)
Le script précédent produit les valeurs numériques suivantes :
1 h= 1.490 e -08
2 g1 = 0.5403
5Script Python : Diff/Scripts/Py3/[Link].
226 Chapitre 9 • Différentiation

Calcul de f 0 par différences finies

Nb. de chiffres
p=1
10
p=2
p=4
0
−10 0
log10 (h)

Figure 9.6 – Nombre de chiffres corrects par trois formules de différences finies
d’ordre 1, 2 et 4 pour l’approximation de f 0(x).

3 exact = 0.5403
4 d1 = 7.893
5 h= 6.055 e -06
6 g2 = 0.5403
7 d2 = 11.03
On observe que la formule de différence finie centrée utilise désormais le pas h ≈ 10−8 ,
significativement plus petit que celui que nous avions utilisé dans l’exemple 9.5. Cela
produit environ 8 chiffres décimaux significatifs. La formule de différence finie centrée
utilise le pas h ≈ 6 × 10−6, ce qui produit 11 chiffres corrects.
Nous découvrirons par la suite dans les sections 9.6 et 9.7 comment obtenir des
formules de différences finies plus précises. Cela nous permettra d’établir une méthode
de différence finie d’ordre de précision p = 4 pour f0 . Dans la figure 9.6, nous considé-
rons l’approximation de la fonction f (x) = sin(x) au point x = 1 par trois formules de
différences finies d’ordre 1, 2 et 4 pour l’approximation de f 0(x). On observe que le pas
optimal augmente lorsque l’ordre de précision p augmente, ce qui mène à une erreur
absolue plus faible et, par conséquent, à un nombre plus élevé de chiffres corrects. La
formule d’ordre 4 produit environ 14 chiffres corrects si on utilise le pas optimal, ce
qui est très proche du nombre maximal (égal approximativement à 17 chiffres avec
des nombres à virgule flottante sur 64 bits).
La partie gauche de la figure 9.76 présente le pas optimal h? en fonction de l’ordre
de précision p pour différents ordres de dérivation d tandis que la partie droite présente
l’erreur absolue optimale. On observe que, pour un ordre de dérivation d donné, le
pas optimal augmente lorsque l’ordre de précision p augmente, ce qui permet de faire
décroître l’erreur absolue. On observe que, pour un ordre de précision p donné, le pas
optimal augmente lorsque l’ordre d augmente et que l’erreur augmente. En particulier,
pour un ordre de dérivation d = 9, le pas optimal est proche de 10−1 , pour une erreur
absolue entre 10−2 et 10 −8. Cela montre que les formules de différences finies sont
performantes pour des ordres de dérivation d faibles, mais qu’il est difficile d’obtenir
une précision élevée lorsque d augmente. Dans ce cas, le choix du pas optimal h? peut
être problématique.
Le théorème 9.5 pose une difficulté pratique en ce qui concerne les hypothèses qui
(d+p)   d
mènent à l’équation 9.19, c’est-à-dire c|f (x)| ≈ 1, |f b (x)| ≈ 1 et d+ p
p p d+p
d ≈ 1.
6Script Python : Diff/Scripts/Py3/[Link].
9.2 • Limitation de la précision 227

Pas optimal Erreur optimale


d=1
10 −3 10−5
d=3

e?abs
h?

10 −10 d=5
10 −6
d=7
d=9
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
p p

Figure 9.7 – À gauche, pas optimal h? en fonction de l’ordre de précision p pour


différents ordres de dérivation d. À droite, erreur absolue optimale e?abs en fonction
de l’ordre de précision p pour différents ordres de dérivation d.

d+p
p  d+d p
Sensibilité de p d

10 d=1
d=3
y

d=5
0 d=7
1 2 3 4 5 6 7 8 9 d=9
p

d+p  p  d+dp
Figure 9.8 – Facteur p d en fonction de l’ordre de précision p pour différents
ordres de dérivée d.

Le terme le plus problématique est certainement |f (d+p)(x)| puisque, si la dérivée


f (d+p) était connue, alors la dérivée f (d) le serait également et nous n’aurions pas
besoin d’une approximation. Ce n’est pas le seul problème, puisque le paramètre c,
représentant l’erreur d’évaluation de la fonction f est inconnu dans la plupart des cas.
  d
La figure 9.8 montre comment évolue le facteur d+p p pd d+p en fonction de l’ordre de
précision p pour différents ordres de dérivée d. On observe que ce facteur peut être
de l’ordre de 10 pour d = 1 et qu’il est croissant en fonction de p. L’évolution est
p  p  d+p
d
similaire pour les autres valeurs de d et p. En conséquence, le facteur d+p d ne
peut changer l’ordre de grandeur du pas optimal que d’une décade environ.
Résumons ce que nous avons vu jusqu’ici. Dans l’exemple 9.6, nous avons vu
qu’on ne devrait pas choisir un pas h trop petit. Puis, nous avons montré dans le
théorème 9.4 un modèle d’erreur d’une formule de différence finie décentrée pour la
dérivée première, que nous avons étendu dans le théorème 9.5 à une dérivée d’ordre
arbitraire. Nous avons montré dans l’exemple 9.7 que le modèle coïncide avec la réalité.
Enfin, dans l’exemple 9.8, nous avons montré que le pas optimal pour le modèle
permet effectivement d’obtenir une dérivée relativement précise dans ce cas particulier.
Une des limites de l’approche présentée dans cette section est que, bien qu’elle soit
rigoureuse, elle ne permet pas nécessairement de comprendre intuitivement la cause
228 Chapitre 9 • Différentiation

du problème. C’est pourquoi nous prolongeons l’analyse avec deux éléments. Dans la
section 9.3, nous montrons que le problème essentiel est l’évaluation de la différence
de deux nombres flottants très proches. Puis, nous montrons dans la section 9.4 que
l’opérateur de différence finie décentrée est mal conditionné.

9.3 Origine de la limitation de la précision


Dans cette section, nous montrons pourquoi les formules de différences finies
peuvent être imprécises lorsque l’erreur de cancellation domine. Ce phénomène est
similaire à la perte de précision par annulation des chiffres significatifs que nous avons
vue dans la section 5.5 pour l’évaluation de l’expression exp(x) − 1 lorsque x est proche
de zéro.

Soit m ≥ 0 un entier représentant le nombre total de chiffres significatifs et n ≤ m


un second entier. Supposons que f (x) est calculé avec m chiffres significatifs, dont
n sont exacts et m − n sont faux. Par exemple, avec des doubles, on a m ≈ 16
chiffres significatifs en base 10. D’autre part, avec des doubles, le nombre n de chiffres
décimaux faux est souvent entre 0 et 2, mais il peut être, dans certains cas, plus
grand. Le tableau suivant indique le nombre de chiffres exacts et faux dans la valeur
de f (x + h) et f (x). Seuls les chiffres exacts sont détaillés : les chiffres faux sont
représentés par des « * ». On considère d’abord le cas où f (x) est proche de 1, tandis
que f (x + h) est proche de 1.1.
Exacts (n) Faux (m-n)
f (x) 1.0000...0***...
f (x + h) 1.1000...0***...
f (x + h) − f (x) 0.1000...0***...
On observe que la valeur de la différence f (x + h) − f (x) est, dans ce cas, proche de
0.1 : on a perdu seulement 1 chiffre significatif dans l’opération, de telle sorte que le
nombre de chiffres exacts dans f (x + h) − f (x) est égal à n − 1. Le calcul précédent
est une illustration du fait que, si h est grand, alors l’erreur de troncature domine.
Dans le tableau suivant, on considère le cas où f (x + h) = 1.00...1 ∗ ∗ ∗ ..., où le chiffre
« 1 » est le n-ième chiffre et les chiffres suivants sont faux.
Exacts (n) Faux (m-n)
f (x) 1.0000...0***...
f (x + h) 1.0000...1***...
f (x + h) − f (x) 0.0000...1***...
On observe que la valeur de la différence f (x + h) − f (x) est, dans ce cas, proche de
10−n , de telle sorte que le nombre de chiffres exacts dans f (x + h) − f (x) est égal
à 1. En d’autres termes, les valeurs de f (x) et f (x + h) sont tellement proches que
la différence n’a plus qu’un seul chiffre correct, au lieu des n chiffres corrects dans
f (x). Le calcul précédent est une illustration du fait que, si h est petit, alors l’erreur
d’évaluation de f domine.
L’erreur de cancellation est synonyme de mauvais conditionnement de la somme
de deux nombres très proches. En effet, nous avons vu dans la section 5.7 que, si on fait
la somme de deux nombres tels que la somme est proche de zéro, alors le problème est
mal conditionné. Par conséquent, lorsqu’on fait la différence de la valeur de la fonction
9.4 • Conditionnement 229

f en deux points très proches, alors la valeur de la différence peut être sensible à des
perturbations dans la valeur de la fonction. C’est particulièrement le cas lorsque le
pas h est petit. Dans la section suivante, nous allons voir que le conditionnement de
la différentiation peut, en effet, être élevé lorsque le pas h est proche de zéro.

9.4 Conditionnement de la différentiation


Dans cette section, nous analysons le conditionnement de la différentiation numé-
rique. Plus précisément, le théorème suivant analyse le conditionnement de l’opérateur
associé à la formule de différence finie décentrée à droite d’ordre 1.
Théorème 9.6 (Conditionnement de la différentiation). Soit f ∈ C2 (R). On consi-
dère la formule de différences finies décentrée à droite donnée par l’équation :

f (x + h) − f (x)
d hf (x) =
h
pour tout x ∈ R et tout h > 0. Pour tout x ∈ R et tout h > 0, on considère le vecteur :
   
y1 (x, h) f (x)
y(x, h) = = ∈ R2.
y2 (x, h) f (x + h)

On considère l’opérateur D : R2 → R défini par :


y 1 − y2
D(y) =
h
pour tout y ∈ R2 . On considère la norme 2 sur R2. Le conditionnement relatif de D
est égal à :
√ p
2 f (x)2 + f (x + h)2
c D (x, h) = (9.20)
|f (x + h) − f (x)|

si f (x + h) =
6 f (x). De plus, si f (x) 6= 0 et f 0 (x) 6= 0, alors :

2|f (x)|
cD (x, h) = + O(1) (9.21)
h|f 0(x)|

quand h → 0.
Le but de l’exercice 9.17 est de démontrer ce résultat. Le théorème précédent
montre que le conditionnement de l’opérateur de différentiation D est grand si h
est proche de zéro. Il peut être grand si le rapport |f|f0((xx))|| est grand. La forme de
l’équation 9.20 montre le lien entre le conditionnement d’une formule de différences
finies et le conditionnement de la somme de deux nombres, que nous avons déjà vu
dans la section 5.7. En effet, le dénominateur de l’équation 9.20 est égal à la différence
entre les deux valeurs de la fonction, ce qui constitue la source principale de mauvais
conditionnement. Elle se traduit par le terme h au dénominateur de l’équation 9.21.
Bien que le théorème se concentre sur la formule de différences finies décentrée
d’ordre 1, le principe s’applique de manière plus générale pour la plupart des for-
mules de différences finies puisqu’elles sont des structures très similaires. Toutefois,
230 Chapitre 9 • Différentiation

l’opérateur D considéré dans le théorème 9.6 ne tient compte que des perturbations
introduites dans la valeur de la fonction f et pas des autres perturbations possibles.
Puisque les perturbations qui dominent le calcul sont les erreurs d’arrondi associées
à la valeur de la fonction dominent, le théorème quantifie l’essentiel de la sensibilité
du problème à des perturbations.

9.5 Implémentation d’une formule de différences


finies
Dans cette section, nous présentons comment implémenter une formule de diffé-
rence finie dans le but d’obtenir une erreur minimale et relativement indépendante du
point x où on utilise l’approximation. En particulier, nous montrons comment utiliser
la méthode de J. Dumontet et J. Vignes afin de satisfaire l’hypothèse H3 du théorème
9.3 ce qui permet d’utiliser un pas de différentiation exact plutôt que celui fourni par
l’utilisateur.
Pour analyser l’impact de l’hypothèse H3, on peut considérer le code suivant, qui
est une implémentation naïve de la formule de différences finies.
1 x = 1.0
2 h = 1.0e -4
3 g = (f (x + h ) - f( x) ) / h

Le problème de l’implémentation précédente est que la différence entre la représen-


tation flottante des nombres x + h et x peut être différente du pas h. Cela implique
que l’hypothèse H3 n’est pas nécessairement vérifiée avec le code précédent. C’est
en particulier la situation qui arrive si x ≈ 1 et h est proche de zéro (par exemple
h = 10 −8 ) ou bien encore si x est grand en valeur absolue (par exemple x = 104 ) et
h est proche de zéro. On peut résoudre le problème en utilisant, ainsi que le suggère
[35] (équation 14, p.16), le pas h_exact = (x + h) - x. Pour cela, on peut utiliser
le code suivant, qui évalue la différence entre les deux abscisses plutôt que d’utiliser
directement le pas h fourni pas l’utilisateur.
1 x = 1.0
2 h = 1.0e -4
3 xp = x + h
4 h_exact = xp - x # Astuce magique
5 g = (f ( xp ) - f( x) ) / h_exact

L’impact de la modification précédente est présentée dans l’exemple suivant en


Python.

Exemple 9.9 (Comparaison de deux implémentations de la formule de différences


finies décentrée pour la fonction f (x) = sin(x)). Considérons la fonction f (x) = sin(x)
pour tout x ∈ R. On considère le point x = 104 et on fait varier le pas de différentiation
entre 10−12 et 10 −1. La figure 9.9 présente l’erreur absolue entre l’approximation
par la formule de différence finie et la valeur exacte f 0 (x) = cos(x). On observe
que l’approximation par la méthode naïve est associée à un pas optimal proche de
h = 10 −6 et une erreur absolue minimum proche de e abs = 10−7 . L’utilisation de
l’astuce « magique » de Dumontet et Vignes est associée à un pas optimal proche de
h = 10−8 associé à une erreur absolue minimum proche de eabs = 10−9 . Le script
9.5 • Implémentation 231

Erreur absolue en x = 10 4 (décentrée)


Astuce magique
10−3
Sans astuce
eabs
10−7

10−8 10−3
h

Figure 9.9 – Comparaison de deux implémentations de la formule de différences


finies décentrée d’ordre 1, avec et sans calcul du pas de différentiation exacte.

suivant7 utilise les équations 9.12 et 9.13 pour déterminer le pas optimal et l’erreur
optimale à la condition que les hypothèses du théorème 9.3 soient satisfaites, en
particulier l’hypothèse H3. On fait l’hypothèse que c = 1.
1 import numpy as np
2 import sys
3

4 def f (x ):
5 return np . sin (x )
6

7 def df (x ):
8 return np . cos (x )
9

10 def dff ( x) :
11 return -np . sin (x)
12

13 h_opt = np . sqrt (2.0 * abs (f( x) ) * \


14 sys . float_i nfo . epsi lon / abs ( dff (x )) )
15 print ( " Pas optimal : %.3 e" % ( h_opt ) )
16 e_opt = np . sqrt (2.0 * abs (f( x) ) * \
17 abs ( dff ( x) ) * sys . float_ info . eps ilon )
18 print ( " Erreur opti male : %.3 e" % ( e_opt ) )

Le script précédent produit l’affichage suivant.


1 Pas optimal : 2.107 e -08
2 Erreur optimale : 6.440 e -09

On observe que ces valeurs numériques coïncident avec la figure 9.9. On peut fa-
cilement modifier la figure pour superposer le modèle d’erreur stipulé par l’équation
9.10 : celui-ci s’ajuste correctement à l’erreur observée pour l’implémentation utilisant
l’astuce de Dumontet et Vignes.

Nous avons vu dans les sections précédentes que la précision de l’évaluation d’une
formule de différences finies est limitée par les erreurs d’arrondi dans la valeur de
la fonction. De plus, nous avons vu que l’erreur est plus grande lorsque le pas h est
7Script Python : Diff/Scripts/Py3/[Link].
232 Chapitre 9 • Différentiation

trop petit. Enfin, nous avons constaté qu’en utilisant des formules de différences finies
d’ordre de précision plus élevé, on peut utiliser un pas h optimal plus grand, ce qui
limite l’effet des erreurs d’arrondi et permet de diminuer l’erreur. Une des limites de
cette approche est qu’il peut être fastidieux de calculer les coefficients d’une formule
de différences finies d’ordre de précision élevé. On pourrait dériver des formules de
différences finies plus précises en combinant plus de termes dans le développement
de Taylor de la fonction f . Ce calcul mène à la résolution d’un système d’équations
linéaires dont le nombre d’inconnues correspond au nombre d’évaluations de la fonc-
tion. Nous ne détaillerons pas cette méthode dans ce livre8 . Pour améliorer la précision
d’une méthode numérique, une méthode efficace consiste à utiliser l’extrapolation de
Richardson, que nous présentons dans la section 9.6. Dans la section 9.7, nous verrons
comment appliquer la méthode de Richardson au problème de la différentiation.

9.6 Extrapolation de Richardson (*)


Dans cette section, nous présentons comment améliorer la précision d’une méthode
numérique grâce à la méthode d’extrapolation de Richardson. Cette méthode permet
d’éliminer un terme d’erreur d’ordre plus élevé dans le but d’obtenir une méthode
plus précise. Dans ce contexte, le paramètre h de la méthode est utilisé avec des
valeurs plus proches de zéro, ce qui permet d’extrapoler le comportement limite de la
méthode. Nous utiliserons cette méthode en intégration numérique dans le chapitre 11.
Elle peut également être utilisée dans l’approximation de la solution d’une équation
différentielle et aussi, comme nous allons le voir, dans le calcul d’une dérivée par une
méthode de différence finie.
Pour comprendre la méthode de Richardson, considérons une fonction g associée à
un paramètre h > 0 et permettant d’obtenir une approximation d’un réel a inconnu.
Faisons l’hypothèse que la fonction g est d’ordre 1 et que le terme qui suit est d’ordre
2, ce qui mène au développement asymptotique suivant :
g(h) ≈ a + a1 h + a2h 2 (9.22)
où a1 , a2 sont des réels inconnus et h est proche de zéro. Si l’on pouvait faire tendre le
paramètre h vers 0, on pourrait obtenir la solution exacte par l’équation g(0) = a, mais
cela nécessiterait une ressource de calcul infinie. D’autre part, si on connaissait a1 , on
pourrait facilement soustraire le terme suivant dans le développement asymptotique
et obtenir :
g(h) − a 1h ≈ a + a2h 2
qui est une approximation d’ordre 2 de a. Toutefois, la valeur de a1 est en général
inconnue. L’idée consiste à considérer une seconde approximation avec un pas h plus
grand. Si l’on utilise la fonction avec le pas 2h, on a :
g(2h) ≈ a + 2a 1 h + 4a2 h2. (9.23)
On cherche alors à combiner les deux équations 9.22 et 9.23 pour obtenir une ap-
proximation plus précise. On multiplie l’équation 9.22 par 2 et on obtient 2g(h) ≈
2a + 2a 1h + 2a2h2 . On soustrait alors l’équation précédente et l’équation 9.23, ce qui
implique :
2g(h) − g(2h) ≈ a − 2a 2 h2
8Voir [4, 37, 43, 93, 63, 99].
9.6 • Extrapolation de Richardson (*) 233

car le terme a1 h est éliminé. L’expression précédente est donc une approximation
d’ordre 2 de a. Le théorème suivant est une généralisation immédiate du procédé.
Théorème 9.7 (Extrapolation de Richardson). On souhaite évaluer un réel a par
une approximation g(h) d’ordre p dépendant d’un paramètre h > 0 réel. On suppose
que :
g(h) = a + a1 hp + O(hq )
quand h → 0 où a1 est une constante réelle et q > p est un entier. On considère la
nouvelle approximation :

k p g(h) − g(kh)
r ( h) = (9.24)
kp − 1
où k > 1 est un paramètre. Alors :

r(h) = a + O(hq ) (9.25)

quand h → 0, c’est-à-dire que r(h) est une approximation d’ordre q de a. Avec k = 2,


on obtient :
2p g(h) − g(2h)
r ( h) = . (9.26)
2p − 1
Le théorème précédent est démontré dans l’exercice 9.7. L’équation 9.26 montre
que l’exposant p doit être connu lorsqu’on souhaite appliquer l’extrapolation de Ri-
chardson. Le point important dans le théorème est que l’approximation r(h) donnée
par l’équation 9.24 ne dépend que des paramètres h et k, qui sont fixés par l’utilisateur.
Ainsi, on peut éliminer le coefficient a1 hp sans connaître a1. Lorsqu’on implémente
cette méthode, on utilise souvent une formule alternative à celle que nous avons vue.
L’équation 9.24 implique :

kp g(h) − g(h) + g(h) − g(kh)


r ( h) =
kp − 1
k g(h) − g(h) g(h) − g(kh)
p
= +
kp − 1 kp − 1
(k − 1)g(h)
p
g(h) − g(kh)
= +
kp − 1 kp − 1
g(h) − g(kh)
= g(h) +
kp−1
pour tout h > 0. Cela montre que la méthode de Richardson peut être vue comme
une correction de l’approximation g(h) par le terme g(hk)− g(kh)
p −1 , appelé correction de
Richardson.
On peut itérer le processus dans le but d’éliminer successivement les termes du
développement asymptotique de la méthode numérique. Cela mène alors au théorème
suivant, qui est généralement associé à la méthode de Romberg en intégration.
Théorème 9.8 (Itérations de l’extrapolation de Richardson). On souhaite évaluer
un réel a par une approximation g(h) dépendant d’un paramètre h > 0 réel :

g(h) = a + a1 hp 1 + . . . + am−1 hpm−1 + O(hpm ) (9.27)


234 Chapitre 9 • Différentiation

quand h → 0 où m est le nombre de termes dans le développement asymptotique,


a1, ..., a m−1 ∈ R et p1, ..., p m ∈ N sont des entiers positifs. On considère les approxi-
mations suivantes :

g1 (h) = g(h) (9.28)

puis :

k pi gi (h) − gi (kh)
g i+1 (h) = (9.29)
kp i − 1
pour i = 1, ..., m − 1 où k > 1 est un paramètre. Alors :

g m (h) = a + O(hp m ) (9.30)

quand h → 0, c’est-à-dire que gm (h) est une approximation d’ordre pm de a. Avec


k = 2, on obtient :
2 pi g(h) − g(2h)
gi+1 (h) = (9.31)
2p i − 1
pour i = 1, ..., m − 1.
La preuve du théorème précédent est donnée dans l’exercice 9.8. Elle est fondée
sur l’application itérative du théorème 9.7, ce qui permet d’éliminer successivement
les termes hp 1 , ..., hp m−1 de l’équation 9.27. Le point important à noter est que,
dans l’équation 9.29, bien que les coefficients a 1, ..., am−1 ne soient pas nécessaires,
les exposants p1 , ..., pm−1 doivent être connus. L’équation 9.29 montre que deux
techniques différentes sont employées pour réduire l’erreur d’approximation, c’est-à-
dire premièrement l’utilisation du pas h plus petit que le pas kh et deuxièmement la
combinaison de ces deux approximations pour en former une plus précise. Le théorème
précédent mène à l’algorithme suivant.
Théorème 9.9 (Algorithme de l’extrapolation de Richardson). On considère les
mêmes hypothèses que celles du théorème 9.8. Soit h0 > 0 un réel appelé pas de base.
Soit gi,1 défini par :
 
gi,1 = g h 0k 1−i (9.32)

pour i = 1, ..., m. Soit g i,j la suite définie par :

k pj gi,j − gi−1,j
gi,j+1 = (9.33)
k pj − 1
pour i = 1, ..., m et j = 1, ..., m − 1. Alors gm,m est une approximation d’ordre m
de a :
gm,m = a + O(hp m )
 
quand h → 0. Si k = 2, alors gi,1 = g h0 2i−1 pour i = 1, ..., m et :

2pj gi,j − gi−1,j


gi,j+1 =
2pj − 1
pour i = 1, ..., m et j = 1, ..., m − 1.
9.7 • Améliorer la précision (*) 235

gi-1,j

gi,j gi,j+1

Figure 9.10 – Termes impliqués dans les itérations de l’extrapolation de Richardson.

La preuve du théorème précédent est donnée dans l’exercice 9.9. On peut mani-
puler l’équation 9.33 dans le but de faire apparaître la correction de Richardson :
gi,j − gi−1,j
gi,j+1 = g i,j +
k pj − 1
pour i = 1, ..., m et j = 1, ..., m − 1. L’algorithme permet d’identifier les deux méca-
nismes à l’œuvre dans la réduction de l’erreur, c’est-à-dire premièrement l’équation
9.32 qui montre que l’on utilise la suite de pas décroissants h0, h0 k−1 , h0k −2 , etc.
et deuxièmement l’équation 9.33 qui montre comment combiner ces approximations
pour en former de plus précises. La figure 9.10 illustre l’équation 9.33 et montre que
l’algorithme procède de la gauche vers la droite et vers le bas. On peut organiser les
calculs sous la forme d’un tableau triangulaire supérieur :
g1,1
g2,1 g2,2
g3,1 g3,2 g 3,3
... ... ... ...
Dans la section suivante, nous allons appliquer les techniques précédentes à l’ap-
proximation d’une dérivée par différence finie.

9.7 Améliorer la précision (*)


La difficulté inhérente à toute formule de différence finie est qu’elle est associée
à un ordre de précision p fixé. Cela détermine à la fois la longueur optimale du pas
h et l’erreur absolue associée à l’approximation. Or, dans certains cas, il est difficile
de fixer la longueur du pas menant à l’erreur minimale, de telle sorte qu’il est plus
prudent d’utiliser un pas un peu plus grand. À cette condition, les erreurs d’arrondi
ne limitent pas la précision et l’erreur totale est dominée par l’erreur de troncature de
la formule de Taylor. Mais puisque dans ce cas on obtient une erreur parfois excessive,
on peut souhaiter augmenter l’ordre de précision p de la formule. Dans cette section,
nous présentons comment améliorer la précision d’une formule de différence finie en
exploitant la méthode d’extrapolation de Richardson.
Considérons la formule de différence finie centrée pour f0 , c’est-à-dire l’équation
9.2. Nous avons vu que cette formule est d’ordre p = 2. De plus, dans l’exercice 9.2,
nous montrons que la formule centrée d’ordre 2 est associée à des termes pairs, ce qui
implique :
dh f (x) = f0 (x) + a 1 h2 + a2 h4 + O(h 6)
quand h → 0. L’équation 9.26 implique que la formule suivante :
4g(h) − g(2h)
r ( h) =
3
236 Chapitre 9 • Différentiation

est une méthode d’ordre 4. L’équation 9.19 peut alors être utilisée pour déterminer
1
le pas h ? optimal pour la méthode centrée extrapolée, ce qui conduit à h ? ≈ M 5
.
Dans l’exemple suivant, nous appliquons la méthode de Richardson en Python pour
améliorer la précision de la formule centrée d’ordre 2, ce qui mène à une formule
centrée extrapolée. Dans un but de simplicité, nous n’utilisons pas la méthode de
Dumontet et Vignes présentée dans la section 9.5.

Exemple 9.10 (Utilisation de la formule centrée extrapolée). Dans le script sui-


vant9 , nous définissons la fonction formule_centree qui fournit une implémentation
simpliste de la formule de différences finies centrée pour l’approximation de f 0 par
l’équation 9.2. Nous utilisons ensuite la fonction formule_centree avec les pas h? et
2h ? puis combinons ces approximations pour former l’approximation d’ordre 4.
1 import numpy as np
2 import sys
3

4 def f ormu le_c ent ree (f , x , h ):


5 g = (f (x + h ) - f( x - h) ) / (2.0 * h)
6 return g
7

8 x = 1.0
9 exact = np . cos (x)
10 epsilon = sys . fl oat_in fo . epsilon
11 h = epsilon ** (1.0 / 5.0)
12 g1 = f ormu le_c ent ree ( np . sin , x , h )
13 g2 = f ormu le_c ent ree ( np . sin , x , 2.0 * h )
14 g = (4.0 * g1 - g2 ) / 3.0
15 d = comp uteD igit s (exact , g , 10)

Le script précédent produit les résultats suivants :


1 h= 0.0 007401
2 exact = 0.5403
3 g= 0.5403
4 d= 13.25

La formule centrée extrapolée produit plus de 13 chiffres corrects. On pourrait parfai-


tement continuer le processus et chercher à éliminer le terme d’ordre supérieur, ce qui
mènerait à une approximation d’ordre 6. Puisque 13 chiffres corrects sont suffisants
pour la plupart des situations, nous n’allons pas plus loin dans cette direction.

Bien sûr, la méthode de Richardson nécessite d’évaluer la fonction f en plus de


points que la méthode initiale. De plus, lorsqu’on applique cette méthode à certaines
formules de différences finies, il arrive que la fonction f soit évaluée plusieurs fois au
même point x, ce qui est une perte de performance. C’est par exemple la situation
qui apparaît avec la formule de différence finie décentrée, qui évalue la fonction f
aux points x et x + h. Lorsqu’on utilise la méthode de Richardson, celle-ci implique
d’évaluer la formule de différence finie décentrée avec le pas 2h, ce qui conduit à
évaluer la fonction aux points x et x + 2h de telle sorte que la fonction f a été évaluée
deux fois au point x : la première fois avec le pas h et la seconde avec le pas 2h. Cela
ne pose pas de difficulté pour la formule centrée, qui évalue la fonction f aux points
9Script Python : Diff/Scripts/Py3/[Link].
9.7 • Améliorer la précision (*) 237

p=2 p=4 p=6 p=8 p = 10 p = 12


0.4546
0.5181 0.5392
0.5347 0.5402 0.5403
0.5389 0.5403 0.5403 0.5403
0.5400 0.5403 0.5403 0.5403 0.5403
0.5402 0.5403 0.5403 0.5403 0.5403 0.5403

Table 9.2 – Résultats de l’extrapolation de Richardson appliquée au calcul de la


dérivée première de la fonction f (x) = sin(x) au point x = 1.

x − h et x + h. Lorsqu’on utilise la méthode de Richardson, cela mène à utiliser la


formule de différence finie avec le pas 2h, ce qui conduit à évaluer la fonction aux
points x − 2h et x + 2h : aucune évaluation de f n’est réalisée en double.
On peut utiliser la méthode de Richardson itérée appliquée à la la formule centrée.
Soit m > 2 un entier. Nous utilisons une nouvelle fois la parité de la formule centrée
d’ordre 2 :

dh f (x) = f 0 (x) + a1 h2 + a 2h4 + ... + a m−1h2(m−1) + O(h2m )

quand h → 0. Cela correspond au théorème 9.9 avec p1 = 2, p 2 = 4, p3 = 6, etc.


et, plus généralement, à pj = 2j pour j = 1, ..., m − 1. Dans l’exemple suivant, nous
appliquons la méthode de Richardson itérée à la fonction sin en Python.

Exemple 9.11 (Utilisation de la méthode de Richardson itérée). Appliquons cette


méthode à la fonction y = sin(x) au point x = 1. Le script suivant10 utilise m = 6
itérations et utilise le pas de base h0 = 1. Ce pas h 0 peut sembler très grand comparé
au pas optimal pour la formule centrée, mais cela permet de garantir que les premières
itérations de la méthode de Richardson itérée sont exemptes d’erreurs d’arrondis.
1 m = 6
2 h0 = 1.0
3 g = np . zeros ((m , m ))
4 #
5 for i in range ( m) :
6 h = h0 * (2 ** -i)
7 g[i , 0] = formu le_ cent ree ( np . sin , x , h )
8 #
9 for i in range (1 , m):
10 for j in range ( i) :
11 pj = 2 * ( j + 1)
12 delta = (g [i , j] - g[ i - 1, j ]) / \
13 (2 ** pj - 1.0)
14 g[i , j + 1] = g [i , j] + delta

Les valeurs produites par l’algorithme sont présentées dans la table 9.2. La première
colonne représente les approximations d’ordre 2 issues directement de la formule cen-
trée. Lorsqu’on descend d’une ligne vers le bas de la table, le pas de différentiation
10 Script Python : Diff/Scripts/Py3/[Link].
238 Chapitre 9 • Différentiation

p=2 p=4 p=6 p=8 p = 10 p = 12


0.80
1.39 2.69
1.98 3.89 5.52
2.58 5.09 7.32 9.18
3.19 6.29 9.12 11.58 13.60
3.79 7.50 10.93 13.98 15.69 15.69

Table 9.3 – Log-erreur relative en base 10 de l’extrapolation de Richardson appliquée


au calcul de la dérivée première de la fonction f (x) = sin(x) au point x = 1.

p 1 2 4 6 8 10
2 log10 (p) 0.3010 0.6021 1.204 1.806 2.408 3.010

Table 9.4 – Nombre de décimales gagnées à chaque itération de l’extrapolation de


Richardson itérée.

h est divisé par 2. La seconde colonne correspond à la première extrapolation de Ri-


chardson, ce qui implique qu’elle contient les approximations d’ordre 4. La troisième
colonne contient les approximations d’ordre 6, et ainsi de suite jusqu’à l’ordre 12. On
observe que la méthode converge rapidement avec plus de 4 chiffres corrects.
Pour observer le comportement plus en détails, il est plus pertinent d’évaluer le
nombre de chiffres corrects par la log-erreur en base 10 : les résultats sont présentés
dans la table 9.3. On observe que, dans la première colonne, le nombre de chiffres
significatifs croît régulièrement, avec environ 0.6 chiffres décimaux corrects de plus
lors de chaque division par 2 (nous reviendrons sur ce détail ensuite). Cela correspond
au comportement attendu d’une méthode d’ordre 2. La croissance est plus rapide sur la
deuxième colonne. La dernière ligne montre toutefois que la méthode semble stagner
au-delà de l’ordre 10, qui fournit plus de 15 chiffres décimaux corrects : l’ordre 12
n’améliore pas la précision et on peut arrêter l’algorithme.

Analysons maintenant plus en détail la croissance du nombre de chiffres significa-


tifs d’une méthode d’ordre p lorsqu’on diminue progressivement le pas h. Plus préci-
sément, supposons qu’à l’itération i, le pas est hi = h0 21−i pour i ≥ 1 où h0 est le pas
de base. Par définition d’une méthode d’ordre p, l’erreur absolue est, à l’itération i,
e i ≈ bhp pour i ≥ 1 où p est l’ordre de précision et b est une constante caractéristique
de la méthode et indépendante de i. Puisque hi+1 = hi/2, l’erreur à l’itération i + 1
est e i+1 ≈ bhpi+1 = bh pi/2 p = ei /2p . Cela implique log 10 (ei+1 ) = log 10 (ei ) − p log10 (2).
Par conséquent :
− log10(e i+1 ) = − log10 (e i) + p log10 (2).
Si la solution exacte est proche de l’unité, alors les erreurs relatives et absolues
sont proches et l’équation précédente montre que chaque itération permet de gagner
p log 10(2) décimales à chaque itération.
La table 9.4 présente le nombre de décimales gagnées à chaque itération de l’algo-
rithme. On observe que l’on peut gagner jusqu’à 3 décimales par itération avec une
méthode d’ordre 10. Puisque le nombre maximum de chiffres décimaux corrects avec
9.8 • Contre-exemple 239

des doubles est égal à 17, cela implique que 6 itérations suffisent pour atteindre cette
limite maximale. Toutefois, ce gain est limité par l’apparition des erreurs d’arrondi,
qui se manifestent lorsque le pas de différentiation devient inférieur à un seuil : passé
ce seuil, la méthode stagne ou régresse.

9.8 Contre-exemple
La difficulté principale pour l’utilisation d’une formule de différences finies est le
choix du pas de différentiation h. En effet, nous avons vu dans le théorème 9.4 que
l’erreur absolue totale spécifiée par l’équation 9.11 dépend de la constante c, de f (x)
et f 00(x). L’évaluation de f (x) ne pose pas de difficulté : le problème principal est
que, en général, nous n’avons pas d’information ni sur c, ni sur f 00(x). Premièrement,
considérons la valeur du paramètre c associé à l’erreur relative d’évaluation de la
fonction f et aux coefficients
√ de la formule de différences finie. Pour certaines fonctions
comme la fonction x pour tout x > 0, l’erreur relative c peut être petite, car
l’implémentation du standard IEEE-754 le garantit. Pour d’autres fonctions, cette
erreur relative peut être beaucoup plus grande. En conséquence, nous ne pouvons en
général pas utiliser l’équation 9.12, car la valeur de c est inconnue. Deuxièmement,
il n’est pas facile de déterminer une approximation de f 00(x). Pour le faire, il serait
possible d’utiliser une formule de différences finies (en supplément de celle utilisée
pour évaluer f 0(x)), mais cela nécessiterait de déterminer un pas de différentiation
pour cette formule : le processus est sans fin. C’est la raison pour laquelle nous avons
fait des hypothèses sur la valeur de c, de f (x) et de f00 (x), ce qui mène à l’équation 9.14
qui spécifie un pas approché. La difficulté est alors que le pas approché associé à ces
hypothèses peut être très éloigné du pas optimal. Dans cette section, nous présentons
un exemple où le calcul du pas est délicat.
Dans l’exemple suivant, nous approchons la dérivée première d’une fonction par
une formule de différence finie d’ordre 1 et nous observons que le pas de différentiation
prédit par le modèle d’erreur ne mène pas à une précision satisfaisante.

Exemple 9.12 (Sensibilité au point x). On considère la fonction f (x) = x pour
1
tout x > 0. Sa dérivée est f 0 (x) = 2√ x
pour tout x > 0. On utilise la formule décentrée
d’ordre 1. Le script suivant montre le calcul du pas optimal sous les hypothèses du
11

théorème 9.4 et les approximations 9.14.


1 import sys
2 import numpy as np
3

4 eps = sys . float _info . epsilo n


5 h = np . sqrt ( eps )
6 x = 1. e8
7 xp = x + h
8 h_exact = xp - x
9 y = ( np . sqrt (xp ) - np . sqrt ( x) ) / h_ exact
10 exact = 0.5 / np . sqrt ( x)
11 eabs = abs (y - exact )

On obtient :
11 Script Python : Diff/Scripts/Py3/[Link].
240 Chapitre 9 • Différentiation

Calcule f 0 par formule décentrée


10 −2 x=1
x = 102

eabs
10 −7 x = 104

10−11 10 −5
h

Figure 9.11 – √ Utilisation de la formule décentrée à droite d’ordre 1 pour f 0 sur la


fonction f (x) = x en différents points.

1 >>> h
2 1.490 e -08
3 >>> h_exact
4 1.490 e -08
5 >>> y
6 0.0
7 >>> exact
8 5e -05
En d’autres termes, le résultat ne possède aucun chiffre significatif : la dérivée appro-
chée est nulle, tandis que la dérivée exacte est égale à 5 × 10−5 . Il s’avère que dans
ce cas la représentation en virgule flottante de x + h est égale à celle de x, car h est
beaucoup plus petit que x. Cela implique que la valeur de [Link](x + h) est égale
à [Link](x) et mène à une dérivée nulle. La figure 9.11 montre comment l’erreur
absolue d’évaluation de la dérivée par la formule de différence finie évolue en fonction
de h pour x = 1, x = 10 2 et x = 104 . On observe que le pas optimal h? augmente
lorsque x augmente, alors que nous utilisons toujours un pas trop petit et proche de
10−8 dans ce cas. Le script suivant utilise la solution exacte 9.12, qui exploite la déri-
vée seconde f 00(x) = 4x13/2 pour tout x 6= 0. Dans le script, nous avons fait l’hypothèse
que c = 1.
1 x = 1. e8
2 fx = np . sqrt ( x) # f( x)
3 f_secon de = 0.25 * x ** ( -1.5) # f ’’(x )
4 h = np . sqrt (2.0 * np . abs ( fx ) / np . abs ( f_seconde )) \
5 * np . sqrt ( eps )
Dans ce cas, on obtient :
1 >>> h
2 4.214
On observe que le pas est beaucoup plus grand. Dans ce cas, la formule de différence
finie fonctionne correctement et produit une erreur absolue proche de 4 × 10−13 (car
la valeur exacte est très proche de zéro) et une erreur relative proche de 9 × 10−9, ce
qui est le résultat attendu.
En général, on ne connaît ni la dérivée seconde f 00(x), ni la constante c et la
méthode précédente n’est pas applicable. Les méthodes de J. Dumontet et J. Vignes
9.9 • Application : chute dans un fluide 241

Jet d’une masse dans un fluide visqueux

Altitude (m)
300
200
100

0 5 10
Temps (s)

Figure 9.12 – Chute verticale d’une masse dans un fluide visqueux.

consistent à utiliser une approximation grossière de la dérivée seconde pour calculer un


pas optimal approché [36, 35]. Une méthode alternative, proposée par R. S. Stepleman
et N. D. Winarsky, consiste à générer une suite de pas de différentiation h décroissants,
puis à exploiter des propriétés de monotonie pour obtenir un pas proche de l’optimum
[129]. Plus de détails sur ce thème sont présentés dans la section 9.11.

9.9 Application à la chute dans un fluide visqueux


On considère une masse projetée verticalement dans un fluide. Cette masse est
freinée par le fluide, qui s’oppose à son avancement. Sans frottement, ce problème
possède une solution simple, proportionnelle au carré du temps. Si l’on considère une
force de traînée proportionnelle au carré de la vitesse (ce qui correspond à un fluide tel
que l’air par exemple), alors l’équation différentielle ordinaire associée à ce problème
n’a pas de solution s’exprimant en termes de fonctions connues. C’est pourquoi on
fait l’hypothèse que cette force de traînée est linéaire en fonction de la vitesse, ce
qui correspond à un fluide visqueux. Ainsi, l’équation différentielle ordinaire admet la
solution :
m mg    mg
z(t) = z0 + v0 + 1 − e−(c/m)t − t (9.34)
c c c
pour t ∈ [0, 12], où z est l’altitude (m) au-dessus de la surface de la Terre, t est le temps
(s), z0 est l’altitude initiale (m), g est l’accélération de la gravité (m/s2), m est la
masse (kg), c est le coefficient de traînée linéaire (kg/s), v0 est la vitesse initiale (m/s).
Une vitesse positive signifie que la masse l’élève. On considère les valeurs suivantes
des paramètres : g = 9.81 (m/s2 ), z0 = 50 (m), v0 = 76 (m/s), m = 250 (kg), c = 7
(kg/s). La figure 9.1212 présente la trajectoire associée. La fonction altitude suivante
implémente l’équation 9.34 :
1 import numpy as np
2 def alti tude (t) :
3 g = 9.81
4 z0 = 50.0
5 v0 = 76.0
6 m = 250.0
7 c = 7.0
12 Script Python : Diff/Scripts/Py3/[Link].
242 Chapitre 9 • Différentiation

8 z = z0 + ( m / c) * ( v0 + ( m * g / c) ) \
9 * (1 - np . exp ( -( c / m ) * t) ) \
10 - ( m * g / c) * t
11 return z
Au vu de l’expression impliquant la fonction exp(x) − 1, nous pourrions utiliser la
fonction expm1 dans le but d’améliorer la précision pour t proche de zéro. Mais puisque
cette partie du domaine temporel n’est pas particulièrement significative dans notre
étude, nous nous abstenons de compliquer inutilement le code source.
Grâce aux méthodes d’optimisation numérique présentées dans la suite du docu-
ment, nous avons recherché la date t correspondant à l’altitude maximale :

t = 7.012, z = 307.7.

L’objectif est de vérifier que ce point correspond à un maximum de la fonction z (t).


Pour cela, nous devons vérifier deux conditions. La dérivée première z0 (t) doit être
nulle et la dérivée seconde z00(t) doit être négative (c’est l’opposé lorsqu’on considère
un minimum) :
z 0 (t) = 0, z00 (t) < 0.
Bien sûr, la figure 9.12 montre que le maximum est atteint et que le point n’est ni
une erreur de calcul, ni un point selle (où la dérivée première est nulle, mais la dérivée
seconde n’est pas strictement négative). Mais lorsqu’on réalise un calcul en boîte noire,
il n’est pas toujours possible d’évaluer la fonction f en un nombre suffisant de points
pour représenter le graphique 9.12, car une évaluation de la fonction f peut être
très coûteuse en temps de calcul. De plus, lorsque la variable d’entrée de la fonction
f est vectorielle au lieu d’être scalaire, la vérification des conditions d’optimalité
peut sembler délicate. Dans ce contexte, l’utilisation des méthodes de différentiation
numérique est requise.
La fonction first_derivative du module numdiff13 , développée pour ce manuel,
permet de calculer la dérivée première d’une fonction dont l’entrée et la sortie sont
des scalaires. Elle prend en entrée la fonction à dériver altitude, le point où évaluer
la dérivée topt, la précision de la formule de différences finies p et le pas h. Lorsque
le pas n’est pas fourni, l’algorithme utilise l’approximation optimale fournie par les
équations 9.19. Elle retourne la dérivée première dans un float. Le second argument
de retour est le nombre d’évaluations de la fonction f (mais nous n’utilisons pas cette
information dans cette application). Nous utilisons des formules d’ordre 1, 2 et 4, dans
le but d’observer si le résultat est sensible à la précision d’approximation.
1 import n umdiff
2 zp1 , fcount = numdiff . fi rst _der iva tive ( altitude , \
3 topt , p =1)
4 print ( "z ’(t ) ( ordre =1) =" , zp1 )
5 zp2 , fcount = numdiff . fi rst _der iva tive ( altitude , \
6 topt , p =2)
7 print ( "z ’(t ) ( ordre =2) =" , zp2 )
8 zp4 , fcount = numdiff . fi rst _der iva tive ( altitude , \
9 topt , p =4)
10 print ( "z ’(t ) ( ordre =4) =" , zp4 )
Le script précédent produit le résultat suivant :
13Script Python : Scripts-Eleves/Py3/[Link].
9.9 • Application : chute dans un fluide 243

1 z ’( t) ( ordre =1) = -6.104e -05


2 z ’( t) ( ordre =2) = 1.802 e -06
3 z ’( t) ( ordre =4) = 1.773 e -06

On observe que ces valeurs sont proches de zéro, ce qui semble confirmer que la
première condition d’optimalité est vérifiée. De même, la fonction second_derivative
permet de calculer la dérivée seconde d’une fonction dont l’entrée et la sortie sont des
scalaires.

1 zpp1 , fcount = numd iff . se con d_de riv ati ve ( altitude , \


2 topt , p =1)
3 print ( "z ’ ’( t) ( ordre =1) =" , zpp1 )
4 zpp2 , fcount = numd iff . se con d_de riv ati ve ( altitude , \
5 topt , p =2)
6 print ( "z ’ ’( t) ( ordre =2) =" , zpp2 )
7 zpp4 , fcount = numd iff . se con d_de riv ati ve ( altitude , \
8 topt , p =4)
9 print ( "z ’ ’( t) ( ordre =4) =" , zpp4 )

Le script précédent produit le résultat suivant :

1 z ’’(t ) ( ordre =1) = -9.810


2 z ’’(t ) ( ordre =2) = -9.810
3 z ’’(t ) ( ordre =4) = -9.810

Les trois méthodes produisent le même résultat négatif de telle sorte que la seconde
condition d’optimalité semble vérifiée. On observe que la dérivée est proche de −g à
l’optimum, ce qui n’est pas si évident au vu de l’équation 9.34 (mais qui est facile à
voir si l’on considère l’équation différentielle ordinaire associée).
Puisque les trois formules de différences finies pour z0 (t) produisent trois approxi-
mations différentes, on peut tenter de quantifier l’erreur d’approximation. Pour éva-
luer l’erreur absolue de l’approximation de z0 (t) par la formule décentrée d’ordre 1, on
peut considérer d’abord l’approximation 9.19, qui serait pertinente si nous n’avions
pas la possibilité d’évaluer la dérivée seconde. Mais puisque nous avons déjà calculé
la dérivée seconde, il est pertinent d’utiliser plutôt l’équation 9.1 qui stipule que l’er-
reur absolue est asymptotiquement égale à h2|z 00(t)|. Pour cela, nous calculons le pas
optimal utilisé par la fonction first_derivative puis nous utilisons l’approximation
de la dérivée seconde produite par la fonction second_derivative.

1 p = 1
2 eps = sys . float _info . epsilo n
3 h = eps ** (1.0 / (p + 1) )
4 erreur_ zp = zpp1 [0 , 0] * h / 2.0
5 print ( " Erreur sur z ’(t ) ( ordre =1) =" , e rreur_z p )

ce qui produit :

1 Erreur sur z ’( t ) ( ordre =1) = 7.309 e -08

Cela montre que z0 (t) = −6.104 × 10−5 ± 7.309 × 10−8 , ce qui confirme que la dérivée
est proche de zéro à l’optimum.
244 Chapitre 9 • Différentiation

9.10 Conclusion
Pour aller plus loin sur ce thème, on peut analyser les formules de différences finies
pour les fonctions multivariées. Ce sujet est abordé dans les exercices 9.11 et suivants.
Le livre [2], chapitre 25. « Numerical Interpolation, Differentiation and Integration »
page 875 présente différentes formules de différences.
Bien que nous n’ayons pas beaucoup développé ce sujet, le calcul de formules de
différences finies lorsque la variable d’entrée est un vecteur est particulièrement im-
portant, par exemple en optimisation. Dans son article [42], G.B. Folland propose
d’utiliser les multi-indices pour écrire la formule de Taylor multidimensionnelle. L’ou-
vrage [108] présente l’évaluation de jacobiennes creuses par dérivées numériques dans
la section 7.1 « Finite-difference derivative approximations ». La section 2.3 « Compu-
ting a Finite Difference Jacobian » de [79] présente une méthode qui met h à l’échelle
en fonction de x lorsque x est grand en valeur absolue, mais pas lorsque x est proche
de zéro.
Lorsque la fonction f est donnée sur une grille arbitraire qui n’est pas régulière, on
ne peut pas utiliser les méthodes que nous avons vues. Dans ce cas, on peut créer un
modèle polynomial interpolant, puis calculer la dérivée de ce modèle. C’est la méthode
présentée par exemple dans [49], page 159. On peut également ajuster une spline, puis
dériver cette spline comme cela est présenté dans [81], page 192.
Une méthode fondée sur l’arithmétique complexe est présentée dans [79]. Selon
un article de Shampine [121], celle-ci est dûe à Squire et Trapp [128]. Bien que cette
méthode semble a priori séduisante, elle n’est pas si simple à mettre en œuvre en pra-
tique, car il est nécessaire de disposer d’une implémentation de la fonction supportant
les nombres complexes de manière robuste.
Nous avons vu dans la section 9.2 comment tenter de calculer le pas optimal
d’une formule de différence finie. Le livre [113] présente plusieurs aspects liés aux
dérivées numériques dans le chapitre 5.7 « Numerical Derivatives » où les auteurs
présentent une méthode pour calculer le pas h de telle sorte que l’erreur d’arrondi
dans la somme x + h est minimale. Dans [129], un algorithme est présenté pour
calculer automatiquement le pas optimal pour les dérivées numériques, en exploitant
une propriété de monotonie. Cette idée s’appuie sur la forme de la figure 9.5, dont la
partie gauche est décroissante, tandis que la partie droite est croissante : l’algorithme
de [129] permet de détecter la transition. Cette méthode est une amélioration d’une
méthode publiée deux ans plus tôt [35]. Les exemples identifiés dans [35] sont repris et
traités avec l’algorithme amélioré de [129], ce qui montre que 11 chiffres significatifs
sont obtenus avec un nombre moyen d’évaluations de la fonction de 8 à 11, au lieu
d’une moyenne de 20 dans [35]. Une synthèse de ces méthodes est présentée dans [1],
avec une extension à l’évaluation de la dérivée seconde.

9.11 Notes et références


La figure 9.1 est inspirée de [151] et la figure 9.2 est inspirée de [149], avec des
modifications. L’extrapolation de Richardson évoquée dans la section 9.6 est présentée
également dans [49], page 190 ainsi que dans [28], page 302. La section 9.9 s’appuie sur
[22], chapitre 7, « Optimization ». Sur le sujet particulier de l’utilisation de dérivées
numériques pour l’optimisation, l’ouvrage [53], dans la section 4.6.2 « Non-derivative
Quasi-Newton methods », les « Notes and Selected Bibliography for section 4.6 » et la
9.12 • Exercices 245

first_derivative Dérivée première par différence finie


gradient Calcul du gradient
gradient_gui Calcul du gradient (avec graphique)
second_derivative Dérivée seconde par différence finie
hessian Matrice hessienne
hessian_gui Matrice hessienne (avec graphique)
derivative_centered Dérivée centrée
derivative_forward Dérivée décentrée
compute_indices Calcule les indices pour une formule
de différence finie
compute_coefficients Calcule les coefficients pour une formule
de différence finie
finite_differences Dérivée d’ordre arbitraire
jacobian Matrice jacobienne

Table 9.5 – Fonctions du module [Link].

section 8.6 « Computing finite differences » sont intéressantes.


La table 9.5 présente les fonctions du module [Link] développé pour ce livre.

9.12 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.
Les exercices qui suivent font usage de la notation de Landau (théorème 3.1, page 38).
De plus, nous utiliserons l’équation 3.10, présentée dans l’exercice 3.2, page 45.

* Exercice 9.1 (Formules pour f’) Soit f une fonction de classe C3 (R). Soit x ∈ R et soit
h ∈ R avec h 6= 0.
1. Démontrer l’égalité 9.1 page 216.
2. Démontrer l’égalité 9.2.
3. Démontrer l’égalité 9.3.

* Exercice 9.2 (Parité de la formule centrée pour f’) Soit f une fonction de classe C n (R).
Pour tout x ∈ R et tout h ∈ R différent de zéro, on considère l’opérateur dh défini par :
f (x + h) − f (x − h) 0
dh f (x) = = f (x) + R (h)
2h
où le reste est R(h) = O(h2 ), quand h → 0. Montrer que, plus précisément, le reste s’écrit
sous la forme :

R(h) = a1 h2 + a 2h 4 + a 3 h6 + . . . + an h 2n (9.35)

pour tout entier n positif, où a 1, a 2 , . . . , an dépendent de x et h.


En d’autres termes, le reste est la somme de puissances paires de h.

Exercice 9.3 (Calcul du pas optimal pour f’ par la formule décentrée) Soit f une fonction
de classe C 2(R) et x un réel. On considère la formule de différence finie décentrée à droite
246 Chapitre 9 • Différentiation

pour f 0 , telle qu’elle est définie par l’équation 9.1. Soit x ∈ R donné. On fait l’hypothèse que
f 00 (x) 6= 0. On suppose que l’erreur totale d’approximation est définie par l’équation 9.11 où
h est un réel différent de zéro, c est une constante associée à l’erreur d’évaluation de f (x),
M est la précision machine.
1. Montrer que le pas optimal qui minimise eabs (h) est donné par l’équation 9.12.
2. Montrer que l’erreur minimale est donnée par l’équation 9.13.

* Exercice 9.4 (Calcul du pas optimal pour f (d) par une formule de différence finie)
Démontrer le théorème 9.5.

Exercice 9.5 (Formule décentrée d’ordre 1 pour f”) Pour toute fonction f de classe C 2(R),
tout x ∈ R, et tout h ∈ R différent de zéro, on définit l’opérateur dh par l’équation :

f (x + h) − f (x)
dh f (x) = = f0 (x) + O (h) (9.38)
h
quand h → 0, pour tout réel x. Montrer que, pour toute fonction f de classe C 3(R), on a :

f (x + 2h) − 2f (x + h) + f (x)
dh dh f (x) = = f 00 (x) + O (h) (9.39)
h
quand h → 0, pour tout réel x.
Dans l’équation 9.38, l’opérateur dh permet d’obtenir une approximation de f 0(x) par
une formule de différences finies. Dans l’équation 9.39, la fonction dh dh f (x) est la fonction
f , à laquelle on applique l’opérateur d h deux fois successivement.

Exercice 9.6 (Formule décentrée d’ordre 2 pour f 00 ) Pour toute fonction f de classe
C 2(R), pour tout x ∈ R et tout h ∈ R différent de zéro, on considère l’opérateur dh défini
par :
f ( x + h ) − f (x − h ) 0 2
dh f (x) = = f (x) + O (h )
2h
quand h → 0. Montrer que, pour toute fonction f de classe C3 (R), on a :

f (x + h) − 2f (x) + f (x − h)
dh dh f (x) = = f 00 (x) + O (h2 ) (9.40)
h2
quand h → 0.

Exercice 9.7 (Extrapolation de Richardson) Démontrer le théorème 9.7.

Exercice 9.8 (Extrapolation de Richardson) Démontrer le théorème 9.8.

Exercice 9.9 (Extrapolation de Richardson) Démontrer le théorème 9.9.


Dans les exercices qui suivent, nous utilisons les notations suivantes pour désigner le
gradient et la matrice hessienne d’une fonction multidimensionnelle.

Définition 9.3 (Gradient, matrice hessienne et formule de Taylor multidimensionnelle).


Soit f : Rn → R une fonction C ∞(Rn ). On note ∇f (x) ∈ Rn le gradient, défini par :

∂f (x)
∇f(x)i =
∂xi

pour i = 1, . . . , n. On note H(x) ∈ Rn×n la matrice hessienne, définie par :

∂ 2f(x)
H(x) ij =
∂x i ∂xj
9.12 • Exercices 247

pour i, j = 1, . . . , n. Pour tout x, h ∈ Rn, le développement de Taylor de la fonction f au


point x est :
1
f (x + h) = f (x) + ∇f (x)T h + hT H (x)h + O (h 3) (9.41)
2
quand h → 0.

Exercice 9.10 (Formule de Taylor multidimensionnelle à l’ordre 2) Pour x ∈ Rn et h ∈ R


différent de zéro, montrer qu’on a :
∂f ∂ 2f h2
f (x + he i) = f (x) + (x)h + (x) + O(h3 )
∂x i ∂x 2i 2
pour i = 1, 2, ..., n.

Exercice 9.11 (Calcul du gradient avec une formule décentrée d’ordre 1) On considère
une fonction f de R n dans R, continûment dérivable. Montrer que, pour tout x ∈ Rn et tout
h ∈ R différent de zéro, on a :
∂f f (x + hei) − f (x)
(x) = + O(h)
∂xi h
pour i = 1, 2, ..., n, quand h → 0.

Exercice 9.12 (Calcul du gradient avec une formule centrée d’ordre 2) On considère une
fonction f de Rn dans R, continûment dérivable. Montrer que, pour tout x ∈ Rn et tout
h ∈ R différent de zéro, on a :
∂f f (x + he i ) − f (x − hei )
(x) = + O(h2 )
∂x i 2h
pour i = 1, 2, ..., n, quand h → 0.

* Exercice 9.13 (Calcul de la matrice hessienne par une formule décentrée d’ordre 1)
Pour x ∈ R n et h ∈ R différent de zéro, montrer que :
∂2f g2(x, h) − g1(x, h)
(x) = + O(h) (9.42)
∂x i ∂x j h
pour i, j = 1, 2, ..., n, quand h → 0 où :
f (x + hei ) − f (x)
g 1 (x, h) =
h
f (x + hei + hej ) − f (x + he j)
g 2 (x, h) = .
h

** Exercice 9.14 (Calcul de la hessienne par une formule centrée d’ordre 2) Pour x ∈ Rn
et h ∈ R différent de zéro, montrer que :
∂2f g2 (x, h) − g1 (x, h)
(x) = + O(h2 ) (9.48)
∂x i ∂xj 2h
pour i, j = 1, 2, ..., n, quand h → 0 où :
f (x + he i + hej ) − f (x − he i + hej )
g1(x, h) =
2h
f (x + he i − hej ) − f (x − he i − hej )
g2(x, h) = .
2h
248 Chapitre 9 • Différentiation

*** Exercice 9.15 (Erreur absolue asymptotique de la formule décentrée) Démontrer le


théorème 9.3, page 221. Indication. On montrera l’égalité :

f (x + h) − f (x) f (x + h)δ1 − f (x)δ2


fl (dh f (x)) − = (9.56)
h h
où δ1 , δ 2 ∈ R sont tels que |δi | ≤  pour i = 1, 2.
Remarque 9.4 (Irrégularités lorsque l’erreur d’arrondi domine). L’équation 9.56 permet de
comprendre la forme irrégulière de la partie gauche de la figure 9.5, page 220. En effet,
l’expression f (x + h)δ1 −f (x)δ 2 peut être évaluée avec plus ou moins de précision en fonction
des valeurs de x et x + h. Par conséquent, alors que la démonstration s’appuie sur une
majoration de l’erreur, le calcul réel mène parfois à des valeurs de δ 1 et δ 2 proches de zéro,
ou bien telles que les erreurs de f (x + h)δ 1 et f (x)δ2 se compensent mutuellement.
L’exercice suivant présente le lien entre les méthodes de différences finies et l’interpola-
tion. Puisque cet exercice ne pose aucune difficulté, nous n’avons pas rédigé la solution.

** Exercice 9.16 (Lien entre différentiation et interpolation) Les méthodes de différentia-


tion que nous avons étudiées peuvent être obtenues en considérant le polynôme interpolant la
fonction. Le degré du polynôme interpolant est déterminé par le nombre de nœuds d’interpo-
lation. Une approximation de la dérivée de la fonction peut alors être évaluée en calculant la
dérivée du polynôme interpolant. On peut évaluer les coefficients du polynôme interpolant,
en imposant les conditions d’interpolation, ce qui mène à un système d’équations linéaires.
De plus, dériver le polynôme interpolant est aisé et permet d’approcher différentes dérivées
de la fonction, avec différents ordres de précision en fonction du degré de dérivation et du
degré du polynôme interpolant.
1. On souhaite montrer que la formule décentrée à droite, c’est-à-dire l’équation 9.5 page
218, est la dérivée première d’un polynôme de degré 1 interpolant la fonction f en
certains points. Soit f ∈ C∞ (R). Soit P le polynôme interpolant la fonction f aux
points x0 et x0 + h, c’est-à-dire tel que P (x0) = f (x 0 ) et P (x0 + h) = f (x0 + h). Le
polynôme interpolant ces deux points est le polynôme de degré 1 défini par l’équation
P (x) = β1 (x − x 0) + β 2 pour tout x ∈ R où β 1 , β2 ∈ R sont des paramètres. L’idée
consiste à approcher la dérivée de la fonction f par la dérivée du polynôme au point
x0 :
P 0(x 0) ≈ f 0 (x0).
La dérivée du polynôme est égale à P 0(x 0) = β 1 . On observe que la valeur du paramètre
β2 n’importe pas dans notre calcul. Montrer que les coefficients β1 et β2 sont solutions
du système de deux équations linéaires à deux inconnues :

β2 = f (x 0 )
β1h + β 2 = f (x 0 + h).

f (x 0 +h)−f (x0 )
Montrer que β1 = h . En déduire que le polynôme interpolant est :

f (x0 + h) − f (x 0 )
P (x) = (x − x0 ) + f (x0 )
h
pour tout x ∈ R.
2. On souhaite montrer que la formule centrée, c’est-à-dire l’équation 9.6 page 218, est la
dérivée première d’un polynôme de degré 2 interpolant la fonction f en certains points.
Soit P le polynôme interpolant la fonction f aux points x0 −h, x0 et x0 +h c’est-à-dire
tel que P (x0 − h) = f (x0 − h), P (x0 ) = f (x0 ) et P (x0 + h) = f (x 0 + h). Considérons
le polynôme de degré 2 défini par l’équation P (x) = β1 (x − x0 )2 + β2 (x − x0 ) + β3
9.12 • Exercices 249

pour tout x ∈ R où β 1, β 2, β3 ∈ R sont des paramètres. Montrer que les conditions


d’interpolation imposent :
 2
β1 h − β2 h + β 3 = f (x 0 − h)

β3 = f (x 0 )

β h2
1 + β2 h + β 3 = f (x 0 + h).

Montrer que :

f (x0 − h) − 2f (x0 ) + f (x0 + h) f (x0 + h) − f (x 0 − h)


β1 = , β2 = .
2h2 2h
On observe que la méthode permet d’obtenir l’équation 9.3 page 217, c’est-à-dire la
formule centrée pour l’approximation de la dérivée seconde, puisque P00 (x0 ) = 2β 1.
Le raisonnement précédent montre que l’on pourrait utiliser toute autre méthode d’in-
terpolation pour évaluer une approximation de la dérivée en utilisant par exemple les racines
des polynômes de Chebyshev comme nœuds d’interpolation ou une spline cubique.
Le théorème suivant sera utile pour faire la preuve de l’exercice 9.17. Il n’est pas trivial
de déterminer la norme 2 d’une matrice, puisque cela implique, en général, sa décomposition
en valeurs singulières. Le théorème suivant facilite le calcul dans le cas particulier d’une
matrice ligne.

Théorème 9.10 (Norme 2 d’une matrice ligne). Soit A = (a11 , ..., a1n ) ∈ R 1×n une matrice
ligne. La norme 2 de la matrice est :
v
uX
u n 2
kAk2 = t aij .
j=1

Démonstration. La norme 2 d’une matrice est égale à sa plus grande valeur singulière 14 ce
qui implique kAk2 = σ1 (A). Les valeurs singulières de A sont les racines carrées des valeurs
propres non nulles de AT A ou AA T ([136] théorème 5.4 page p 34). Or AAT = a211 + ... + a21n ∈
R. Par conséquent, l’unique valeur singulière de A est égale à a211 + ... + a21n , ce qui conclut
la preuve.

** Exercice 9.17 (Conditionnement d’une formule de différences finies) Démontrer le


théorème 9.6 page 229.

14 Voir [11] page 25.


Chapitre 10

Moindres carrés linéaires

La méthode des moindres carrés consiste à résoudre un système d’équations


d’une manière approchée. Au lieu de le résoudre de manière exacte, on minimise
la somme des carrés des résidus. C’est une méthode que l’on peut utiliser dans dif-
férents contextes, mais une situation fréquente est celle de l’ajustement de courbe,
dans laquelle on dispose d’observations et où on recherche les paramètres du modèle
qui s’ajustent le mieux. C’est une situation analogue à l’interpolation que nous avons
étudié dans le chapitre 8, avec la différence significative que nous n’imposons pas
que le modèle passe exactement par les observations. Au contraire, nous minimisons
l’écart quadratique entre la courbe et les observations. En d’autres termes, la mé-
thode des moindres carrés peut être vue comme une généralisation des méthodes
d’interpolation. Dans un contexte probabiliste, le critère des moindres carrés a une
interprétation statistique dont la théorie et la pratique sont très développées. L’ana-
lyse des résidus, en particulier, permet de déterminer si l’hypothèse implicitement
gaussienne du modèle est vérifiée. Nous reviendrons sur ce sujet dans la remarque
10.2.
Ce chapitre est à la frontière entre l’analyse et l’algèbre et pourrait être nommé
tout aussi justement « Approximation de fonction ». Une fonction n’est pas néces-
sairement représentable en dimension finie. Une méthode consiste alors à projeter la
fonction sur une base fonctionnelle de dimension finie, ce qui permet de manipuler
un nombre fini de coefficients. Nous constaterons que les méthodes de résolution de
systèmes d’équations linéaires présentées dans le chapitre 7 seront utiles. D’une part,
nous verrons que le vecteur des coefficients est solution d’un système d’équations
linéaires appelé « équations normales ». D’autre part, nous étudierons le conditionne-
ment du problème avec des méthodes similaires et qui impliquent le conditionnement
de certaines matrices.
Dans ce chapitre, nous analysons les problèmes de moindres carrés linéaires. Nous
présentons l’utilisation des équations normales et nous montrons comment utiliser la
méthode du pivot de Gauss que nous avons vue dans le chapitre 7. De plus, nous ana-
lysons pourquoi il est en général prudent de les éviter, en particulier à cause du condi-
tionnement de la matrice de Gram XT X. De manière alternative, nous présentons la
décomposition QR, une décomposition importante en algèbre linéaire numérique et
nous présentons l’utilisation de cette décomposition dans les problèmes de moindres
carrés linéaires.

251
252 Chapitre 10 • Moindres carrés linéaires

t 1971 1975 1980 1985 1990 1995 2000


y 0.3104 0.4211 0.6484 0.7324 0.9832 1.233 1.562
t 2005 2010 2015 2019
y 1.889 2.245 3.227 4.233

Table 10.1 – Nombre annuel de passagers (en milliards) utilisant le transport aérien
dans le monde entre 1971 et 2019.

10.1 Hypothèses de calcul


Dans cette section, nous présentons un exemple d’ajustement de courbe, asso-
cié à l’évolution du transport aérien de voyageurs. Nous introduisons les principaux
concepts de la méthode, c’est-à-dire la variable indépendante, les observations, les
paramètres et les fonctions de base. Pour conclure cette section, nous faisons le lien
entre la méthode des moindres carrés linéaires et l’analyse statistique associée.
Remarque 10.1 (Notation). Dans la suite de ce texte, on utilise la lettre grecque β
pour représenter un vecteur. Ce n’est pas la convention habituelle en algèbre linéaire
numérique, où on utilise plutôt les lettres grecques pour représenter les scalaires.
Puisque la lettre β est la notation classiquement utilisée dans la littérature sur les
moindres carrés linéaires, nous la conservons.
Dans l’exemple suivant, nous considérons un échantillon d’observations et le com-
parons avec un modèle polynomial, dont les coefficients sont déterminés par la mé-
thode des moindres carrés linéaires. Nous utiliserons cet exemple tout au long de ce
chapitre.
Exemple 10.1 (Transport aérien de voyageurs). La table 10.1 présente le nombre
annuel de passagers (en milliards) utilisant le transport aérien dans le monde entre
1971 et 2019 [105]. D’après la Banque Mondiale, ces données proviennent de « sta-
tistiques mondiales de l’aviation civile, de l’Organisation de l’aviation civile interna-
tionale (OACI) et d’estimations du personnel de l’OACI ». La méthode des moindres
carrés permet de tenter de prédire le nombre de passagers à une date qui n’est pas
dans la table. On considère le modèle :

y(t) = β1 t2 + β2 t + β 3

pour tout t ∈ R où les coefficients β1 , β 2, β3 sont des paramètres réels à déterminer.


Dans la suite, nous allons voir comment calculer les coefficients β1 , β2 , β3 . La figure
10.11 présente le nombre de passagers du transport aérien mondial ainsi qu’un modèle
polynomial de degré 2 ajusté au sens des moindres carrés. Ce modèle prédit que, en
2030, le nombre mondial de passagers sera égal, en moyenne, à 5.846 milliards. Bien
sûr, il paraît hasardeux de considérer sans recul en une telle prévision associée, de
plus, à 4 chiffres significatifs. En effet, en tant que phénomène social et économique,
la dynamique de l’évolution du transport aérien est soumise à des lois qui ne sont pas
du domaine de la physique. Toutefois, nous allons voir dans la suite que ce modèle
est optimal sous certaines hypothèses dans le sens où il minimise les écarts quadra-
tiques avec les données. L’analyse probabiliste permettrait d’estimer un intervalle de
1Script Python : Leastsq/Scripts/Py3/[Link].
10.1 • Hypothèses de calcul 253

Ajustement par moindres carrés

Milliards
5.846
5

0
1975 2000 2025

Figure 10.1 – Nombre de passagers du transport aérien mondial entre 1971 et 2019
(en milliards).

confiance de cette prévision, mais cela n’est pas présenté dans ce livre. Dans le script
Python suivant2 , on définit le vecteur de données y et on crée le graphique présentant
les données.
1 import numpy as np
2 t = np . array ([1971.0 , 1975.0 , [...] , 2019.0])
3 y = np . array ([0.3104 , 0.4211 , [...] , 4.233])
4 m = np . size ( y) # m =11
5 import pylab as pl
6 pl . plot (t , y , "o " )

Le script Python précédent produit la figure 10.1.


Dans les définitions qui suivent, nous introduisons progressivement les différents
concepts de la méthode des moindres carrés linéaires. Nous commençons par définir
la variable indépendante (c’est-à-dire l’entrée du modèle) ainsi que les observations
(c’est-à-dire la sortie observée).
Définition 10.1 (Variable indépendante, observation). On note m ∈ N le nombre
d’observations. Soit t ∈ R la variable indépendante et t1 , ..., t m ∈ R des valeurs
distinctes de t. Les observations sont les valeurs réelles y1 , ..., ym .
La définition suivante introduit les paramètres, les fonctions de base et le modèle.
Définition 10.2 (Paramètre, fonctions de base, modèle). Soit β ∈ Rn un vecteur de
paramètres, où n est le nombre de paramètres. On considère n fonctions φ1 (t), φ2 (t),
..., φn (t) appelées fonctions de base. On considère le modèle suivant :

y(t) = β1 φ1 (t) + ... + βn φn (t) (10.1)

pour tout t ∈ R.
Dans la suite, nous faisons l’hypothèse que les observations yi sont bruitées. Dans
le contexte où l’on considère des mesures physiques, l’écart entre modèle et l’observa-
tion peut être dû à une erreur de mesure liée aux limites physiques de l’équipement.
En conséquence, on ne cherche pas exactement la fonction y(t), mais seulement une
bonne approximation. Nous considérerons plus loin dans ce chapitre une définition
rigoureuse, mais la définition suivante introduit cela de manière informelle.
2Script Python : Leastsq/Scripts/Py3/[Link].
254 Chapitre 10 • Moindres carrés linéaires

Définition 10.3 (Problème d’ajustement de courbe). Ajuster une courbe consiste à


rechercher β ∈ Rn tel que :
yi ≈ y(t i ) (10.2)
pour i = 1, ..., m où le modèle y est défini par l’équation 10.1.
En d’autres termes, étant donné un modèle, le problème d’ajustement de courbe
consiste à réduire l’écart entre les observations et les prévisions du modèle, en ajus-
tant les paramètres. C’est pourquoi on parle souvent de problème de calage. Dans la
définition 10.2, le modèle est linéaire par rapport aux paramètres car la relation entre
la sortie y et les coefficients β est linéaire : la sortie y est une combinaison linéaire
des coefficients β. En effet, dans un problème de moindres carrés linéaires, les fonc-
tions de base φj(t) peuvent être non linéaires en t, mais les inconnues βj apparaissent
linéairement dans le modèle. Appliquons les trois définitions précédentes à l’exemple
du transport aérien de voyageurs.
Exemple 10.2 (Transport aérien de voyageurs (suite)). Considérons à nouveau les
données de l’exemple 10.1. Le paramètre m, représentant le nombre d’observations,
vaut m = 11 puisque nous disposons de 11 observations du nombre mondial de voya-
geurs. Il y a n = 3 fonctions de base φ1 (t) = t2 , φ 2(t) = t et φ3(t) = 1. Dans cet
exemple, on ne peut pas atteindre exactement la courbe, car l’évolution du nombre
de passagers n’est pas exactement polynomiale. De plus, la mesure du nombre de pas-
sagers est associée à un bruit de mesure, comparable à celui des mesures physiques.
On peut émettre l’hypothèse que ce bruit, qui représente les fluctuations annuelles
du nombre de voyageurs, peut être dû aux variations du tourisme mondial, aux fluc-
tuations dans l’activité économique mondiale ou encore aux variations de prix du
transport. Le nombre de facteurs étant élevé et aucun facteur n’étant tout à fait pré-
dominant, on peut penser que l’hypothèse gaussienne de variabilité du nombre de
voyageurs autour du modèle est plausible.
Dans la remarque suivante, nous présentons l’interprétation probabiliste des
moindres carrés linéaires, dans laquelle nous faisons le lien avec la loi de Laplace-
Gauss.
Remarque 10.2 (Observation, modèle et bruit). Analysons plus en détail le lien entre
les observations, le modèle et le bruit. Dans l’équation 10.2, la prévision du modèle
y(t i) ne peut pas, en général, être égale à l’observation yi à cause du bruit de mesure.
Ce bruit est parfois modélisé comme une variable aléatoire ou, de manière équivalente,
imprévisible. Notons N (µ, σ2 ) la loi de distribution normale (de Laplace-Gauss) de
moyenne µ ∈ R et d’écart-type σ > 0. Dans un contexte probabiliste, on fait souvent
l’hypothèse que, pour i = 1, ..., m, le bruit i est une variable aléatoire de loi N (0, σ 2),
où σ > 0 est inconnu. Dans ce contexte, l’approximation 10.2 devient :
yi = y(ti ) + i (10.3)
pour i = 1, ..., m. En d’autres termes, chaque observation est égale à la prévision du
modèle ajoutée au bruit :
observation = modèle + bruit.
Pour estimer la variance σ 2 et valider que le bruit i est de distribution gaussienne,
on peut analyser la distribution des résidus yi − y(t i ).
10.2 • Matrice de conception et modèles 255

En général, il y a plus d’équations que d’inconnues : on a m ≥ n. Dans ce cas, on


dit que le problème est sur-déterminé. Dans le cas contraire, on dit que le problème
est sous-déterminé. Dans ce cas, il peut y avoir une infinité de solutions et une régula-
risation est nécessaire. Dans la suite de ce texte, nous faisons l’hypothèse que m ≥ n,
car c’est le cas le plus fréquent dans les problèmes d’ajustement de courbe.

10.2 Matrice de conception et modèles


Dans la section précédente, nous avons vu comment créer un modèle en exprimant
la sortie comme une combinaison linéaire de fonctions de base. En généralisant ce
procédé, nous allons voir que l’on peut décrire la sortie sous une forme matricielle
qui va faciliter l’analyse. De plus, nous allons observer d’autres bases de fonctions qui
sont plus appropriées dans certaines circonstances. La définition suivante introduit la
matrice de conception, qui est calculée à partir de la valeur des fonctions de base et
des entrées observées.

Définition 10.4 (Matrice de conception). La matrice de conception X ∈ Rm×n est


la matrice définie par :
xi,j = φj (ti )
pour i = 1, . . . , m et j = 1, . . . , n.

On peut exprimer les prévisions du modèle sous une forme matricielle, comme le
montre le théorème suivant.

Théorème 10.1. Le modèle s’écrit sous la forme :

y ≈ X β.

Dans le théorème précédent, les prévisions du modèle sont rassemblées dans le


vecteur Xβ. La raison principale pour laquelle l’approximation précédente n’est pas
une égalité est que les données sont, par hypothèse, bruitées. C’est pourquoi nous
cherchons trouver le vecteur β permettant de s’ajuster aux données au mieux. Le
principe de résolution est d’utiliser les techniques d’algèbre linéaire numérique, et
c’est ce que nous allons voir dans la suite.

Démonstration. Le modèle des moindres carrés linéaires est tel que, pour i = 1, ..., m,
on a :
n
X n
X
yi ≈ βj φ j(t i ) = xi,j βj
j=1 j=1

par définition de la matrice de conception. Par définition du produit matrice-vecteur,


le second membre de l’expression précédente est la i-ème composante du produit
matrice-vecteur Xβ :
Xn
xi,j β j = (Xβ) i
j=1

pour i = 1, ..., m. Par conséquent, pour i = 1, ..., m, on a yi ≈ (Xβ)i ce qui conclut


la preuve.
256 Chapitre 10 • Moindres carrés linéaires

Dans l’exemple suivant, nous vérifions que le modèle s’écrit sous la forme du pro-
duit Xβ dans le cas où nous disposons de 4 fonctions de base.
Exemple 10.3. Si n = 4, la prévision du modèle au point t1 est :

y(t1 ) = φ1 (t 1)β1 + φ2(t 1 )β2 + φ 3(t1 )β3 + φ 4(t 1)β 4.

Par définition de la matrice de conception, l’équation précédente est :


4
X
y(t1) = x 1,1β1 + x1,2β 2 + x1,3 β3 + x 1,4 β4 = x1jβ j
j=1

ce qui est le produit scalaire de la première ligne de X par le vecteur β.


En fonction du modèle, les prévisions peuvent être plus ou moins proches des
observations et c’est pourquoi ce choix est particulièrement important. Analysons
quelques exemples. Étant donné un degré n, on peut considérer un polynôme de
degré n − 1, associé aux fonctions de base φj (t) = tn−j pour j = 1, ..., n et pour tout
t ∈ R. Cela conduit au modèle :

y(t) = β1 tn−1 + . . . + β n−1t + β n

pour tout t ∈ R. Dans ce cas, la matrice de conception X est la matrice de Vander-


monde. Un cas particulier du modèle précédent est la ligne droite, associé à l’équa-
tion :
y(t) = β1 t + β2
pour tout t ∈ R. C’est ce que l’on appelle parfois la « droite des moindres carrés ».
Nous utiliserons ce modèle dans l’application présentée dans la section 10.8.
Lorsqu’il y a une relation exponentielle entre y et t, on peut considérer un modèle
log-linéaire. Il s’agit du modèle :

y(t) = ke λt

pour tout t ∈ R, où k et λ sont des paramètres réels à déterminer. Le logarithme de


l’équation précédente est :

log(y(t)) = log(k) + λt = β1 t + β2

pour tout t ∈ R, où β 1 = λ et β2 = log(k). Puisque la relation entre log(y(t))


et les paramètres β 1 et β2 est linéaire, on peut utiliser la méthode des moindres
carrés linéaires. Une fois que le modèle pour log(y(t)) est ajusté, les coefficients sont
déterminés par les équations λ = β1 et k = exp(β 2).
Le choix de la base de fonctions a un impact significatif sur le conditionnement
du problème, comme nous le soulignons dans la remarque suivante.
Remarque 10.3 (Choix de la base de fonctions et conditionnement). Choisir comme
base de fonctions les polynômes associés à la base canonique (c’est-à-dire les poly-
nômes 1, t, t 2, t3 , etc.) mène à une matrice de conception X qui peut être mal condi-
tionnée. On peut plutôt choisir une base de polynômes orthogonaux telle que la base
des polynômes de Legendre. Dans ce cas, il est possible de démontrer que la matrice
de conception associée possède un conditionnement plus modéré. Nous reviendrons
sur ce sujet dans la remarque 10.4.
10.3 • Moindres carrés et norme euclidienne 257

Dans l’exemple suivant, nous évaluons la matrice de conception dans l’exemple du


transport aérien de voyageurs.
Exemple 10.4 (Transport aérien de voyageurs (suite)). Considérons les données
présentées dans l’exemple 10.1 et évaluons la matrice de conception. On recherche un
polynôme de degré 2, ce qui conduit à n = 3 paramètres. La matrice X est donc de
taille 11-par-3. Le script Python suivant 3 permet de calculer la matrice de conception
X :
1 import numpy as np
2 n = 3
3 X = np . vander (t , n )
Notons que la fonction vander renvoie un array, et non pas une matrix. La matrice
X est la suivante :
1 >>> X
2 [[3.885 e +06 1.971 e +03 1.000 e +00]
3 [3.901 e +06 1.975 e +03 1.000 e +00]
4 [3.920 e +06 1.980 e +03 1.000 e +00]
5 [3.940 e +06 1.985 e +03 1.000 e +00]
6 [3.960 e +06 1.990 e +03 1.000 e +00]
7 [3.980 e +06 1.995 e +03 1.000 e +00]
8 [4.000 e +06 2.000 e +03 1.000 e +00]
9 [4.020 e +06 2.005 e +03 1.000 e +00]
10 [4.040 e +06 2.010 e +03 1.000 e +00]
11 [4.060 e +06 2.015 e +03 1.000 e +00]
12 [4.076 e +06 2.019 e +03 1.000 e +00]]
On vérifie que la matrice X possède 11 lignes et 3 colonnes. Un point important dans
cette matrice est l’ordre de grandeur des valeurs numériques, qui est très différent en
fonction des colonnes. Pour le comprendre, observons tout d’abord que les dates t ∈
[1971, 2019] sont approximativement de l’ordre de 103. La première colonne correspond
à la fonction φ1(t) = t 2, et c’est pourquoi les valeurs sont de l’ordre de 106 . La seconde
colonne correspond à la fonction φ2(t) = t, et c’est pourquoi les valeurs sont de l’ordre
de 103 . On observe que la dernière colonne, qui correspond à la fonction φ3 (t) = 1
est, en effet, égale à un.
À ce point de l’étude, nous avons introduit les observations et nous avons spécifié
un modèle. Dans le but d’ajuster les paramètres du modèle, il faut introduire une
mesure de l’écart entre le modèle et les observations, ce qui est le but de la section
suivante, dans laquelle nous introduisons la notion de résidu et mesurons les écarts
grâce à la norme euclidienne.

10.3 Moindres carrés et norme euclidienne


Le résidu est l’écart entre les prévisions du modèle et les observations. Dans cette
section, nous allons voir comment les problèmes de moindres carrés permettent de
quantifier ce résidu. Puis, nous verrons comment introduire la norme euclidienne du
résidu et comment définir le problème de moindres carrés linéaires en fonction de cette
norme.
3Script Python : Leastsq/Scripts/Py3/[Link].
258 Chapitre 10 • Moindres carrés linéaires

Considérons le modèle :
n
X
yi ≈ β jφ j (ti ), i = 1, ..., m.
j=1

Les résidus sont les écarts entre les observations et le modèle :


n
X
ri = yi − β j φj (ti ), i = 1, ..., m.
j=1

L’équation précédente peut être écrite sous la forme matricielle équivalente :

r = y − Xβ

où r ∈ Rm est le vecteur des résidus. Pour résoudre le problème, on peut utiliser deux
approches.
— La méthode par interpolation est la suivante. Si le nombre d’inconnues n est
égal au nombre d’équations m, on peut, peut-être, annuler les résidus. Dans
le cas d’un problème linéaire, le vecteur β est solution du système d’équations
linéaires :
X β = y.
Si la matrice est de rang n, alors la solution du système d’équations linéaire
précédent existe et elle est unique.
— La méthode des moindres carrés est la suivante. Si le nombre d’équations m est
supérieur au nombre d’inconnues, la méthode consiste à minimiser la somme
des carrés des résidus :
Xm
2
krk = r2i .
i=1

Dans l’égalité précédente, la norme vectorielle k · k est la norme deux ou norme


euclidienne, que nous avons déjà présentée dans la définition 6.8 page 102. En toute
rigueur, on devrait plutôt écrire k · k2 , mais cela ne fait qu’alourdir les notations
puisque la seule norme impliquée dans ce chapitre est la norme 2. D’autres normes
sont possibles, mais nous ne les utiliserons pas dans le cadre de ce cours. En effet,
il y a plusieurs raisons pour privilégier la norme euclidienne. Premièrement, si on
fait l’hypothèse que les résidus suivent la loi gaussienne, alors la norme euclidienne
apparaît dans le modèle. Deuxièmement, nous allons voir que des méthodes efficaces
d’algèbre linéaire numérique existent pour le résoudre. Si on change de norme et qu’on
utilise par exemple la norme 1, il s’avère que le problème d’optimisation peut être
plus complexe et peut nécessiter des méthodes plus sophistiquées. Cela ne disqualifie
toutefois pas ces méthodes, mais nécessite des outils qui sont au-delà du cadre de ce
livre. La définition suivante formalise le problème des moindres carrés linéaires.

Définition 10.5 (Problème de moindres carrés linéaires). On suppose que m ≥ n.


Soit X ∈ R m×n une matrice et y ∈ R m un vecteur. Le problème de moindres carrés
linéaires consiste à trouver β ∈ R n solution de :

min kXβ − yk2 . (10.4)


β∈Rn
10.4 • Conditionnement 259

On remarque que les propriétés de la norme euclidienne impliquent l’égalité kXβ −


yk = ky − Xβk, de telle sorte que l’on peut utiliser arbitrairement l’une ou l’autre des
deux expressions. En d’autres termes, la solution β ∈ R n du problème est le vecteur
qui minimise le carré de la norme euclidienne du résidu, puisque krk = ky − Xβk.
Pour résoudre le problème précédent, nous allons analyser deux méthodes. La
première est fondée sur les équations normales que nous étudierons dans la section
10.5. Nous étudierons le conditionnement des équations normales dans la section 10.6.
Nous vérifierons que dans certains cas, le choix de la base de fonctions mène à une
difficulté : la solution peut devenir très sensible à des petites perturbations dans
les données. Cela nous motivera à explorer une méthode alternative, fondée sur la
factorisation QR et que nous étudierons dans la section 10.7. Nous préciserons certains
avantages et inconvénients de chaque méthode. D’autres méthodes sont possibles, par
exemple celles fondées sur la décomposition SVD, mais nous ne les étudierons pas dans
ce livre. Mais, avant de résoudre le problème, nous allons étudier la sensibilité de la
solution du problème à des perturbations dans les données dans la section suivante.

10.4 Conditionnement des problèmes de moindres


carrés linéaires (*)
Dans cette section, nous présentons le conditionnement des problèmes de moindres
carrés linéaires. Pour progresser du plus simple au plus complexe, nous commençons
par analyser la sensibilité à une perturbation de y , puis à une perturbation de X . Nous
ne présenterons pas la borne d’erreur obtenue lorsqu’on perturbe simultanément y et
X, mais nous présentons dans la section 10.10 les références où ce travail est mené.
Nous commençons par analyser la sensibilité du problème à une perturbation du vec-
teur des observations y. Nous allons voir que le conditionnement du problème dépend
du conditionnement de la matrice de conception. Puisque cette matrice n’est pas car-
rée, nous devons étendre la notion de conditionnement à une matrice rectangulaire.
Dans ce but, la définition suivante introduit le pseudo-inverse de Moore-Penrose.

Définition 10.6 (Pseudo-inverse de Moore-Penrose). Soit A ∈ Rm×n . Supposons


que la matrice A est de rang plein. Soit A† le pseudo-inverse de Moore-Penrose de A :

A† = (AT A)−1A T .

Dans l’équation précédente, la variable A† se dit « A dague ». Lorsqu’on considère


le conditionnement d’une matrice carrée inversible A, le conditionnement en norme
2 de la matrice implique les normes 2 des matrices A et A−1 . Pour une matrice
rectangulaire, cette définition ne peut pas être appliquée, car la matrice n’est pas
nécessairement inversible. Dans ce cas, on peut utiliser la définition suivante qui est
fondée sur le pseudo-inverse de Moore-Penrose.

Définition 10.7 (Conditionnement d’une matrice rectangulaire en norme 2). Le


conditionnement de la matrice A en norme 2 est défini par :

κ2 (A) = kAk 2kA†k 2

pour toute matrice A ∈ Rm×n.


260 Chapitre 10 • Moindres carrés linéaires

Dans la définition suivante, nous introduisons une perturbation dans le second


membre du problème de moindres carrés linéaires et observons comment la solution
est perturbée.

Définition 10.8 (Moindres carrés linéaires avec perturbation du second membre).


Soit β ∈ Rn la solution du problème de moindres carrés linéaires :

β = argmin kXβ − yk2 .


β∈R n

Soit δy ∈ R m une perturbation du second membre y . Soit ỹ = y + δy ∈ Rm le second


membre perturbé. Soit β̃ ∈ Rn la solution perturbée :

β̃ = argmin kXβ − ỹk2 .


β∈R n

Soit δβ = β̃ − β ∈ Rn la perturbation de la solution.

Dans les deux équations précédentes, la fonction argmin est celle qui retourne la
valeur du vecteur β qui atteint le minimum. Nous découvrirons par la suite que la
sensibilité du problème dépend du paramètre η que nous introduisons dans le théorème
suivant.

Théorème 10.2 (Définition et propriété de η). Supposons que β 6= 0. Soit η =


η(X, β) le réel défini par :
kX k 2 kβk2
η= .
kXβk2
Alors η ∈ [1, κ2(X )].

La variable η quantifie à quel point le vecteur Xβ atteint sa longueur maximale. Le


résultat principal de cette section est présenté dans le théorème suivant, où nous cal-
culons la sensibilité relative de la perturbation de la solution du problème de moindres
carrés linéaire vis-à-vis d’une perturbation du second membre.

Théorème 10.3 (Sensibilité de la solution du problème de moindres carrés linéaires


avec perturbation du second membre). Supposons que β 6= 0 et que la matrice X
est de rang plein. Alors, le conditionnement relatif du problème de moindres carrés
vis-à-vis d’une perturbation du second membre est :

κ2 (X )
cy (X, y) = (10.5)
η cos(θ)


kXβk 2
cos(θ) =
kyk2
et :
kδβk2 kδyk 2
≤ c y (X, y) . (10.6)
kβk2 kyk2

De plus, la borne supérieure peut être atteinte.


10.4 • Conditionnement 261

L’équation 10.5 montre que la sensibilité du problème dépend du conditionnement


de X , de l’angle θ et du facteur η, et ces paramètres dépendent de la matrice X et
du second membre y. Par conséquent, le conditionnement du problème dépend de X
et y . Nous avons placé l’indice y dans le conditionnement cy dans le but d’indiquer
que c’est une perturbation du second membre qui est considérée. Puisque η ≥ 1, cela
implique η1 ≤ 1, ce qui mène à l’inégalité :

kδβk2 κ2 (X ) kδyk 2
≤ (10.7)
kβk2 cos(θ) kyk2

pour tout β ∈ Rn tel que β 6= 0. Analysons l’inégalité précédente d’un point de vue
plus intuitif. Soit R(X ) = {Xβ ∈ Rn | β ∈ Rn } l’espace image de la matrice X .
Plus de détails sur les quatre espaces fondamentaux et, en particulier, sur l’espace
image R(X ) sont présentés dans la définition 10.9 page 274. Le nombre θ représente
l’angle entre le second membre y et l’espace image R(X ) de la matrice X . Deux cas
particuliers sont intéressants et faciles à analyser4 .
— Si le second membre y appartient à l’espace image de X , c’est-à-dire si y ∈
R(X ), alors θ = 0 ce qui implique cos(θ) = 1. Dans ce cas, le résidu est nul
kδy k
et le second membre de l’équation 10.7 est κ2 (X ) kyk22 . Le conditionnement du
problème dépend alors exclusivement du conditionnement de la matrice X .
— Si le second membre y est orthogonal à l’espace image de X c’est-à-dire si
y ⊥ R(X ), alors θ = π2 ce qui implique cos(θ) = 0. Le second membre de
l’équation 10.7 est alors non borné : le problème est mal conditionné quel que
soit le conditionnement de la matrice X .
Dans le théorème suivant, nous considérons une perturbation de la matrice et nous
montrons une borne du changement relatif dans la solution perturbée.

Théorème 10.4 (Sensibilité de la solution du problème de moindres carrés linéaires à


une perturbation de la matrice). Soit δX = B ∈ Rm×n une matrice de perturbation
où B ∈ Rm×n et  ∈ R est l’amplitude de la perturbation. Nous sommes intéressés
par des petites perturbations  → 0. Considérons la matrice de conception perturbée
X̃ = X + δX ∈ Rm×n . Supposons que X̃ est de rang plein. Soit β̃ ∈ R n la solution
du problème perturbé :  
β̃ = argmin X̃β − y 2 .
β∈R n

Soit δβ = β̃ − β ∈ Rn la perturbation de la solution. Alors, le conditionnement relatif


du problème de moindres carrés vis-à-vis d’une perturbation de la matrice est :
 
tan(θ)
c X (X, y) = κ2 (X ) 1 + κ2 (X ) (10.8)
η

et :
kδβk2 kδX k2
≤ cX (X, y) + O(2 ) (10.9)
kβk 2 kX k2

quand  → 0.
4Voir [3] page 129.
262 Chapitre 10 • Moindres carrés linéaires

De même que l’équation 10.5, l’équation 10.8 montre que la sensibilité du pro-
blème dépend du conditionnement de X , de l’angle θ et du facteur η. Une différence
significative est que cX peut dépendre du carré du conditionnement κ2 (X )2 , alors que
c y ne dépend que de κ 2(X ). Reprenons la même analyse que précédemment5 .
— Si le second membre y appartient à l’espace image de X alors θ = 0 ce qui im-
plique tan(θ) = 0. Le conditionnement du problème dépend alors exclusivement
du conditionnement de la matrice X .
— Si le second membre y est orthogonal à l’espace image de X alors θ = π2 ce qui
implique que tan(θ) est infini. Le problème est mal conditionné quelque soit le
conditionnement de la matrice X .
— Dans les situations intermédiaires, le conditionnement c X dépend du paramètre
tan(θ)/η. S’il est proche de zéro, alors le conditionnement dépend principalement
de κ2 (X ). Sinon le conditionnement du problème dépend principalement de
κ2(X )2 , une situation très défavorable.
Analysons la situation du problème du point de vue de l’ajustement de courbes.
Si la matrice X est mal conditionnée en norme 2, nous avons vu que la situation
n’est pas très favorable. Dans ce contexte, on peut tenter d’améliorer la situation en
normalisant les données ou en changeant de base de fonctions. Nous reviendrons sur ce
sujet dans la remarque 10.4. Si θ ≈ π2 , cela signifie que les données que nous essayons
d’approcher sont mal représentées par les fonctions de base. Dans ce contexte, on peut
soit conserver la base de fonctions et augmenter, par exemple, le degré polynômial,
soit changer de base de fonctions.
Dans la section suivante, nous présentons la méthode des équations normales.
Bien que cela soit la méthode la plus simple, elle n’est pas sans inconvénient : nous
étudierons son conditionnement et nous constaterons dans la section 10.6 que celui-ci
peut être grand dans certains cas.

10.5 Méthode des équations normales


Dans cette section, nous présentons la plus simple des méthodes pour résoudre un
problème de moindres carrés linéaires, c’est-à-dire la méthode des équations normales.
Nous allons appliquer cette méthode à la prévision du transport aérien de passagers
et analyser comment normaliser les données pour limiter le conditionnement du pro-
blème. Le théorème suivant indique que la solution du problème de moindres carrés
linéaires est égale à la solution d’un système d’équations linéaires.
Théorème 10.5 (Équations normales). On considère les hypothèses de la définition
10.5. Le vecteur de paramètres β ∈ Rn est solution du problème de moindres carrés
linéaires si et seulement si :

X T X β = X T y. (10.10)

Dans le théorème précédent, la matrice XT X est nommée « matrice de Gram ».


La démonstration de ce théorème est donnée dans l’exercice 10.2. Si la matrice de
conception X est de rang plein (c’est-à-dire si rang(X ) = n), alors la solution du pro-
blème de moindres carrés linéaires est unique. Cette proposition est démontrée dans
5Voir [3] page 131.
10.5 • Méthode des équations normales 263

l’exercice 10.6, page 276. Il suffit, par conséquent, de résoudre le système d’équations
linéaires donné par l’équation 10.10. La matrice de Gram X T X est de taille n-par-n.
Ainsi, s’il y a beaucoup de données (c’est-à-dire si m est grand), mais peu d’inconnues
(c’est-à-dire si n est petit), alors la taille de la matrice X est grande, mais celle de la
matrice XT X reste petite. On remarque que la matrice de Gram XT X est symétrique.
En effet, sa transposée est :

(X T X)T = X T (X T )T = X T X.

Comme le montre l’exercice 10.9, elle est, de plus, semi-définie positive. Elle est définie
positive si rang(X ) = n. L’évaluation des fonctions de base aux points {ti} i=1,...,m
forme les vecteurs colonnes de la matrice de conception. Dans l’exercice 10.8, nous
montrons que si les colonnes de la matrice X sont linéairement indépendantes alors
la matrice XT X est non singulière. Sous cette hypothèse, la solution est :

β = (X T X) −1 XT y.

En pratique, pour résoudre l’équation précédente, on ne calcule pas l’inverse de la


matrice (X T X)−1 . En effet, c’est plus coûteux et moins précis que le pivot de Gauss.
L’algorithme fondé sur les équations normales 10.10 est le suivant.
1. On évalue la matrice de Gram c’est-à-dire le produit matrice-matrice A = XT X.
2. On évalue le second membre en évaluant le produit matrice-vecteur b = XT y.
3. On résout le système d’équations linéaires Aβ = b.
Si la matrice de conception X est de rang plein, alors la matrice de Gram est symé-
trique et définie positive. Une des conséquences de cette propriété est que l’algorithme
du pivot de Gauss ne nécessite pas de permutation des lignes6 . Dans ce contexte, on
peut utiliser la décomposition matricielle de Cholesky. Nous reviendrons brièvement
sur ce sujet dans la section 10.10. Dans l’exemple suivant, nous calculons la solution
du problème de moindres carrés linéaires en utilisant les équations normales.

Exemple 10.5 (Transport aérien de voyageurs (suite)). Considérons à nouveau les


données de l’exemple 10.1 et utilisons la méthode des équations normales. On re-
cherche un polynôme de degré 2, ce qui conduit à n = 3 inconnues. Le script Python
suivant7 permet de calculer la matrice de conception X , puis de calculer la matrice
A = X T X , le second membre b = XT y et enfin de résoudre les équations normales.
La fonction vander renvoie un array. L’instruction X.T retourne le tableau X trans-
posé et l’opérateur @ est utilisé deux fois, pour évaluer le produit matrice-matrice,
puis le produit matrice-vecteur.
1 import numpy as np
2 n = 3
3 X = np . vander (t , n )
4 A = X. T @ X
5 b = X. T @ y
6 beta = np . linalg . solve (A , b )

La matrice de Gram XT X est la suivante :


6Voir [70] chapitre 10.
7Script Python : Leastsq/Scripts/Py3/[Link].
264 Chapitre 10 • Moindres carrés linéaires

Ajustement par moindres carrés


4 Degré 1

Milliards
Degré 2
2 Degré 3

0
1980 2000 2020

Figure 10.2 – Nombre de passagers du transport aérien mondial entre 1971 et 2019
(Milliards). Plusieurs ajustements de courbe avec des polynômes de degré 1, 2 et 3
par la méthode des équations normales.

1 >>> A
2 [[1.7431 e +14 8.736 e +10 4.378 e +07]
3 [8.7358 e +10 4.378 e +07 2.195 e +04]
4 [4.3783 e +07 2.195 e +04 1.100 e +01]]
Cette matrice a 3 lignes et 3 colonnes. On observe que les valeurs numériques dans
cette matrice sont d’ordres de grandeur très différents : les valeurs vont d’environ 10
jusqu’à 10 14 . Dans la session suivante, on affiche le vecteur des paramètres β.
1 >>> beta
2 [ 1.795 e -03 -7.091 e +00 7.003 e +03]
Donc le polynôme de degré 2 qui approche le mieux les données au sens des moindres
carrés est :
y(t) = 0.001795t2 − 7.091t + 7003.
Puisque la variable t représente une année, dont l’ordre de grandeur est proche de
103 , les coefficients associés à t2, t et 1 sont d’ordre de grandeur très différents. En
particulier, le coefficient devant t 2 doit nécessairement être relativement proche de
zéro. Nous reviendrons sur ce sujet par la suite lorsque nous analysons comment
normaliser la variable t. La figure 10.2 présente plusieurs ajustements de courbe avec
des polynômes de degré 1, 2 et 3. On constate qu’il y a un gain à utiliser un polynôme
de degré 2 au lieu d’un polynôme de degré 1 (modèle linéaire). L’ajustement par le
polynôme de degré 3 s’approche mieux des observations que le polynôme de degré 2.
Toutefois, il semble indiquer un « ralentissement » de l’accélération entre les années
1980 à 2000 environ, puis une accélération à partir de 2000. Puisque cet effet n’est pas
facile à observer dans les données, on peut penser que c’est plutôt un effet du choix
de la base polynomiale utilisée pour l’ajustement.
Dans la mesure où l’ajustement du polynôme de degré 3 n’est pas très convaincant,
on pourrait transformer les données avant de réaliser l’ajustement. Par exemple, on
peut considérer plutôt le logarithme du nombre de passagers, ce qui mène au modèle :
log (y(t)) = β1 t2 + β 2t + β 2
pour tout t ∈ R où les coefficients β1 , β 2, β3 sont des paramètres réels à déterminer.
Par conséquent :
y(t) = exp(β1 t 2 + β2t + β 2)
10.5 • Méthode des équations normales 265

pour tout t ∈ R. Ajuster les paramètres de ce modèle pourrait être réalisé avec la
méthode des équations normales.
Dans la remarque suivante, nous montrons comment normaliser les données par
deux méthodes différentes et nous analysons le lien avec le conditionnement du pro-
blème.
Remarque 10.4 (Normalisation des données et conditionnement). Plutôt que de consi-
dérer les variables indépendantes t1 , ..., t m , on peut considérer une transformation de
ces variables. La transformation la plus souvent utilisée consiste à centrer ces variables
de telle sorte que la moyenne empirique soit égale à zéro, puis de les réduire de telle
sorte que l’écart-type soit égal à un. Plus précisément, considérons la moyenne t et
l’écart-type empirique (biaisé) σ̂ des variables indépendantes :
v
m u m
1X u 1 X 2
t= ti, σ̂ = t ti − t .
n i=1 n i=1

Considérons alors les variables indépendantes centrées-réduites s1 , ..., sm définies par :


ti − t
si =
σ̂
pour i = 1, ..., m. On peut vérifier que la moyenne empirique des variables si est égal
à zéro et que l’écart-type empirique est égal à 1.
Lorsque les données sont bornées, une alternative consiste à transformer les don-
nées de telle sorte que les données normalisées soient dans l’intervalle [−1, 1]. Dans ce
cas, on considère :
tmax − t min
t min = min ti , t max = max ti , δ= , tc = tmin + δ
i=1,...,m i=1,...,m 2
tmax +t min
où δ est la moitié de l’amplitude des données et tc = 2 est le centre de gravité.
Alors, la variable transformée est :
ti − tc
si =
δ
pour i = 1, ..., m. On peut vérifier que si ∈ [−1, 1] pour i = 1, ..., m. Ce processus de
changement d’échelle est souvent appelé « normalisation » des données et les variables
si sont souvent appelées variables « normalisées ». De plus, on peut observer empiri-
quement que la matrice de conception X calculée en fonction des variables normalisées
si est beaucoup mieux conditionnée que la matrice de conception des variables indé-
pendantes ti . C’est la raison pour laquelle il est utile de normaliser les observations
avant de les transmettre à une procédure d’ajustement par moindres carrés linéaires.
On cherche à observer l’influence de la normalisation sur les résultats. Avec les
données du transport mondial de passagers, on obtient tc = 1995 et δ = 24, ce qui
mène à la transformation :
t − 1995
s=
24
pour tout t ∈ [1971, 2019]. Dans ce cas, les coefficients du polynôme β1s2 + β 2 s + β3
associé à la variable normalisée s sont :
β = (1.034, 1.707, 1.157) T .
266 Chapitre 10 • Moindres carrés linéaires

On observe que l’ordre de grandeur de ces coefficients est proche de 1, par opposition
aux coefficients du polynôme associé à la variable t. Plus de détails sur ce thème
sont présentés dans [62], chapitre 3 « Analysis of least squares problems », section 3.4
« Condition number and column scaling ».
Une difficulté importante de la méthode des équations normales est qu’elle est
associée à un conditionnement élevé, ce qui peut mener à une forte imprécision dans
les résultats, comme nous allons le voir dans la section suivante.

10.6 Conditionnement des équations normales


Dans cette section, nous analysons pourquoi les équations normales peuvent être
mal conditionnées. Nous allons observer des exemples pour lesquels la matrice de
Gram est singulière lorsque la matrice de conception est associée à des colonnes
presque linéairement dépendantes. Cette analyse justifie de rechercher d’autres mé-
thodes de résolutions comme la décomposition QR, que nous présenterons dans la
section 10.7. Pour comprendre pourquoi la méthodes des équations normales peut
mener à un problème mal conditionné, on peut considérer le théorème suivant.
Théorème 10.6. Soit X ∈ R m×n de rang plein. Le conditionnement de la matrice
de Gram X TX est :
κ2 (XT X ) = κ2 (X )2
où κ 2(X ) est le conditionnement en norme 2 de la matrice X .
Le théorème précédent est démontré dans [11] page 49. Pour démontrer ce théo-
rème, il faut étendre la notion d’inverse à la matrice rectangulaire X . Pour cela, il
faut introduire la décomposition en valeurs singulières (décomposition SVD), ce qui
est en dehors du programme de ce cours.
On pourrait penser que, si la matrice de conception X est de rang plein, il n’y
a pas de difficulté particulière. En fait, si les colonnes de la matrice X sont presque
linéairement dépendantes, alors le conditionnement de X est grand et le conditionne-
ment de la matrice de Gram est encore pire. En effet, le théorème précédent montre
que le conditionnement de la matrice de Gram est égal au carré du conditionnement
de la matrice de conception X initiale. Ainsi, la perte de chiffres significatifs lors de la
résolution du système d’équations linéaires peut être égale au double de la perte qui
aurait été occasionnée si l’on avait utilisé directement X au lieu de X T X, puisque :

log(κ(XT X )) = 2 log(κ(X )).

Le théorème ne signifie pas pour autant que la perte maximale de chiffres signi-
ficatifs a toujours lieu, mais cela signifie que, dans certains cas, une perte de chiffres
significatifs peut avoir lieu, en fonction des données du problème. En particulier, si
la matrice de conception X est orthogonale, alors le conditionnement des équations
normales est inchangé, puisque κ2 (X ) = 1. Cette situation peut arriver si la base de
fonctions est choisie de telle sorte que la valeur des fonctions φj aux points ti mène
à des colonnes de X orthogonales. Dans ce cas, le théorème implique le conditionne-
ment de la matrice de Gram est parfait, c’est-à-dire κ2 (XT X) = 1 et la méthode des
équations normales ne pose alors pas de problème de ce point de vue.
Comme on va le voir, lorsqu’on n’a pas sélectionné les fonctions de base de manière
particulièrement appropriée pour ce critère, la situation peut être très éloignée du
10.6 • Conditionnement des équations normales 267

cas idéal. Dans l’exemple suivant, nous observons les conditionnements respectifs des
matrices X et XT X.
Exemple 10.6 (Transport aérien de voyageurs (suite)). Considérons à nouveau les
données de l’exemple 10.1. Dans le script suivant8, on calcule le conditionnement de
la matrice X et de la matrice X T X.
1 >>> import numpy as np
2 >>> np . log10 ( np . linalg . cond ( X) )
3 10.89
4 >>> np . log10 ( np . linalg . cond ( A) )
5 21.77
Dans cet exemple, utiliser la matrice X T X pour résoudre ce système d’équations
linéaires peut faire perdre jusqu’à 20 chiffres significatifs. Comme il n’y a qu’environ
16 chiffres significatifs avec des doubles, utiliser la matrice XT X peut donner des
résultats très imprécis (dans les cas les plus défavorables).
Dans certains cas, les colonnes de la matrice X sont presque linéairement dépen-
dantes, sans l’être toutefois de manière exacte. Dans ce cas, il se peut que l’évaluation
numérique de matrice de Gram soit singulière lorsqu’on utilise des nombres à virgule
flottante, comme le montre l’exemple suivant.
Exemple 10.7 (Conditionnement des équations normales). Considérons la matrice
de conception définie par9 :  
1 1
X = δ 0 
0 δ
où δ est un réel non nul proche de zéro. Les deux colonnes de X sont mathématique-
ment linéairement indépendantes, mais définissent des vecteurs quasiment parallèles.
Si on utilise les équations normales, l’étendue des valeurs numériques dans la matrice
de Gram augmente à cause du carré. On obtient ici des valeurs proches de 1 :
 
T 1 + δ2 1
X X= .
1 1 + δ2
Si on évalue cette matrice avec des nombres à virgule flottante sur 64 bits et si
|δ| < 10−8, alors l’évaluation numérique de la matrice de Gram est singulière.
Approcher les données par un polynôme peut mener à un problème mal condi-
tionné lorsque ce polynôme est exprimé dans la base canonique. Cela ne pose pas
de problème lorsque ces polynômes sont orthogonaux du point de vue de leur dis-
crétisation. Par exemple, le conditionnement de la matrice de conception associé aux
polynômes de Chebyshev que nous avons introduit dans la section 8.3 est générale-
ment beaucoup plus modéré. Lorsqu’on utilise la base canonique, la situation empire
quand le degré du polynôme augmente, et c’est pourquoi on devrait plutôt utiliser
plutôt des polynômes de degré faible, par exemple de degré 1 (linéaire) ou 2 (quadra-
tique). Utiliser les équations normales empire encore la situation, puisque, au pire, le
nombre de chiffres perdus est multiplié par deux. C’est la raison pour laquelle on peut
être intéressé en particulier par la factorisation QR, ce qui est le sujet de la section
suivante.
8Script Python : Leastsq/Scripts/Py3/[Link].
9Voir [104] page 146.
268 Chapitre 10 • Moindres carrés linéaires

10.7 Décomposition QR (*)


La décomposition QR est une décomposition matricielle fondée sur l’utilisation
de matrices orthogonales. Nous allons voir que c’est une méthode qui peut être plus
stable pour la résolution du problème des moindres carrés linéaires que la méthode des
équations normales. Dans le théorème suivant, nous montrons que n’importe quelle
matrice réelle rectangulaire peut être décomposée sous la forme du produit d’une
matrice orthogonale et d’une matrice triangulaire supérieure.
Théorème 10.7 (Décomposition QR). Soit X ∈ R m×n une matrice réelle. Alors, il
existe deux matrices Q et R telles que :

X = QR

où Q ∈ R m×m est une matrice orthogonale, c’est-à-dire Q T Q = I m, et R ∈ Rm×n est


une matrice triangulaire supérieure.
Lorsque la matrice X est une matrice carrée, c’est-à-dire si m = n, alors les
matrices Q et R sont uniques 10. Dans ce cas, on peut obtenir la matrice Q par le
procédé d’orthogonalisation de Gram-Schmidt. Dans le cas où il y a plus d’équations
que d’inconnues, c’est-à-dire si m ≥ n, alors la méthode de Gram-Schmidt permet de
déterminer n vecteurs colonnes orthogonales, que l’on doit compléter par m − n vec-
teurs orthogonaux pour former la matrice Q. La méthode de Gram-Schmidt classique
peut être instable et on lui préfère souvent la méthode de Gram-Schmidt modifiée 11 .
Une alternative à la méthode de Gram-Schmidt consiste à utiliser la transformation
de Householder12 . Une méthode fondée sur les rotations de Givens peut également
être développée 13. Nous ne présenterons pas ces méthodes dans ce livre. La factori-
sation QR d’une matrice carrée X de taille m-par-n coûte O(mn 2 ) opérations. Une
matrice orthogonale possède des propriétés particulières vis-à-vis de la norme eucli-
dienne puisqu’elle préserve la norme 2 ce qui implique que kQxk 2 = kxk 2 pour tout
vecteur x compatible. En conséquence, le conditionnement d’une matrice orthogonale
est parfait et égal à 1 (voir l’exercice 7.6, page 169). Plus de détails sur les propriétés
d’une matrice orthogonale sont présentés dans l’exercice 7.5 page 169. Dans le cas
où m ≥ n, les m − n dernières lignes de R sont nulles (puisque R est triangulaire
inférieure), ce qui implique :
 
  R1
X = QR = Q 1, Q2 = Q1R 1
0

où Q1 est de taille m-par-(m − n) et R1 est de taille (m − n)-par-(m − n). L’équation


précédente permet de définir deux modes de calcul de la décomposition QR. Le mode
plein consiste à évaluer directement les matrices Q et R. Le mode économique consiste
à évaluer uniquement les matrices Q1 et R1 , ce qui évite de stocker inutilement les
zéros des dernières lignes de la matrice R ainsi que la matrice Q2. La figure 10.3
présente les modes plein et économique de la factorisation QR d’une matrice. Dans
l’exemple suivant, nous appliquons la décomposition QR aux données de transport
aérien de voyageurs.
10Voir [3] page 117.
11Voir [11] page 61.
12Voir [3] page 136.
13Voir [11] page 53.
10.7 • Décomposition QR (*) 269

n n
X = Q R X = Q1 R1
m m 0
0

Figure 10.3 – Mode plein et mode économique pour la factorisation QR d’une


matrice X ∈ Rm×n , avec m ≥ n.

Exemple 10.8 (Transport aérien de voyageurs (suite)). Considérons à nouveau les


données de l’exemple 10.1. Dans la session suivante14, on calcule la décomposition
QR de la matrice X en mode économique.
1 >>> import numpy as np
2 >>> Q , R = np . linalg .qr (X )
3 >>> Q
4 [[ -0.2943 -0.4674 0.4933]
5 [ -0.2954 -0.3915 0 .2352]
6 [ -0.2969 -0.2961 -0.0216]
7 [ -0.2984 -0.2002 -0.2052]
8 [ -0.3000 -0.1039 -0.3157]
9 [ -0.3015 -0.0070 -0.3529]
10 [ -0.3030 0.0903 -0.3169]
11 [ -0.3045 0.1881 -0.2078]
12 [ -0.3060 0.2864 -0.0255]
13 [ -0.3075 0.3852 0.2300]
14 [ -0.3088 0.4645 0.4872]]
15 >>> R
16 [[ -1.320 e +07 -6.617 e +03 -3.316 e +00]
17 [ 0.000 e+00 -5.149 e+01 -5.162 e -02]
18 [ 0.000 e+00 0.000 e +00 1.716 e -04]]

On remarque que les valeurs numériques dans la matrice Q sont entre -1 et 1. Dans
la matrice R, l’ordre de grandeur des valeurs numériques est entre 10−4 et 107 , ce
qui reflète les différences d’ordre de grandeur dans X . Dans la session suivante, on
souhaite vérifier que QT Q = I3 , c’est-à-dire que nous vérifions l’orthonormalité des
colonnes de Q. Pour cela, nous vérifions que la norme de chaque colonne est égale à
1 et que les colonnes sont orthogonales entre elles.
1 >>> import numpy as np
2 >>> Q [: ,0] @ Q [: ,1]
3 1.527 e -16
4 >>> Q [: ,0] @ Q [: ,2]
5 -1.388 e -16
6 >>> Q [: ,1] @ Q [: ,2]
7 -2.776 e -17
8 >>> np . linalg . norm ( Q [: ,0])
9 1.0
10 >>> np . linalg . norm ( Q [: ,1])
11 1.0
12 >>> np . linalg . norm ( Q [: ,2])
14 Script Python : Leastsq/Scripts/Py3/[Link].
270 Chapitre 10 • Moindres carrés linéaires

13 1.0

On analyse maintenant de manière informelle comment utiliser la décomposition


QR dans le cadre d’un problème de moindres carrés linéaires. L’équation X β ≈ y
devient :
QRβ ≈ y.
On multiplie à gauche par QT et on obtient Q T QRβ ≈ QT y. Or la matrice Q est
orthogonale, ce qui implique QT Q = I m. Donc :

Rβ ≈ Q T y.

Dans le cas m ≥ n, les m − n dernières lignes de R sont nulles. C’est pourquoi on


utilise R1 et Q 1 au lieu de R et Q. Cela implique :

R1 β = QT1 y.

L’argument intuitif présenté précédemment est justifié par la preuve rigoureuse pré-
sentée dans l’exercice 10.7. L’algorithme fondé sur la décomposition QR est le suivant.
1. On effectue la décomposition QR de la matrice X .
2. On calcule le vecteur z en évaluant le produit matrice-vecteur z = QT1 y.
3. On calcule le vecteur β en résolvant le système d’équations linéaires R1 β = z.
L’algorithme de résolution peut s’appuyer sur l’algorithme de remontée présenté dans
la section 7.6, puisque la matrice R1 est triangulaire supérieure. Si la matrice R1
est non singulière, alors l’algorithme précédent calcule la solution du problème de
moindres carrés linéaires. Considérons à nouveau l’exemple du transport aérien de
voyageurs et utilisons la décomposition QR.
Exemple 10.9 (Transport aérien de voyageurs (suite)). On considère les données de
l’exemple 10.1. Le script Python suivant15 utilise la décomposition QR pour calculer
la solution du problème :
1 >>> import numpy as np
2 >>> z = Q .T @ y
3 >>> beta = np . linalg . solve (R , z )
4 >>> beta
5 [ 1.795 e -03 -7.091 e +00 7.003 e +03]
Donc le polynôme de degré 2 qui approche le mieux les données au sens des moindres
carrés est :
y(t) = 0.001795t2 − 7.091t + 7003
pour tout t ∈ R. La solution précédente est presque la même qu’avec les équations
normales.

10.8 Application : résistivité du cuivre


La résistivité, qui s’exprime en ohms mètres (Ω·m), est la résistance électrique d’un
matériau d’un mètre de longueur et d’un mètre carré de section. Lorsqu’on chauffe
15Script Python : Leastsq/Scripts/Py3/[Link].
10.8 • Application : résistivité du cuivre 271

T (°C) 28 32 38 42 46 50 54 58
ρ (Ω · m) 104.9 108.3 107.7 110.5 111.9 112.1 115.6 117.1

Table 10.2 – Résistivité électrique du cuivre en fonction de la température.

Résistivité (Ω.m)
115 Données
110 Modèle

105
40 60
Température (°C)

Figure 10.4 – Résistivité du cuivre en fonction de la température.

un métal dans lequel on fait passer un courant électrique, la résistivité augmente. Il


s’avère, de plus, que la relation est linéaire. Dans cette section, nous appliquons la
méthode des moindres carrés linéaires à des données issues de mesures expérimentales
de la résistivité du cuivre. Des mesures de la résistivité du cuivre en fonction de la
température ont été effectuées 16. Elles sont présentées dans la table 10.4 et la figure
10.217 . On considère le modèle :
ρ(T ) = β1 T + β2
où T est la température, R est la résistance et β1 , β2 sont des paramètres réels à
déterminer. Le coefficient de résistivité, noté α, est tel que ρ(T ) = β1 (1 + αT ) ce
qui implique α = ββ12 . Nous avons développé pour ce cours la fonction polynomial_-
fit_normal_equations du module leastsq 18 qui utilise les équations normales et la
méthode du pivot de Gauss.
1 from leastsq import po ly nom ia l_f it_ no rma l_ equ ati on s
2

3 temp eratur e = [28.0 , 32.0 , 38.0 , 42.0 , 46.0 , 50.0 ,


4 54.0 , 58.0]
5 resi stivit y = [104.9 , 108.3 , 107.7 , 110.5 , 111.9 ,
6 112.1 , 115.6 , 117.1]
7 degre = 1
8 betCo pper1 = p oly no mia l_f it _no rm al_ equ at ion s (
9 temperature , resistivity , degre )
10 alpha = betCop per1 [0] / b etCopp er1 [1]
On obtient :
β1 = 0.3755 (Ω · m/Deg), β 2 = 94.68 (Ω · m)
ce qui implique α = 3.966 × 10−3 (Deg −1 ). De même, la fonction polynomial_fit du
module leastsq utilise la décomposition QR et la méthode du pivot de Gauss.
16 Voir [32] page 3
17 Script Python : Leastsq/Scripts/Py3/[Link].
18 Script Python : Scripts-Eleves/Py3/[Link].
272 Chapitre 10 • Moindres carrés linéaires

1 from leastsq import pol ynom ial_ fit


2 betCo pper2 = po lyno mial _fit ( temperature , resistivity , 1)

On obtient les mêmes résultats que précédemment.

10.9 Conclusion
Pour aller plus loin sur ce thème, on peut analyser les sujets suivants. Dans le
contexte des problèmes de moindres carrés linéaires, une technique classique consiste
à utiliser la décomposition de Cholesky pour résoudre les équations normales. Lorsque
le problème est dégénéré, alors la solution n’est pas unique, mais on peut utiliser le
pseudo-inverse de Moore-Penrose. La décomposition SVD peut également être utilisée
pour résoudre des problèmes de moindres carrés linéaires. L’analyse statistique des ré-
sidus est riche d’enseignements. Sur ces sujets, le lecteur intéressé peut consulter [11].

10.10 Notes et références


La figure 10.3 est inspirée de la figure 5.3, page 147 dans [104], avec des modi-
fications. Une figure similaire est présentée dans [136] pages 49 et 50, dans laquelle
la factorisation économique est nommée « réduite ». Plus de détails sur les méthodes
de moindres carrés sont disponibles dans le livre de Björck [11]. L’exercice 10.7 est
présenté dans [55], dans le chapitre 5 « Orthogonalization and Least Squares », dans
la section 5.3.3 « LS Solution Via QR Factorization » page 263. Une autre preuve
des équations normales est donnée dans [3], chapitre 5 « Least squares », section 7.2
« Main results ». Cette preuve est fondée sur les propriétés du produit scalaire, qui
ne sont pas vues en cours. La même preuve des équations normales est donnée dans
[11], chapitre 1, section 1.1.4 « Characterization of least squares solutions ».
On remarque que le vecteur des résidus r = y − Xβ utilisé dans le contexte des
moindres carrés linéaires est l’opposé du vecteur des résidus Ax − b utilisé dans le
contexte des systèmes d’équations linéaires. Bien que cela soit quelque peu étrange,
c’est la convention adoptée dans la plupart des ouvrages.
Dans la section 10.4, nous avons présenté le conditionnement des problèmes de
moindres carrés linéaires. Dans la définition 10.7, nous avons introduit le condition-
nement d’une matrice rectangulaire. On peut également définir le conditionnement
d’une matrice rectangulaire en fonction de sa décomposition en valeurs singulières
([136] équation 18.3 page 130). Les théorèmes 10.3 et 10.4 sont présentés dans [136]
page 131, dans [3] pages 129 et 130. Dans [11] théorème 1.4.6 page 30, l’auteur perturbe
simultanément la matrice et le second membre ce qui mène à un résultat similaire,
mais un peu plus complexe.
Dans la section 10.5, nous avons décrit les équations normales pour résoudre le
problème des moindres carrés linéaires. Si les colonnes de la matrice X sont linéaire-
ment indépendantes, c’est-à-dire si les fonctions de base φj sont indépendantes aux
points ti , alors la matrice X T X est symétrique et définie positive. Dans ce cas, il
s’avère que la permutation des lignes n’est pas nécessaire dans l’algorithme du pivot
de Gauss [70, 131, 69]. En effet, on peut démontrer que le facteur de croissance ρn est
dans ce cas égal à 1 (voir [70], chapitre 10 « Cholesky factorization » page 211 exercice
10.4). De plus, la permutation des lignes peut détruire la symétrie de la matrice, et
10.11 • Exercices 273

polynomial_fit_normal_equations Résout les équations normales


polynomial_value Valeur du polynôme
polynomial_fit Ajustement polynomial

Table 10.3 – Fonctions du module [Link].

donc la positivité ([131] chapitre 4 « Gaussian elimination » page 239). C’est la raison
pour laquelle un autre algorithme est souvent utilisé, l’algorithme de Cholesky. Cet
algorithme ne sera pas présenté dans ce document.
Dans l’exemple 10.7, nous avons montré un exemple de matrice de conception
de rang plein pour laquelle l’évaluation numérique de la matrice de Gram avec des
nombres à virgule flottante est singulière. Un exemple similaire est présenté dans [70]
page 386 ou encore dans [11] page 44. L’application sur la mesure de la résistivité
du cuivre dans la section 10.8 est inspirée d’un rapport rédigé par des étudiants du
département de physique de l’Université Technique de Prague en République Tchèque
[32].
La table 10.3 présente les fonctions du module [Link] développé pour ce livre.

10.11 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.

Exercice 10.1 (Un exemple simple) On considère les observations suivantes :

t -1 0 1 2
y 0 1 3 7

On considère les fonctions de base φ1 (t) = t2, φ2 (t) = t et φ3 (t) = 1 pour tout t ∈ R. On
cherche le modèle quadratique :
2
y (t) = β1 t + β2 t + β 3

pour tout t ∈ R qui s’ajuste le mieux aux données au sens des moindres carrés. La situation
est présentée dans la figure 10.519.
1. Calculer la matrice de conception X .
2. Calculer la matrice et le second membre des équations normales.
3. (Optionnel) À l’aide de Python, calculer la solution du système d’équations linéaires
associé aux équations normales et en déduire le modèle quadratique y(t) associé.

** Exercice 10.2 (Dérivation des équations normales par perturbation) L’objectif de cet
exercice est de démontrer le théorème 10.5. Soient X ∈ R m×n et y ∈ Rm . On recherche
β ∈ Rn solution du problème de moindres carrés linéaires au sens de la définition 10.5 page
258.
1. Soit β, z ∈ Rn . On considère le vecteur a = β + z, où  est un réel. Montrer que :

ky − Xa k 2 =ky − Xβ k2 − 2hy − X β , X zi + 2 kXzk2 . (10.11)


19 Script Python : Leastsq/Scripts/Py3/[Link].
274 Chapitre 10 • Moindres carrés linéaires

5 Modèle
Données

y
0
0.0 2.5
t

Figure 10.5 – Modèle quadratique associé aux données de l’exercice 10.1.

2. Montrer que si β est solution du problème de moindres carrés linéaires, alors :

X T X β = X T y. (10.12)

Indication. Utiliser l’égalité hy − X β , X zi = hX T (y − Xβ ), zi pour tout z ∈ Rn et


noter que XT (y − Xβ ) = X T y − X T Xβ.
3. Réciproquement, montrer que si β satisfait l’équation 10.12, alors β est solution du
problème de moindres carrés linéaires.

Remarque 10.5 (Norme euclidienne). Nous rappelons que dans l’exercice précédent ainsi que
dans tous les exercices qui suivent, la norme vectorielle k · k est la norme euclidienne.
Les deux définitions suivantes définissent les quatre espaces fondamentaux associés à une
matrice.
m×n
Définition 10.9 (Image et noyau d’une matrice). Soit A une matrice T dans R . Soit R(A)
l’espace vectoriel engendré par les colonnes de la matrice A et R A l’espace vectoriel des
T
colonnes de la matrice A :
 
R(A) = {y = Ax ∈ Rm | x ∈ Rn }, R AT = {x = AT y ∈ R n | y ∈ Rm }.

On dit que R(A) est l’image de A. De manière équivalente, c’est l’espace vectoriel
 T  des lignes
de A. Soit N (A) l’ensemble des solutions de l’équation Ax = 0 et soit N A l’ensemble
T
des solutions de l’équation A y = 0 :
 
N (A) = {x ∈ Rn | Ax = 0}, N AT = {y ∈ Rm | AT y = 0}.

On dit que N (A) est le noyau de A.

Théorème 10.8 (Théorème fondamental de l’algèbre linéaire : orthogonalité des espaces


fondamentaux). Soit A une matrice dans R m×n. Premièrement, l’image de A et le noyau
 de
T T
A sont orthogonaux. En d’autres termes, pour tout vecteur z ∈ R(A) et y ∈ N A , on a
zT y = 0. De plus, l’image de AT et le noyau de A sont orthogonaux.

Remarque 10.6 (Orthogonalité des espaces fondamentaux). La figure 10.6, inspirée de Gil-
bert Strang [132] (p.198), illustre le théorème précédent. Dans cette figure, on représente à
gauche l’espace Rn et à droite l’espace R m . La matrice A fait passer tout vecteur de gauche
x ∈ R n vers le vecteur de droite b ∈ R m, ce qui explique la flèche centrale de la gauche
 T vers la
T
droite. Puisque l’image de A (c’est-à-dire R(A)) et le noyau de A (c’est-à-dire N A ) sont
orthogonaux, les deux rectangles de droite ont étés Treprésentés
 de manière perpendiculaire.
T
De même, puisque l’image de A (c’est-à-dire R A ) et le noyau de A (c’est-à-dire N (A))
sont orthogonaux, les deux rectangles de gauche ont étés représentés de manière perpendi-
culaire. Considérons un vecteur x ∈ Rn . On peut le décomposer de manière unique comme
10.11 • Exercices 275

dim=r
dim=r
R(A ) T
y b R(A)
x

0
n
R z 0 Rm
N(A)
N(A T)

dim=n-r dim=m-r

Figure 10.6 – Orthogonalité des quatre espaces fondamentaux de la matrice A ∈


Rm×n.

y
r

R(X)
Xβ^

Figure 10.7 – Interprétation géométrique d’un problème de moindres carrés linéaires.

 
la somme x = y + z où z ∈ N (A) et y ∈ R AT : le vecteur z est le projeté orthogonal
 
de x sur N (A) et le vecteur y est le projeté orthogonal de x sur R A T . Par définition du
noyau, l’image de z par l’application linéaire associée à la matrice A est le vecteur nul, ce qui
explique la flèche en bas, de la gauche vers la droite. De plus, on a Ax = Ay + Az = Ay = b,
ce qui explique la flèche du haut. Enfin, la figure présente la dimension des sous-espaces
vectoriels correspondants : une partie de ce résultat apparaît dans le théorème du rang (le
théorème 10.9, page 275).

*** Exercice 10.3 (Moindres carrés et orthogonalité) Démontrer le théorème 10.8.

*** Exercice 10.4 (Moindres carrés et orthogonalité) Soit X une matrice dans Rm×n .
Considérons la solution β̂ du problème de moindres carrés linéaires au sens de la définition
10.5. Montrer que r = y − X β̂ ∈ N (X T ). En déduire que les deux composantes du vecteur
y = Xβ̂ + r sont orthogonales. Indication. Utiliser le théorème 10.8.
La figure 10.7 présente une interprétation géométrique d’un problème de moindres carrés
linéaires, dans lequel la solution du problème est β̂. L’espace R(X ) contient tous les vecteurs
z = X β. Le point Xβ̂ est le projeté orthogonal de y sur le sous-espace R(X ). Le résidu
r = y − Xβ̂ est orthogonal au sous-espace R(X ).

** Exercice 10.5 (Deux noyaux égaux) Soit A une matrice dans Rm×n . Démontrer que
N (A) = N (AT A).

Théorème 10.9 (Théorème fondamental de l’algèbre linéaire : théorème du rang). Soit A


une matrice dans Rm×n . Alors dim(N (A)) + dim(R(A)) = n.
276 Chapitre 10 • Moindres carrés linéaires

Ce théorème ne sera pas démontré dans ce cours.

*** Exercice 10.6 (Rang et unicité de la solution du problème de moindres carrés linéaires)
Soit X une matrice dans Rm×n . On considère le problème de moindres carrés linéaires au
sens de la définition 10.5.
1. Supposons que X est de rang plein c’est-à-dire que dim(R(A)) = n. Montrer que la
solution du problème de moindres carrés est unique.
2. Supposons que X n’est pas de rang plein, c’est-à-dire que dim(R(A)) < n. Alors,
montrer que la solution des équations normales n’est pas unique. Pour cela, montrer
que, si β̂ est solution des équations normales et si β0 est un vecteur non nul tel que
β0 ∈ N (X ), alors le vecteur β̂ + β0 est également solution des équations normales.

Remarque 10.7. Si la matrice X n’est pas de rang plein, alors il existe une infinité de vecteurs
β0 non nuls tels que β0 ∈ N (X ). Plus précisément, la dimension de ce sous-espace vectoriel
est, d’après le théorème du rang, par l’équation dim(N (X )) = n − dim(R(X )) > 0.

*** Exercice 10.7 (Décomposition QR et moindres carrés linéaires) Soit X ∈ R m×n une
matrice et y ∈ Rm un vecteur. On recherche β ∈ Rn solution du problème de moindres carrés
linéaires au sens de la définition 10.5. On suppose que m ≥ n. Soient Q et R les matrices de
la décomposition QR de X au sens du théorème 10.7. On suppose que :
 
R1
R= (10.16)
0

où R 1 ∈ Rn×n est une matrice non singulière. On suppose que :

Q = (Q1 , Q 2 ) (10.17)

où Q1 ∈ R m×n et Q2 ∈ R m×(m−n). Montrer que, si β ∈ Rn est tel que R1 β = QT1 y, alors β


est solution du problème de moindres carrés linéaires.

** Exercice 10.8 (Inversibilité des équations normales) Soit X ∈ Rm×n la matrice de


conception au sens de la définition 10.4. Pour j = 1, ..., n, soit :
 
φj (t1 )
 φj (t2 ) 
xj = 
 ..  ∈ R
 m

.
φ j (tm)

la j-ème colonne de la matrice X . Si les fonctions φj sont linéairement indépendantes aux


point t i , c’est-à-dire si les vecteurs xj sont linéairement indépendants, alors montrer que la
matrice X T X est inversible. Indication. Montrer que Xβ = 0 si et seulement si β = 0 puis
montrer que XT Xβ = 0 si et seulement si β = 0.

** Exercice 10.9 (Positivité de la matrice des équations normales) Soit X ∈ Rm×n la


matrice de conception au sens de la définition 10.4. Soit λ une valeur propre de la matrice
XT X. Cette valeur propre est réelle, puisque la matrice X T X est symétrique. Montrer que
λ ≥ 0. Si les colonnes de X sont linéairement indépendantes, montrer que λ > 0.
Chapitre 11

Intégration

Dans ce chapitre, nous analysons des méthodes d’intégration numérique. Étant


donnée des bornes a et b réelles avec a < b et une fonction f , le problème consiste
à évaluer l’intégrale de la fonction sur cet intervalle. Il y a plusieurs contextes dans
lesquels on est amené à évaluer une intégrale. À la fin de ce chapitre par exemple, dans
la section 11.11, nous considérerons un problème probabiliste dans lequel on souhaite
évaluer une probabilité. Une autre source de problèmes d’intégration se trouve dans
la résolution de certaines équations différentielles ordinaires. Nous reviendrons sur ce
sujet dans la section 12.1 du chapitre 12 sur les EDO, où nous verrons le rôle du
théorème fondamental de l’analyse dans ce contexte.
Pour construire des méthodes d’intégration, une méthode possible consiste à uti-
liser les méthodes d’interpolation présentées dans le chapitre 8. Dans ce contexte, la
technique consiste à créer un polynôme interpolateur, puis à utiliser l’intégrale du
polynôme pour créer une approximation de la valeur de l’intégrale de la fonction. Par
ce moyen, si le polynôme est une bonne approximation de la fonction, alors l’intégrale
du polynôme peut être une approximation précise de l’intégrale.
Nous commençons dans ce chapitre par introduire plusieurs méthodes d’intégra-
tion simples comme la méthode du point milieu et du rectangle. Puis, nous définissons
des méthodes plus précises analogues à la méthode d’extrapolation de Richardson vue
dans la section 9.6. On peut également obtenir une méthode en intégrant le polynôme
interpolant, ce qui mène aux formules de Newton-Cotes. Nous présentons ensuite une
méthode de quadrature adaptative qui s’ajuste aux propriétés de la fonction en pro-
duisant une approximation de l’intégrale associée à une précision pré-déterminée par
l’utilisateur. Nous présentons des techniques qui permettent de concevoir un problème
d’intégration facile à résoudre numériquement. Enfin, nous analysons les limitations
de l’intégration numérique.
Avant de présenter des méthodes plus fines, commençons par analyser une méthode
d’intégration simple, mais intuitive. Le mot quadrature se réfère à une technique d’in-
tégration de la Grèce antique utilisée pour calculer une surface. La méthode consiste à
dessiner la fonction sur une surface quadrillée. La valeur de l’intégrale est approchée
par le produit du nombre de carrés sous la courbe par la surface d’un carré. Soit
f (x) une fonction réelle où x est une variable réelle dans un intervalle [a, b]. On veut

277
278 Chapitre 11 • Intégration

f (x)
0
0 1
x

Figure 11.1 – L’intégrale de f (x) pour x entre a et b est la surface sous la courbe
y = f (x).

calculer l’intégrale :
Z b
f (x)dx.
a

Dans ce contexte, la fonction f est nommée un « intégrande ». Comme le montre


la figure 11.1 1 , l’intégrale précédente est la surface sous la courbe y = f (x). Dans
l’exemple suivant, nous intégrons la fonction sinus.

Exemple 11.1 (Quadrature). On considère la fonction :


 2
5x
f (x) = sin (11.1)
2

pour tout x ∈ [0, 1]. L’intégrale exacte est :


Z 1
5 − sin(5)
f (x)dx = = 0.5959. (11.2)
0 10

Dans, la suite, on suppose que f est continûment dérivable sur [a, b].

11.1 Conditionnement de l’intégrale


L’analyse du conditionnement du problème d’intégration consiste à observer com-
ment change la valeur de l’intégrale lorsque la valeur de la fonction ou les bornes de
l’intervalle sont modifiés. Dans cette section, nous montrons que, si on considère l’er-
reur relative, la valeur de l’intégrale peut être très sensible à des changements dans
la valeur de la fonction, en particulier lorsque l’intégrale est proche de zéro. C’est
en particulier le cas lorsqu’on considère un intégrande oscillant. Nous commençons
par définir le conditionnement de l’intégrale par rapport à une perturbation de l’inté-
grande. Pour cela, il est nécessaire d’introduire une norme sur les fonctions intégrables
de telle sorte que l’on puisse définir la norme de la perturbation de l’intégrande f .
Cette norme peut ensuite être utilisée pour définir l’erreur absolue et l’erreur relative
sur la perturbation de l’intégrande.

1Script Python : Integration/Scripts/Py3/[Link].


11.1 • Conditionnement de l’intégrale 279

Définition 11.1 (Conditionnement de l’intégrale par rapport à f ). Supposons que


f est une fonction réelle intégrable sur un intervalle [a, b], avec a < b. On considère
l’intégrale :
Zb
I (f ) = f (x)dx.
a
On cherche à quantifier le changement dans l’intégrale I (f ) lorsqu’on considère une
perturbation de la fonction f par une fonction δ intégrable. Soit k · k une norme sur
l’espace des fonctions intégrables. Le conditionnement absolu de l’intégrale est :
eabs (I (f ), I (f + δ))
cabs (f, a, b) = lim sup (11.3)
→0 kδ k≤ eabs (f, f + δ)

où e abs(f, f + δ) est l’erreur absolue entre la fonction f et sa perturbation f + δ :

eabs(f, f + δ) = kδ k. (11.4)

Supposons de plus que I (f ) =


6 0. Le conditionnement relatif de l’intégrale est :
erel (I (f ), I (f + δ))
crel (f, a, b) = lim sup (11.5)
→0 kδ k≤ erel (f, f + δ)

où e rel(f, f + δ) est l’erreur relative entre la fonction f et sa perturbation f + δ :


kδ k
eabs (f, f + δ) = .
kf k

L’équation 11.4 correspond à l’erreur absolue entre f et f +δ puisque k(f +δ )−f k =


kδk. Dans le théorème suivant, nous montrons que les conditionnements précédents
peuvent avoir, sous certaines hypothèses, une expression plus simple. Pour obtenir
ce résultat, nous considérons la norme infinie d’une fonction que nous avons déjà
présentée dans la définition 8.7 page 197.
Théorème 11.1 (Conditionnement de l’intégrale par rapport à f ). On considère la
norme infinie k · k ∞ sur l’espace des fonctions intégrables. Le conditionnement absolu
est :

cabs (f, a, b) = b − a. (11.6)

Le conditionnement relatif est :


kf k ∞
c rel (f, a, b) = (b − a)  R b .
 (11.7)
 a f ( x) dx

Le théorème précédent est démontré dans l’exercice 11.16. Il indique que le condi-
tionnement absolu d’une intégrale sur un intervalle borné (c’est-à-dire avec a et b
finis) peut être grand si la longueur de l’intervalle est grand. Toutefois, sauf lorsqu’on
utilise un domaine d’intégration très grand, l’intégrale est généralement bien condi-
tionnée du point de vue du conditionnement absolu. Le conditionnement relatif est
grand si la longueur de l’intervalle est grand, si la fonction est non bornée (c’est-à-dire
si kf k∞ est grand) ou si l’intégrale est proche de zéro. En particulier, le condition-
nement est infini si on intègre une fonction non nulle telle que I (f ) = 0. C’est par
280 Chapitre 11 • Intégration

exemple le cas pour la fonction f (x) = sin(x) sur l’intervalle [−π, π]. D’une manière
plus générale, une fonction oscillante d’intégrale nulle peut être mal conditionnée du
point de vue de l’intégrale. Nous montrerons un cas de problème mal conditionné dans
l’exemple 11.13. Analysons maintenant le conditionnement de l’intégrale par rapport
aux bornes.

Théorème 11.2 (Conditionnement de l’intégrale par rapport aux bornes). Supposons


que f est une fonction réelle intégrable sur un intervalle [a, b], avec a < b. Soit F la
fonction de b définie par :
Z b
F (b) = f (x)dx. (11.8)
a

On analyse la sensibilité de l’intégrale par rapport à une perturbation sur la borne b.


Considérons la norme infinie de f . Le conditionnement absolu de l’intégrale pour une
perturbation par rapport à b est :
 
 F (b + ) − F (b) 

cabs (b) = lim  . (11.9)
→0  

Alors :

cabs(b) = |f (b)|. (11.10)

Le conditionnement relatif de l’intégrale pour une perturbation par rapport à b est :


 
 F (b+)−F (b) 
 F (b) 
cabs (b) = lim ||
. (11.11)
→0
|b|

Alors :
|bf (b)|
crel(b) =  R b .
 (11.12)
 a f (x)dx

Le théorème fondamental de l’analyse implique que la dérivée de la fonction F


définie par l’équation 11.8 est la primitive de la fonction f , à une constante près. Le
théorème précédent est démontré dans l’exercice 11.17. Il montre que le condition-
nement absolu peut être grand lorsque |f (b)| est grand. Cela signifie qu’une petite
perturbation sur la borne b peut impliquer une grande perturbation sur l’intégrale
lorsque la fonction f est singulière en b. Bien sûr, le même principe est vrai pour une
perturbation par rapport à la borne de gauche, c’est-à-dire par rapport à a.

11.2 Règles de quadrature


Dans cette section, nous présentons quelques règles de quadrature simples, en
particulier les règles du point milieu, du trapèze et de Simpson. Une règle de quadra-
ture est une formule permettant d’obtenir une approximation de l’intégrale de f sur
l’intervalle [a, b] en combinant les valeurs de la fonction en des points bien choisis.
11.2 • Règles de quadrature 281

Définition 11.2 (Règle de quadrature). Soient a, b ∈ R deux réels tels que a < b. Soit
f ∈ C 0 ([a, b]) une fonction intégrable sur l’intervalle [a, b]. Soient x1 , ..., xn ∈ [a, b] les
nœuds tels que x 1 < x 2 < ... < xn et w 1 , ..., wn ∈ R les poids. Alors, la règle de
quadrature R est définie par :
n
X
R(f, a, b) = wk f (xk ). (11.13)
k=1

En d’autres termes, une règle de quadrature est une somme pondérée de valeurs
de la fonction f aux nœuds. Dans la suite, on note h la longueur de l’intervalle :

h = b − a.

Les deux premières règles de quadrature que nous allons observer sont les règles du
point milieu et du trapèze.
Définition 11.3 (Formule du point milieu, du trapèze). La surface d’un rectangle
de largeur h = b − a et dont la hauteur est déterminée par la valeur de f au milieu
est :
 
a+b
M = hf . (11.14)
2
La surface d’un trapèze de largeur h et dont les hauteurs sont calculées en fonction
des valeurs de f aux bords est :
h
T = (f (a) + f (b)) . (11.15)
2
Observons qu’il serait tout aussi légitime que la règle du point milieu se nomme
règle du rectangle, mais cela n’est pas un nom très usité pour cette méthode. Dans
l’équation 11.14, nous avons M = M (f, a, b) car la règle du point milieu dépend de la
fonction f et des bornes a et b. Nous avons écrit M par souci de concision, comme nous
l’avons fait pour la règle du trapèze, ainsi que pour toutes les règles de quadrature
de ce chapitre. La règle du point milieu est une règle de quadrature au sens de la
définition 11.2, associée au nœud x1 = (a + b)/2 et au poids w 1 = h. De même, la
règle du trapèze est une règle de quadrature associée aux nœuds x1 = a et x2 = b
et aux poids w1 = w2 = h/2. Dans l’exemple suivant, nous utilisons les méthodes du
point milieu et du trapèze et observons leurs précisions.
Exemple 11.2 (Point milieu et règle du trapèze). On considère à nouveau la fonction
f introduite dans l’exemple 11.1 et définie par l’équation 11.1. La figure 11.22 présente
la formule du point milieu et la formule du trapèze appliquée à la fonction f . Dans
le script suivant 3 , nous implémentons la méthode du point milieu. Nous commençons
par définir la fonction myfunc qui utilise l’équation 11.1 pour définir la fonction f . On
évalue ensuite la fonction f au point c et nous utilisons l’équation 11.14 pour évaluer
une approximation de l’intégrale.
1 import numpy as np
2

2Script Python : Integration/Scripts/Py3/[Link].


3Script Python : Integration/Scripts/Py3/[Link].
282 Chapitre 11 • Intégration

Point milieu : 0.9006 Trapèze : 0.1791


1 1

f (x)

f (x)
0 0
0 1 0 1
x x

Figure 11.2 – Intégration d’une fonction par une règle de quadrature. La fonction
est représentée en pointillés. À gauche, la formule du point milieu. À droite, la formule
du trapèze.

3 def myfunc (x) :


4 y = np . sin (2.5 * x ) ** 2
5 return y
6

7 a = 0.0
8 b = 1.0
9 h = b - a
10

11 c = (a + b ) / 2.0
12 fc = myfunc (c)
13 M = h * fc
Pour utiliser la règle du trapèze, le script suivant évalue la fonction f aux points a et
b puis utilise l’équation 11.15 :
1 fa = myfunc (a)
2 fb = myfunc (b)
3 T = h * ( fa + fb ) / 2.0
La règle du point milieu produit l’approximation M = 0.9006, tandis que la règle
du trapèze produit T = 0.1791. La règle du point milieu correspond à l’intégrale du
polynôme interpolant de degré 0 tandis que la règle du trapèze correspond à l’intégrale
du polynôme interpolant de degré 1, qui sont représentés dans la figure. Ces polynômes
interpolateurs s’avèrent peu précis dans ce cas particulier.
Nous découvrirons par la suite que la précision d’une règle de quadrature peut
être analysée en observant son comportement relativement à des polynômes, ce que
l’on peut formaliser de la manière suivante.
Définition 11.4 (Degré d’exactitude d’une règle de quadrature). Le degré d’exacti-
tude est le plus grand entier p tel que :
Zb
P (x)dx = R(P, a, b) (11.16)
a

pour tout polynôme P de degré inférieur ou égal à p.


En d’autres termes, le degré d’exactitude p d’une règle de quadrature R est le
degré du polynôme de plus grand degré tel que la règle de quadrature est exacte.
11.2 • Règles de quadrature 283

Exemple 11.3 (Degré d’exactitude des formules du point milieu et du trapèze). Dans
l’exercice 11.1, nous montrons que les formules du milieu et du trapèze sont exactes
pour un polynôme de degré 0 ou 1, mais approchées pour un polynôme de degré 2.
Par conséquent, leur degré d’exactitude est p = 1.
Dans la remarque suivante, nous analysons à quelle condition le degré d’exactitude
d’une règle de quadrature est supérieur ou égal à zéro.
Remarque 11.1 (Condition pour un degré d’exactitude supérieur ou égal à zéro). Le
degré d’exactitude de la règle de quadrature R est supérieur ou égal à zéro si R intègre
Rb
exactement le polynôme constant P (x) = 1. Dans ce cas, on a R(1, a, b) = a dx. Par
conséquent, l’équation 11.13 implique :
w1 + . . . + w n = b − a = h.
En d’autres termes, si la règle R est une règle de quadrature de degré d’exactitude
supérieur ou égal à zéro, la somme des poids est égale à la longueur de l’intervalle.
Il est facile de vérifier que cette propriété est vraie en particulier pour les règles du
point milieu et du trapèze.
Pour caractériser l’erreur absolue, on introduit l’ordre de précision de la règle de
quadrature.
Définition 11.5 (Ordre de précision d’une règle de quadrature). La règle de qua-
drature R(f, a, b) est d’ordre q si :
Z b
f (x)dx = R(f, a, b) + O(h q), h → 0 (11.17)
a

où h = b − a.
En d’autres termes, l’erreur absolue d’une règle de quadrature d’ordre q est égale
à O(hq ) quand h → 0. Dans les deux théorèmes qui suivent, nous présentons l’ordre
des méthodes du point milieu et du trapèze.
Théorème 11.3 (Erreur de la formule du point milieu). Pour toute fonction f de
classe C2([a, b]), il existe ξ ∈ [a, b] tel que :
Z b
h3
f (x)dx = M + f 00 (ξ) (11.18)
a 24
où h = b − a et M est la règle du point milieu.
L’équation 11.18 montre que formule du point milieu est d’ordre 3 :
Zb
f (x)dx = M + O(h3)
a

quand h → 0.
Théorème 11.4 (Erreur de la formule du trapèze). Pour toute fonction f de classe
C2 ([a, b]), il existe ξ ∈ [a, b] tel que :
Z b
h3
f (x)dx = T − f 00(ξ) (11.19)
a 12
où h = b − a et T est la règle du trapèze.
284 Chapitre 11 • Intégration

L’équation 11.19 montre que formule du trapèze est également d’ordre 3. Les
preuves des deux théorèmes précédents sont données dans les exercices 11.4 et 11.5.
La comparaison des équations 11.18 et 11.19 révèle un point a priori surprenant : avec
le facteur 1/24 au lieu de −1/12, la règle du point milieu est deux fois plus précise
que la règle du trapèze. C’est étonnant, puisque la règle du point milieu n’utilise
qu’un seul point alors que la règle du trapèze en utilise deux. De plus, l’écart entre
l’intégrale et son approximation sont de signes opposés. Exploitons cette observation
et, en combinant les deux règles précédentes, tentons d’obtenir une règle plus précise.
Rb
Notons I = a f (x)dx l’intégrale. D’après le théorème 11.3, il existe ξ 1 ∈ [a, b] tel
que :

h3
I = M + f 00 (ξ1 ) .
24
En multipliant l’équation précédente par 2, on obtient :

h3
2I = 2M + f00 (ξ1) . (11.20)
12
De même, d’après le théorème 11.4, il existe ξ 2 ∈ [a, b] tel que :

h3
00
I = T − f (ξ2) . (11.21)
12
On fait la somme des équations 11.20 et 11.21 et on obtient une expression impliquant
3
I , M et T , c’est-à-dire 3I = 2M + T + (f 00(ξ1 ) − f 00(ξ2 )) h12 . Cela implique :

1 h3
I= (2M + T ) + (f00 (ξ1 ) − f 00(ξ 2 )) .
3 36
Soit S la règle de Simpson, définie par :

2 1
S = M + T. (11.22)
3 3
Alors :
00 00h3
I = S + (f (ξ1 ) − f (ξ2 )) .
36
Par conséquent, si f 00 (ξ1) ≈ f 00 (ξ2 ), alors la règle de Simpson est d’ordre 3.
Il y a une autre manière d’obtenir la règle de Simpson, qui utilise l’interpolation
polynomiale. Nous avons vu que la règle du point milieu est fondée sur l’intégrale
du polynôme de degré 0 (c’est-à-dire constant) interpolant la fonction f au centre c
de l’intervalle [a, b]. Quant à la règle du trapèze, elle est fondée sur le polynôme de
degré 1 interpolant la fonction f aux points a et b. D’une manière plus générale, les
méthodes d’intégration fondées sur l’intégrale du polynôme interpolant avec n points
équidistants sont nommées les formules de Newton-Cotes. Pour ces méthodes, le lien
entre le degré d’exactitude et l’ordre de précision est donné par le théorème 11.9 que
nous étudierons par la suite. Dans l’exercice 11.7, nous montrons que la formule de
quadrature associée à l’intégrale du polynôme de degré 2 qui interpole f en a, c et b
est la règle de Simpson.
11.3 • Règles plus précises 285

Définition 11.6 (Règle de Simpson). La règle de Simpson est :

h
S= (f (a) + 4f (c) + f (b)) (11.23)
6

où c = a+2b est le milieu de l’intervalle et h = b − a.

Dans l’exercice 11.6, on vérifie que les équations 11.22 et 11.23 sont équivalentes.
On peut vérifier que la formule de Simpson intègre de manière exacte un polynôme
de degré 3, mais pas un polynôme de degré 4. Plus précisément, on peut démontrer
que la règle de Simpson peut être obtenue en considérant le polynôme de degré 3
interpolant f (a), f (b), f (c) et f 0 (c). Une telle interpolation est nommée interpolation
d’Hermite, car elle interpole également la dérivée de la fonction, comme on le voit
dans le théorème 11.16 page 315. Nous avons déjà utilisé l’interpolation d’Hermite
dans le contexte de l’interpolation lorsque nous avons évoqué les splines cubiques
dans la section 8.9. Dans le théorème suivant, nous analysons l’erreur de la méthode
de Simpson.

Théorème 11.5 (Erreur de la formule de Simpson). Pour toute fonction f de classe


C4 ([a, b]), il existe ξ ∈ [a, b] tel que :
Z b
h5
f (x)dx = S − f (4) (ξ) (11.24)
a 2880

ou h = b − a et S est la règle de Simpson.

La règle de Simpson est par conséquent d’ordre 5 :


Z b
f (x)dx = S + O(h5), h → 0. (11.25)
a

Ce théorème est démontré dans l’exercice 11.9.


Nous avons vu jusque là les règles du point milieu, du trapèze et de Simpson.
Dans le but d’identifier des règles plus précises, nous allons avoir recours à une mé-
thode similaire à celle que nous avons déjà utilisée dans le cadre de la différentiation
numérique, c’est-à-dire l’extrapolation de Richardson présentée dans la section 9.6.

11.3 Règles plus précises


Dans cette section, nous présentons la règle de Simpson composite (à deux sous-
intervalles) et la règle de Boole. Cette section a plusieurs objectifs. D’une part, il s’agit
de présenter une règle d’intégration composite relativement simple, ce qui prépare
l’introduction des règles d’intégration composites plus générales que nous analyserons
dans la section 11.6. D’autre part, nous examinerons comment utiliser la règle de
Simpson composite et la règle de Boole dans le cadre d’une méthode d’intégration
adaptative que nous étudierons dans la section 11.7. Pour obtenir une formule plus
précise que la règle de Simpson, coupons l’intervalle [a, b] en deux et appliquons la
règle à chaque sous-intervalle [a, c] puis [c, b]. Soit d le milieu de [a, c] et e le milieu
de [c, b]. On obtient la règle suivante.
286 Chapitre 11 • Intégration

Définition 11.7 (Règle de Simpson composite à deux sous-intervalles). La règle de


Simpson composite à deux sous-intervalles est :

h
S2 = (f (a) + 4f (d) + 2f (c) + 4f (e) + f (b)) (11.26)
12
où h = b − a, c = 2 ,
a+b
d= a+c
2 et e = 2 .
c+b

C’est un exemple de formule composite, un sujet que nous approfondirons par la


suite dans la section 11.6. L’indice 2 dans la notation S2 a pour but de rappeler qu’il
s’agit d’une règle composite à 2 sous-intervalles. À partir du théorème 11.5, on peut
déduire le théorème suivant, qui présente l’erreur de la formule de Simpson composite
à deux sous-intervalles.

Théorème 11.6 (Erreur de la formule de Simpson composite à deux sous-intervalles).


Pour toute fonction f de classe C 4 ([a, b]), il existe ξ ∈ [a, b] tel que :
Z b
1
f (x)dx = S 2 − f(4) (ξ)h 5 (11.27)
a 2880 × 16

où h = b − a et S 2 est la règle de Simpson composite à deux sous-intervalles.

De la même manière que la règle de Simpson, la règle de Simpson composite est


d’ordre 5. Puisque 2 × (h/2) 5 = h5 /16, la différence significative est que l’erreur
est divisée par 16 par rapport à la règle précédente, ce que nous démontrons dans
l’exercice 11.10. Dans l’exemple suivant, nous comparons la précision des méthodes
de Simpson et de Simpson composite.

Exemple 11.4 (Règle de Simpson et de Simpson composite à deux sous-intervalles).


On reprend les données de l’exemple 11.2. La figure 11.34 présente la formule de
Simpson et la formule de Simpson composite appliquées à la fonction f . Pour utiliser
la règle de Simpson, le plus simple est d’utiliser la valeur des variables M et T déjà
définies dans l’exemple 11.2. On peut alors utiliser l’équation 11.22, ce qui mène au
script suivant5 :
1 S = 2.0 * M / 3.0 + T / 3.0

Pour utiliser la règle de Simpson composite à deux sous-intervalles, on peut utiliser


le script suivant qui utilise l’équation 11.26 :
1 d = (a + c ) / 2.0
2 e = (c + b ) / 2.0
3 fd = myfunc (d)
4 fe = myfunc (e)
5 S2 = h * ( fa + 4.0 * fd + 2.0 * fc + 4.0 * fe + fb ) / 12.0

La règle de Simpson produit l’approximation S = 0.6601, tandis que la règle de Simp-


son composite produit l’approximation S2 = 0.5975. La règle de Simpson correspond
à l’intégrale du polynôme interpolant de degré 2 qui est représenté dans la figure en
trait plein. Ce polynôme interpolant s’avère peu précis dans ce cas particulier. On
constate que la formule de Simpson composite est plus proche de la valeur exacte que
la formule de Simpson. En effet, la combinaison des deux approximations locales sur
les demi-intervalles [0, 0.5] et [0.5, 1] a mené à une approximation globale plus précise.
11.3 • Règles plus précises 287

Simpson : 0.6601 Simpson S2 : 0.5975 Boole : 0.5933


f (x) 1 1 1

f (x)

f (x)
0 0 0
0 1 0 1 0 1
x x x

Figure 11.3 – Trois règles avancées pour l’intégration numérique. À gauche, la for-
mule de Simpson. Au centre, la formule de Simpson composite à deux sous-intervalles.
À droite, la règle de Boole.

Par le même procédé que celui que nous avons déjà utilisé, nous allons combiner les
deux approximations S et S2 pour obtenir une approximation plus précise. Nous allons
pour cela utiliser une méthode similaire à la méthode d’extrapolation de Richardson.
Rb
Notons I = a f (x)dx. D’après le théorème 11.5, il existe ξ1 ∈ [a, b] tel que :

I = S + a1f (4) (ξ1 )h5 (11.28)

où a1 = −1/2880. De même, le théorème 11.6 implique qu’il existe ξ2 ∈ [a, b] tel que :
a1 (4)
I = S2 + f (ξ2 )h 5.
16
On multiplie l’équation précédente par 16, ce qui implique :

16I = 16S 2 + a1f (4) (ξ2 )h5 .

On soustrait l’équation 11.28 à l’équation précédente. On obtient une expression im-


pliquant I , S2 et S, c’est-à-dire 15I = 16S2 − S + a1 (f (4) (ξ2 ) − f (4) (ξ 1))h 5. Par
conséquent :
16S2 − S 1
I= + a1 (f (4) (ξ2 ) − f (4)(ξ1 ))h5 .
15 15

Si on a f(4) (ξ 2 ) ≈ f(4) (ξ1 ), alors la règle :

16S2 − S
W = (11.29)
15
est d’ordre supérieur ou égal à 5. La règle précédente est la règle de Boole, que nous
introduisons dans la définition suivante.
Définition 11.8 (Règle de Boole). La règle de Boole est :

S2 − S
W = S2 + . (11.30)
15
4Script Python : Integration/Scripts/Py3/[Link].
5Script Python : Integration/Scripts/Py3/[Link].
288 Chapitre 11 • Intégration

Analysons ce résultat. Pour obtenir l’équation 11.30, on observe que l’équation


11.29 implique W = 15S2 +S 15
2 −S
. Bien que les équations 11.29 et 11.30 soient mathé-
matiquement équivalentes, notre préférence va à la formule 11.30. En effet, celle-ci
exprime la règle de Boole comme une correction de la valeur prise par la règle de
Simpson composite à deux sous-intervalles. Nous reviendrons sur ce sujet dans la
remarque 11.2. Il est facile de démontrer que :
 
h 7 16 16 7
B= f ( a) + f (d) + 2f (c) + f (e) + f (b) .
15 6 3 3 6

Le théorème suivant indique l’ordre de précision de la formule de Boole.


Théorème 11.7 (Ordre de la formule de Boole). La formule de Boole est d’ordre 7 :
Z b
f (x)dx = B + O(h 7 ), h →0
a

où h = b − a et B est la règle de Boole.


Le théorème précédent est démontré dans l’exercice 11.11. La formule de Boole est
connue sous différents noms : formule de Newton-Cotes d’ordre 7, méthode de Milne
ou encore en tant que premier pas de l’intégration de Romberg.
Exemple 11.5 (Règle de Boole). On reprend les données de l’exemple 11.2. La partie
droite de la figure 11.36 présente la règle de Boole appliquée à la fonction f . Pour
évaluer la règle de Boole, on peut utiliser les variables S et S2 déjà définies dans
l’exemple 11.4. On utilise alors l’équation 11.30, ce qui mène au script suivant7 :
1 B = S2 + ( S2 - S) / 15.0
La règle de Boole produit l’approximation B = 0.5933. Elle correspond à l’intégrale
du polynôme interpolant de degré 4, qui est représenté dans la figure. Cette approxi-
mation s’avère très précise dans cet exemple.
Dans la table 11.1, pour chaque formule d’intégration numérique, nous présentons
le nombre de points de la formule, son degré d’exactitude et son ordre de précision.
Dans la table, nous avons indiqué par « Simpson S2 » la formule de Simpson composite
à deux sous-intervalles. On observe que le nombre de points de la formule n’est pas
directement lié à son degré d’exactitude et que la parité du nombre de points semble
jouer un rôle. Nous reviendrons sur ce sujet dans l’analyse des formules de Newton-
Cotes que nous introduirons dans la section 11.4.
Dans les deux exemples qui suivent, nous analysons expérimentalement le compor-
tement des méthodes de quadrature précédentes vis-à-vis de l’ordre de précision et du
degré d’exactitude. L’objectif est d’illustrer les conséquences des résultats présentés
dans la table 11.1.
Exemple 11.6 (Convergence de plusieurs règles de quadrature). On souhaite ob-
server expérimentalement l’ordre de précision des formules de quadrature précédentes
lorsque la longueur de l’intervalle tend vers zéro et vérifier que le comportement corres-
pond aux théorèmes vus précédemment. Soit h > 0 un réel représentant la longueur
6Script Python : Integration/Scripts/Py3/[Link].
7Script Python : Integration/Scripts/Py3/[Link].
11.3 • Règles plus précises 289

Formule Points Exactitude Ordre


Milieu 1 1 3
Trapèze 2 1 3
Simpson 3 3 5
Simpson S2 5 3 5
Boole 5 5 7

Table 11.1 – Nombre de points, degré d’exactitude et ordre de précision de diffé-


rentes règles de quadrature.

Milieu
Erreur absolue

10−5
Trapèze
10−14 Simpson
Simpson S 2
10−23
Boole

10 −7 10−3
h

Figure 11.4 – Convergence de plusieurs règles de quadrature.

de l’intervalle. On considère la fonction définie par l’équation 11.1 pour x ∈ [0, h].
Rh
L’intégrale exacte est 0 f (x)dx = 5h−sin(5
10
h)
. La figure 11.4 8 présente l’erreur abso-
lue de plusieurs règles de quadrature lorsque la longueur de l’intervalle h tend vers
zéro. Dans ce graphique en échelle logarithmique, la pente correspond à l’ordre de
précision de la méthode : plus la pente est forte, plus la règle est précise. On observe
que les règles du trapèze et du point milieu ont le même ordre de précision, c’est-à-
dire O(h3 ), avec un petit avantage pour la règle du point milieu. On observe que les
règles de Simpson et de Simpson composite ont le même ordre de précision en O(h5 ),
avec un petit avantage pour la règle de Simpson composite. On observe que la règle
de Boole a un ordre de précision en O(h7 ). On observe que, lorsque h est inférieur à
10−7, les méthodes numériques produisent des erreurs de plus en plus proches. Cela
est dû au développement de Taylor de la fonction f au voisinage de 0. L’équation 11.1
2
implique f (x) = 25x
4 + O (x ) quand x → 0 car sin(x) = x + O (x ). Par conséquent,
4 3

la fonction à intégrer est de plus en plus proche d’un polynôme de degré 2 lorsque
h → 0, ce qui explique pourquoi les méthodes ont des comportements de plus en plus
similaires.

Dans le but de vérifier expérimentalement le degré d’exactitude des différentes


règles de quadrature, nous réalisons l’expérience suivante.

Exemple 11.7 (Degré d’exactitude de plusieurs règles de quadrature). Nous évaluons


R1 1
l’intégrale du polynôme xp sur l’intervalle [0, 1] c’est-à-dire 0 x p dx = p+1 pour p =
8Script Python : Integration/Scripts/Py3/[Link].
290 Chapitre 11 • Intégration

p Exacte Milieu Trapèze Simpson Boole


0 1.0 1.0 1.0 1.0 1.0
1 0.5 0.5 0.5 0.5 0.5
2 0.3333 0.25 0.5 0.3333 0.3333
3 0.25 0.125 0.5 0.25 0.25
4 0.2 0.0625 0.5 0.2083 0.2
5 0.1667 0.03125 0.5 0.1875 0.1667
6 0.1429 0.01562 0.5 0.1771 0.1432

Table 11.2 – Intégrale du monôme x p sur l’intervalle [0, 1] pour différentes valeurs
de p.

0, 1, ..., 6 avec plusieurs règles de quadrature. La table 11.29 présente les résultats. On
observe que la règle du milieu est exacte pour p = 0 et p = 1, mais fausse pour p = 2 :
la règle du milieu fournit l’approximation 0.25 au lieu de la valeur exacte 13 = 0.3333
(avec 4 chiffres significatifs). On observe de même que la règle de Boole est exacte
pour p entre 0 et 5, mais fausse pour p = 6.

L’analyse précédente a permis de construire des règles de quadrature précises pour


lesquelles nous avons vu, sans l’expliquer, le lien entre le nombre de points, le degré
d’exactitude et l’ordre de précision. L’objectif de la section suivante est de donner les
fondements théoriques de ces méthodes, dont nous allons voir qu’elles s’appuient sur
l’interpolation polynomiale. Dans le cas général où on considère un nombre arbitraire
de nœuds d’interpolation et que l’on intègre le polynôme interpolateur, la règle que
l’on obtient est nommée formule de Newton-Cotes, ce qui est le sujet de la section
suivante.

11.4 Formules de Newton-Cotes


Dans cette section, nous présentons les formules de Newton-Cotes et nous présen-
tons leur ordre de précision ainsi que le lien avec leur degré d’exactitude. Les formules
de Newton-Cotes sont des méthodes d’intégration numériques fondées sur le polynôme
interpolant la fonction f en des points équidistants. Les méthodes du trapèze et de
Simpson, par exemple, sont des cas particuliers des formules de Newton-Cotes dans
le cas où le polynôme interpolant est de degré 1 (formule du trapèze) et de degré 2
(formule de Simpson).
Dans le contexte de l’interpolation polynomiale, on introduit des nœuds d’inter-
polation dans l’intervalle [a, b]. Soit n un entier représentant le nombre de nœuds
d’interpolation. Soit h la longueur constante de chaque sous-intervalle :

b−a
h= .
n−1
On considère le premier nœud d’interpolation x1 = a, puis les nœuds suivants :

x k = x1 + h(k − 1) (11.31)
9Script Python : Integration/Scripts/Py3/[Link].
11.4 • Formules de Newton-Cotes 291

pour k = 1, 2, ..., n. Les nœuds sont définis de telle sorte que le dernier nœud est
xn = b. D’après la définition 8.2 page 181, le polynôme interpolant de Lagrange est
donné par l’équation 8.6, que nous reproduisons ci-dessous :
n
X
P (x) = Lk(x)f (xk )
k=1

pour tout x ∈ [a, b]. Les formules de Newton-Cotes consistent à approcher l’intégrale
de la fonction f par l’intégrale du polynôme P . Or l’intégrale du polynôme est égale
à:
Z b ZbXn
P (x)dx = Lk (x)f (xk )dx
a a k=1
n
X Z b
= f (xk) L k (x)dx
k=1 a

car on peut échanger l’intégrale et la somme grâce aux propriétés de linéarité de


l’intégrale. Soit wk l’intégrale du polynôme L k sur l’intervalle [a, b] :
Z b
wk = Lk (x)dx (11.32)
a

pour k = 1, ..., n. Alors :


Z b n
X
P (x)dx = wk f (xk ).
a k=1

On observe que l’intégrale du polynôme interpolant est une somme pondérée des
valeurs de la fonction f aux nœuds xk, où les poids sont les coefficients w k . Cette
observation mène à la définition des formules de Newton-Cotes suivante.
Définition 11.9 (Formules de Newton-Cotes). Soient a, b ∈ R tels que a < b. Soit
f ∈ C 0([a, b]) une fonction continue intégrable sur l’intervalle [a, b]. Soient x 1, ..., xn
les nœuds équidistants définis par l’équation 11.31. La formule de Newton-Cotes pour
l’approximation de l’intégrale est la règle de quadrature obtenue par intégration du
polynôme P de degré n − 1 interpolant la fonction f aux nœuds x1, ..., x n ∈ R :
n
X
R(f, a, b) = w k f (xk ) (11.33)
k=1

où les poids wk sont définis par l’équation 11.32.


Nous sommes intéressés par l’erreur commise par une telle méthode. La formule
de Taylor pour l’interpolation (théorème 8.7, page 193), implique que l’erreur de la
formule de Newton-Cotes est donnée par l’équation :
Zb Z
1 b (n)
f (x)dx = R(f, a, b) + f (ξ(x))ωn(x)dx (11.34)
a n! a
où ωn est le polynôme nodal (à ne pas confondre avec le poids wk ), ξ (x) est un réel
dans l’intervalle [a, b] et f(n) est la n-ième dérivée de f . En développant le dernier
292 Chapitre 11 • Intégration

terme de l’équation précédente, on peut obtenir une expression qui fait apparaître
une certaine puissance de h associée à certaines dérivées de f . Le théorème suivant
formalise l’erreur des formules de Newton-Cotes et fait intervenir la parité de n.
Théorème 11.8 (Erreur des formules de Newton-Cotes). On considère la formule
de Newton-Cotes pour l’approximation de l’intégrale avec n points. Soit h = bn−1 −a
.
Supposons que n est impair et que f ∈ C n+1
([a, b]). Alors, il existe ξ ∈ [a, b] et un
réel Mn tel que :
Z b
Mn
f (x)dx = R(f, a, b) + hn+2 f (n+1)(ξ). (11.35)
a ( n + 1)!
Supposons que n est pair et que f ∈ C n([a, b]). Alors il existe ξ ∈ [a, b] et un réel M n
tel que :
Z b
M n n+1 (n)
f (x)dx = R(f, a, b) + h f (ξ). (11.36)
a n!
La preuve de ce théorème est donnée dans [115], chapitre 9 « Numerical integra-
tion » théorème 9.2 page 388. Lorsqu’on ne s’intéresse qu’à l’ordre de précision de la
règle de quadrature, on peut quelque peu simplifier le résultat précédent, ce qui mène
au théorème suivant.
Théorème 11.9 (Ordre des formules de Newton-Cotes). On considère la formule
de Newton-Cotes pour l’approximation de l’intégrale avec n points. Soit h = bn−1 −a
.
Supposons que n est impair et que f ∈ C n+1
([a, b]). Alors le degré d’exactitude est n
et :
Z b
f (x)dx = R(f, a, b) + O(hn+2 ), h → 0. (11.37)
a

Supposons que n est pair et que f ∈ C n([a, b]). Alors le degré d’exactitude est n − 1
et :
Z b
f (x)dx = R(f, a, b) + O(hn+1 ), h → 0. (11.38)
a

Le théorème précédent est démontré dans l’exercice 11.15. Il montre qu’il est
avantageux d’utiliser un nombre impair de points puisque cela mène à une erreur en
O(hn+2 ) au lieu de O(hn+1 ) lorsque n est pair. On peut alors voir que le degré d’exac-
titude et l’ordre de précision sont directement reliés, comme le montre le théorème
suivant.
Théorème 11.10 (Ordre des formules de Newton-Cotes (seconde partie)). On consi-
dère une formule de Newton-Cotes pour l’approximation de l’intégrale. Soit h = bn−1
−a
.
Si la formule est de degré d’exactitude p et si f ∈ C ∞
([a, b ]), alors :
Z b
f (x)dx = R(f, a, b) + O(hp+2 ), h → 0. (11.39)
a

Démonstration. La preuve est réalisée en fonction de la parité du nombre de points


n de la règle de quadrature. Supposons que n est impair. Le théorème 11.9 implique
que p = n. L’égalité 11.37 implique directement l’égalité 11.39. Supposons que n est
pair. Le théorème 11.9 implique que p = n − 1. L’égalité 11.38 implique directement
l’égalité 11.39.
11.5 • Le problème 293

n 1 2 3 4 5 6
Degré d’exactitude 1 1 3 3 5 5
Ordre de précision 3 3 5 5 7 7

Table 11.3 – Ordre de précision d’une formule de Newton-Cotes en fonction du


nombre de points n.

La table 11.3 présente l’ordre de précision d’une formule de Newton-Cotes en


fonction du nombre de points n. On observe qu’on retrouve les résultats présentés
dans la table 11.1 pour les méthodes du point milieu (n = 1), du trapèze (n = 2), de
Simpson (n = 3) et de Boole (n = 5). De plus, la règle de Simpson composite à deux
sous-intervalles n’est pas une formule de Newton-Cotes puisqu’elle n’interpole pas la
fonction f sur 5 points.
On pourrait alors penser qu’il suffit d’augmenter le degré du polynôme interpolant
pour obtenir des formules de plus en plus précises. C’est vrai en arithmétique exacte,
mais c’est faux en arithmétique flottante comme nous allons le voir dans la section
suivante.

11.5 Le problème des formules de Newton-Cotes


Dans cette section, nous allons voir pourquoi il n’est pas possible d’utiliser les
formules de Newton-Cotes en arithmétique flottante lorsque le nombre de nœuds
équidistants est supérieur ou égal à 9. En effet, nous allons voir que certains poids
d’intégration sont négatifs, ce qui mène à une approximation de l’intégrale par une
somme pondérée qui peut être numériquement instable. En général, les poids des
formules de Newton-Cotes dépendent de la longueur de l’intervalle h = b − a. Dans le
but d’expliciter cette dépendance, considérons le changement de variable x = a + ht
pour t ∈ [0, 1]. Alors l’équation 11.32 implique :
Z 1
wk = h L k (a + ht)dt
0

pour k = 1, . . . , n. En d’autres termes, la longueur de l’intervalle h est en facteur de


tous les poids des formules de Newton-Cotes. C’est la raison pour laquelle il est plus
commode de considérer les poids réduits uk définis par :
Z 1
wk
uk = = L k (a + ht)dt (11.40)
h 0

pour k = 1, ..., n. On peut démontrer, de plus, que chaque poids réduit u k ne dépend
que de n et de k, mais pas de h. Pour le voir, insérons l’équation 11.31 dans l’équation
8.5, page 181. Cela implique :
 
j−1
Yn (a + ht) − a + h n−1
L k(x) =    .
k−1 j−1
j=1 a + h n−1
− a + h n−1
j 6=k
294 Chapitre 11 • Intégration

n u1 u2 u3
Milieu 1 1
1 1
Trapèze 2 2 2
1 2 1
Simpson 3 6 3 6

Table 11.4 – Poids des formules de Newton-Cotes avec n nœuds équidistants, pour
n = 1, 2, 3.

En simplifiant le terme a au numérateur et au dénominateur, on obtient une expression


Q ht−h j−1
indépendante de a, c’est-à-dire L k(x) = nj=1 h k−1 −hn−1
j−1 . Par conséquent, après
j 6=k n−1 n−1

simplification par le facteur h au numérateur et au dénominateur :


n
Y j−1
t−
n−1
L k (x) = k−1
j=1 n−1
− j−1
n−1
j 6=k
Y n
t(n − 1) − j + 1
=
k−j
j=1
j 6=k

pour k = 1, . . . , n. L’équation précédente montre que le polynôme L k ne dépend pas


de h et l’équation 11.40 permet de conclure qu’il en est par conséquent de même
pour u k. La table 11.4 présente les poids réduits des formules de Newton-Cotes pour
n = 1, 2, 3. La table 11.5 10 présente les poids réduits des formules de Newton-Cotes
pour n = 1, 2, ..., 10 avec des nœuds équidistants. Puisque les poids sont symétriques,
nous ne présentons que ceux dont les indices sont les plus faibles (c’est-à-dire à gauche
dans la table) : les poids dont les indices sont élevés (c’est-à-dire à droite) peuvent
alors se déduire des poids symétriques par rapport à l’indice central b(n + 1)/2c. Par
exemple, si n = 7, on a u5 = u3 . On observe que la somme des poids réduits vaut 1,
comme nous l’avions noté dans la remarque 11.1. On observe que, pour n = 1, ..., 8,
les poids réduits sont positifs, mais que cette propriété n’est pas vraie pour n = 9
puisque u5 = −0.160 qui est strictement négatif.
D’après l’analyse du conditionnement de la somme menée dans la section 5.7 page
87, le conditionnement relatif en norme 1 de la somme associée à l’équation 11.33 est :
Pn
|w kf (x k)|
crel = Pk=1
n .
| k=1 wkf (x k)|
Supposons que f (x) = 1 pour tout x ∈ [a, b] (ce qui est un cas plutôt favorable),
alors : Pn
|wk|
crel = Pk=1
n .
| k=1 wk|
En exprimant l’équation précédente en fonction de uk et en utilisant le fait que la
somme des termes uk est égale à 1, on obtient :
n
X
crel = |u k|.
k=1

10Script Python : Integration/Scripts/Py3/[Link].


11.5 • Le problème 295

n u1 u2 u3 u4 u5 u6 u7 u8 u9
1 1
2 0.5 u1
3 0.167 0.667 u1
4 0.125 0.375 u2 u1
5 0.078 0.356 0.133 u2 u1
6 0.066 0.260 0.174 u3 u2 u1
7 0.049 0.257 0.032 0.324 u3 u2 u1
8 0.044 0.207 0.077 0.173 u4 u3 u2 u1
9 0.035 0.208 -0.033 0.370 -0.160 u4 u3 u2 u1

Table 11.5 – Poids des formules de Newton-Cotes avec n nœuds équidistants, pour
n = 1, 2, ..., 9. Pour des questions d’espace, nous présentons seulement 3 chiffres après
la virgule.

200
|uk |

100
k=1
Pn

0
5 10 15
n
Pn
Figure 11.5 – La somme k=1 |uk | en fonction du nombre de nœuds n.

Pn
La figure 11.511 présente la somme des valeurs absolues des poids réduits k=1 |uk | en
fonction du nombre de nœuds n. On observe que, lorsque n = 1, ..., 8 et n = 10, cette
somme vaut 1. C’est une conséquence du fait que tous les poids sont positifs pour ces
petites valeurs de n. Lorsque n augmente, on observe que cette somme peut augmenter
rapidement. La plus petite valeur de n pour laquelle cela arrive est n = 9. Lorsque
n augmente, la somme des valeurs absolues augmente très rapidement. Pour n = 20
par exemple, la somme est égale à 175.4 avec un poids minimal égal à -27.56 et un
poids maximal égal à 30.33. La conséquence de ces poids négatifs est que les formules
de Newton-Cotes sont inutilisables lorsque n = 9 ou n ≥ 11. En particulier, les poids
négatifs génèrent une propagation importante
Pn des erreurs d’arrondis par cancellation.
En effet, certains termes de la somme k=1 w k f (xk ) sont négatifs tandis que d’autres
sont positifs. De plus, ces termes tendent à devenir de plus en plus grands. Dans ce
cas, la somme pondérée est mal conditionnée et les erreurs d’arrondis finissent par
prédominer.
Le phénomène de Runge accentue encore le problème. En effet, nous avons vu dans
le chapitre sur l’interpolation polynomiale que, si les dérivées de la fonction f ne sont
pas bornées, alors le polynôme interpolant peut être une très mauvaise approximation
de la fonction. Puisque les formules de Newton-Cotes sont fondées sur l’intégrale du
polynôme interpolant, si l’interpolation polynomiale est trop approximative, l’inté-
11 Script Python : Integration/Scripts/Py3/[Link].
296 Chapitre 11 • Intégration

grale approchée est peu précise.


En pratique, les deux problèmes précédents (poids négatifs et phénomène de
Runge) se combinent pour aboutir à un résultat pratique catastrophique : les for-
mules de Newton-Cotes sont inutilisables pour n ≥ 11. Dans cette situation, plusieurs
approches peuvent être utilisées. La première solution consiste à subdiviser l’inter-
valle [a, b] en sous-intervalles plus petits et à utiliser des polynômes locaux de degrés
faibles dans chaque sous-intervalle. Cette approche mène aux méthodes composites,
que nous présentons dans la section 11.6. Un des problèmes des méthodes composites
est que l’erreur d’approximation peut varier d’un sous-intervalle à l’autre, car celle-ci
est reliée à certaines dérivées de la fonction f . Puisque, en général, les dérivées de
f ne sont pas constantes, l’erreur n’est pas uniforme sur l’intervalle [a, b] : tandis
que certains sous-intervalles sont associés à des fortes erreurs, d’autres sont associés
à des erreurs très faibles. En d’autres termes, certaines évaluations de la fonction f
sont inutiles, alors que d’autres devraient être ajoutées. Les méthodes de quadrature
adaptatives, que nous présentons dans la section 11.7, sont une tentative de réponse
à ce problème.

11.6 Méthode composite


Au lieu de considérer l’intervalle [a, b] de manière globale, les méthodes de quadra-
ture composites subdivisent l’intervalle en sous-intervalles plus petits, et utilisent une
méthode de quadrature locale sur chaque sous-intervalle. Nous allons voir comment
créer une méthode composite en s’appuyant sur la formule du point milieu, du trapèze
ou de Simpson. Soient x 1, . . . , xn ∈ [a, b] des points formant une partition de l’inter-
valle, c’est-à-dire tels que a = x1 < x 2 < . . . < xn = b. Les méthodes d’intégration
composites utilisent la propriété d’additivité de l’intégrale en décomposant l’intégrale
sur l’intervalle [a, b] en une somme d’intégrales sur chaque sous-intervalle :
Z b Z x2 Z x3 Z xxn
f (x)dx = f (x)dx + f (x)dx + . . . + f (x)dx.
a x1 x2 xn−1

On peut alors appliquer une méthode de quadrature sur chaque sous-intervalle


[xk , x k+1] pour k = 1, . . . , n − 1, ce qui mène à la définition suivante.

Définition 11.10 (Méthode d’intégration composite). Soit f une fonction intégrable


sur un intervalle réel [a, b]. On dispose d’un ensemble de valeurs de x notées a = x1 <
x 2 < . . . < xn = b et des valeurs de f associées y k = f (x k) pour k = 1, 2, . . . , n.
Soit hk = xk+1 − xk la longueur du sous-intervalle [xk , x k+1] pour k = 1, 2, . . . , n − 1.
On considère une règle de quadrature R(xk , xk+1 ) qui approche l’intégrale sur chaque
sous-intervalle [xk , xk+1 ] :
Z x k+1
f (x)dx ≈ R(xk , xk+1 ) (11.41)
xk

pour k = 1, 2, . . . , n − 1. La méthode d’intégration composite consiste à considérer


l’approximation :
Zb n−1
X
f (x)dx ≈ R(x k , xk+1 ).
a k=1
11.6 • Méthode composite 297

Lorsque les intervalles hk sont de longueurs égales, l’erreur d’approximation de la


règle de quadrature composite se déduit de la règle de quadrature locale comme le
montre le théorème suivant.
Théorème 11.11 (Erreur d’approximation d’une méthode composite). On considère
une méthode d’intégration composite au sens de la définition 11.10. On suppose que
les intervalles sont de longueurs égales, ce qui implique :
b−a
hk = h = (11.42)
n−1
pour k = 1, 2, . . . , n − 1. Si la règle R est d’ordre q + 1 sur chaque sous-intervalle
[xk, xk+1 ], alors la règle composite est d’ordre q :
Z b n−1
X
f (x)dx = R(xk , xk+1 ) + O(h q) (11.43)
a k=1

quand h → 0.
En d’autres termes, si on considère une méthode de quadrature d’ordre q + 1 sur
chaque sous-intervalle [xk , xk+1 ], alors la méthode composite associée est d’ordre q.
Le théorème 11.11 est démontré dans l’exercice 11.13. Appliquons cette méthode à
certaines règles de quadrature identifiées dans les sections précédentes. En appliquant
la méthode du point milieu de la définition 11.3 à chaque sous-intervalle, on obtient
la méthode du point milieu composite.
Théorème 11.12 (Méthode du point milieu composite). La méthode du point milieu
composite est :
n−1
X
Mc = hk f (x̄k ) (11.44)
k=1
xk+x k+1
où h k = xk+1 − xk et x̄k = 2 est le milieu de l’intervalle [x k , xk+1 ] pour
k = 1, 2, . . . , n − 1.
L’égalité 11.44 est démontrée dans l’exercice 11.14. De même, en appliquant la
méthode du trapèze à chaque sous-intervalle, on obtient la méthode du trapèze com-
posite.
Théorème 11.13 (Méthode du trapèze composite). La méthode du trapèze composite
est :
n−1
X hk
Tc = (f (x k) + f (x k+1 )) (11.45)
2
k=1

où h k = xk+1 − xk .
L’équation 11.45 est démontrée dans l’exercice 11.14. À l’aune de l’équation 11.45,
on pourrait penser qu’il est nécessaire d’évaluer la fonction deux fois pour la plupart
des nœuds. Il n’en est rien puisqu’on peut mettre la méthode du trapèze composite
sous la forme :
n−2
X hk + hk+1
h1 h n−1
Tc = f (x1) + f (xk+1 ) + f (xn). (11.46)
2 k=1
2 2
298 Chapitre 11 • Intégration

Méthode composite Milieu Trapèze Simpson


Ordre de précision 2 2 4

Table 11.6 – Ordre de précision de plusieurs méthodes composites avec des sous-
intervalles de longueurs égales.

comme nous le montrons dans l’exercice 11.14. L’équation précédente montre qu’une
seule évaluation de la fonction f est nécessaire pour chaque nœud. Dans le cas particu-
lier où les sous-intervalles sont de longueurs égales, l’équation précédente se simplifie,
ce qui mène à l’équation :

X n−2
h h
T c = f (x 1 ) + hf (x k+1) + f (xn ) (11.47)
2 2
k=1

où h = bn−1
−a
. En appliquant la méthode de Simpson à chaque sous-intervalle, on obtient
la méthode de Simpson composite.

Théorème 11.14 (Méthode de Simpson composite). La méthode de Simpson com-


posite est :
n−1
X hk + hk+1
h1 h n−1
Sc = f (x1) + f (xk+1 ) + f (x n )
6 6 6
k=1
n−1
X 2hk
+ f (x̄k ) (11.48)
3
k=1

xk +xk+1
où x̄ k = 2 est le milieu de l’intervalle [x k, xk+1 ] pour k = 1, 2, . . . , n − 1.

L’équation 11.48 est démontrée dans l’exercice 11.14. La méthode de Simpson


composite est l’analogue composite de l’équation 11.22 puisque :
2 1
Sc = M c + Tc . (11.49)
3 3
La table 11.6 présente l’ordre de précision de plusieurs méthodes composites lorsque
les longueurs des sous-intervalles sont égales. Pour obtenir les résultats présentés dans
cette table, on utilise les théorèmes 11.3, 11.4 et 11.5 qui montrent que les formules du
milieu, du trapèze et de Simpson sont respectivement d’ordre 3, 3 et 5 sur chaque sous-
intervalle, et on applique le théorème 11.11. Dans l’exemple qui suit, nous comparons
les résultats des trois méthodes composites précédentes.

Exemple 11.8 (Méthodes composites). On considère la fonction f (x) = 1 + x6 +


sin(2πx) pour x ∈ [−1, 1]. L’intégrale exacte est :
Z 1
16
f (x)dx = = 2.286
−1 7

avec 4 chiffres significatifs. On considère une grille régulière constituée de n = 7 nœuds


et on applique les méthodes du point milieu composite, du trapèze composite et de
11.7 • Quadrature adaptative (*) 299

Méthode R(f, a, b) LRE10 n


Milieu composite 2.234 1.64 6
Trapèze composite 2.393 1.33 7
Simpson composite 2.287 3.36 13

Table 11.7 – Résultats de plusieurs méthodes composites.

Simpson composite. La figure 11.612 présente les résultats des méthodes du point
milieu composite, du trapèze composite et de Simpson composite. On observe que la
méthode du point milieu composite est un cas particulier d’une somme de Riemann
dans laquelle le point d’évaluation de f est le point milieu (dans la somme de Riemann,
on peut choisir n’importe quel autre point dans le sous-intervalle [x k, x k+1 ]). Il n’est
pas très difficile d’implémenter les méthodes composites en utilisant une boucle for.
Pour des raisons qui sont présentées dans les notes de la section 11.13, la méthode
composite du trapèze possède d’excellentes propriétés, et c’est pourquoi nous l’avons
choisie dans le script ci-dessous. Celui-ci implémente la méthode en utilisant l’équation
11.46.
1 n = 7
2 h = (b - a) / ( n - 1)
3 x = [a + i * h for i in range (n) ]
4 y_sum = test_f (x [0])
5 for i in range (1 , n - 1) :
6 y_sum += 2.0 * test_f (x [i ])
7 y_sum += test_f (x[ n - 1])
8 integral = y_sum * h / 2.0

La table 11.7 présente les résultats numériques des trois méthodes, dans laquelle
R(f, a, b) est la valeur approchée de l’intégrale par la méthode numérique, LRE10 est
la log-erreur relative en base 10 et n est le nombre d’évaluations de la fonction f .
On observe que la méthode de Simpson composite obtient une précision de plus de
3 chiffres décimaux. Cela correspond à ce que l’on observe dans la figure 11.6, où
l’on ne distingue pas de différence visuelle entre la fonction f et l’interpolation par
le polynôme de degré 2 utilisé par la méthode de Simpson sur chaque sous-intervalle.
On observe également que le nombre d’évaluations de la fonction f pour la méthode
de Simpson est égal à la somme du nombre d’évaluations de la fonction f par les
méthodes du point milieu et du trapèze, conformément à l’équation 11.49.

11.7 Quadrature adaptative (*)


Une difficulté importante avec les algorithmes précédents est que l’utilisateur doit
fixer à l’avance le nombre de points où la fonction est évaluée. De plus, l’erreur associée
à la méthode n’est pas nécessairement facile à déterminer, sauf dans le cas particulier
où l’on peut estimer une borne de la dérivée appropriée de la fonction f . Dans ce
contexte, l’objectif principal de la quadrature adaptative est de pouvoir fixer une
tolérance a priori et de laisser l’algorithme sélectionner automatiquement les points où
la fonction f est évaluée. De plus, l’objectif est d’évaluer f le moins souvent possible,
12 Script Python : Integration/Scripts/Py3/[Link].
300 Chapitre 11 • Intégration

Méthodes composites : M.C.=2.234, T.C.=2.393, S.C.=2.287


2 2 2

y
0 0 0
−1 0 1 −1 0 1 −1 0 1
x x x

Figure 11.6 – À gauche, la méthode du point milieu composite (M.C.). Au centre,


la méthode du trapèze composite (T.C.). À droite, la méthode de Simpson composite
(S.C.).

tout en essayant d’obtenir une erreur plus petite qu’une tolérance donnée. Observons
que l’algorithme ne peut pas garantir que l’erreur est inférieure à la tolérance, puisque
l’erreur est, elle aussi, approchée 13.
Les méthodes de quadrature adaptatives combinent plusieurs méthodes pour par-
venir à un algorithme « automatique ». La méthode que nous allons étudier utilise
une propriété d’additivité de l’intégrale par rapport à l’intervalle d’intégration :
Z b Z c Z b
f (x)dx = f (x)dx + f (x)dx (11.50)
a a c

où c = a2+b. En choisissant astucieusement les points a et b, nous allons voir comment


obtenir un algorithme qui minimise le nombre d’évaluations de la fonction f . De plus,
on peut utiliser deux méthodes numériques différentes pour approcher l’intégrale :
la différence entre ces deux méthodes est ensuite utilisée pour estimer l’erreur. Dans
Rb
l’algorithme que nous allons présenter, on évalue l’intégrale a f (x)dx par deux mé-
thodes numériques, ce qui produit les deux approximations S et S2 issues des règles
de Simpson et de Simpson composite.
— Si la différence entre les deux approximations est inférieure à la tolérance, alors
on les combine pour former une approximation Q encore plus précise par la
formule de Boole.
— Sinon, on évalue (récursivement) des approximations de l’intégrale de f sur les
intervalles [a, c] et [c, b] : le résultat est la somme des deux termes.
L’algorithme s’adapte alors aux propriétés de f , en partitionnant l’intervalle en
sous-intervalles petits lorsque f varie rapidement et grands lorsque f varie doucement,
ce que nous verrons plus en détail dans la section 11.8. Ainsi, si les valeurs de la
fonction f ne sont disponibles qu’en des points déterminés à l’avance, alors la méthode
de quadrature adaptative ne peut pas être appliquée. Toutefois, on peut dans ce cas
utiliser les méthodes composites présentées dans la section 11.6.
Dans le module SciPy, la fonction [Link] réalise un calcul d’intégrale
numérique, fondé sur les fonctions de la librairie QUADPACK [41]. Nous avons déve-
loppé la fonction simplifiée adaptsim, dont la séquence d’appel est :
1 integral , fcount = adaptsim (f , a , b , tol , * args )
13Voir [31], p.316.
11.7 • Quadrature adaptative (*) 301

où f est la fonction à intégrer, a et b sont les bornes de l’intégrale, tol est une
tolérance absolue, integral contient une approximation de l’intégrale et la variable
fcount contient le nombre d’appels à la fonction f . L’argument args permet de gérer
le cas où la fonction f nécessite des arguments supplémentaires. Ce thème sera détaillé
dans la section 11.10. Le script suivant14 présente la fonction adaptsim, adaptée en
Python et simplifiée à partir de la méthode proposée par Walter Gander et Walter
Gautschi15 :
1 def adap tsim (f , a , b , atol =1.e -6 , * args ):
2 c = (a + b ) / 2
3 fa = f (a , * args )
4 fc = f (c , * args )
5 fb = f (b , * args )
6 integral , fcount_s ub = adap tsims tep (
7 f , a , c , b , atol , fa , fc , fb , * args )
8 fcount = fco unt_su b + 3
9 return integral , fcount
La fonction adaptsim appelle la fonction récursive adaptsimstep, qui est présentée
ci-dessous. Dans la fonction, les points sont dans l’ordre suivant : a ≤ d ≤ c ≤ e ≤ b.
1 def ad apts imste p (f , a , c , b , atol , fa , fc , fb , * args ) :
2 h = b - a
3 d = (a + c ) / 2
4 e = (c + b ) / 2
5 fd = f (d , * args )
6 fe = f (e , * args )
7 S = h / 6 * ( fa + 4 * fc + fb ) # Simpson
8 S2 = h / 12 * ( fa + 4 * fd + 2 * fc
9 + 4 * fe + fb ) # Simpson c omposite
10 if abs ( S2 - S) <= atol :
11 in tegral = S2 + ( S2 - S) / 15 # Boole
12 fcount = 2
13 else :
14 Q1 , fc ount1 = adapts imst ep (
15 f, a , d , c , atol , fa , fd , fc , * args )
16 Q2 , fc ount2 = adapts imst ep (
17 f, c , e , b , atol , fc , fe , fb , * args )
18 in tegral = Q1 + Q2
19 fcount = fcount1 + fc ount2 + 2
20 return integral , fcount
L’implémentation précédente fait appel à la récursivité, ce qui est un cas unique
dans ce manuel. Ne pas utiliser la récursivité dans ce cas particulier ne semble pas
facile en principe, car l’algorithme est adaptatif (mais on peut toujours transformer
un algorithme récursif en un algorithme itératif en utilisant une structure de pile ).
Le principe de la fonction adaptsimstep est le suivant. On utilise la formule de
Simpson pour calculer une première approximation S. Puis, on utilise la formule de
Simpson composite pour calculer l’approximation S2. Si la différence entre S et S2 est
faible, alors on combine les deux par la formule de Boole et on retourne le résultat.
Sinon, aucune des deux approximations n’est fiable. Dans ce cas, on divise l’intervalle
14 Script Python : Scripts-Eleves/Py3/[Link].
15 Voir [47].
302 Chapitre 11 • Intégration

en deux et on recommence récursivement sur chaque demi-intervalle. On utilise en-


suite l’équation 11.50 pour obtenir une approximation de l’intégrale sur l’intervalle
complet, en effectuant la somme des intégrales sur les sous-intervalles. On peut calcu-
ler le nombre d’appels à la fonction f , ce qui donne une indication de la performance
de la fonction. Pour la phase d’initialisation de adaptsim, il y a 3 appels à f . La fonc-
tion adaptsimstep réalise elle-même 2 appels à f . Dans la remarque suivante, nous
analysons la règle de Boole et expliquons pourquoi nous avons opté pour l’équation
11.30 au lieu de 11.29 pour l’implémenter.
Remarque 11.2 (Implémentation par correction). Dans l’algorithme précédent, nous
avons suivi l’implémentation de [104] plutôt que l’instruction :
1 integral = (16 * S2 - S) / 15

proposée initialement dans [47]. En effet, l’instruction que nous utilisons consiste à
corriger l’approximation S2 par la correction (S2 - S) / 15, ce qui peut être plus
précis dans certains cas lorsqu’on réalise des calculs avec des nombres à virgule flot-
tante16 .
Dans l’exemple qui suit, nous observons le comportement de l’algorithme dans un
exemple simple.

Exemple 11.9 (Quadrature adaptative). On reprend les données de l’exemple 11.2


page 281 et on utilise la méthode de quadrature adaptative pour évaluer une approxi-
mation de l’intégrale17 .
1 import numpy as np
2 from quadra ture import adap tsim
3

4 def myfunc (x) :


5 y = np . sin (2.5 * x ) ** 2
6 return y
7

8 Q , fcount = adaptsim ( myfunc , 0.0 , 1.0)


9 print ( "Q = " , Q )
10 print ( " fcount =" , fcount )
11 exacte = (5.0 - np . sin (5.0) ) / 10.0
12 err eur_ abso lue = abs ( Q - exacte )
13 print ( " erreu r_ab solu e =" , erre ur_a bsol ue )

Le script précédent produit la sortie suivante, où nous avons conservé 4 chiffres signi-
ficatifs.
1 Q = 0.5959
2 fcount = 57
3 err eur_ abso lue = 7.762 e -11

Nous avons utilisé la valeur par défaut de la tolérance c’est-à-dire 10 −6, ce qui a
produit une erreur absolue proche de 4 × 10−11 avec seulement 57 évaluations de la
fonction f . Comparée aux règles de quadrature que nous avions considérées précé-
demment, c’est une performance tout à fait spectaculaire puisque l’erreur absolue est
très inférieure sans que le nombre d’évaluations de la fonction ne soit excessif. On
16Voir [46], p.162.
17Script Python : Integration/Scripts/Py3/[Link].
11.8 • Performance (*) 303

observe que l’erreur absolue produite par la méthode est très inférieure à la tolérance
que nous avons utilisée (par défaut, la tolérance est égale à 10−6 ). Cela est dû au fait
que la méthode estime l’erreur en utilisant la différence S − S2 , mais utilise la règle
de Boole, beaucoup plus précise, pour estimer l’intégrale.

11.8 Performance de la quadrature adaptative (*)


Dans cette section, nous observons la performance de la quadrature adaptative en
termes d’erreur absolue et de nombres d’évaluations de la fonction f . Nous allons voir
que l’algorithme permet d’évaluer la fonction f avec plus de points dans les zones où
la fonction f le nécessite, par exemple dans les zones de forte courbure.

Exemple 11.10 (Intégrale de la fonction de Runge). Considérons la fonction de


1
Runge f (x) = 1+25x 2 pour x ∈ [ −1, 1]. Cette fonction a une forte courbure en x = 0,

ce qui va révéler une propriété intéressante de la méthode de quadrature adaptative.


Son intégrale exacte est :
Z 1
2
f (x)dx = arctan(5) = 0.5494
0 5

avec 4 chiffres significatifs. L’instruction suivante utilise la fonction adaptsim_gui


pour calculer une approximation de l’intégrale Q et le nombre d’appels à la fonction
fcount :
1 from quadra ture import a dapts im_g ui
2 import numpy as np
3 def runge ( x) :
4 y = 1.0 / (1.0 + 25.0 * x ** 2)
5 return y
6

7 Q , fcount = adapt sim_g ui ( runge , -1.0 , 1.0 , 1.0e -3)

De plus, la fonction produit la partie gauche de la figure 11.718 dans laquelle chaque
barre verticale sur l’axe des abscisses représente un point d’évaluation de la fonction f
par l’algorithme. On observe que, quand f évolue plus rapidement, l’algorithme utilise
plus de points : lorsqu’on est dans le voisinage de x = 0 les barres verticales sont plus
proches. La cause de ce comportement est liée à la courbure locale de la fonction
f au voisinage de x = 0. La méthode a utilisé un pas plus petit car la différence
entre les règles de Simpson et de Simpson composite a montré que l’erreur était trop
importante, ce qui a mené à un découpage plus fin de l’intervalle d’intégration. En
effet, la courbure plus marquée de la fonction f est telle que l’approximation par un
polynôme d’ordre 2 utilisée par la méthode de Simpson est parfois insuffisante pour
représenter correctement la fonction.
On souhaite voir comment l’erreur diminue quand le nombre d’évaluations de la
fonction augmente. Puisque c’est la tolérance que nous contrôlons, on utilise le script
Python suivant, qui fait varier la tolérance entre 1 et 10 −12. À chaque itération, nous
divisons la tolérance par 2 avec l’instruction atol /= 2.0 qui est équivalente à atol
= atol / 2.0. Pour chaque valeur de tolérance, on calcule l’erreur absolue et on la
stocke dans la variable err.
18 Script Python : Integration/Scripts/Py3/[Link].
304 Chapitre 11 • Intégration

Adaptatif : 0.5494.

Erreur absolue
1
Adapt.
−7
y 10 T.C.
S.C.
0 10 −16
−1 0 1 102 104
x Nombre d’appels à f

Figure 11.7 – À gauche, intégration par quadrature adaptative de la fonction de


Runge pour x ∈ [−1, 1] avec 33 évaluations de f . À droite, erreur absolue en fonction
du nombre d’appels à la fonction lors de l’intégration numérique de la fonction de
Runge par trois méthodes numériques : la quadrature adaptative de adaptsim, les
méthodes du trapèze composite (T.C.) et de Simpson composite (S.C.).

1 import numpy as np
2 from quadra ture import adap tsim
3

4 nombr e_pas = 50
5 err = np . zeros ( nomb re_pas )
6 fcount = np . zeros ( no mbre_p as )
7 atol = 1.0
8 for k in range ( nombr e_pas ):
9 atol /= 2.0
10 Q , fcount [k ] = adaptsim ( runge , -1.0 , 1.0 , atol )
11 err [ k] = abs ( Q - exact )

La partie droite de la figure 11.719 montre l’erreur absolue en fonction du nombre


d’appels à la fonction lors de l’intégration numérique de la fonction de Runge par
la méthode numérique de adaptsim. Sur le même graphique, nous présentons les
résultats de la méthode du trapèze composite et de Simpson composite, que nous
avons présentées dans la section 11.6. On constate que l’erreur absolue décroît lorsque
le nombre d’appels à f augmente. La courbe montre que le logarithme de l’erreur
absolue évolue presque linéairement en fonction du logarithme du nombre d’appels,
mais que la pente dépend de la méthode choisie. On observe que l’erreur absolue
diminue, puis, lorsqu’elle s’approche de 10−16 environ, ne change quasiment plus.
Cette limitation est due aux erreurs d’évaluations de la fonction f , qui limitent la
précision de l’approximation de son intégrale. Plus de détails sur ce thème sont donnés
dans l’exercice 11.13. On observe que la méthode du trapèze composite converge moins
vite que la méthode de Simpson composite. La méthode de quadrature adaptative est
proche de la méthode de Simpson composite dans ce cas particulier.

11.9 Traiter les difficultés


La manière de spécifier le problème d’intégration compte beaucoup dans le ré-
sultat d’une méthode numérique. Dans cette section, nous allons voir que certaines
19Script Python : Integration/Scripts/Py3/[Link].
11.9 • Traiter les difficultés 305

sin(x)/x
1

y
0
0 2
x

Figure 11.8 – La fonction sin(x)/x pour x ∈ [0, 3.5].

difficultés peuvent apparaître lorsqu’on tente d’approcher une intégrale, mais qu’il
existe plusieurs techniques pour les traiter. On peut en effet ajuster l’évaluation de
la fonction f , ajuster les bornes a et b ou encore ajuster la tolérance. Dans l’exemple
suivant, nous allons voir comment traiter le cas d’une fausse singularité générant une
division par zéro.
sin(x)
Exemple 11.11 (Fausse singularité). Considérons la fonction f (x) = x pour
x ∈ [0, π]. Cette fonction est présentée dans la figure 11.820. L’intégrale :
Z π
sin(x)
dx = 1.852
0 x
(avec 4 chiffres significatifs) pourrait se calculer avec les instructions :
1 import numpy as np
2

3 def myfun ( x) :
4 y = np . sin (x) / x
5 return y
6

7 Q , fcount = adaptsim ( myfun1 , 0.0 , np . pi )


Mais cela génère une division par zéro, à cause de la borne gauche de l’intervalle.
Cette division génère le nombre NAN et mène finalement à l’exception suivante :
1 Rec ursi onEr ror : maximum recur sion depth exceeded in c ompari son
La première solution consiste à changer la borne de gauche a = 0.0. Dans le script
suivant, nous utilisons la fonction nextafter pour calculer le flottant positif juste à
droite de zéro, égal à 4.941 × 10−324 . On utilise cette valeur comme borne de gauche
pour le calcul de l’intégrale.
1 >>> import numpy as np
2 >>> from quadra ture import adapt sim
3 >>>
4 >>> aft erzero = np . next after (0.0 , np . pi )
5 >>> aft erzero
6 4.941 e -324
7 >>> Q , fcount = adaptsi m (mysinc , afterzero , np . pi )
20 Script Python : Integration/Scripts/Py3/[Link].
306 Chapitre 11 • Intégration

8 >>> Q
9 1.852

L’erreur commise sur l’intégrale est très petite et son impact sur la représentation
flottante de l’intégrale est nul. En effet, l’erreur est :

h × f (0) = 4.941 × 10−324 × 1 = 4.941 × 10 −324 .

Par conséquent, la représentation flottante de l’approximation de l’intégrale est :


 
fl 1.852 + 4.941 × 10−324 = 1.852.

La seconde solution consiste à changer l’implémentation de l’évaluation de f . On


reconnaît qu’il s’agit de la fonction sinus cardinal. Or le développement de la fonction
3
sinus au voisinage de x = 0 est sin(x) = x − x3! + O(x 5 ) quand x → 0. Cela implique :

sin(x) x2
= 1− + O(x4 )
x 3!
quand x → 0. On en déduit que f (0) = 1 par continuité au voisinage de zéro. La
fonction mysincbis suivante utilise cette information pour évaluer la fonction en
traitant de manière particulière le cas où x = 0 :
1 >>> import numpy as np
2 >>> from quadra ture import adapt sim
3 >>> def mys incbis (x ):
4 ... if x == 0.0:
5 ... y = 1.0
6 ... else :
7 ... y = sin ( x) / x
8 ... return y
9 >>> Q , fcount = adaptsi m ( mysincbis , 0.0 , np . pi )
10 >>> Q
11 1.852

On pourrait penser que le test d’égalité exacte x == 0.0 devrait être remplacé par
abs(x) <= epsilon où epsilon est un nombre flottant proche de zéro (par exemple
epsilon = 1.e-8). Ce serait une erreur, car cela revient à produire une intégrale
approchée. Au contraire, le test x == 0.0 correspond à l’unique valeur flottante pour
laquelle une exception est levée, c’est-à-dire le cas où le dénominateur est exactement
nul. Plus précisément, les deux uniques nombres à virgule flottante pour lesquels le
test x == 0.0 est vrai sont les deux zéros signés, puisqu’il existe un nombre à virgule
flottante zéro positif et un zéro négatif, à cause du bit de signe, comme nous l’avons
vu dans l’exemple 4.14 page 62. Puisque nous intégrons la fonction sur l’intervalle
[0, π], le seul zéro qui peut apparaître dans ce cas particulier est le nombre à virgule
flottante zéro positif. En évitant de diviser par zéro dans cet unique cas particulier,
nous résolvons le problème de l’évaluation de la fonction au seul point où cela pose
un problème.

Il faut noter que la fonction adaptsim ne dispose pas de sécurité de telle sorte
que certains calculs provoquent des erreurs, comme nous allons le voir dans l’exemple
suivant.
11.9 • Traiter les difficultés 307

1/(2x − 1) Une aiguille dans une botte de foin.


50 1

0
y

y
−50 0
0.0 0.5 −1 0 1
x x

Figure 11.9 – À gauche, la fonction 1/(2x − 1) pour x ∈ [0, 0.9] n’est pas intégrable.
À droite, intégrer une fonction peut revenir à rechercher une aiguille dans une botte
de foin.

Exemple 11.12 (Échec). L’intégrale :


Z 9
10 1
dx
0 2x − 1

a une singularité qui n’est pas intégrable. Cette fonction est présentée dans la partie
gauche de la figure 11.921 . Avec adaptsim, le calcul échoue avec l’erreur suivante :
1 Runt imeEr ror : maximum recur sion depth exceeded

Il n’y malheureusement rien à faire pour résoudre ce problème : une méthode nu-
mérique d’intégration ne peut pas intégrer une fonction qui n’est pas intégrable. La
raison pour laquelle on a considéré plutôt la borne supérieure 10 9
au lieu de 1 est
d’éviter d’évaluer la fonction en x = 0.5, qui est précisément le milieu de l’intervalle.
Puisqu’il est utilisé par la règle de Simpson, cela génère une division par zéro. En fait
le calcul échouerait dans tous les cas, même si on évitait d’évaluer la fonction en ce
point (car la singularité ne peut pas être intégrée).

Une difficulté importante en intégration numérique est qu’il faut pouvoir détecter
la zone de l’intervalle [a, b] dans laquelle l’intégrale de la fonction est significative, ce
qui peut être difficile dans certains cas comme nous le voyons dans l’exemple suivant.

Exemple 11.13 (Une aiguille dans une botte de foin). On considère la fonction :

1
f (x) =
1 + α(x − β )2

pour x ∈ [−1, 1], où α, β ∈ R sont des paramètres. Le paramètre α contrôle la courbure


du pic et β contrôle sa position. La partie droite de la figure 11.922 présente cette
fonction avec les paramètres α = 103 et β = 0.5. Intégrer une telle fonction peut
revenir à rechercher une aiguille dans une botte de foin. En effet, la valeur de la
fonction est presque nulle sur tout l’intervalle, à l’exception notable du voisinage de
β où presque toute l’intégrale est contenue.
21 Script Python : Integration/Scripts/Py3/[Link].
22 Script Python : Integration/Scripts/Py3/[Link].
308 Chapitre 11 • Intégration

L’exemple précédent montre qu’une méthode de quadrature composite peut man-


quer l’aiguille si la longueur d’un sous-intervalle d’intégration est supérieure à la
longueur de la zone associée à des valeurs numériquement non nulles. De même, une
méthode de quadrature adaptative peut échouer à détecter la zone où la masse est
concentrée. Ce problème correspond à l’estimation d’une faible probabilité dans le
contexte de la fiabilité. Ce problème peut être interprété à l’aune du théorème 11.1
portant sur le conditionnement de l’intégrale. L’équation 11.7 présente le conditionne-
ment relatif de l’intégrale. Dans le contexte de l’exemple 11.13, la largeur de l’intervalle
b − a = 2 est relativement grande au numérateur et la valeur de l’intégrale est plutôt
petite au dénominateur. Au numérateur, la norme infinie de la fonction est égale à 1.
Cela montre que le problème est mal conditionné : un petit changement dans la valeur
de la fonction peut produire un grand changement relatif dans la valeur de l’intégrale.

11.10 Fonction paramétrique


En pratique, la plupart des fonctions f dépendent de certains paramètres qui
sont nécessaires pour l’évaluer la sortie en fonction de l’entrée. Dans ce paragraphe,
nous montrons comment utiliser une procédure d’intégration numérique et prendre
en compte ces paramètres.
Exemple 11.14 (Une fonction paramétrique). Considérons à nouveau la fonction de
Runge que nous avons déjà vue dans l’exemple 11.10 et introduisons des paramètres.
On considère la fonction :
α
f (x) =
β + γx 2
pour tout x ∈ [−1, 1] où α, β, γ sont les paramètres. Dans la fonction de Runge
classique, on a α = 1, β = 1 et γ = 25. La fonction rungefun suivante évalue
l’intégrande de la fonction de Runge paramétrique23 .
1 def rung efun (x , alpha , beta , gamma ):
2 y = alpha / ( beta + gamma * x ** 2)
3 return y
Dans la fonction précédente, l’ordre des paramètres est important. Le premier ar-
gument est x et correspond à la variable d’intégration. Les arguments suivants sont
alpha, beta et gamma, c’est-à-dire les paramètres de l’intégrande. Dans la session
suivante, on utilise la fonction adaptsim pour évaluer l’intégrale. Pour préciser leurs
valeurs, on transmet les paramètres à la fin de la séquence d’appel de adaptsim, après
l’argument tol. Ces arguments supplémentaires sont traités par l’instruction *args,
de telle sorte que la séquence d’appel de la fonction rungefun est respectée.
1 >>> from quadra ture import adapt sim
2 >>> alpha = 1.0
3 >>> beta = 1.0
4 >>> gamma = 25.0
5 >>> atol = 1. e -6
6 >>> Q , fcount = adaptsi m ( rungefun , -1.0 , 1.0 , atol ,
7 alpha , beta , gamma )
8 >>> Q
9 0.5494
23Script Python : Integration/Scripts/Py3/[Link].
11.11 • Applications : intégrer la loi normale 309

Les algorithmes du module quadrature, développé pour ce manuel, utilisent l’ar-


gument optionnel *args pour fournir cette fonctionnalité. À l’intérieur de chaque
algorithme, l’intégrande f est évalué grâce à la séquence d’appel :
1 y = f(x , * args )
où x est un nombre à virgule flottante représentant la variable d’entrée et y est un
nombre à virgule flottante représentant la variable de sortie. Le nombre de variables
optionnelles est arbitraire : on peut donc définir des fonctions paramétriques conte-
nant autant de paramètres que nécessaire. Cette fonctionnalité peut être utilisée dans
tous les contextes où un algorithme doit évaluer une fonction. Plus précisément, nous
utiliserons la même méthode dans le chapitre 12 consacré aux équations différentielles
ordinaires (en particulier dans la section 12.7), dans le chapitre 13 consacré à la réso-
lution d’équations non linéaires ainsi que dans le chapitre 14 consacré aux méthodes
d’optimisation. Un autre exemple d’intégration d’une fonction paramétrique est donné
dans la section 11.11.

11.11 Applications : intégrer la loi normale


Le bureau de recensement des États-Unis fournit des statistiques sur ce pays. On
dispose en particulier de la distribution de la population par taille et par sexe [140].
Bien que la question soit controversée [120], on pense que la distribution de la taille des
hommes suit approximativement la loi gaussienne. Nous avons déjà utilisé cette loi de
probabilité dans la section 8.10, où nous l’avons utilisée dans le contexte d’un problème
d’interpolation appliqué à un modèle de fiabilité. Si on mélange les échantillons de la
taille des hommes et des femmes, on obtient une distribution bimodale qui peut être
difficile à approcher par une loi gaussienne. Soient µ et σ > 0 deux réels. La densité
de probabilité de la loi gaussienne est :
 
1 (x − µ)2
f (x) = √ exp −
σ 2π 2σ2
pour tout x ∈ R. La fonction de répartition F est l’intégrale de f :
Zx
F (x) = f (t)dt (11.51)
−∞

pour tout x ∈ R. La probabilité que la variable X soit inférieure à un seuil x est


P (X ≤ x) = F (x).
Soit X la taille d’un homme dont l’âge est entre 20 et 79 ans D’après les données
dans [140], on peut estimer que la moyenne et l’écart-type sont µ = 1.763 (m) et
σ = 0.0680 (m). La fonction f associée à ces paramètres est présentée dans la figure
11.1024. L’objectif est de calculer la probabilité que la taille d’un homme soit inférieure
à 2 (m). Cela revient à évaluer l’intégrale 11.51 lorsque x = 2. Bien que la fonction
f ait une expression explicite fondée sur la fonction exp, il s’avère qu’il n’y a pas
d’expression simple de son intégrale F . C’est pourquoi une méthode numérique peut
être utilisée pour évaluer une approximation de la probabilité. Bien sûr, on pourrait
utiliser la fonction erf, ou bien encore le module stats de SciPy. Dans notre cas,
nous proposons d’utiliser une méthode d’intégration numérique.
24 Script Python : Integration/Scripts/Py3/[Link].
310 Chapitre 11 • Intégration

Hommes de 20 à 79 ans
5

Densité
0
1.6 1.8
Taille (m)

Figure 11.10 – Modèle gaussien pour la distribution de la taille des hommes dont
l’âge est entre 20 et 79 ans.

Le premier problème est que la borne inférieure de l’intégrale 11.51 est égale à −∞.
Lorsqu’on utilise des nombres flottant de type double, il s’avère que la fonction f (x)
est numériquement égale à zéro lorsque x < µ − 40σ ou x > µ + 40σ. Par conséquent,
l’intégrale à évaluer est :
Zx
P (X ≤ x) ≈ f (t)dt.
µ−40σ

Le script suivant réalise le calcul :


1 import numpy as np
2 from quadra ture import adap tsim
3

4 def gaus spdf (x , mu , sigma ):


5 z = (x - mu ) / sigma
6 y = np . exp ( -( z ** 2) / 2.0) / \
7 ( sigma * np . sqrt (2 * np . pi ))
8 return y
9

10 mu = 1.763
11 sigma = 0.0680
12 a = mu - 40 * sigma
13 b = 2.0
14 tol = 1.0 e -7
15 Q , fcount = adaptsim ( gausspdf , a , b , tol , mu , sigma )
Avec une tolérance absolue égale à 10−7 , il faut 189 évaluations de f pour obtenir :
P (X < 2) ≈ 0.9998.
On peut également évaluer la probabilité complémentaire en modifiant les bornes
de l’intégrale : Z µ+40σ
P (X > x) ≈ f (t)dt
x
avec le script suivant :
1 a = 2.0
2 b = mu + 40 * sigma
3 tol = 1.0 e -7
4 Q , fcount = adaptsim ( gausspdf , a , b , tol , mu , sigma )
11.12 • Conclusion 311

Il ne faut que 41 évaluations de f pour obtenir :

P (X > 2) ≈ 0.0002499

avec une tolérance absolue égale à 10−7.

11.12 Conclusion
Dans ce chapitre, nous avons vu les méthodes les plus classiques, mais pas for-
cément les plus efficaces. Une solution consiste à se tourner vers les méthodes de
quadrature de Gauss, fondées sur des polynômes orthogonaux. Dans ces méthodes,
les nœuds sont répartis plus astucieusement que les nœuds équidistants des formules
de Newton-Cotes. Cette propriété limite grandement le phénomène de Runge dû aux
grandes valeurs de certaines dérivées de f . De plus, les poids sont positifs (mais pas
nécessairement égaux) dans les quadratures de Gauss ce qui empêche le phénomène de
cancellation que nous avons vu pour les méthodes de Newton-Cotes. Plus de détails
sur ce sujet peuvent être trouvés dans [49] page 169, dans [50] page 152, dans [115]
chapitre 10 et dans [40] page 134. Une introduction plus ancienne est présentée dans
[31] page 73.
Un aspect que nous n’avons pas présenté est la « super-convergence » de la méthode
du trapèze composite dans certaines situations. En effet, l’erreur de la méthode du
trapèze sur les fonctions périodiques décroît plus rapidement que ce que le théorème
11.11 indique. Sous certaines hypothèses, la décroissance peut être exponentielle. Pour
le voir, on peut utiliser la formule d’Euler-MacLaurin, qui permet d’obtenir l’ordre de
précision de la méthode d’intégration de Romberg. Plus de détails sur ce thème sont
présentés dans [28] page 531, [49] page 194, [31] page 106 ou encore dans [115] page
398.
On peut facilement mettre en défaut n’importe quel programme informatique d’in-
tégration numérique [77]. C’est pourquoi la plupart des auteurs de librairies d’inté-
gration numérique confrontent leurs programmes à des collections de fonctions tests.
Plusieurs collections de problèmes tests en intégration numérique sont présentés dans
la littérature, par exemple les problèmes identifiés dans [39] page 325 (6 problèmes)
et page 334 (23 problèmes).
Le théorème fondamental de l’analyse donne un lien entre différentiation et inté-
gration. C’est pourquoi on peut résoudre un problème d’intégration en utilisant une
méthode initialement conçue pour résoudre une équation différentielle. Nous revien-
drons sur ce thème sont présentés dans la section 12.1 page 321.

11.13 Notes et références


Les figures 11.2 page 282 et 11.3 page 287 sont présentées par exemple dans [104]
page 167 ou dans [40] page 108 sur un autre intégrande.
Les méthodes de quadrature que nous avons présentées sont décrites dans le cha-
pitre 5 de [28] qui présente, de plus, des méthodes d’intégration multidimensionnelles
comme la méthode de Monte-Carlo. La méthode de Boole est nommée méthode de
Milne dans [28], page 552. Elle est nommée méthode de Weddle dans [104], page 168,
bien que la règle de Weddle-Hardy soit plutôt associée à la méthode de Newton-Cotes
associée à 6 nœuds, et non pas à 5 nœuds comme pour la règle de Boole. Le chapitre
312 Chapitre 11 • Intégration

adaptsim Quadrature adaptative


adaptsim_gui Quadrature adaptative (avec graphique)
midpoint_rule Règle du point milieu
trapezoidal_rule Règle du trapèze
simpson_rule Règle de Simpson
boole_rule Règle de Boole
compositesimpson_rule Règle de Simpson composite
composite_midpoint Règle du milieu composite
composite_trapezoidal Règle du trapèze composite
composite_simpson Règle de Simpson composite
test_problems Une collection de problèmes

Table 11.8 – Fonctions du module [Link].

9 de [115] présente les méthodes d’intégration classiques ainsi que des méthodes que
nous n’avons pas présentées, par exemple la méthode d’intégration de Romberg fondée
sur l’extrapolation de Richardson. La section 9.7 présente les méthodes de quadrature
adaptative.
Dans la section 11.7, nous avons présenté un algorithme de quadrature adaptative.
Plus de détails sur cet algorithme et en particulier sur le choix délicat du critère
d’arrêt sont présentés dans [47]. Cet algorithme est également présenté dans [104]
page 168. L’ouvrage pionnier [46] chapitre 5 page 84 utilise une méthode de quadrature
adaptative similaire à celle que nous présentons. Observons que la procédure QUANC8
utilisée par les auteurs est fondée sur une formule de Newton-Cotes utilisant 9 nœuds
et associée à des poids négatifs, un inconvénient d’ailleurs analysé par les auteurs
de [46] page 99. Remarquons enfin que l’algorithme de quadrature adaptative utilisé
dans [104] est fondé sur la règle de Boole qui ne fait pas apparaître de poids négatifs,
au contraire de l’algorithme utilisé dans [46]. D’après [46], le premier algorithme de
quadrature adaptative, fondé sur la méthode de Simpson, est dû à McKeeman [101].
On peut consulter [31] sur le thème des méthodes numériques pour l’intégration et en
particulier le chapitre 6 page 315 sur le sujet de la quadrature adaptative.
La table 11.8 présente les fonctions du module [Link] développé pour ce
livre.

11.14 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.

Exercice 11.1 (Vérification du degré d’exactitude) L’objectif de cet exercice est de


calculer le degré d’exactitude de plusieurs règles de quadrature. Pour cela, il faudrait selon
la définition tester n’importe quel polynôme de degré p sur un intervalle [a, b] arbitraire.
Nous allons utiliser une méthode plus facile à mettre en œuvre. En effet, le théorème 11.17
page 317 montre qu’il suffit de tester les monômes x p sur l’intervalle [0, 1]. On sait que :
Z 1
1
xp dx = (11.52)
0
p+1
11.14 • Exercices 313

pour p = 0, 1, .... Dans la suite, par souci de concision, nous omettons les bornes 0 et 1 de
l’intervalle [0, 1] dans les règles de quadrature concernées. Par exemple, nous désignons par
M (x2) la règle du point milieu appliquée au polynôme x2 sur l’intervalle [0, 1].
1. Montrer que, pour la règle du milieu sur l’intervalle [0, 1] on a M (1) = 1, M (x) = 12
et M (x2 ) = 14 . En déduire que la règle du milieu est de degré d’exactitude égal à 1.
2. Montrer que, pour la règle du trapèze sur l’intervalle [0, 1] on a T (1) = 1, T (x) = 12 et
T (x2) = 12 . En déduire que la règle du trapèze est de degré d’exactitude égal à 1.
3. Montrer que, pour la règle de Simpson sur l’intervalle [0, 1] on a S(1) = 1, S (x) = 12 ,
S (x2) = 13 , S (x3 ) = 14 et S (x 4 ) = 24
5
. En déduire que la règle de Simpson est de degré
d’exactitude égal à 3.
On remarque que, bien évidemment, les valeurs numériques indiquées dans l’exercice
coïncident avec les valeurs indiquées dans la table 11.2 page 290.

* Exercice 11.2 (Intégrale d’un polynôme particulier) Soit a et b deux réels avec a < b.
Soit h = b − a. Soit c = (a + b)/2 et p un entier positif. Montrer que :
Z (
b
p 0 si p est impair
(x − c) dx = hp+1
a (p+1)2p si p est pair.

Remarque 11.3. Le résultat de l’exercice précédent est utilisé dans l’exercice 11.4.
Dans la démonstration des erreurs de plusieurs règles de quadrature, nous aurons besoin
du théorème suivant.

Théorème 11.15 (Théorème de la valeur intermédiaire pour l’intégrale). Soient f et g deux


fonctions continues sur un intervalle [a, b].
1. Supposons que g (x) ≥ 0 pour tout x ∈ [a, b]. Alors, il existe ξ ∈ [a, b] tel que :
Z b Z b
f (x)g(x)dx = f (ξ ) g (x)dx. (11.53)
a a

2. Supposons que g (x) ≤ 0 pour tout x ∈ [a, b]. Alors il existe ξ ∈ [a, b] tel que l’égalité
11.53 est satisfaite.
Nous utiliserons le théorème 11.15 dans plusieurs exercices, et en particulier dans l’exer-
cice11.4.

* Exercice 11.3 (Théorème de la valeur intermédiaire pour l’intégrale)


1. Supposons que g (x) ≥ 0 pour tout x ∈ [a, b]. Démontrer le théorème 11.15, partie
1. Indication. Utiliser le théorème des bornes (ou théorème de Weierstrass) puis le
théorème de la valeur intermédiaire 13.2, page 363.
2. Supposons que g (x) 6= 0 pour tout x ∈ [a, b]. Démontrer le théorème 11.15, partie 2.

* Exercice 11.4 (Erreur de la formule du point milieu) Soit a et b deux réels avec a < b.
On suppose que f ∈ C 2([a, b]). On considère la formule du point milieu définie par l’équation
11.14.
1. Soit P le polynôme de degré zéro interpolant la fonction f au point c où c = a+2b est le
milieu de l’intervalle [a, b]. En d’autres termes, on a P (x) = f (c) pour tout x ∈ [ a, b].
Montrer que la formule du point milieu est égale à l’intégrale du polynôme P . En
Rb
d’autres termes, montrer que a P (x)dx = M .
2. Montrer l’équation 11.18, page 283. Indication. Utiliser l’exercice 11.2 ainsi que le
théorème 11.15.
314 Chapitre 11 • Intégration

* Exercice 11.5 (Erreur de la formule du trapèze) Soit a et b deux réels avec a < b. On
suppose que f ∈ C 2 ([a, b]). On considère la formule du trapèze définie par l’équation 11.15.
Soit P le polynôme interpolant la fonction f aux points a et b :
x−a
P (x) = f (a) + (f (b) − f (a)) (11.56)
b−a

pour tout x ∈ [ a, b].


1. Montrer que la formule Rdu trapèze est égale à l’intégrale du polynôme P . En d’autres
b
termes, démontrer que a P (x)dx = T . Indication. Considérer le changement de va-
riable x = a + ht pour t ∈ [0, 1].
2. Montrer que :
Z b
h3
(x − a)(x − b)dx = − . (11.57)
a
6

Indication. Considérer le changement de variable x = a + ht pour t ∈ [0, 1].


3. Montrer l’équation 11.19, page 283. Indication. Utiliser la formule de Taylor pour
l’interpolation (c’est-à-dire le théorème 8.7 page 193) ainsi que le théorème 11.15.

Exercice 11.6 (Lien entre la formule de Simpson, la règle du milieu et la formule du


trapèze) Soit a et b deux réels avec a < b. On suppose que f est une fonction intégrable sur
[a, b]. On considère la formule de Simpson définie par l’équation 11.22, page 284. Démontrer
l’équation 11.23.

Exercice 11.7 (Règle de Simpson comme intégrale du polynôme interpolant de degré 2)


1. Soit f une fonction intégrable sur l’intervalle [−h, h] où h > 0. On suppose que f (−h) =
y0, f (0) = y1 et f (h) = y2 où y0, y1 , y2 ∈ R. On considère le polynôme de degré deux
P (x) = c1x 2 + c2 x + c3 pour tout x ∈ [−h, h] où c 1 , c2 et c3 sont des constantes réelles.
On fait l’hypothèse que le polynôme P interpole les valeurs de f en −h, 0 et h. En
d’autres termes, on a :

P (−h) = y0, P (0) = y 1 , P (h) = y2 . (11.58)

Montrer que :
Z h
h
P (x)dx = (2c 1h 2 + 6c 3). (11.59)
−h 3

2. En déduire que :
Z h
h
P (x)dx = (y 0 + 4y1 + y2). (11.60)
−h
3

3. Soient a et b deux réels avec a < b. Soit f ∈ C∞ ([a, b]). Soit c = (a + b)/2 le milieu de
l’intervalle. Soit P le polynôme de degré deux qui interpole f aux points a, b, c. Par
un changement de variable, utiliser l’équation 11.60 et montrer que :
Z b
h
P (x)dx = (f (a) + 4f (c) + f (b)) (11.61)
a
6

où h = b − a, qui est la règle de Simpson.


11.14 • Exercices 315

y y=f(x)
y2 y=P(x)
y1

y0

x
-h 0 h

Figure 11.11 – Interpolation d’une fonction en trois points par un polynôme de degré
deux. La fonction f est représentée en trait plein, tandis que le polynôme interpolant
est représenté en trait discontinu.

Remarque 11.4 (Règle de Simpson). L’exercice précédent montre que la formule de Simpson
intègre exactement un polynôme de degré 2. Il montre que, de plus, la formule de Simpson
intègre exactement un polynôme de degré 3, ce qui implique que le degré d’exactitude de
cette formule est égal à 3. La figure 11.11 présente le polynôme P de degré deux qui interpole
la fonction f en −h, 0 et h.

Théorème 11.16 (Théorème de Taylor pour la formule de Simpson). Soient x1 , x 2, x 3 ∈ R


tels que x1 < x 2 < x3. On suppose que f ∈ C 4 ([x1, x 3]). Soit ω le polynôme défini par :

ω (x) = (x − x1 )(x − x2 ) 2(x − x 3 ) (11.62)

pour tout x ∈ [x1 , x3 ]. Soit H l’unique polynôme de degré 3 tel que :

H (x i ) = f (xi ) (11.63)

pour i = 1, 2, 3 et :
0 0
H (x2) = f (x 2). (11.64)

Un tel polynôme est appelé polynôme interpolant d’Hermite, car il interpole à la fois la valeur
de la fonction ainsi qu’une de ses dérivées. Soit x ∈ [x1 , x3 ]. Alors il existe ξ ∈]x 1, x3 [ tel
que :
1 (4)
f (x) = H (x) + f (ξ )ω (x). (11.65)
4!
Remarque 11.5. Pour faire la démonstration du théorème précédent, on ne peut pas utiliser
le théorème 8.7 page 193. En effet, le théorème est associé à un polynôme nodal constitué de
racines simples. Or, dans le théorème précédent, la racine x2 est double ce qui implique le
terme (x − x 2)2 au lieu du terme x − x2. L’équation 11.65 peut être obtenue en utilisant la
formulation de Newton pour l’interpolation, fondée sur les différences divisées. Plus détails
sur le thème de l’interpolation par le polynôme de Newton et l’interpolation d’Hermite sont
donnés dans [49], section « Newton’s formula » page 93 et la section « Hermite interpolation »
page 97.

** Exercice 11.8 (Théorème de Taylor pour la formule de Simpson) Le but de cet


exercice est de démontrer le théorème 11.16. On remarque que l’égalité 11.65 est satisfaite
si x = x1, si x = x 2 ou si x = x3. En effet, par définition du polynôme nodal ω, on a
ω (x1) = ω(x 2) = ω (x3) = 0. C’est pourquoi nous supposons dans la suite que x est différent
des trois nœuds x 1, x 2 et x3 . Il existe nécessairement une constante c ∈ R telle que :

f (x) = H (x) + cω (x). (11.66)


316 Chapitre 11 • Intégration

En effet, si c = f (xω)−(xH) (x) alors l’égalité 11.66 est satisfaite. De plus le dénominateur est
nécessairement non nul puisque, par hypothèse, on a x 6= x 1, x 6= x 2 et x 6= x3 . Soit F la
fonction définie par :

F (t) = f (t) − H (t) − cω (t) (11.67)

pour tout t ∈]x 1, x 3 [.


1. Montrer que F (xi ) = 0 pour i = 1, 2, 3.
2. Montrer que F 0 (x2) = 0.
3. En déduire qu’il existe ξ ∈]x1 , x3[ tel que F (4) (ξ ) = 0. Indication. Utiliser le théorème
de Rolle.
4. En déduire que :
1 (4)
c= f (ξ ) (11.68)
4!
ce qui conclut la preuve.

** Exercice 11.9 (Ordre de précision de la formule de Simpson) Soit a et b deux réels


avec a < b. On suppose que f ∈ C 4 ([a, b]). On considère la formule de Simpson définie par
l’équation 11.23. Soit c = (a + b)/2 le milieu de l’intervalle. Soit ω le polynôme nodal défini
par :

ω (x) = (x − a)(x − c)2 (x − b) (11.69)

pour tout x ∈ [ a, b].


1. Montrer que :
Z b
h5
ω (x)dx = − (11.70)
a
120

Indication. Utiliser le changement de variable t = x−a


h
pour x ∈ [a, b] puis le change-
ment de variable s = 2t − 1 pour t ∈ [0, 1].
2. Montrer l’équation 11.24, page 285.
Remarque 11.6 (Erreur de la formule de Simpson). Dans certains textes, l’équation 11.24 est
écrite sous la forme :
Z b
(h/2)5
f (x)dx = S − f (4)(ξ ) (11.74)
a
90

mais les deux formulations sont équivalentes puisque 2880 = 90 × 25 . Néanmoins, nous
devons admettre que nous n’avons pas trouvé de démonstration totalement rigoureuse de
cette égalité dans la bibliographie. Dans [28] page 530, les auteurs présentent le résultat dans
le cas particulier de la fonction f (x) = x4 . Dans [17], chapitre 4 « Numerical differentiation
and integration », section 4.3 « Elements of numerical integration » page 195, les auteurs
indiquent que l’équation 11.34 ne permet d’obtenir qu’un terme O (h4 ) et non pas le terme
O (h5 ) voulu. Ils démontrent qu’il existe ξ 1 et ξ2 tels que :
Z b  
(h/2) 5 1 (4) 1
f (x)dx = S − f (ξ1 ) − f (4) (ξ2) . (11.75)
a
15 3 5

Pour faire apparaître le terme 1/90, les auteurs utilisent le cas particulier f (x) = x4 (dans
l’exercice 24 de leur ouvrage).
11.14 • Exercices 317

* Exercice 11.10 (Erreur de la formule de Simpson composite à deux sous-intervalles)


Montrer le théorème 11.6.

Exercice 11.11 (Ordre de la formule de Boole) Démontrer le théorème 11.7, page 288.

Théorème 11.17 (Degré d’exactitude et intégrale de monômes). Soit R une règle de qua-
drature. La règle de quadrature est de degré d’exactitude p si et seulement si :
Z 1
i
R(x , 0, 1) = xi dx (11.77)
0

pour i = 0, 1, ..., p.
En d’autres termes, le théorème indique que la règle de quadrature est de degré d’exac-
titude p sur l’intervalle [ a, b] si et seulement si elle est de degré d’exactitude 0, 1, ..., p sur
l’intervalle [0, 1]. Cette dernière condition est bien plus facile à vérifier en pratique.

** Exercice 11.12 (Degré d’exactitude et intégrale de monômes) L’objectif de cet exercice


est de montrer le théorème 11.17.
1. Montrer qu’une règle de quadrature est linéaire par rapport à son intégrande. En
d’autres termes, montrer que pour toutes fonctions f et g intégrables sur l’intervalle
[a, b] et tous réels α et β , on a R(αf + βg, a, b) = αR(f, a, b) + βR(g, a, b).
2. Montrer que la règle de quadrature est de degré d’exactitude p si et seulement si :
Z b
i
R(x , a, b) = xi dx (11.78)
a

pour i = 0, 1, ..., p.
3. Montrer que si la règle de quadrature R est de degré p, alors l’égalité 11.77 est satisfaite.
4. Montrer que si l’égalité 11.77 est satisfaite, alors la règle de quadrature R est de degré
d’exactitude p. Indication. Considérer une règle de quadrature associée à n nœuds
x1, ..., x n et n poids w1, ..., wn et utiliser le changement de variable t = xb− −a
a
pour
x ∈ [a, b].

* Exercice 11.13 (Méthode d’intégration composite) On considère une méthode d’intégra-


tion composite au sens de la définition 11.10, page 296. On cherche à démontrer le théorème
11.11, page 297.
1. Montrer l’égalité 11.43.
2. Soit eabs (a, b) l’erreur absolue :
Z 
 xn X
n−1 

eabs (a, b) = 

f (x)dx − R(x k, xk+1 )  . (11.79)
 x1 
k=1

Montrer qu’il existe une constante M et un entier n0 tels que :

log(eabs (a, b)) ≤ M − q log(n − 1) (11.80)

pour n ≥ n0 .
Remarque 11.7 (Erreur absolue d’une règle d’intégration en échelle logarithmique). L’égalité
11.43 montre que, si la règle de quadrature est d’ordre q + 1 sur chaque intervalle [xk , x k+1],
alors la règle composite associée est d’ordre q sur l’intervalle [a, b] : on a perdu un ordre de
précision. Puisque la fonction exp(x) est croissante, l’inégalité 11.80 implique :

eabs (a, b) ≤ eM e−q log(n−1) = eM (n − 1)−q


318 Chapitre 11 • Intégration

puisque αβ = eβ log(α) pour tous réels α > 0 et β . L’égalité 11.80 montre que, si l’on trace
l’erreur absolue e abs (a, b) en fonction du nombre d’intervalles n en échelle log-log, alors on
doit observer une droite de pente −q . Cette pente est plus négative lorsque l’ordre q + 1 de
la règle de la quadrature est plus grand. De plus, pour une méthode composite, le nombre
d’appels à la fonction f est le même pour chaque sous-intervalle. Par exemple, pour un
sous-intervalle, il y a un seul appel à f pour la méthode du point milieu. Ainsi, on peut
également tracer l’erreur absolue en fonction du nombre d’appels à f . En ce qui concerne les
méthodes de quadrature adaptatives, le nombre d’appels à f n’est pas le même pour tous
les intervalles, et, en toute rigueur, l’analyse précédente ne s’applique pas.

Exercice 11.14 (Méthodes composites : trapèze composite et Simpson composite) On


considère une méthode d’intégration composite au sens de la définition 11.10, page 296.
1. Pour chaque intervalle [x k, xk+1 ], on considère la méthode du point milieu. Montrer
l’équation 11.44 page 297.
2. Pour chaque intervalle [xk , xk+1], on considère la méthode du trapèze. Montrer les
équations 11.45 et 11.46.
3. Pour chaque intervalle [xk , xk+1 ], on considère la méthode de Simpson. Montrer l’équa-
tion 11.48.

* Exercice 11.15 (Ordre des formules de Newton-Cotes) Démontrer le théorème 11.9.

* Exercice 11.16 (Conditionnement de l’intégrale par rapport à f) Le but de l’exercice


est de montrer le théorème 11.1.
1. Montrer que :

c abs(f, a, b) ≤ b − a. (11.81)

2. Supposons que I (f ) 6= 0. Montrer que :

kf k∞
crel (f, a, b) ≤ (b − a) . (11.82)
|I (f )|

3. Pour tout réel  > 0, montrer qu’il existe une fonction δ intégrable telle que kδ k∞ < 
et :

|I (δ )| = kδ k∞ (b − a). (11.83)

En déduire que cela montre que, pour cette fonction f , les bornes des inégalités 11.81
et 11.82 sont atteintes.

* Exercice 11.17 (Conditionnement de l’intégrale par rapport aux bornes) Démontrer le


théorème 11.2.
Chapitre 12

Équations différentielles
ordinaires

De nombreux phénomènes physiques peuvent être modélisés par des systèmes


d’équations différentielles ordinaires (EDO). Le principe fondamental de la dyna-
mique, par exemple, stipule que la somme des forces exercées sur un objet est pro-
portionnelle à l’accélération de l’objet. Puisque l’accélération est égale à la dérivée
seconde de la position, on obtient une équation différentielle que l’on peut tenter de
résoudre. De manière plus générale, qu’il s’agisse de l’évolution des concentrations
d’un mélange dans le contexte de la cinétique chimique ou de l’évolution d’une popu-
lation de prédateurs et de proies dans un système écologique, beaucoup de ces sujets
peuvent être appréhendés grâce à des EDO.
Toutefois, certains de ces systèmes n’ont pas de solution qui peut être exprimée
en termes de fonctions connues et il est parfois nécessaire de recourir à des méthodes
numériques pour les résoudre de manière approchée. Dans cette section, nous présen-
tons différentes méthodes pour résoudre une équation différentielle ordinaire ou un
système d’EDO. En particulier, nous présentons les méthodes à un pas ainsi que les
méthodes multi-pas. Nous étudions les erreurs locales et globales de ces méthodes et
présentons un algorithme adaptatif permettant de contrôler l’erreur locale en ajustant
le pas de discrétisation au cours des itérations.
La résolution d’une équation différentielle ordinaire peut être formalisée grâce au
problème de Cauchy.
Définition 12.1 (Problème de Cauchy). Soient t0 et y0 deux réels. Soit f (t, y) une
fonction réelle pour tout t ≥ t0 et tout y ∈ R. Le problème de Cauchy consiste à
trouver une fonction y(t) telle que :

dy(t)
= f (t, y (t)) (12.1)
dt
pour tout t ≥ t0 avec la condition initiale :

y(t0 ) = y0 . (12.2)

Dans ce problème, le réel t0 ∈ R est la date initiale et y0 ∈ R est la condition


initiale. Les données du problème sont la condition initiale y0 et la fonction f . L’in-

319
320 Chapitre 12 • EDO

connue est la fonction y(t) pour t ≥ t0. Dans la remarque suivante, nous analysons le
choix de la date initiale pour le problème de Cauchy.
Remarque 12.1 (Date initiale). Sans perte de généralité, analysons pourquoi on pour-
rait considérer la date initiale t0 = 0. Premièrement, supposons que la fonction y est
solution du problème de Cauchy associé aux équations 12.1 et 12.2. Soit z la fonction
définie par z (t) = y(t + t0 ) pour tout t ≥ 0. Pour tout t ≥ 0, on a :

z 0(t) = y 0(t + t0 ) = f (t + t 0, y (t + t0 )) = f (t + t0, z (t)).

Soit f0 la fonction définie par f0 (t, z ) = f (t + t0 , z ) pour tout t ≥ 0 et tout z ∈ R.


Alors z est solution de l’EDO :
dz(t)
= f 0(t, z (t)) (12.3)
dt
pour tout t ≥ 0 avec la condition initiale :

z(0) = y0 . (12.4)

En d’autres termes, la fonction z est solution du problème de Cauchy associé à la date


initiale t = 0, à l’état initial z0 et à la fonction f0 . Réciproquement, supposons que
la fonction z est solution du problème de Cauchy associé aux équations 12.3 et 12.4.
Soit y la fonction définie par y(t) = z(t − t0) pour tout t ≥ t 0. Pour tout t ≥ t 0 on a :

y0(t) = z 0 (t − t0) = f 0 (t − t0, z (t − t 0)) = f 0 (t − t0, y (t)).

Soit f la fonction définie par f (t, y) = f0 (t − t0, y ) pour tout t ≥ t 0 et tout y ∈ R.


Alors y est solution de l’EDO y0 (t) = f (t, y (t)) pour tout t ≥ t0 avec la condition
initiale y(t 0 ) = z (t0 − t0) = z (0) = y0 . En d’autres termes, la fonction y est solution
du problème de Cauchy associé aux équations 12.1 et 12.2. Puisque la formulation la
plus classique est celle donnée dans la définition 12.1, nous la conservons dans la suite
de l’exposé.
En anglais, le terme approprié est initial value problem (IVP) ou bien ordinary
differential equation (ODE). En français, on parle d’équation différentielle ordinaire
(EDO). Observons que le terme initial value problem met davantage en avant la condi-
tion initiale (c’est-à-dire y0 ) tandis que le terme équation différentielle ordinaire met
davantage en avant l’équation différentielle satisfaite par la solution (c’est-à-dire f ).
Dans l’exemple suivant, nous présentons le problème de Cauchy associé à la trajectoire
d’un ballon et analysons les rôles respectifs de la condition initiale et de l’équation
différentielle ordinaire.

Exemple 12.1 (Trajectoire d’un ballon). Considérons la trajectoire d’un ballon dans
lequel on frappe avec le pied. Le problème de Cauchy revient à tenter de déterminer
la trajectoire de la balle. Le modèle le plus simple consiste à considérer uniquement
l’altitude de la balle y en fonction du temps t. Cette trajectoire est déterminée, d’une
part, par l’altitude initiale y0 du ballon : la trajectoire n’est pas la même si le ballon
est posé au sol ou bien à une altitude de 10 mètres par exemple. D’autre part, la
trajectoire est déterminée principalement par l’accélération de la gravité g , mais aussi
par la force de traînée qui traduit la résistance que l’air oppose à l’avancement de la
balle.
12.1 • EDO et quadrature 321

Dans un premier temps, nous allons considérer une variable y (t) ∈ R, c’est-à-dire
scalaire. Nous verrons par la suite qu’on peut facilement étendre la définition à une
variable y(t) vectorielle. Dans le cas de la trajectoire d’un ballon par exemple, les
inconnues seraient l’altitude y(t) de la balle ainsi que l’abscisse x(t) de la balle dans
le plan du mouvement. Dans un nombre considérable de problèmes d’ingénierie, la
solution exacte du problème de Cauchy est inconnue. Dans ce cas, il est nécessaire
d’utiliser des méthodes numériques : l’exemple suivant présente le cas particulier de
la trajectoire d’un ballon.

Exemple 12.2 (Méthodes numériques pour la trajectoire d’un ballon). Dans le cas,
par exemple, de la trajectoire d’un ballon, la solution du problème de Cauchy est
connue dans le cas où la résistance de l’air est nulle : la trajectoire est une parabole.
Un modèle réaliste de résistance de l’air consiste à considérer une force dépendant de
la vitesse de la balle. Dans ce cas, la trajectoire n’est pas nécessairement une parabole :
la balle peut monter moins haut et peut descendre plus rapidement vers le sol que
la parabole ne le prédit. On ne peut pas exprimer la solution exacte de ce problème
à partir de fonctions connues, ce qui n’est pas un problème puisque les méthodes
numériques sont capables de calculer une solution approchée de ce problème.

Dans une méthode numérique, on discrétise le temps, ce qui mène aux dates t0 ,
t1 , etc. Pour chaque date t n , on souhaite calculer une approximation yn de la solution
exacte y (tn ). En d’autres termes, on a :

y n ≈ y(t n ) (12.5)

pour n ≥ 0. La différence yn − y(t n ) caractérise l’erreur commise par la méthode


numérique. Pour la plupart des méthodes que nous allons utiliser dans ce document,
le pas de discrétisation temporelle h > 0, spécifié par l’utilisateur, est constant durant
toute la simulation. Dans ce cas, nous avons :

tn+1 = tn + h

pour n ≥ 0. Toutefois, dans certaines méthodes plus avancées, le pas de temps t n+1−tn
est automatiquement déterminé pour garantir que l’erreur est inférieure à une tolé-
rance spécifiée par l’utilisateur. Cela requiert d’adapter le pas au cours des itérations,
en le réduisant si nécessaire lorsque l’erreur est trop grande ou en l’augmentant lorsque
l’erreur peut être relâchée tout en restant inférieure à la tolérance. Nous présenterons
ces méthodes avancées dans la section 12.5.
Du fait du lien entre intégration et différentiation, on peut être tenté d’utiliser
une des méthodes d’intégration déjà présentées dans le chapitre 11 pour résoudre une
EDO. Il s’avère que cela n’est pas toujours possible, comme nous l’étudions dans la
section suivante.

12.1 EDO et quadrature


Dans cette section, nous présentons le lien entre équation différentielle ordinaire
et intégration par l’intermédiaire du théorème fondamental de l’analyse. Nous mon-
trons pourquoi ces deux approches sont parfois équivalentes et différentes en certaines
occasions. On pourrait penser qu’il nous suffit d’utiliser une méthode d’intégration
322 Chapitre 12 • EDO

pour trouver une solution approchée de l’EDO. En effet, le théorème fondamental de


l’analyse (théorème 9.1 page 215) implique :
Z t+h
y(t + h) = y(t) + f (s, y (s))ds. (12.6)
t

La difficulté est que la fonction y(s) est inconnue, ce qui implique que l’intégrande
f (s, y (s)) ne peut être évalué directement : il est donc impossible, en général, d’utiliser
une méthode de quadrature pour calculer l’intégrale.
Considérons le cas particulier où f (t, y) ne dépend que de t et appliquons l’équation
12.6 à la date tn . Cela implique :
Z tn+h
y(tn + h) = y(t n ) + f (s)ds.
tn

Par conséquent :
Z tn+1
yn+1 = y n + f (s)ds. (12.7)
tn

Dans l’équation précédente, puisque la fonction f ne dépend que de s et pas de y ,


on peut approcher l’intégrale par une méthode d’intégration numérique. Dans ce cas,
si yn est une bonne approximation de y(tn ), alors l’équation précédente fournit un
moyen constructif d’obtenir une bonne approximation de y(tn+1 ). Toutefois, dans le
cas général, la fonction f dépend explicitement de y, et c’est pourquoi nous devons
rechercher des méthodes appropriées.
Inversement, on peut toujours utiliser une méthode de résolution d’EDO pour
traiter un problème d’intégration. Compte tenu du haut degré de précision et de
robustesse des méthodes disponibles pour les EDO, cela peut être une alternative
intéressante pour traiter certains problèmes d’intégration difficiles.
Une des contraintes associées à beaucoup de méthodes numériques pour les EDO
est que le système doit la plupart du temps être présenté sous la forme d’une équation
ne présentant que des dérivées premières par rapport au temps. L’objectif de la section
suivante est de montrer qu’il est toujours possible de se ramener à cette situation.

12.2 Systèmes d’EDO


Dans cette section, nous présentons plusieurs exemples de systèmes d’équations
différentielles. Plus précisément, nous allons analyser l’oscillateur harmonique, une
équation différentielle impliquant des dérivées secondes en temps. Or les méthodes que
nous allons présenter nécessitent de considérer exclusivement des dérivées premières.
C’est la raison pour laquelle nous allons démontrer qu’il est toujours possible de
transformer une telle équation en un système d’EDO, associé à un vecteur d’inconnues
dépendant du temps. Cela permet ensuite de pouvoir utiliser les fonctionnalités du
module SciPy.
En pratique, la solution exacte y(t) est souvent un vecteur de taille m :
 
y1 (t)
 y2 (t) 
 
y(t) =  .  ∈ R m (12.8)
 . .
y m (t)
12.2 • Systèmes d’EDO 323

pour tout t ≥ t0 . C’est par exemple le cas lorsque nous observons l’évolution tempo-
relle de plusieurs variables interdépendantes, associées à des équations différentielles
couplées. Dans ce cas, on parle de système d’équations différentielles ordinaires. Pour
les méthodes que nous allons voir (dites méthodes explicites), résoudre plusieurs équa-
tions différentielles ordinaires en même temps ne pose, en fait, aucune difficulté parti-
culière. Dans ce chapitre, nous allons fréquemment utiliser la dérivée par rapport au
temps t. Dans le but de simplifier les expressions, nous utiliserons la notation de New-
ton. La dérivée première par rapport au temps t est indiquée par un point au-dessus
de la variable et la dérivée seconde par deux points :

dy(t) d2 y(t)
ẏ = et ÿ =
dt dt2
pour tout t ≥ t0 . Dans la définition suivante, nous introduisons la définition d’un
système d’équations différentielles ordinaires ainsi que la matrice jacobienne d’un
système d’EDO.
Définition 12.2 (Matrice jacobienne). Soit f : Rm → Rm une fonction. On considère
le système de m équations différentielles :

ẏ(t) = f (y(t)) (12.9)

où y(t) ∈ R m pour tout t ≥ t 0 avec y(t0 ) = y 0 où y0 ∈ R m est la condition initiale.


La matrice jacobienne de f est la matrice de taille m-par-m :
 ∂f ∂f 1

1
∂y1 . . . ∂y
 . .. 
m

J(y) =   . . . 

∂fm
∂y1 . . . ∂f m
∂y m

pour tout y ∈ Rm.


L’EDO implique parfois des dérivées d’ordre deux ou plus. En fait, on peut toujours
ramener le problème à un système d’ordre un. Il suffit pour cela d’introduire des
nouvelles inconnues, associées à des dérivées de l’inconnue initiale. C’est ce que nous
allons vérifier dans les exemples suivants.
Exemple 12.3 (Oscillateur harmonique). Considérons l’oscillateur harmonique, dont
la solution x satisfait l’équation différentielle ordinaire :

ẍ(t) = −x(t)

pour t ≥ 0. On considère les conditions initiales x(0) = 1 et ẋ(0) = 0. Supposons que


x(t) est la position d’un mobile à l’instant t. Dans ce cas, la vitesse du mobile est
ẋ(t). Soit y(t) ∈ R2 la fonction définie par :
   
y 1(t) x(t)
y(t) = =
y 2(t) ẋ(t)

pour t ≥ 0. Par conséquent, la condition initiale est :


 
1
y(0) = .
0
324 Chapitre 12 • EDO

Alors :
     
ẋ(t) ẋ(t) y 2(t)
ẏ(t) = = = .
ẍ(t) −x(t) −y 1(t)

Par conséquent, on a ẏ(t) = f (t, y(t)) avec :


 
y2
f (t, y) = (12.10)
−y1

pour tout t ≥ t0 . Ce nouveau problème n’implique que des dérivées d’ordre un.

Comme nous venons de le voir, il suffit d’introduire des inconnues supplémentaires


correspondant à des dérivées de y pour se ramener à un problème d’ordre 1. Ce
principe est généralisé dans l’exercice 12.1 pour une EDO d’ordre arbitraire.
Pour résoudre des équations différentielles avec la fonction odeint du module
[Link], il faut définir le second membre de l’EDO, c’est-à-dire la fonction
f. La séquence d’appel de f doit être la suivante :
1 ydot = f (y , t)

où ydot est une liste de taille m.

Exemple 12.4 (Oscillateur harmonique (suite)). Considérons à nouveau les données


de l’exemple 12.4 et résolvons le problème avec le module SciPy. La fonction harmosc
suivante 1 calcule le second membre de l’EDO associé à l’oscillateur harmonique, en
définissant dans le langage Python la fonction définie par l’équation 12.10. Dans la
fonction harmosc, la variable y est une liste de longueur 2 qui représente le vecteur
y(t), la variable t est un flottant qui représente le temps t et ydot est une liste de
longueur 2 qui représente le vecteur ẏ(t). Rappelons que, en Python, les indices d’une
liste commencent à l’indice zéro, de telle sorte que les composantes y1 et y2 du vecteur
y sont y[0] et y[1]. Ainsi, la première composante de f (t, y) est y 2, qui correspond à
la composante y[1] en Python. De même, la seconde composante de f (t, y) est −y1 ,
qui correspond à la composante -y[0] en Python.
1 def harmosc (y , t) :
2 ydot = [ y [1] , -y [0]]
3 return ydot

Le module [Link] fournit la fonction odeint qui permet de calculer la


solution approchée d’une EDO. Pour utiliser la fonction odeint, il faut inclure l’ar-
gument d’entrée t, même si la valeur n’est pas utilisée. Le script suivant utilise la
fonction odeint qui calcule la solution approchée par une méthode numérique. Nous
définissons d’abord l’état initial y0. Puis, nous choisissons une position initiale égale
à 1 et une vitesse initiale égale à 0. Nous utilisons ensuite la fonction linspace pour
définir les valeurs du temps pour lesquels nous souhaitons évaluer la solution appro-
chée, c’est-à-dire pour 100 valeurs du temps régulièrement réparties entre 0 et 2π.
Pour cette raison, nous appelons la fonction odeint qui renvoie y, un tableau à deux
dimensions contenant 100 lignes et 2 colonnes. Chaque ligne correspond à une valeur
du temps, tandis que chaque colonne correspond à une variable.
1Script Python : EDO/Scripts/Py3/[Link].
12.2 • Systèmes d’EDO 325

1 from scipy . int egrate import odeint


2 y0 = [1.0 , 0.0]
3 t = linspace (0.0 , 2.0* pi , 100)
4 y = odeint ( harmosc , y0 , t)

Il y a deux graphiques classiques lorsqu’on considère des EDO. Le premier gra-


phique est placé dans l’espace des phases, qui est un espace dont les coordonnées sont
les variables du problème. Dans l’espace des phases, la courbe associée à une condition
initiale donnée est appelée trajectoire. L’inconvénient principal de l’espace des phases
est qu’on ne peut plus le représenter par un graphique en deux dimensions lorsqu’il
y a plus de deux variables. Avec un problème associé à trois variables, on peut re-
présenter la trajectoire par un graphique en trois dimensions, mais cela nécessite de
choisir les angles de projection de manière appropriée, ce qui n’est pas toujours facile.
Pour résoudre ce problème, on représente une projection de l’espace des phases sur
un couple de variables particulières, et l’on répète si nécessaire l’opération pour tous
les couples possibles. C’est ce que nous ferons en particulier pour le modèle de Lorenz
à la fin de ce chapitre.
Le second type de graphique est la série temporelle, qui représente l’évolution de
chaque variable en fonction du temps. Dans cette représentation, on utilise un gra-
phique pour chaque variable. Les figures sont alignées verticalement et l’axe horizontal
du temps est commun à tous les graphiques. L’avantage de ce graphique est qu’on
peut le dessiner facilement même lorsqu’il y a de deux à cinq variables. Lorsqu’il y a
plus de variables, on peut, par exemple, rassembler plusieurs séries temporelles dans
le même graphique, avec une légende appropriée.
Exemple 12.5 (Oscillateur harmonique (suite)). Considérons à nouveau les données
de l’exemple 12.4 et observons le diagramme de phase et la série temporelle. Dans
le script suivant - qui est la suite du script commencé dans l’exemple 12.5 - nous
dessinons la seconde variable y2 (t) = x˙ (t) en fonction de la première y1 (t) = x(t), ce
qui produit la figure 12.1.
1 import pylab as pl
2 pl . plot ( y [: ,0] , y [: ,1] , " -o" )
La partie gauche de la figure 12.1 présente une trajectoire de l’oscillateur harmonique
dans l’espace des phases. Pour l’oscillateur harmonique, les coordonnées de l’espace
des phases sont la position x(t) et la vitesse ẋ(t). La fonction ode_plot du module
odes, développé pour ce cours, permet de dessiner la série temporelle associée au
problème.
1 from odes import od e_plot
2 ode_plot (t , y , " Osci llateu r har moniqu e " , " -" )
La partie droite de la figure 12.1 2 présente la série temporelle de l’oscillateur harmo-
nique.
Dans l’analyse d’un système d’équations différentielles, on peut s’intéresser aux
solutions constantes dans le temps, ce qui mène à la définition suivante.
Définition 12.3 (Point critique, solution stationnaire). Le point yc ∈ Rm est un
point critique si f (t, yc ) = 0 pour tout t ≥ t0 . Sous cette hypothèse, la solution
y(t) = yc est stationnaire c’est-à-dire que dy( t)
dt = 0 pour tout t ≥ t0 .
2Script Python : EDO/Scripts/Py3/[Link].
326 Chapitre 12 • EDO

y[0]
t = 5.0 0
1
−1
y[1] t = 0.0 1
0

y[1]
0
−1 −1
−2 0 2 0 2 4
y[0] Temps (s)

Figure 12.1 – Oscillateur harmonique. À gauche, une trajectoire dans l’espace des
phases. À droite, la solution en fonction du temps.

Dans certains contextes, on utilise plutôt le terme de point d’équilibre et de solution


d’équilibre. Nous reviendrons par la suite sur ces notions dans les exemples et dans
l’analyse théorique.

12.3 Méthodes à un pas


Dans cette section, nous présentons les méthodes les plus simples pour résoudre
une équation ou un système d’équations différentielles ordinaires. Plus précisément,
nous présentons les méthodes d’Euler, de Runge, de Heun et, les plus classiques, les
méthodes de Runge-Kutta. Nous étudierons dans la section 12.4 l’erreur commise par
ces méthodes. Une des limites des méthodes présentées dans cette section est qu’il
faut choisir un pas de différentiation h constant, ce qui peut être délicat si on a pas
de connaissance préalable. Une alternative consiste à spécifier une tolérance portant
sur l’erreur maximale que nous sommes prêts à accepter et à utiliser une méthode
adaptative dans laquelle le pas h varie au cours des itérations. Le pas de différentiation
est alors sélectionné automatiquement par l’algorithme grâce aux méthodes présentées
dans la section 12.5.

12.3.1 Introduction
Pour résoudre une équation différentielle ordinaire, une méthode consiste à utiliser
un développement de Taylor dans le but d’obtenir une solution approchée au voisinage
d’une date t donnée. Dans ce contexte, on suppose que le pas de discrétisation h > 0 est
donné et on utilise un développement de Taylor pour obtenir une solution approchée à
la date t+h. Puisque nous considérons un nombre fini de termes dans le développement
de Taylor, nous commettons une erreur que nous analyserons plus en détail dans la
section 12.4. Les méthodes de ce type se nomment méthodes à un pas. Pour prédire
la solution approchée à la date t + h, on peut également utiliser la solution aux deux
dates t et t − h. On obtient dans ce cas une méthode multi-pas, ce qui peut augmenter
la précision. Une méthode de ce type est présentée dans l’exercice 12.4.
Lorsque la solution approchée à la date t + h peut être déterminée directement
en fonction de la solution à la date t, on dit que la méthode est explicite. On peut
être tenté d’utiliser une méthode précise associée à un pas h relativement grand dans
12.3 • Méthodes à un pas 327

le but d’améliorer la performance. Malheureusement, les méthodes explicites ont un


domaine de stabilité limité et deviennent instables lorsque le pas h est trop grand.
Pour résoudre ce problème, on peut développer des méthodes implicites, mais nous
ne détaillons pas ce sujet dans ce cours.
Nous présentons dans cette section plusieurs méthodes explicites à un pas. Pour
chaque méthode, nous présenterons la méthode de quadrature associée, en consé-
quence du lien que nous avons vu dans la section 12.1. Dans le but de simplifier la
présentation, nous considérons une unique équation différentielle (c’est-à-dire m = 1)
car, d’une part, cela simplifie la présentation et, d’autre part, l’extension de ces mé-
thodes à un système de m équations ne pose en général pas de difficultés.

12.3.2 Méthode d’Euler


Dans cette section, nous présentons la plus simple des méthodes pour résoudre
une EDO : la méthode d’Euler. Nous montrons comment obtenir la méthode d’Euler
en utilisant un développement de Taylor local de la solution. Nous implémentons la
méthode en Python et observons son comportement dans l’exemple de l’oscillateur
harmonique ainsi que dans l’exemple associé à la fonction exponentielle.
Soit h > 0 le pas de discrétisation temporelle. La formule de Taylor appliquée à y
au point t à l’ordre 2 implique :

dy(t)
y(t + h) = y(t) + h + O(h) 2
dt
quand h → 0. L’équation 12.1 mène à l’égalité :

y(t + h) = y(t) + hf (t, y(t)) + O(h)2

quand h → 0. On applique cette formule au point t = t n et on obtient :

y(t n + h) = y(tn ) + hf (tn , y (t n )) + O(h)2

pour n ≥ 0. On néglige, de plus, le terme d’ordre 2, ce qui implique :

y(t n + h) ≈ y (t n) + hf (t n, y (tn ))

pour n ≥ 0. L’approximation 12.5 implique y(tn + h) ≈ y n + hf (t n, y n ) pour n ≥ 0,


ce qui mène à la méthode d’Euler.
Définition 12.4 (Méthode d’Euler (1768)). Soit y0 = y (t0 ) ∈ R le terme initial. La
méthode d’Euler pour résoudre le problème de Cauchy est :

yn+1 = y n + hf (t n, y n )
tn+1 = tn + h

pour n ≥ 0.
La partie gauche de la figure 12.23 présente le principe de la méthode d’Euler. À
la date tn , on considère la condition initiale yn . La solution exacte y (t) est représentée
avec un trait continu. La méthode d’Euler utilise la valeur s1 = f (t n , yn) en tant que
3Script Python : EDO/Scripts/Py3/[Link].
328 Chapitre 12 • EDO

Euler

y'(t)
y n+1 y' n+1 f(t,y(t))
s1 y' n
yn
tn t n+1
tn t n+1 t

Figure 12.2 – À gauche, la méthode d’Euler dans le plan (t, y(t)). À droite, la
méthode d’Euler dans le plan (t, y0 (t)) interprétée comme méthode du rectangle en
intégration.

pente de la solution et considère une approximation linéaire entre tn et t n+1 . C’est


pourquoi la solution approchée à l’instant tn+1 est y n+1 = y n + hs1 . La partie droite
de la figure 12.2 interprète la méthode d’Euler comme une méthode d’intégration
appliquée à la fonction f (t, y(t)) avec la formule du rectangle. Cette méthode est
exacte si f (t, y(t)) est constante en fonction du temps et inexacte si f (t, y (t)) est
linéaire. L’ordre d’approximation local est h.
Le script Python suivant4 implémente la méthode d’Euler. On initialise d’abord
la date t et la condition initiale y0. Puis, on utilise une boucle while qui s’exécute
tant que la date courante t est plus petite que la date finale tfinal.
1 t = t0
2 y = y0
3 while t <= tfinal :
4 y = y + h * f(y , t )
5 t = t + h

L’algorithme précédent fonctionne aussi si y0 est un tableau et f retourne un tableau,


à condition que les opérations arithmétiques Python correspondantes soient définies
pour ce type de variables (c’est-à-dire soient vectorisées). C’est vrai en particulier si
la variable y est un array NumPy. Le problème de l’algorithme précédent est que le
pas de temps h ne correspond peut-être pas exactement à la date tfinal fixée par
l’utilisateur. Pour obtenir la solution approchée à la date tfinal, nous modifions
l’algorithme de telle sorte que le pas associé à la dernière itération soit raccourci si
nécessaire.
1 t = t0
2 y = y0
3 while t < tfinal :
4 h = min (h , tfinal - t ) # Change le dernier pas
5 y = y + h * f(y , t )
6 t = t + h

Dans l’exemple suivant, nous utilisons la méthode d’Euler pour résoudre l’équation
différentielle de l’oscillateur harmonique.

Exemple 12.6 (Utilisation de la méthode d’Euler pour l’oscillateur harmonique).


4Script Python : EDO/Scripts/Py3/[Link].
12.3 • Méthodes à un pas 329

Diagramme de phase
1 Euler

y[1]
0 Exact
−1
−2.5 0.0 2.5
y[0]

Figure 12.3 – Oscillateur harmonique : comparaison de la méthode d’Euler (avec


h = 0.1) et de la solution exacte.

Nous avons développé pour ce cours le module simplifié odes5 qui fournit la fonc-
tion euler. Dans le script suivant 6, on calcule une approximation de la solution de
l’EDO associée à l’oscillateur harmonique vu dans l’exemple 12.3 pour t dans l’inter-
valle [0, 2π]. On utilise un pas de temps égal à 0.1 et on définit la condition initiale
correspondant à une position initiale égale à 1 et une vitesse initiale nulle. Enfin, on
appelle la fonction euler, qui renvoie la liste t contenant les dates intermédiaires
(0, h, 2h, ..., 2π) ainsi que la liste y contenant les valeurs correspondantes de la solu-
tion.
1 from odes import euler
2 tspan = [0.0 , 2.0 * pi ]
3 h = 0.1
4 y0 = [1.0 , 0.0]
5 t , y = euler ( harmosc , tspan , y0 , h )

Dans la figure 12.3, on considère l’équation différentielle ordinaire associée à l’os-


cillateur harmonique, et on compare la solution exacte et la méthode d’Euler avec
h = 1. On observe que les erreurs s’accumulent en fonction du temps, de telle sorte
qu’au bout d’une période, le point d’arrivée de la solution approchée est relativement
éloigné du point de départ (alors que les deux points sont égaux dans le cas de la
solution exacte).

Dans l’exemple suivant, nous utilisons la méthode d’Euler pour résoudre l’équation
différentielle ordinaire associée à la fonction exponentielle.

Exemple 12.7 (Utilisation de la méthode d’Euler pour la fonction exponentielle).


On considère l’équation différentielle ordinaire :

dy(t)
= y(t)
dt
pour t ∈ [0, 4] avec la condition initiale y(0) = 1. La solution exacte est la fonction
y(t) = exp(t) pour t ∈ [0, 4]. Dans le script suivant7, nous utilisons la méthode
d’Euler pour calculer la solution approchée avec le pas de discrétisation h = 1. Nous
5Script Python : Scripts-Eleves/Py3/[Link].
6Script Python : EDO/Scripts/Py3/[Link].
7Script Python : EDO/Scripts/Py3/[Link].
330 Chapitre 12 • EDO

ODE linéaire
Euler
40 RK2

y
RK4
20
Exact

0
0 1 2 3 4
t

Figure 12.4 – Différentes méthodes numériques pour l’équation différentielle ordi-


naire dy/dt = y avec la condition initiale y0 = 1.

définissons la fonction linearf qui évalue le membre de droite, puis nous utilisons la
fonction euler pour évaluer la solution approchée par la méthode d’Euler.
1 from odes import euler
2

3 def linearf (y , t) :
4 ydot = y
5 return ydot
6

7 tspan = [0.0 , 4.0]


8 y0 = 1.0
9 h = 1.0
10 tout , yout = euler ( linearf , tspan , y0 , h)

La figure 12.4 présente le résultat associé, en le comparant au résultat issu des mé-
thodes de Runge-Kutta d’ordre 2 et d’ordre 4 (que nous verrons plus en détails dans
les sections 12.3.3 et 12.3.4). On observe qu’il y a un décalage entre la solution exacte
et la solution approchée, et que ce décalage augmente en fonction du temps. On ob-
serve que la méthode d’Euler est la moins précise, que la méthode de Runge-Kutta
d’ordre 2 est plus précise que la méthode d’Euler et que la méthode de Runge-Kutta
d’ordre 4 est la plus précise des trois. La raison de ces différences de précision se
clarifiera par la suite, lorsque nous analyserons la précision de ces méthodes.
Un des inconvénients de la méthode d’Euler est la faiblesse de sa précision. De
plus, la méthode d’Euler ne fournit pas d’estimation de l’erreur, et c’est l’une des
raisons pour lesquelles nous allons analyser d’autres méthodes.

12.3.3 Méthode de Runge, méthode de Heun


On peut obtenir des méthodes numériques plus précises en conservant davantage
de termes dans le développement de Taylor. Dans ce but, au lieu d’évaluer la fonction f
une fois par itération, on l’évalue deux fois, trois fois, ou plus. Dans les deux méthodes
qui vont suivre, deux évaluations sont utilisées pour chaque itération. Nous commen-
çons par définir la méthode de Runge, également nommée méthode de Runge-Kutta
d’ordre 2.
12.3 • Méthodes à un pas 331

Runge

y n+1
s1 s1 s2
yn yn
h
tn t n+1 tn tn + 2 tn+1

Figure 12.5 – La méthode de Runge ou RK2, analogue à la méthode du point milieu


en intégration.

Définition 12.5 (Méthode de Runge ou RK2 (1895)). Soit y0 = y (t 0) ∈ R le terme


initial. La méthode de Runge pour résoudre le problème de Cauchy est :
s1 = f (tn , yn) (12.11)
 
h h
s2 = f t n + , yn + s1 (12.12)
2 2
yn+1 = yn + hs 2 (12.13)
pour n ≥ 0.
La méthode de Runge est analogue à la méthode du point milieu en intégration.
Cette méthode est présentée dans la figure 12.58 . La méthode de Runge évalue la
pente s1 de la solution à la date tn . Puis, elle utilise la pente s1 pour construire une
approximation linéaire de la solution entre les dates tn et tn + h/2, c’est-à-dire au
milieu de l’intervalle [tn, tn+1 ]. Ensuite, la pente s 2 est évaluée à la date tn + h/2.
Cette pente s2 est ensuite utilisée pour construire une approximation linéaire entre
les dates tn et tn + h. On observe que cette méthode est beaucoup plus précise que
la méthode d’Euler : la solution approchée est beaucoup plus proche de la solution
exacte.
La définition suivante présente la méthode de Heun.
Définition 12.6 (Méthode de Heun). Soit y0 = y(t0) ∈ R le terme initial. La méthode
de Heun pour résoudre le problème de Cauchy est :
s1 = f (tn , yn ) (12.14)
s2 = f (tn + h, yn + hs1) (12.15)
s1 + s2
yn+1 = y n + h (12.16)
2
pour n ≥ 0.
La méthode de Heun est analogue à la méthode du trapèze en intégration. Cette
méthode est présentée dans la figure 12.69 . Dans la méthode de Heun, la seconde
pente s 2 est évaluée à la date t n + h. Puis une approximation linéaire entre tn et
tn + h est construite en utilisant la moyenne des pentes (s1 + s2 )/2. On observe que
la méthode de Heun possède une précision comparable à la méthode de Runge.
8Script Python : EDO/Scripts/Py3/[Link].
9Script Python : EDO/Scripts/Py3/[Link].
332 Chapitre 12 • EDO

Heun

y n+1
s2
yn s1 yn s1

tn tn+1 tn tn+1

Figure 12.6 – La méthode de Heun, analogue à la méthode du trapèze en intégration.

Il est très facile d’étendre le script que nous avons déjà vu pour la méthode d’Euler
aux deux méthodes précédentes. Le script suivant présente par exemple l’utilisation
de la méthode de Heun pour la mise à jour de l’état.
1 t = t0
2 y = y0
3 while t < tfinal :
4 h = min (h , tfinal - t )
5 s1 = f (y , t)
6 s2 = f (y + h * s1 , t + h)
7 y = y + 0.5 * h * ( s1 + s2 )
8 t = t + h
Dans l’exemple suivant, nous observons le comportement de la méthode de Runge-
Kutta d’ordre 2 dans l’exemple associé à la fonction exponentielle.
Exemple 12.8 (Utilisation de la méthode de Runge d’ordre 2). Considérons les
données de l’exemple 12.7. Dans le script suivant10, nous avons utilisé la fonction
explicit_method, développée pour ce cours11 . Le premier argument de cette fonction
est une chaîne de caractère qui permet de spécifier le nom de la méthode numérique
que l’on désire utiliser. Nous avons utilisé l’argument "rk2" pour spécifier que nous
souhaitons utiliser la méthode de Runge-Kutta d’ordre 2.
1 from odes import euler , exp lici t_m etho d
2 tout , yout = expl ici t_me thod ( " rk2 " , linearf , tspan , y0 , h , a )
La figure 12.4 montre que la méthode d’Euler est peu précise et que la méthode de
Runge d’ordre 2 est significativement plus précise. Remarquons toutefois que cette
amélioration de la précision a nécessité deux fois plus d’évaluations de la fonction f .

12.3.4 Les méthodes de Runge-Kutta


Dans le but d’obtenir des méthodes très précises, Runge et Kutta ont développé
des méthodes dont la précision dépend principalement du nombre d’évaluations de
la fonction f , mais également des coefficients choisis pour pondérer les pentes. Dans
cette section, nous allons analyser une méthode de Runge-Kutta classique qui utilise
quatre pentes s1 , s2 , s3 et s4 . En généralisant le procédé, nous présenterons ensuite
les méthodes de Runge-Kutta à k pentes.
10Script Python : EDO/Scripts/Py3/[Link].
11Script Python : Scripts-Eleves/Py3/[Link].
12.3 • Méthodes à un pas 333

RK4

s1 s1 s2
yn yn
h
tn tn+1 tn tn + 2

s4
yn+1
s1 s3
yn yn
tn tn + h2 tn t n+1

Figure 12.7 – La méthode de Runge-Kutta d’ordre 4.

Nous commençons par introduire la plus classique d’entre elles, c’est-à-dire la


méthode de Runge-Kutta d’ordre 4.
Définition 12.7 (Runge-Kutta classique (RK4)). Soit y0 = y(t 0) ∈ R le terme initial.
La méthode Runge-Kutta d’ordre 4 pour la résolution du problème de Cauchy est :
 
s1 = f (tn , y n),  s 2 = f t n + h
2 , yn + h
2 s1
s3 = f t n + h2, yn + h2 s 2 , s4 = f (tn + h, yn + hs 3 )
et :
h
y n+1 = yn + (s1 + 2s2 + 2s3 + s4 )
6
tn+1 = tn + h
pour n ≥ 0.
Dans le cas particulier où f (t, y) = f (t), alors s2 = s3 , et la méthode est équiva-
lente à la formule de quadrature de Simpson en intégration. La figure 12.712 présente
la méthode de Runge-Kutta d’ordre 4. On observe que la méthode évalue deux pentes
différentes s2 et s 3 au même point t n + h2 , avant d’évaluer la pente s4 au point t n + h.
On peut généraliser la méthode de Runge et Kutta d’ordre 4 pour obtenir des
méthodes encore plus précises. Une méthode de Runge-Kutta à k étages est définie
par les paramètres αi , β ij , γi et δi pour i = 1, ..., k et j = 1, ..., i − 1. La pente s i est
calculée en fonction des pentes précédentes :
 
i−1
X
si = f tn + hα i, y n + h β ijs j  (12.17)
j=1

où i = 1, . . . , k. Le nouvel itéré est une combinaison linéaire des pentes :


k
X
yn+1 = y n + h γi si . (12.18)
i=1

12 Script Python : EDO/Scripts/Py3/[Link].


334 Chapitre 12 • EDO

Les coefficients αi peuvent se déduire des coefficients βij par l’équation :


i−1
X
αi = βij (12.19)
j=1

pour i = 1, ..., k . De plus, les coefficients γi doivent satisfaire l’équation :

γ 1 + ... + γk = 1. (12.20)

On peut présenter les méthodes de Runge-Kutta sous la forme du tableau de


Butcher suivant dû à John C. Butcher, un mathématicien néo-zélandais.

α1 β11 ··· β1k


.. .. ..
. . .
αk βk1 ··· βkk
γ1 ··· γk

Lorsqu’on considère, comme nous l’avons fait, une méthode de Runge-Kutta explicite,
le tableau se simplifie, puisque seuls les termes βij sous la diagonale sont non nuls.
Seuls ces termes sont alors indiqués dans la table.

0
α2 β 21
.. .. ..
. . .
αk β k1 ··· βkk−1
γ1 ··· γk−1 γk

L’équation 12.19 implique que, dans la partie en haut à droite, la somme des
termes sur chaque ligne est égale à la colonne de gauche. L’équation 12.20 implique
que la somme des termes sur la dernière ligne est égale à 1. Par exemple, le tableau
de Butcher pour la méthode de Runge est :

0
1 1
2 2
0 1

Pour calculer les paramètres d’une méthode de Runge-Kutta généralisée, on annule


les termes du développement en série de Taylor des pentes s. Dans les exercices 12.9 et
12.10, nous proposons de calculer la précision des méthodes de Runge-Kutta d’ordre
2 et 3.
Dans la table 12.1, nous présentons les liens entre les méthodes de résolution des
EDO et les méthodes d’intégration numérique.

12.4 Erreurs
Dans cette section, nous analysons l’erreur associée aux méthodes numériques
pour la résolution d’une EDO. Nous introduisons les erreurs de discrétisation locales
et globales et nous définissons l’ordre de précision d’une méthode.
12.4 • Erreurs 335

ODE Analogue en intégration


Euler Rectangle
Runge Point milieu
Heun Trapèze
RK4 Simpson

Table 12.1 – Lien entre les méthodes pour les EDO et les méthodes d’intégration
numérique.

Sol. approchée
yn+1
dn+1 u(t)
u(tn+1 )
yn Sol. exacte

tn t n+1 t

Figure 12.8 – Analyse de l’erreur locale d’une méthode de résolution d’une EDO.

L’erreur de discrétisation est la conséquence de l’utilisation d’une méthode nu-


mérique pour calculer une solution approchée de l’EDO. Elle est liée au choix du
paramètre h > 0. Si l’on stockait les nombres avec une précision infinie, seule l’er-
reur de discrétisation existerait. Quand nous stockons les valeurs numériques dans des
nombres à virgule flottante, un second type d’erreurs s’ajoute aux erreurs de discré-
tisation c’est-à-dire les erreurs d’arrondis. Lorsqu’on considère un horizon temporel
très grand relativement au pas de discrétisation ou si l’on souhaite garantir une très
grande précision, alors les erreurs d’arrondi peuvent dominer. Nous analysons ce sujet
dans l’exercice 12.8. On peut toutefois affirmer que c’est une situation assez peu com-
mune. En général, l’erreur de discrétisation domine largement les erreurs d’arrondis
et c’est pourquoi cette section se concentre sur ce sujet.
L’erreur de discrétisation locale est celle qui est associée à une seule itération.
Définition 12.8 (Erreur de discrétisation locale). Soient tn ≥ t 0 un réel, h > 0 un
réel et tn+1 = tn + h. Soit y n ∈ R. Soit u(t) la solution de l’équation différentielle
ordinaire :

u̇(t) = f (t, u(t)), t ∈ [tn, t n + h], (12.21)


u(tn ) = y n . (12.22)

Soit yn+1 l’approximation de u(tn+1 ) par la méthode numérique. L’erreur (absolue)


de discrétisation locale de la méthode numérique est :

dn+1 = |y n+1 − u(tn+1)|

pour n ≥ 0.
Le point important est que la solution u(t), définie sur l’intervalle [tn , tn + h], est
associée à la condition initiale u(tn ) = yn. Cette solution u(t) est donc différente de la
336 Chapitre 12 • EDO

solution y(t) du problème de Cauchy donné dans la définition 12.1, puisque y, définie
pour tout t ≥ t0 , est associée à la condition initiale y(t0 ) = y 0. La figure 12.8 présente
l’erreur locale d’une méthode de résolution d’une EDO. La solution exacte, notée u(t)
est associée à la condition initiale yn à la date tn . La solution exacte vaut u(t n+1)
à la date tn+1. La solution approchée, calculée par la méthode numérique est y n+1
à la date tn+1. À la date t n+1 , la différence entre la solution exacte et la solution
approchée est l’erreur locale, notée dn+1 .
L’erreur de discrétisation globale est la différence entre la solution théorique et la
solution approchée après n itérations.

Définition 12.9 (Erreur de discrétisation globale). Soient t0 un réel et y0 ∈ R. Soit


y(t) la solution de l’équation différentielle ordinaire :

ẏ(t) = f (t, y(t)), t ≥ t0,


y(t0 ) = y 0.

Soit h > 0 le pas de discrétisation. On considère la suite ti+1 = ti + h, pour i =


0, 1, 2, ..., n − 1. Soit yn l’approximation de y(t n ) par la méthode numérique. L’erreur
(absolue) de discrétisation globale de la méthode numérique est :

en = |yn − y(t n)|

pour n ≥ 0.

Dans l’exemple suivant, nous analysons le lien entre l’erreur globale et l’erreur
locale dans un cas particulier.

Exemple 12.9 (Lien entre l’erreur globale et l’erreur locale pour la méthode d’Euler).
Supposons que f ne dépend pas de y . En d’autres termes, supposons que f (t, y ) = f (t)
pour tout t ≥ t0 . Alors la solution est :
Z t
y(t) = y 0 + f (s)ds.
t0

Avec la méthode d’Euler, l’erreur globale après n itérations est :


n−1
X
en ≤ di+1 .
i=0

La preuve est donnée dans l’exercice 12.7.

La définition suivante introduit l’ordre de précision d’une méthode pour la réso-


lution d’une EDO.

Définition 12.10 (Ordre de précision d’une méthode). L’ordre de précision d’une


méthode numérique pour la résolution du problème de Cauchy est p si l’erreur de
discrétisation locale est telle que :

dn+1 = O(h p+1)

quand h → 0 pour n 6= 0.
12.5 • Méthodes adaptatives (*) 337

Méthode Ordre p
Euler 1
Runge (RK2) 2
Heun 2
Bogacki-Shampine (BS23) 3
Runge-Kutta (RK4) 4

Table 12.2 – Ordre de précision p de différentes méthodes pour résoudre les équations
différentielles ordinaires.

En d’autres termes, au bout d’une itération menant de tn à tn +h, la solution exacte


u(tn+1 ) est la somme de la solution approchée calculée par la méthode numérique y n+1
et d’un terme d’erreur d’ordre p+1 :

u(tn+1 ) = y n+1 + O(h p+1)

quand h → 0. Sous cette hypothèse, une analyse simplifiée de l’erreur globale est
donnée dans l’exercice 12.8.
La table 12.2 présente plusieurs méthodes numériques pour calculer la solution
approchée du problème de Cauchy, ainsi que l’ordre de chaque méthode. Le calcul de
l’ordre de ces méthodes est présenté dans les exercices 12.3, 12.9 et 12.10.
Une des difficultés des méthodes précédentes est qu’il faut définir le pas h > 0 à
l’avance. Si h est petit, alors la méthode est plus précise, mais plus coûteuse. Récipro-
quement, si h est grand la méthode est plus rapide, mais moins précise. Un compromis
peut être trouvé, mais il faut pour cela être capable d’estimer l’erreur, ce que les mé-
thodes que nous avons présentées ne permettent pas. Une solution peut être apportée
par les méthodes adaptatives présentées dans la section suivante.

12.5 Méthodes adaptatives (*)


Dans cette section, nous allons voir comment ajuster le pas de discrétisation h dans
le but de satisfaire un critère de précision fixé par l’utilisateur. Plus précisément, nous
allons voir comment déterminer dynamiquement le pas h pour contrôler l’erreur de
discrétisation.

12.5.1 Principe d’une méthode adaptative


Lorsqu’on utilise une des méthodes présentées jusqu’ici, on peut se demander
comment choisir le pas de discrétisation h. Supposons que l’utilisateur fournisse une
tolérance absolue abs > 0. Une idée naturelle consiste à ajuster le pas de discrétisation
en fonction de l’erreur : si l’erreur est inférieure à abs , on peut augmenter le pas h,
sinon, il faut diminuer h.
De plus, au lieu de considérer un pas de discrétisation constant, on peut utiliser
un pas de discrétisation variable, qui se contracte lorsque la précision n’est pas suf-
fisante et qui sinon s’agrandit. Dans ce contexte, le pas de discrétisation dépend de
l’itération n et on a tn+1 = tn + hn pour n ≥ 0 où hn est le pas de discrétisation
à l’itération n. Cette démarche est semblable à la quadrature adaptative que nous
338 Chapitre 12 • EDO

avons vue dans la section 11.7. Cette stratégie mène alors à deux questions. La pre-
mière est de savoir comment calculer l’erreur. La seconde consiste à déterminer le pas
permettant d’atteindre l’erreur imposée.
Comme il est difficile d’estimer l’erreur globale au terme des n itérations, nous
allons étudier un algorithme qui estime l’erreur locale au terme d’une itération seule-
ment. Pour estimer l’erreur de discrétisation locale, nous allons voir comment combi-
ner deux méthodes numériques dont la première permet de calculer une solution ap-
prochée et la seconde permet d’estimer l’erreur sur cette solution. L’analyse montre
que, pour que l’estimation de l’erreur soit précise, les deux méthodes doivent être
d’ordres de précision différents. Souvent, on choisit une première méthode d’ordre p
et une seconde méthode d’ordre p + 1. On parle alors d’une paire. La construction de
l’estimation de l’erreur repose sur le théorème suivant.
Théorème 12.1 (Estimation de l’erreur par une paire de méthodes). Considérons
le problème de Cauchy de la définition 12.1. Soit {yn } n≥0 une méthode numérique
d’ordre p et soit {zn }n≥0 une méthode numérique d’ordre p + 1. Soit dn+1 l’erreur
de discrétisation locale associée à la méthode {y n}n≥0 au sens de la définition 12.8.
Alors :
d n+1 ≤ |zn+1 − yn+1 | + O(h p+2 ) (12.23)
pour n ≥ 0.
L’équation 12.23 implique :
d n+1 ≈ |z n+1 − yn+1| (12.24)
pour n ≥ 0.
Démonstration. Soit n ≥ 0. Soit u la solution de l’équation différentielle locale 12.21-
12.22. Puisque la méthode {yn}n≥0 est d’ordre p, il existe M n tel que :
yn+1 = u(tn+1 ) + M n+1h p+1 + O(h p+2) (12.25)
fn
quand h → 0. De même, puisque la méthode {zn }n≥0 est d’ordre p + 1, il existe M
tel que :
fn+1 h p+2 + O(h p+3)
zn+1 = u(tn+1 ) + M (12.26)
quand h → 0. Les équations 12.25 et 12.26 impliquent :
y n+1 − zn+1
 
= u(tn+1 ) + M n+1hp+1 + O(h p+2 )
 
− u(tn+1) + Mfn+1 hp+2 + O(h p+3 )

= M n+1 hp+1 + O(hp+2 )


quand h → 0. Cela implique Mn+1 hp+1 = yn+1 − zn+1 + O(h p+2 ) quand h → 0. On
substitue l’équation précédente dans l’équation 12.25 et on obtient :
y n+1 = u(tn+1 ) + yn+1 − zn+1 + O(h p+2) + O(hp+2 )
= u(tn+1 ) + yn+1 − zn+1 + O(h p+2)
 
quand h → 0. Par conséquent dn+1 = |yn+1 − u(tn+1)| = yn+1 − zn+1 + O(hp+2 ) ce
qui mène à l’équation 12.23.
12.5 • Méthodes adaptatives (*) 339

Une manière d’obtenir une méthode plus précise consiste à utiliser l’extrapolation
de Richardson, comme nous l’avons vu dans la section 9.6. L’inconvénient de cette
méthode est qu’elle nécessite beaucoup plus d’évaluations de la fonction f . Une alter-
native consiste à utiliser deux méthodes de Runge-Kutta d’ordres différents, comme
les méthodes de Runge-Kutta d’ordre 4 et 5 utilisées dans la méthode adaptative de
Runge-Kutta-Fehlberg. Dans la méthode que nous allons étudier, les deux méthodes
utilisées sont des méthodes de Runge-Kutta d’ordre 2 et 3, pour des raisons que nous
allons étudier ci-dessous. La stratégie est alors la suivante. Si l’erreur locale dn+1 est
inférieure à abs, l’étape est réussie et yn+1 est accepté. Sinon, l’étape est un échec et
yn+1 est refusé. De plus, l’erreur d n+1 est utilisée pour calculer hn+1. On peut utiliser
la méthode d’ordre faible (par exemple d’ordre 2) pour estimer yn+1 et la combinai-
son des deux méthodes (par exemple d’ordre 2 et 3) pour estimer l’erreur dn+1. Dans
la méthode de Bogacki-Shampine que nous allons voir, on utilise la méthode d’ordre
élevé (c’est-à-dire 3) pour estimer yn+1 . Dans ce cas, on dit que l’on est en mode
d’extrapolation locale.
Une difficulté est que la précision et la performance sont, comme souvent, en op-
position. La performance peut se mesurer en fonction du nombre d’évaluations de la
fonction f durant l’intégralité de la simulation. Cela dépend, d’une part, du nombre
d’évaluations de la fonction f à chaque itération et, d’autre part, du nombre d’ité-
rations. D’un côté, une méthode peu précise nécessite moins d’évaluations de f à
chaque itération, mais peut nécessiter un pas hn plus petit pour limiter l’erreur ce
qui augmente le nombre d’itérations. À l’opposé, une méthode précise peut permettre
d’utiliser des grands pas de discrétisation hn ce qui peut diminuer le nombre d’itéra-
tions, mais au prix d’un plus grand nombre d’évaluations de la fonction f à chaque
itération. Il n’est pas évident de savoir quels paramètres permettent de diminuer le
nombre d’évaluations de la fonction f à la fin de la simulation, car cela dépend de
beaucoup de paramètres. Dans ce contexte, un avantage de la méthode de Bogacki
et Shampine est qu’elle permet de réutiliser une évaluation de la fonction f pour
l’itération suivante, comme nous allons le voir.

12.5.2 Méthodes de Runge-Kutta d’ordre 2 et 3


Décrivons maintenant plus en détail les deux méthodes de Runge-Kutta utilisées
dans la méthode de Bogacki-Shampine.
Définition 12.11 (Méthode de Bogacki-Shampine). La méthode de Bogacki-Sham-
pine pour la résolution du problème de Cauchy est :
 
s1 = f (tn , y n )  s2 = f t n + h
2 , yn + h
2 s 1
s3 = f t n + 3h 4 , yn + 4 s2
3h

puis :
tn+1 = tn + h, yn+1 = y n + h9 (2s1 + 3s2 + 4s3 )
h
s4 = f (tn+1 , y n+1 ), dn+1 = 72 (−5s1 + 6s 2 + 8s 3 − 9s 4)
pour n ≥ 0.
La méthode permet de réutiliser s4 à l’itération n+1 : la pente s4 est évaluée d’une
part pour évaluer l’erreur et, d’autre part, pour évaluer s1 à la prochaine itération.
Ainsi, à partir de la première itération, la fonction f est évaluée seulement trois fois
par itération. Ce principe se nomme « premier identique au dernier » (ou first same
340 Chapitre 12 • EDO

BS23

s1 s1 s2
yn yn
h
tn tn+1 tn tn + 2

s4
yn+1
s1 s3
yn yn
3h
tn tn + 4 tn t n+1

Figure 12.9 – La méthode de Bogacki-Shampine.

as last ou encore FSAL dans la littérature anglophone). La figure 12.913 présente le


principe de la méthode de Bogacki-Shampine.
Analysons plus en détail le principe de la méthode. Dans la méthode de Bogacki-
Shampine, l’approximation y n+1 est d’ordre 3 et correspond à la méthode Ralston
[116]. Par ailleurs, on peut démontrer que :

7 1 1 1
zn+1 = yn + hs1 + hs 2 + hs3 + hs 4
24 4 3 8
est une approximation d’ordre 2. C’est pourquoi la différence dn+1 = yn+1 − z n+1
est utilisé pour mesurer l’erreur. En d’autres termes, la méthode combine deux ap-
proximations, dont la première utilise une méthode d’ordre 3 pour prédire l’état et la
seconde utilise une méthode d’ordre 2 pour prédire l’erreur. Cela explique pourquoi
cette méthode est nommée BS23 dans [104].

12.5.3 Contrôle du pas de discrétisation


Dans cette section, nous allons voir comment contrôler le pas de discrétisation dans
une méthode adaptative. Considérons une méthode permettant de déterminer l’erreur
de discrétisation locale (absolue) d n+1 au sens de la définition 12.8 et supposons que
cette méthode est d’ordre p. Alors, il existe un nombre réel Mn tel que l’erreur de
discrétisation locale est :

d n+1 = Mn hp+1
n + O(hp+2 ) (12.27)

quand h n → 0. Le réel Mn dépend de la date tn, de l’état y n , de la fonction f et de


la méthode numérique. En exploitant l’égalité précédente et en négligeant le terme
d’ordre hp+2 on peut déterminer le pas optimal ce qui mène au théorème suivant.

13Script Python : EDO/Scripts/Py3/[Link].


12.5 • Méthodes adaptatives (*) 341

Théorème 12.2 (Pas optimal pour une méthode d’ordre p). Soit abs > 0 la tolérance
absolue fournie par l’utilisateur. Supposons que, à l’itération n, la méthode produit une
erreur de discrétisation locale telle que :

d n+1 = Mn hnp+1 (12.28)

où p est l’ordre de la méthode et hn le pas de discrétisation utilisé pour produire


l’erreur dn+1 . Alors le pas de discrétisation h∗ permettant d’obtenir une erreur locale
(absolue) égale à  abs est :
  p+1
1
abs
h∗ = hn . (12.29)
dn+1

Le théorème précédent est démontré dans l’exercice 12.16. Si le pas de discrétisa-


tion à l’itération n est suffisamment petit, le premier terme domine le second dans
l’équation 12.27 et l’équation 12.28 est approximativement vérifiée. Observons que
cette hypothèse est plus facile à obtenir lorsque la méthode est d’ordre de précision
faible. C’est un des arguments utilisés par Bogacki et Shampine pour justifier d’utili-
ser deux méthodes d’ordre faible, ce qui permet de favoriser une bonne estimation de
l’erreur.
Dans une méthode adaptative, lorsque l’erreur d n+1 est supérieure à la tolérance
 abs, on rejette yn+1 et on met à jour le pas de discrétisation grâce à l’équation 12.29.
Dans la méthode de Bogacki-Shampine, l’erreur est déterminée avec une méthode
d’ordre p = 2, ce qui mène à l’équation :

h∗ = hnf ∗
  13
abs
où f∗ = dn+1est le facteur de correction du pas. Deux précautions peuvent
être employées pour éviter de réduire ou d’augmenter excessivement le pas. Si hn
augmente trop rapidement, il peut arriver que la méthode rejette une nouvelle fois
le pas si l’erreur de discrétisation est supérieure à la tolérance. À l’opposé, si hn ne
diminue pas assez rapidement, il peut arriver que la correction ne soit pas suffisante.
C’est pourquoi le facteur modifié fc = min(α 1 , α2 f ∗) peut être utilisé avec α1 > 1
et 0 < α2 < 1. En pratique, on peut utiliser par exemple α1 = 4 pour éviter une
augmentation trop rapide et α2 = 0.8 pour éviter une réduction insuffisante.
L’algorithme suivant, extrait de la fonction bogacki_shampine14, implémente l’al-
gorithme en Python. Pour initialiser l’algorithme, on utilise un pas de discrétisation
local dont la longueur est égale à un dixième de la longueur de l’intervalle [t0 , tf ].
Lorsque l’on considère un système d’équations différentielles, la méthode de Bogacki-
Shampine retourne un vecteur d’erreurs. Dans ce contexte, on utilise la fonction
[Link] qui permet de calculer la norme infinie du vecteur d’erreur.
1 import numpy as np
2 # Ini tial isat ion
3 t = t0
4 y = y0
5 tout = [ t0 ]
6 yout = y0
14 Script Python : Scripts-Eleves/Py3/[Link].
342 Chapitre 12 • EDO

7 s1 = f (y , t , * args )
8 h = 0.1 * ( tfinal - t0 )
9

10 # Boucle princi pale


11 while t < tfinal :
12 h = min (h , tfinal - t )
13

14 # Tente un pas .
15 s2 = f (y + h / 2 * s1 , t + h / 2, * args )
16 s3 = f (y + 3 * h / 4 * s2 , t + 3 * h / 4, * args )
17 tnew = t + h
18 ynew = y + h * (2 * s1 + 3 * s2 + 4 * s3 ) / 9
19 s4 = f ( ynew , tnew , * args )
20

21 # Estime l ’ erreur .
22 e = h * ( -5 * s1 + 6 * s2 \
23 + 8 * s3 - 9 * s4 ) / 72
24 err = np . linalg . norm (e , np . inf )
25

26 # Acc epte le pas si pos sible .


27 if err <= atol :
28 t = tnew
29 y = ynew
30 tout . append ( t)
31 yout = np . vstack ([ yout , y ])
32 # Pour le prochain pas .
33 s1 = s4
34

35 # Cor rige le pas .


36 cand idate_ f = ( atol / err ) ** (1.0 / 3.0)
37 modif ied_f = min (4.0 , 0.8 * ca ndida te_f )
38 h = modifie d_f * h
En pratique, cet algorithme peut générer une séquence de pas qui diverge ou
qui converge vers zéro. C’est pourquoi des lignes de code supplémentaires doivent
être ajoutées pour obtenir un algorithme robuste. Pour illustrer les propriétés de
l’algorithme de Bogacki et Shampine, on souhaite résoudre l’équation différentielle
suivante proposée par D.F. Griffiths et D.J. Higham15 .
Exemple 12.10 (Utilisation de l’algorithme de Bogacki-Shampine). On considère
l’équation différentielle :
dy(t)
= (1 − 2t)x(t)
dt
pour t ∈ [0, 4] avec la condition initiale y(0) = 1. La solution exacte est la fonction :
 2 !
1 1
y(t) = exp − −t
4 2

pour tout t ∈ [0, 4]. La solution exacte de l’équation différentielle est présentée dans
la figure 12.1016 . Nous utilisons l’algorithme de Bogacki-Shampine avec une tolérance
15Voir [58] page 20.
16Script Python : EDO/Scripts/Py3/[Link].
12.5 • Méthodes adaptatives (*) 343

Solution exacte
1

y
0
0 2 4
t

Figure 12.10 – Solution exacte du problème de Griffiths-Higham.

BS23. Tol. abs. = 1.0e-04 BS23. Tol. abs. = 1.0e-04


Erreur absolue

−3 0.3
10
10−4

hn
0.2
−5
10
0.1
0.0 2.5 0.0 2.5
Temps (s) Temps (s)

Figure 12.11 – Méthode de Bogacki-Shampine pour le problème de Griffiths-


Higham. À gauche, erreur absolue globale. À droite, longueur du pas variable.

absolue égale à abs = 10 −4. Le pas de discrétisation est initialisé à h 1 = 0.4, ce


qui mène à une erreur supérieure à la tolérance lors de la première itération. Le pas
corrigé est égal à h1 = 8.614 × 10 −2 . Celui-ci est accepté, ce qui permet de débuter
la simulation. Soit yn pour n = 1, 2, ..., nmax la solution approchée par la méthode
de Bogacki-Shampine où nmax est le nombre d’itérations. Avec ces paramètres, nous
obtenons nmax = 31 itérations. À chaque date tn , on évalue l’erreur absolue globale :

e abs(tn ) = |yn − y(t n)|

pour n = 1, 2, ..., n max. Nous insistons sur le fait qu’il s’agit de l’erreur globale et non
pas de l’erreur locale, contrôlée par l’algorithme. La partie gauche de la figure 12.11
présente l’évolution de l’erreur absolue en fonction du temps. On observe qu’elle est
proche de 10−6 au début de la simulation, atteint un maximum local proche de 10−3
pour t ≈ 2.5, puis diminue. Cela montre que l’erreur globale peut être inférieure ou
supérieure à la tolérance abs = 10 −4 en fonction de l’itération au cours de l’algo-
rithme. La partie droite de la figure 12.11 présente l’évolution de la longueur du pas
de discrétisation en fonction du temps. On observe que la longueur initiale est proche
de h ≈ 0.1, puis augmente progressivement et est comprise entre 0.2 et 0.3 à la fin de
la simulation. On observe que, pour t ∈ [2, 4], la dynamique de la solution exacte est
moins forte, ce qui explique en partie pourquoi la méthode numérique peut augmenter
le pas de discrétisation.
A cet instant de l’étude, nous avons introduit la plupart des méthodes numériques
nécessaires pour résoudre une EDO de manière relativement précise. Toutefois, il y a
plusieurs sujets qui doivent être considérés lorsqu’on considère ce sujet. Le premier est
344 Chapitre 12 • EDO

que certaines EDO sont particulièrement difficiles à simuler de manière précise. Ces
EDO peuvent avoir le qualificatif de raides, ce que nous présentons dans la section
12.6. D’autre part, certaines EDO sont associées à des paramètres comme la masse de
la balle considérée dans l’exemple 12.1. Dans la section 12.7, nous analysons comment
utiliser SciPy pour tenir compte de ces paramètres. Enfin, il est possible de se faire une
idée de la solution d’une EDO en utilisant des outils graphiques. Cela méthode permet
de compléter l’utilisation d’une méthode numérique et de comprendre la dynamique
du système en fonction de sa condition initiale. Dans la section 12.8 nous montrons
comment représenter graphiquement des champs de vecteurs.

12.6 Équations raides (*)


La raideur d’un système d’équations différentielles peut mener à des difficultés
lors de la mise en œuvre d’une méthode numérique. Dans cette section, nous intro-
duisons brièvement les problèmes liés aux équations raides. D’une manière informelle,
un système d’équations différentielles ordinaires est raide si la solution varie lente-
ment, mais il existe des solutions voisines qui varient rapidement, de telle sorte que la
méthode numérique doit utiliser des petits pas pour obtenir des résultats satisfaisants.
Plus précisément, un tel problème linéaire est associé à une matrice jacobienne dont
certaines valeurs propres ont des parties réelles négatives, mais dont les ordres de
grandeur sont très différents : certaines ont des parties réelles très grandes en valeur
absolue (c’est-à-dire très négatives), alors que d’autres sont très proches de zéro17 .
La raideur est un problème de performance, car la raideur ne pose pas de problème,
à l’exception de la limite de temps nécessaire pour réaliser le calcul18 . Avec beaucoup
de temps, une méthode explicite peut résoudre un problème raide. L’analyse de ces
problèmes implique le domaine de stabilité de la méthode numérique mise en œuvre, ce
qui mène à des méthodes numériques implicites. Nous n’approfondirons pas l’analyse
théorique de ce sujet dans ce livre19 .

12.7 EDO paramétrée


Il arrive que l’EDO soit paramétrée, ce qui signifie que l’évaluation de la fonction
f (t, y ) nécessite des paramètres supplémentaires. C’est par exemple le cas pour l’at-
tracteur de Lorenz (présenté dans la section 12.9.2) qui dépend de trois paramètres
β , σ et ρ. Pour calculer une approximation de la solution avec la fonction odeint du
module SciPy, nous avons défini la fonction lorenz qui évalue la fonction f (t, y ). La
séquence d’appel de cette fonction est la suivante.
1 ydot = lorenz (y , t , beta , sigma , rho )

où y est le vecteur d’état, t est le temps, beta, sigma, rho sont des paramètres
numériques et ydot est la valeur de f (t, y(t)). Pour que la fonction odeint puisse
évaluer la fonction lorenz, nous plaçons un tuple contenant les paramètres en tant
que quatrième argument de la fonction odeint.
1 y = odeint ( lorenz , y0 , t , ( beta , sigma , rho ) )
17Voir [58] page 102.
18Voir [104] page 203.
19Voir par exemple [93] page 167.
12.8 • Champ de vecteurs 345

Ainsi, lorsque la fonction odeint appelle la fonction lorenz pour évaluer f (t, y), elle
ajoute les paramètres supplémentaires à la séquence d’appel. C’est la raison pour
laquelle l’ordre des éléments dans le tuple doit correspondre à l’ordre des arguments
dans la séquence d’appel de la fonction lorenz. Plus de détails sur l’attracteur de
Lorenz sont donnés dans la section 12.9.2. La gestion des paramètres supplémentaires
est présentée dans le contexte de l’intégration numérique dans la section 11.10.

12.8 Champ de vecteurs


Dans la plupart des situations, la dynamique du système dépend de la condition
initiale. Pour analyser le comportement du système, une méthode graphique consiste
à représenter l’évolution instantanée du système sur une grille, ce qui conduit à consti-
tuer un champ de vecteurs. Dans cette section, nous présentons le modèle de popula-
tion logistique, pour lequel nous représentons le champ de vecteurs associé.
On cherche à modéliser la taille de la population d’un groupe en fonction du
temps. Cela peut être la population des habitants d’un pays ou bien la population
d’une certaine espèce d’animaux dans une région donnée. Si l’on utilise l’équation
différentielle ẏ = ay où a est une constante, le comportement est très simple : si
a > 0, la population croît exponentiellement et si a < 0, elle décroît tout aussi
rapidement. Si le coefficient a est positif et si la population dépasse un certain seuil,
la compétition entre les individus peut limiter la croissance, une réalité que le modèle
ne peut reproduire. Pour prendre cela en compte, on peut utiliser le modèle logistique.
Il s’agit de l’équation différentielle :
 
y(t)
ẏ(t) = ay (t) 1 −
N
pour t ≥ 0 avec la condition initiale y(0) = 0 où a et N sont des constantes. Le
paramètre N permet d’introduire une force de rappel dans la dynamique, puisque, si
y > N , alors 1 − y/N < 0 ce qui implique que y˙ < 0.
On considère les paramètres a = 1 et N = 1, ainsi que le domaine temporel
t ∈ [0, 2]. Le script suivant 20 utilise la fonction odeint du module SciPy pour résoudre
l’EDO avec la condition initiale y (0) = 0.5.
1 import numpy as np
2 from scipy . int egrate import odeint
3

4 def lo gistiq ue (y , t ):
5 dydt = a * y [0] * (1.0 - y [0] / N)
6 ydot = [ dydt ]
7 return ydot
8

9 a = 1.0
10 N = 1.0
11 t_min = 0.0
12 t_max = 2.0
13 n_points = 100
14 t = np . li nspace ( t_min , t_max , n_poin ts )
15 y0 = [0.5]
20 Script Python : EDO/Scripts/Py3/[Link].
346 Chapitre 12 • EDO

16 y = odeint ( logistique , y0 , t )

Pour comprendre la dynamique du système, on peut tenter de représenter le champ


de vecteurs associé à l’équation. Dans le cas particulier où le système d’équations
différentielles est réduit à une seule équation, nous allons voir que c’est très simple.
Ce champ est représenté dans le plan (t, x) et, pour chaque date t, on considère le
vecteur qui a pour composantes :
 
1
u(t) =
ẏ(t)

pour t ≥ 0. À chaque instant t, la pente de la solution y(t) est égale à ẏ(t) de telle sorte
que le vecteur u(t) est tangent à la solution du problème. On peut alors dessiner cette
pente sur une grille de valeurs dans le plan (t, y). L’avantage de cette méthode est qu’il
n’y a pas besoin de calculer la solution de l’équation différentielle pour déterminer le
vecteur u(t). Un problème peut se poser si les vecteurs sont trop longs, de telle sorte
qu’ils se chevauchent mutuellement, rendant le graphique illisible. Puisque la pente
est inchangée par une multiplication par un scalaire, on considère plutôt le vecteur
normalisé :
u(t)
v(t) =
ku(t)k2
où ku(t)k2 est la norme euclidienne.
Le script suivant21 utilise la fonction meshgrid du module NumPy pour générer
une grille régulière dans le plan (t, x). Puis, on calcule le facteur de normalisation s
et on divise chaque vecteur par sa longueur.
1 import numpy as np
2 n_points = 10
3 t_range = np . linsp ace (t_min , t_max , 10)
4 y_range = np . linsp ace ( -0.5 , 1.5 , 10)
5 T , Y = np . me shgrid ( t_range , y_range )
6 dtdt = np . ones ( T. shape )
7 dydt = a * Y * (1.0 - Y / N)
8 s = np . sqrt ( dtdt ** 2 + dydt ** 2)
9 dtdt = dtdt / s
10 dydt = dydt / s
La fonction quiver du module pylab permet de créer le champ de vecteurs.
1 import pylab as pl
2 pl . figure ()
3 pl . xlabel ( "t " )
4 pl . ylabel ( "y " )
5 pl . quiver (T , Y , dtdt , dydt )

La figure 12.12 présente le champ de vecteurs. Sur la même figure, nous avons
placé plusieurs trajectoires associées à 5 conditions initiales entre 0.05 et 1.5. Nous
avons représenté par des lignes noires les droites y(t) = 0 et y(t) = 1. La ligne
y(t) = 0 repousse les solutions : si la condition initiale est en dessous de cette ligne,
la trajectoire tend vers −∞ tandis que si la condition initiale est entre 0 et 1, la
trajectoire tend vers 1. Au contraire, la ligne y(t) = 1 attire les solutions.
21Script Python : EDO/Scripts/Py3/[Link].
12.9 • Applications 347

Modèle logistique

y
0

0 1 2
t

Figure 12.12 – Champ de vecteurs et différentes trajectoires du modèle logistique.

Cette méthode peut être étendue en dimension 2, en représentant le vecteur :


 
ẏ1 (t)
u(t) =
ẏ2 (t)
pour t ≥ 0. En dimension supérieure, il est plus difficile de représenter le champ de
vecteurs, mais on peut toujours représenter des sections de celui-ci.

12.9 Applications
12.9.1 Un modèle de frasil
Lorsqu’une installation industrielle, par exemple une centrale nucléaire de pro-
duction d’électricité ou une centrale hydraulique, prélève de l’eau dans une rivière, la
glace dans la rivière peut mettre en difficulté les prises d’eau [20]. Dans ce contexte,
l’entrée d’eau peut poser un problème pour le fonctionnement du système, soit que
la glace obture l’écoulement, soit que des quantités trop importantes de glace soient
emportées dans le flux. Les cristaux de frasil sont des particules de glace qui flottent
librement dans l’eau et se forment lorsque la température de l’eau est basse, généra-
lement en dessous de 0°C (mais cela peut dépendre de la salinité de l’eau). L’état de
surfusion de l’eau correspond à celui dans lequel la température de l’eau passe sous la
température de fusion. Dans cet état peu stable, une petite perturbation peut suffire
à déclencher un changement de phase vers l’état solide.
On considère une simplification du modèle de frasil présenté dans [145], qui déter-
mine la température de l’eau T et la concentration volumique de frasil c correspondant
à la fraction du volume total occupée par le frasil. Nous faisons l’hypothèse que la
température de fusion est nulle. Nous considérons des cristaux de frasil sous la forme
de disques aplatis (c’est-à-dire dont le rayon est plus grand que l’épaisseur), la forme
la plus observée dans les écoulements turbulents [29]. Le modèle est constitué des
équations suivantes :
dT (t)
= −φ − αT (t)c(t) (12.30)
dt
dc(t)
= −βT (t)c(t) (12.31)
dt
348 Chapitre 12 • EDO

où t ∈ [t 0 , t 1] est le temps, T (°C ) est la température de l’eau, c est la concentration


volumique de frasil, φ = 4 × 10−4 (°C/s) est la vitesse de refroidissement imposée
dans l’expérience, α est un paramètre dépendant des propriétés de l’eau, du niveau
de turbulence et du nombre de particules de frasil et β est un paramètre dépendant
des propriétés de la glace et de la forme géométrique des particules de frasil. Dans
l’équation 12.30, l’expression αT c caractérise le transfert de chaleur entre les particules
de frasil et l’eau.
On considère les paramètres α = 66.87 et β = 0.9177, ainsi que les dates initiales
et finales t0 = 0 (s) et t1 = 600 (s) correspondant à une durée égale à 10 minutes. La
condition initiale est T (t = 0) = 0 (°C) et c(t = 0) = 10−8. La concentration initiale de
frasil, très proche de zéro mais non nulle, est appelée ensemencement initial. Elle est
indispensable pour favoriser le changement d’état. La fonction suivante22 implémente
le modèle :
1 import numpy as np
2

3 def frasil (y , t ):
4 T, C = y
5 dTdt = - phi - alpha * T * C
6 dCdt = - beta * T * C
7 dydt = np . array (( dTdt , dCdt ))
8 return dydt

Pour résoudre l’EDO, nous utilisons la fonction bogacki_shampine.


1 from odes import bo gac ki_s ham pine
2 phi = 4.0 e -4
3 alpha = 66.87
4 beta = 0.9177
5 t_min = 0.0
6 t_max = 600.0
7 tspan = [ t_min , t_max ]
8 # Conditi on initial e
9 T0 = 0.0
10 C0 = 1.0 e -8
11 y0 = [ T0 , C0 ]
12 t , y = b ogac ki_ sham pin e ( frasil , tspan , y0 )

La figure 12.13 présente l’évolution de la température et de la concentration de


frasil en fonction du temps. La température est caractérisée par trois phases distinctes
[20]. La première est marquée par une décroissance linéaire de la température sans
formation de glace, gouvernée essentiellement par l’équation :

dT (t)
≈ −φ.
dt
Lorsque la condition initiale est T (t = t 0) = 0 associée à la date initiale t0 = 0,
l’évolution est particulièrement simple puisque T (t) ≈ −φt pour t ∈ [0, tc ] où tc est
l’instant où la création de frasil libère suffisamment de chaleur latente pour infléchir
la dynamique. Nous introduirons par la suite un calcul approché de cette date de
transition. Dans la deuxième phase, la température continue de baisser, mais moins
22Script Python : EDO/Scripts/Py3/[Link].
12.9 • Applications 349

0.00

T (°C)
−0.05

0 500
0.0025

C
0.0000
0 500
t (s)

Figure 12.13 – Dynamique de la formation du frasil.

0.1
T (°C)

(−0.1, 10 −7 )
0.0
(−0.1, 10 −9 )
−0.1
(0.1, 10 −7)
0 500
(0.1, 10 −9)
0.0025
C
0.0025
C

0.0000 0.0000
0 500 −0.1 0.0 0.1
t (s) T (°C)

Figure 12.14 – Dynamique de la formation du frasil et sensibilité à la condition


initiale y0 = (T 0 , C0). À gauche, en fonction du temps. À droite, dans l’espace des
phases.

vite, tandis que la concentration de frasil augmente jusqu’à un instant où la tem-


pérature atteint sa valeur la plus basse. À cet instant, la vitesse d’évolution de la
concentration de frasil est la plus grande. Dans la dernière phase, la concentration
continue d’augmenter, mais à un rythme moindre et la température tend lentement
vers la température d’équilibre, proche de zéro dans notre cas.
La partie gauche de la figure 12.14 présente la dynamique de formation du frasil en
fonction de la condition initiale, où nous avons considéré deux températures initiales
T (t = 0) = −0.1 °C et T (t = 0) = 0.1 °C ainsi que les deux concentrations initiales
C (t = 0) = 10−7 et C (t = 0) = 10−9 . On observe que lorsque la température
initiale est plus basse, la température minimale est également plus basse. Lorsque
la concentration initiale est plus grande, la formation du frasil est plus précoce. La
partie droite de la figure 12.14 présente plusieurs trajectoires dans l’espace des phases
en fonction des différentes conditions initiales.
Sous l’hypothèse que la concentration initiale est proche de zéro, on peut obtenir
une approximation du comportement initial du système. Plus précisément, supposons
350 Chapitre 12 • EDO

que c(0) ≈ 0. Alors le comportement approché du système est :


 
e 1 2
T (t) = −φt, c̃(t) = c(0) exp βφt (12.32)
2
pour t → 0 + . Cela explique pourquoi la première partie de la simulation est associée
à une décroissance presque linéaire de la température et une augmentation rapide
de la concentration. L’approximation précédente permet de déterminer l’instant du
changement de comportement du système et l’instant de transition vers la dynamique
de long terme. Soit w = W 0(x) la solution de l’équation w exp(w) = x pour tout
x > 0. La fonction W0 est la première branche de la fonction de Lambert. Soit tc la
date telle que :
dT (t c)
= 0. (12.33)
dt
Ainsi, la date tc est l’instant où la décroissance linéaire initiale de la température
cesse. La solution approchée de l’équation est :
s  
e 1 βφ
tc = W0 . (12.34)
βφ c(0)2 α 2
Dans l’exercice 12.17 nous proposons de démontrer les équations 12.32 et 12.34. Avec
les données du problème, nous trouvons les valeurs numériques :
t c = 219.3 (s), T˜( tec) = −0.08772 °C, c(
e ˜ tec ) = 6.819 × 10−5.
Ces valeurs correspondent au point représenté dans la figure 12.13. On observe que
l’approximation tec est satisfaisante.
La dynamique de long terme est déterminée localement par les valeurs et vecteurs
propres de la matrice jacobienne du système. Soit f : R × R+ → R 2 la fonction définie
par :  
T −φ − αT c
f ((T, c) ) =
−βT c
pour tout T ∈ R et tout c > 0. La matrice jacobienne est :
 
T −αc −αT
J ((T, c) ) =
−βc −βT
pour tout T ∈ R et tout c > 0. On peut démontrer que les valeurs propres sont réelles,
distinctes, et égales à λ1 = 0 et λ2 = −αc − βT . Les vecteurs propres sont :
   
−T α
v1 = , v2 = .
c β
La première valeur propre est nulle. De plus, puisque α, β, c, T > 0, cela implique
que la seconde est strictement négative, c’est-à-dire que λ 2 < 0. Par conséquent, la
solution locale du système autour de la date tc est :
ỹ(t) = k 1e λ 1 (t−tc) v1 + k2 eλ2 (t−tc) v2
= k1v 1 + k 2 eλ 2(t−t c) v 2
pour tout t ∈ [t0 , t 1]. Puisque la seconde valeur propre est négative, le terme dépendant
de la seconde valeur propre tend vers zéro. Par conséquent, la solution locale linéarisée
de long terme est ỹ(t) = k1v 1 quand t → +∞. Plus de détails sur ce modèle physique
sont présentés dans [20, 109, 29, 133, 145].
12.9 • Applications 351

12.9.2 L’attracteur de Lorenz


L’attracteur de Lorenz décrit un modèle de mécanique des fluides associé à l’at-
mosphère terrestre. Considérons une « planète » dont l’atmosphère est formée d’un
seul fluide qui, comme sur Terre, est chauffée par le dessous et refroidie par le dessus.
Dans cette situation instable, l’atmosphère chaude du dessous, plus légère, monte et
l’atmosphère froide du dessus, plus lourde, descend. Le modèle de Lorenz peut être
défini comme le produit matrice-vecteur :
ẏ(t) = A(y(t))y(t)
où y(t) est un vecteur de dimension 3 :
 
y1 (t)
y(t) =  y2 (t)
y3 (t)
et la matrice A(y) dépend de y2 :
 
−β 0 y2
A(y) =  0 −σ σ  .
−y2 ρ −1
En conséquence, le système d’EDO n’est pas linéaire.
Les composantes de y représentent les variables physiques suivantes. La variable
y1 (t) représente la variation de température verticale, y2 (t) représente la convection
dans le courant atmosphérique et y3 (t) représente la variation de température ho-
rizontale. Les paramètres du modèle sont le nombre de Prandtl σ > 0, le nombre
de Rayleigh normalisé ρ > 0 et un paramètre géométrique β > 0. Les paramètres
classiques σ = 10, ρ = 28 et β = 8/3 ne correspondent pas à des valeurs qu’on peut
trouver sur Terre.
Les points critiques de ce système sont l’origine y = (0, 0, 0)T et les deux points 23 :
 p p T
y± = ρ − 1, ± β (ρ − 1), ± β (ρ − 1) .

Avec les paramètres classiques, on obtient24 :


 √ √ T
y± = 27, ±6 2, ±6 2 = (27, ±8.485, ±8.485)T

avec 4 chiffres significatifs. Au point y = (0, 0, 0)T , les valeurs propres de la matrice
jacobienne sont λ1 = −8/3 et :

11 1201
λ± = − ± .
2 2
On obtient λ− = −22.83 et λ + = 11.83.
Les deux fonctions suivantes25 permettent de définir le modèle. La fonction
lorenz_jacobian définit la matrice jacobienne A(y). La fonction lorenz définit
la fonction f (t, y).
23 Voir [71] page 308.
24 Voir [71] page 313.
25 Script Python : EDO/Scripts/Py3/[Link].
352 Chapitre 12 • EDO

Attracteur de Lorenz. β = 8/3, σ = 10, ρ = 28.

20 t=0
t=30.00

y3
0

−20
−25 0 25
y2

Figure 12.15 – Attracteur de Lorenz : trajectoire avec β = 8/3, σ = 10, ρ = 28.

1 def l oren z_ja cob ian (y , t , beta , sigma , rho ):


2 A = np . array ([[ - beta , 0.0 , y [1]] ,
3 [0.0 , - sigma , sigma ],
4 [ -y [1] , rho , -1.0]])
5 return A
6

7 def lorenz (y , t , beta , sigma , rho ) :


8 A = lore nz_j acob ian (y , t , beta , sigma , rho )
9 ydot = A @ y
10 return ydot
On considère la condition initiale y(0) = (1, 1, 1)T et l’intervalle de temps t ∈ [0, 30].
Dans le script suivant, on utilise la fonction odeint du module SciPy pour calculer
une solution approchée du problème.
1 from scipy . int egrate import odeint
2 import numpy as np
3 rho = 28.0
4 sigma = 10.0
5 beta = 8.0 / 3.0
6 y0 = np . array ([1.0 , 1.0 , 1.0])
7 tfinal = 30.0
8 t = np . li nspace (0.0 , tfinal , 100)
9 y = odeint ( lorenz , y0 , t , ( beta , sigma , rho ) )
La figure 12.15 présente la projection du diagramme de phase associé à ce problème
sur les composantes (y2 , y3 ). En effet, le diagramme de phase complet, représentant
l’évolution des paramètres (y 1, y2 , y3 ) est en trois dimensions, ce qui n’est pas facile
à visualiser.
Une des caractéristiques du système de Lorenz est d’être chaotique : même une
petite perturbation de la condition initiale peut changer radicalement la trajectoire à
plus long terme. Le comportement local de la solution est également assez étonnant.
Les deux points d’équilibre y ± jouent tour à tour le rôle d’attracteurs et de points de
répulsion : sitôt que la solution s’en approche, elle en diverge en direction généralement
de l’autre point d’équilibre (ou de l’origine du repère). Plus de détails sur le système
de Lorenz sont présentés dans [71], chapitre 14. L’ouvrage décrit, de plus, le système
tridimensionnel de Rössler possédant des points communs avec l’attracteur de Lorenz.
12.10 • Conclusion 353

12.10 Conclusion
Pour aller plus loin dans l’analyse théorique de la solution des équations différen-
tielles ordinaires, on peut analyser le théorème de Cauchy-Lipschitz. Sa démonstra-
tion peut s’appuyer sur l’inégalité de Gronwall, le théorème de Banach et la définition
d’une fonction Lipschitzienne. Plus de détails sur ces thèmes sont présentés dans [96]
chapitre 11. Sur le théorème de Banach, on peut consulter [134] page 35. On peut
analyser la stabilité des méthodes explicites en fonction du pas de discrétisation h.
Sur ce sujet, voir [93] page 149.
On peut également analyser les méthodes pour résoudre des problèmes raides,
c’est-à-dire les méthodes implicites. Dans ces méthodes, à chaque itération, on résout
un système d’équations non linéaires. La méthode utilise des opérations matricielles
qui impliquent la matrice jacobienne. Cette matrice peut être fournie par l’utilisateur,
mais, la plupart du temps, elle est approchée. Plus de détails sur le thème des équations
raides sont donnés dans [93] chapitre 8 page 167.
Un autre thème important dans le calcul des solutions d’EDO est le calcul d’évè-
nements. Ce problème consiste à rechercher t tel que y(t) = y? où y ? est donné. Un
exemple de problème de ce type consiste à calculer le temps t pour lequel un ballon
lancé en l’air touche le sol. Pour aller encore plus loin, on peut considérer les équa-
tions aux dérivées partielles [93], ce qui constitue un vaste sujet en mathématiques
appliquées.

12.11 Notes et références


Le chapitre 6 du livre [122] est consacré aux méthodes numériques pour les équa-
tions différentielles ordinaires. L’article [12] présente la méthode de Bogacki et Sham-
pine. Le lecteur intéressé peut également consulter [5, 6, 58]. Dans le contexte de
Python, on peut consulter la page des fonctions associées dans le module SciPy [24]
ainsi que [23].
Lorsqu’on considère un système d’EDO linéaire (c’est-à-dire avec une matrice ja-
cobienne constante), on peut déterminer la solution exacte de l’équation différentielle.
Pour cela, on peut utiliser les valeurs propres et les vecteurs propres de la matrice
jacobienne. Plus de détails sur ce sujet sont présentés dans [71], dans les chapitres
1 à 6. L’analyse d’un système associé à des valeurs propres multiples est présentée
dans [71], chapitre 5 ou dans le chapitre 5 de [38]. Lorsqu’on considère un système
d’équations non linéaires, on peut linéariser le système et l’utiliser pour obtenir une
analyse locale par développement de Taylor. Plus de détails sur ce sujet sont présentés
dans [58] page 166. On peut également relier cette approximation linéaire au compor-
tement de la méthode numérique, comme cela est présenté dans [93] page 158. Une
analyse similaire est présentée dans [104] page 186. Sur le thème du portrait de phase
présenté dans la section 12.2, et en particulier le portrait de phase des oscillateurs,
on peut consulter [52].
Nous avons décrit dans la section 12.5 le principe des méthodes adaptatives pour
la résolution d’un système d’équations différentielles ordinaires. Plus de détails sur la
méthode de Runge-Kutta-Fehlberg sont présentés dans [40] page 211. La figure 12.9 a
été créée en Python de telle sorte que les valeurs numériques utilisées correspondent
avec exactitude à la méthode. Elle est inspirée de [104] page 192 avec des modifications.
Le modèle logistique présenté dans la section 12.8 est également présenté dans [15]
354 Chapitre 12 • EDO

euler Méthode d’Euler


bogacki_shampine Méthode de Bogacki-Shampine
ode_plot Dessine la solution d’une EDO
adams_bashforth Méthode d’Adams-Bashforth
explicit_method Résout une EDO par une méthode explicite

Table 12.3 – Fonctions du module [Link].

page 28 ainsi que dans [71] page 4. Le champ de vecteurs pour le modèle logistique
est présenté dans [15] page 6. Dans la section 12.9.1, nous avons décrit un modèle de
frasil associé à une seule taille de particules de frasil. Une extension est proposée dans
[126] permettant de modéliser plusieurs tailles.
La table 12.3 présente les fonctions du module [Link] développé pour ce livre.

12.12 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.

* Exercice 12.1 (Réduction à un problème d’ordre 1) On considère l’équation différentielle


ordinaire de degré m :
 0

y (m) (t) = f t, y (t), y (t), . . . , y (m−1) (t) (12.35)

pour tout t ≥ t 0 associée à la condition initiale :


0
y (t 0) = η1, y (t0) = η 2, ..., y (m−1)(t 0 ) = ηm

où η1 , η 2 , . . . , ηm sont les conditions initiales données, f est une fonction continûment dé-
rivable et y (m−1)(t) est la dérivée de y (t) d’ordre m − 1. Montrer qu’il existe une fonction
g(t, z) et une fonction z ∈ Rm solution de l’équation différentielle ordinaire ż(t) = g(t, z(t))
pour tout t ≥ t 0 avec :
z(t 0) = (η 1 , η2 , ..., η m)T
et telles que la première composante de z(t) est y (t), c’est-à-dire que y (t) = z 1(t).

Définition 12.12 (Système autonome). Un système d’équations différentielles ordinaires


est autonome s’il est de la forme :
0
y (t) = f (y(t)) (12.36)

pour t ≥ t 0 avec la condition initiale y(t0 ) = y0 où y(t) ∈ Rm .

* Exercice 12.2 (Réduction à un système autonome) Montrer que le problème de Cauchy


donné par la définition 12.1 page 319 peut toujours être transformé en un système autonome.
Indication. Considérer la variable de dimension m + 1 suivante :
 
y(t)
z(t) = . (12.37)
t
12.12 • Exercices 355

* Exercice 12.3 (Erreur de la méthode d’Euler) Soient t n ≥ t 0 un réel, h > 0 un réel et


tn+1 = t n + h. Supposons que f ∈ C∞ ([t n, t n + h] × R). Montrer que la méthode d’Euler est
d’ordre 1. Indication. Définir u(t), écrire le développement de Taylor de la solution locale
u(t + h) et appliquer ce développement en t = tn .

** Exercice 12.4 (Erreur de la méthode d’Adams-Bashforth à deux pas) La méthode


d’Adams-Bashforth à deux pas (notée AB(2)) est une méthode définie par :

sn = f (t n , yn ) (12.39)
h
yn+2 = yn+1 + (3sn+1 − sn ) (12.40)
2
pour n ≥ 0. Cette méthode ne peut être utilisée qu’à partir du second pas de temps, lorsque
y0 et y 1 sont connus (pour calculer y 1 en fonction de y 0 , on peut utiliser une méthode à un
pas, par exemple la méthode d’Euler). Supposons que f ∈ C∞ ([tn , tn + h] × R). Montrer que
la méthode AB(2) est d’ordre 2. Indication. On montrera que, pour tout t ∈ [tn , tn + h] on
a:
h
u(t + h) = u(t) + (3f (t, u(t)) − f (t − h, u(t − h))) + O (h3) (12.41)
2
lorsque h → 0.

** Exercice 12.5 (Erreur de la méthode de Runge) Supposons que f ∈ C∞ ([tn, tn + h] ×R).


Montrer que la méthode de Runge est d’ordre 2. Indication. On montrera que, pour tout t,
on a :
 h h

u(t + h) = u(t) + hf t + , u(t) + f (t, u(t)) + O(h 3) (12.44)
2 2
lorsque h → 0.

** Exercice 12.6 (Erreur de la méthode de Heun) Montrer que la méthode de Heun est
d’ordre 2. Indication. Montrer que :

h
u(t + h) =u(t) + (f (t + h, u(t) + hf (t, u(t))) + f (t, u(t))) + O (h 3 ) (12.47)
2
lorsque h → 0.

** Exercice 12.7 (Erreur de la méthode d’Euler avec f (t)) Soient t0 et y0 deux réels.
Considérons n > 0 itérations de la méthode d’Euler avec un pas h > 0 constant. On considère
la suite ti+1 = ti + h, pour i = 0, 1, ..., n− 1. Supposons que f ne dépend pas de y . En d’autres
termes, supposons que :

f (t, y ) = f (t) (12.52)

pour tout t ∈ [t0 , tn ] et y ∈ R. Supposons de plus que f ∈ C ∞([t 0, t n ]). On considère


l’équation différentielle ordinaire :

ẏ (t) = f (t), t ∈ [t 0, tn ] (12.53)


y (t 0 ) = y0. (12.54)

1. Montrer que pour n > 0, l’erreur de discrétisation locale est :


 Z 
 t n+1 
dn+1 =  hf (tn) − f (s)ds . (12.55)
tn
356 Chapitre 12 • EDO

2. Montrer que pour n > 0, l’erreur de discrétisation globale est :


 Z tn 
 n−1 
X 
en =  hf (ti ) − f (s)ds . (12.56)
 i=0 t0 

3. En déduire que :

X
n−1

en ≤ di+1 (12.57)
i=0

pour n > 0 où di+1 est l’erreur locale et en est l’erreur globale à l’itération n.
4. Notons T = t n − t0 la durée de la simulation. Par conséquent, le nombre d’itérations
est n = Th . En déduire que en = O (h) quand h → 0. Indication. Utiliser l’exercice
12.3.
Remarque 12.2 (Erreur de la méthode d’Euler avec f (t)). Dans [104], l’auteur obtient une
égalité au lieu d’une inégalité, en utilisant des définitions des erreurs locales et globales sans
valeurs absolues. Il s’agit, dans ce cas, non plus d’erreur, mais d’écart, et, en effet, la somme
des écarts locaux est égale à l’écart global. Toutefois, certains écarts locaux sont positifs et
d’autres sont négatifs ; les erreurs sont, elles, positives.

** Exercice 12.8 (Influence des erreurs d’arrondis) Supposons que l’on utilise une mé-
thode numérique pour calculer la solution approchée d’une équation différentielle ordinaire.
Soit t 0 la date initiale. On considère la suite ti+1 = ti + h, pour i = 0, 1, ..., n − 1. Par consé-
quent, après n itérations, la date finale est tn . On suppose qu’on utilise un pas h constant,
de telle sorte qu’on utilise n = Th itérations où T = t n − t0 > 0 est la durée de la simulation.
On suppose que l’erreur d’arrondis due aux évaluations avec des nombres à virgules flot-
tantes est, pour une itération, égale à M = 2 −52. Par conséquent, après n itérations, l’erreur
d’arrondi est égale à n M = T hM . Supposons que la méthode numérique est d’ordre p ≥ 1,
de telle sorte que l’erreur locale est d i+1 = O (hp+1) quand h → 0, pour i = 0, 1, ..., n − 1.
Par conséquent, par définition de la notation de Landau, il existe δ > 0 et M tels que pour
tout h < δ , on a d i+1 ≤ Mh p+1 pour i = 0, 1, ..., n − 1. Supposons que l’erreur globale est
inférieure à la somme des erreurs locales, c’est-à-dire, supposons que :

X
n−1

en ≤ di+1 . (12.59)
i=0

Par conséquent, en ≤ nM hp+1 = Th Mhp+1 = T Mhp . On fait alors l’hypothèse que l’erreur
totale est E (h) = T Mhp + T hM .
1. Montrer que l’erreur totale E (h) est minimale lorsque :
  p+1
1
M
h= . (12.60)
pM

2. Montrer que, avec ce pas, le nombre d’itérations est :


 pM  p+1
1

n=T . (12.61)
M

3. À l’aide d’un script Python, calculer le pas optimal pour p = 1, 3, 5, 10, en considérant
M = 100 et T = 20.
12.12 • Exercices 357

Remarque 12.3. Nous avons vu dans l’exercice 12.7 que l’inégalité 12.59 est vérifiée pour la
méthode d’Euler dans le cas particulier où la fonction f ne dépend que de t.

* Exercice 12.9 (Méthodes de Runge-Kutta d’ordre 2) Supposons que le système d’EDO


est autonome. On considère la méthode de Runge-Kutta associée aux pentes s1 = f (yn) et
s2 = f (yn + βhs1 ) ainsi qu’à l’itération yn+1 = y n + hγ 1 s1 + hγ2 s2 avec t n+1 = tn + h pour
n ≥ 0. Montrer que la méthode de Runge-Kutta est d’ordre 2 si :
1
γ1 + γ2 = 1, γ2 β = . (12.62)
2

Remarque 12.4 (Méthodes de Runge-Kutta d’ordre 2). Les conditions précédentes forment
un système non-linéaire de 2 équations à 3 inconnues. Ce système a donc une infinité de
solutions. On observe que les conditions précédentes sont satisfaites dans les cas suivants. Si
γ1 = 0, γ 2 = 1 et β = 12 , on obtient la méthode de Runge, présentée dans la définition 12.5. Si
γ1 = 12 , γ2 = 12 et β = 1, on obtient la méthode de Heun, présentée dans la définition 12.6. Si
γ1 = 13 , γ2 = 23 et β = 34 , on obtient également une méthode d’ordre 2. Si γ1 = 14 , γ2 = 34 et
β = 23 , on obtient la méthode de Ralston [116], qu’il attribue à Zopal [86]. Le calcul montre
que l’hypothèse du système autonome simplifie grandement les calculs, puisque seules les
dérivées de f par rapport à y sont prises en comptes.

** Exercice 12.10 (Méthodes de Runge-Kutta d’ordre 3) Supposons que le système d’EDO


est autonome. On considère la méthode de Runge-Kutta suivante :
s1 = f (y n ) (12.64)
s2 = f (yn + β21 hs1) (12.65)
s3 = f (yn + β31 hs1 + β32 hs2 ) (12.66)
et :
yn+1 = yn + hγ 1s1 + hγ2 s2 + hγ3s3 (12.67)
t n+1 = tn + h (12.68)
pour n ≥ 0. Montrer que la méthode de Runge-Kutta est d’ordre 3 si :
γ1 + γ 2 + γ3 = 1 (12.69)
1
γ2 β 21 + γ 3β 31 + γ3 β32 = (12.70)
2
1
γ3 β 32 + β21 = (12.71)
6
1
γ2 β 221 + γ 3β 231 + γ3 β32
2
= . (12.72)
3

Remarque 12.5 (Méthodes de Runge-Kutta d’ordre 3). La méthode de Ralston d’ordre 3


[116] utilise les coefficients γ1 = 2/9, γ2 = 1/3, γ 3 = 4/9, β 21 = 1/2, β 32 = 3/4 et il est
facile de voir que ces paramètres vérifient les équations 12.69 à 12.72. Le calcul montre que
les expressions impliquées dans la démonstration sont nettement plus complexes que celles
impliquées dans la méthode de Runge-Kutta d’ordre 2, telle qu’on l’a vu dans l’exercice
12.9. C’est pourquoi Butcher [19] propose d’utiliser une technique fondée sur des arbres
représentant les termes associés aux dérivées de f .

* Exercice 12.11 (Analyse de la méthode de Runge-Kutta pour un système autonome)


Considérons le problème de Cauchy, que l’on transforme en système autonome avec la trans-
formation définie dans l’exercice 12.2. Utilisons une méthode de Runge-Kutta pour approcher
la solution du système d’équations autonomes.
358 Chapitre 12 • EDO

f(y)

Figure 12.16 – Une fonction Lipschitizienne.

1. Montrer que les équations 12.19 sont satisfaites.


2. Faire de même pour l’équation 12.20.

* Exercice 12.12 (Dérivées de y) Supposons que le système d’EDO est autonome.


1. Montrer que :
00 0 0
y (t) = f (y (t))f (y (t)) = f f (12.75)

pour tout t ≥ t 0, où on a ignoré les termes entre parenthèses pour simplifier l’expres-
sion.
2. Montrer que, pour tout t ≥ t0 , on a :

y 000(t) = f 00 ff + f 0 f 0 f. (12.76)

Remarque 12.6 (Dérivées de y). Dans l’équation 12.75, le terme f 0 représente la matrice
jacobienne de f et l’expression f 0 f est le produit de la matrice jacobienne par le vecteur f .
Dans l’équation 12.76, le terme f 0 f 0 représente un produit matrice-matrice. Le terme f 00 est
un tenseur d’ordre 3. Le fait que l’EDO soit autonome simplifie considérablement l’analyse
[19].

Définition 12.13 (Fonction localement lipschitzienne). Soit f (y ) une fonction continue sur
R. La fonction f est lipschitzienne par rapport à y s’il existe un réel L ≥ 0 tel que pour tous
y 1 , y2 ∈ R :

|f (y1 ) − f (y2 )| ≤ L|y1 − y 2 |. (12.77)

Remarque 12.7. La figure 12.16 présente une fonction lipschitzienne. On y considère un


double cône dont la pente est égale à L. Comme la fonction est lipschitzienne, la courbe de
la fonction est entièrement contenue dans le double cône et ce, quelque soit le point où on
le fait « glisser » le long de la courbe. L’ouverture du cône nécessaire pour observer cette
propriété dépend de la valeur absolue de la plus grande dérivée. Plus précisément, les points
(y2 , z2) ∈ R 2 appartiennent au double cône de centre (y1 , z1 ) ∈ R2 si |z 1 − z2 | ≤ L|y1 − y2 |.

Définition 12.14 (Fonction lipschitzienne par rapport à une variable). Soit f (t, y ) une
fonction continue sur R × R. La fonction f est lipschitzienne par rapport à y s’il existe un
réel L ≥ 0 tel que :

|f (t, y 1 ) − f (t, y 2)| ≤ L|y 1 − y2 | (12.78)

pour tout t ∈ R et tous y1 , y2 ∈ R.

Certaines fonctions sont dérivables et Lipschitziennes, par exemple les fonctions sin(x) et
cos(x) dont les dérivées sont plus petites que 1. Certaines fonctions ne sont pas dérivables,
mais sont tout de même Lipschitziennes. Par exemple, la fonction |x| possède une dérivée
12.12 • Exercices 359

discontinue en x = 0. Toutefois, comme la pente de la fonction est inférieure à 1, la fonc-


tion est lipschitzienne. Certaines fonctions sont dérivables, mais pas Lipschitziennes. C’est
notamment le cas de la fonction exp(x), pour x ∈ R, qui n’est pas lipschitzienne sur R car

sa dérivée n’est pas bornée. C’est également le cas de la fonction x pour x ∈ [0, 1], dont la
dérivée en x = 0 n’est pas bornée.

* Exercice 12.13 (Fonction lipschitzienne) Soit f (t, y ) une fonction continue sur R × R.
Supposons que f est dérivable par rapport à y et que sa dérivée est bornée. Montrer que f
est lipschitzienne par rapport à y .

* Exercice 12.14 (Propriétés de la méthode d’Euler) On considère le problème de Cauchy


de la définition 12.1, que l’on résout par la méthode d’Euler. On note h le pas de discrétisation
temporelle. Supposons que f est lipschitzienne par rapport à y et notons L > 0 la constante
associée. Soient v0 , w0 deux réels. On considère la méthode d’Euler pour les termes initiaux
v0 et w0 :

vn+1 = vn + hf (t n, v n ), wn+1 = wn + hf (t n, w n) (12.80)

pour n ≥ 0.
1. Montrer que, pour n ≥ 0, on a :

|vn+1 − w n+1 | ≤ (1 + hL)|vn − wn |. (12.81)

2. En déduire que, pour n ≥ 0, on a :

|vn − w n | ≤ (1 + hL)n |v0 − w 0|. (12.82)

*** Exercice 12.15 (Erreurs globale et locale de la méthode d’Euler) On considère le


problème de Cauchy de la définition 12.1, que l’on résout par la méthode d’Euler. On note
h le pas de discrétisation temporelle. Supposons que f est lipschitzienne par rapport à y et
notons L > 0 la constante associée. On considère la méthode d’Euler.
1. La partie gauche de la figure 12.17 montre que l’écart entre la solution exacte y (tn ) et
la méthode d’Euler yn est la somme de plusieurs erreurs locales. Pour tout i ≥ 0, soit
(i)
yn la méthode d’Euler ayant comme condition initiale y(t i ), c’est-à-dire :
(i)
 
y n+1 = y(ni) + hf tn , y (ni)
y (ii) = y (ti )

pour n ≥ i. La partie droite de la figure 12.17 illustre cette situation. Utiliser l’inégalité
12.82 pour montrer que, pour i ≥ 1, on a :
(i+1) (i)
|y n − yn | ≤ (1 + hL)n−(i+1) di+1 (12.83)

pour n ≥ i + 1 où di+1 est l’erreur de discrétisation locale de la méthode d’Euler.


2. En déduire qu’il existe une constante M et δ > 0 tels que, pour tout h < δ et pour
n ≥ 0, on a :

X
n−1

en ≤ (1 + hL) j Mh 2 . (12.84)
j=0

3. Montrer que, pour tout n ≥ 0 et tout x ≥ 0, on a :

(1 + x) n ≤ exp(nx). (12.85)
360 Chapitre 12 • EDO

y(t) y 0

y(t 4) (i )
y(t i)=yi
y(t)
(i+1)
y1 y(ti+1)=y i+1
y4 (i)
y2 y3 y i+1
t0 t1 t2 t3 t4 t ti ti+1 t

Figure 12.17 – À gauche, l’éventail de Lady Windermere. À droite, l’éventail de


Lady Windermere à l’itération i.

4. En déduire que, pour n ≥ 0, on a :


M
en ≤ (exp(nhL) − 1)h. (12.86)
L
5. Soit T la durée de la simulation. On suppose que, pour tout n ≥ 1, le pas de discréti-
sation temporel est égal à h = Tn . En conclure que, lorsque h → 0, on a en = O (h).

Remarque 12.8 (L’éventail de Lady Windermere). Selon [60], la figure 12.17 est dûe à Ge-
rhard Wanner. La figure montre le lien entre l’erreur locale qui est d’ordre O (h2 ) et l’erreur
locale qui, comme le montre l’exercice 12.15, est d’ordre O (h).

*** Exercice 12.16 (Pas optimal pour une méthode d’ordre p) Démontrer le théorème
12.2 page 340.

** Exercice 12.17 (Approximation de la date critique de surfusion frasil)


1. Démontrer la première partie de l’équation 12.32, c’est-à-dire l’équation pour T˜.
2. Démontrer la seconde partie de l’équation 12.32, c’est-à-dire l’équation pour c̃.
3. Démontrer l’équation 12.34.
Chapitre 13

Équations non linéaires

Dans ce chapitre, nous présentons différentes méthodes numériques pour résoudre


une équation non linéaire du type f (x) = 0. Nous présentons le conditionnement du
problème ainsi que les limitations des méthodes.
Il y a différentes situations pratiques dans lesquelles il est nécessaire d’utiliser une
méthode numérique pour résoudre une équation non linéaire. De toute évidence, trou-
ver x tel que x2 = 2 est très facile, puisque la fonction racine carrée est disponible en
Python. Pour implémenter la fonction racine carrée dans la librairie mathématique de
Python, on peut utiliser la méthode de Newton. Beaucoup d’autres exemples peuvent
être cités. Par exemple, dans le contexte du calcul des probabilités, il est parfois né-
cessaire de déterminer x (le quantile) tel que la probabilité que P (X < x) = α où α
est une probabilité donnée. Nous reviendrons sur ce sujet à la fin de ce chapitre pour
observer d’autres applications.
Chaque zéro d’une fonction, s’il existe, peut être défini de la manière suivante.
Définition 13.1 (Zéro d’une fonction). Soit f une fonction de R dans R. On dit que
x est un zéro de f si f (x) = 0.
Lorsque f est un polynôme, on dit que x est une racine du polynôme. Toutefois,
dans le cas où la fonction f est un polynôme, les méthodes présentées dans ce chapitre
ne sont pas les plus appropriées. En effet, il est plus efficace dans ce cas de calculer les
valeurs propres de la matrice compagnon du polynôme. C’est pourquoi les méthodes
présentées ici sont plus appropriées dans le cas où f est une fonction non linéaire plus
générale qu’un polynôme.
Lorsqu’on analyse les solutions de l’équation non linéaire, plusieurs cas peuvent se
présenter. Comme on le voit dans la figure 13.1, il peut y avoir une solution unique,
aucune solution, ou bien plusieurs solutions. En général, on ne peut pas savoir à
l’avance dans quel cas on se trouve. Les méthodes numériques que nous allons voir
dans la suite permettent de calculer une approximation d’une seule solution. S’il
existe plus d’une solution, une méthode peut consister à découper l’intervalle global
en plusieurs sous-intervalles. Toutefois, déterminer les bornes de ces sous-intervalles
peut être tout aussi délicat.
Dans la plupart des situations, la fonction f est associée à une erreur d’évaluation
qu’il faut prendre en compte. C’est le cas lorsqu’on évalue la fonction f avec des
nombres à virgule flottante en Python. L’erreur peut être relativement petite, par
exemple pour une fonction comme sin ou exp, ou bien relativement grande comme par

361
362 Chapitre 13 • Équations non linéaires

f(x) f(x) f(x)

x x x

Figure 13.1 – Différents types de zéros d’une fonction.

y
~
0
x x+Δx

Figure 13.2 – Conditionnement d’un zéro d’une fonction.

exemple lorsque la fonction f est issue d’une méthode numérique associée à une erreur
de discrétisation. Dans ce cas, il est nécessaire de prendre en compte la sensibilité du
calcul du zéro aux erreurs d’évaluation de la fonction f .

13.1 Conditionnement d’une équation non linéaire


Dans cette section, nous présentons le conditionnement du zéro d’une fonction et
nous présentons des exemples de problèmes mal conditionnés.
Pour définir le conditionnement, on doit choisir une erreur absolue (et non relative)
sur f , car f (x) = 0. Par cohérence, on peut également choisir une erreur absolue
pour x, ce qui mène à la définition suivante.

Définition 13.2 (Conditionnement d’un zéro). Soit x ∈ R tel que y = f (x) = 0. Pour
toute perturbation ∆x ∈ R, soient x̃ et ỹ définis par : x̃ = x + ∆x et ỹ = f (x + ∆x).
Le conditionnement de la solution x de l’équation non linéaire est :

eabs (x, x)
˜
cZ (x) = lim
∆x→0 e abs(y, y)
˜

où eabs est l’erreur absolue.

Dans les équations précédentes, le nombre ∆x est une perturbation de x. Dans


la définition précédente, le conditionnement est la limite du quotient de la sortie sur
l’entrée, puisque la variable y = f (x) représente l’entrée et la variable x représente la
sortie, c’est-à-dire la solution. La figure 13.2 présente la situation du conditionnement
d’un zéro. Sous certaines hypothèses de régularité de la fonction f , la définition pré-
cédente peut être simplifiée en utilisant un développement de Taylor de la fonction au
voisinage de x. On peut alors obtenir une expression du conditionnement d’un zéro,
ce qui mène au théorème suivant.

Théorème 13.1 (Conditionnement d’un zéro). Supposons que f ∈ C 1 (R). Soit x ∈ R


tel que f (x) = 0 et f 0 (x) 6= 0. Alors :
 
 1 
cZ (x) =  0 . (13.1)
f (x) 
13.2 • Méthode de la bissection (dichotomie) 363

Bien conditionné Mal conditionné

f(x) exact f(x)


exact

x x
approx.
approx.

Figure 13.3 – Conditionnement d’un zéro d’une fonction. À gauche, un zéro bien
conditionné. À droite, un zéro mal conditionné.

La preuve est donnée dans l’exercice 13.1. Si f0 (x) est proche de zéro, alors
1/|f 0 (x)| est grand et le problème est mal conditionné : un petit changement absolu
sur f provoque un grand changement absolu sur x.
La figure 13.3 présente le conditionnement d’un zéro d’une fonction. Dans la figure,
le trait plein représente la valeur exacte de f (x) et le trait pointillé représente une
évaluation de f (x) entachée d’erreur. Dans la figure de gauche, la fonction f (x) coupe
l’axe des abscisses en un seul point, mais les traits pointillés coupent l’axe en deux
points qui forment un intervalle : cela signifie que, à cause des erreurs d’évaluation
sur f , il y a une erreur sur le zéro qui est situé dans l’intervalle défini par les courbes
en pointillés. Dans la figure de droite, la pente de la fonction en x est plus proche de
zéro en valeur absolue, ce qui écarte les bornes de l’intervalle : ainsi, l’erreur sur le
zéro est plus grande à droite.
Pour évaluer la précision d’un zéro approché x̃, on peut considérer deux critères.
Le premier critère est le résidu, c’est-à-dire |f (x̃)| ≈ 0 tandis que le second critère
est l’erreur absolue, c’est-à-dire |x − x̃| ≈ 0. Si le conditionnement est petit, alors les
deux critères sont équivalents. En revanche, si le conditionnement est grand, les deux
critères sont différents : même si le résidu est petit, l’erreur absolue sur x peut être
grande.

13.2 Méthode de la bissection (dichotomie)


Dans cette section, nous présentons l’algorithme de la bissection. En français, on
utilise parfois le terme de « dichotomie ». Pour établir les bases théoriques de l’algo-
rithme, nous introduisons le théorème de la valeur intermédiaire1 , puis le théorème
de Bolzano. Nous présentons enfin une implémentation de l’algorithme en Python. La
méthode de la dichotomie est fondée sur le théorème suivant.

Théorème 13.2 (Théorème de la valeur intermédiaire). Soit f une fonction réelle


continue sur un intervalle [a, b]. Pour tout réel y entre f (a) et f (b), il existe x entre
a et b tel que f (x) = y.
1Dans certains ouvrages, par exemple [95] page 80, ce théorème est nommé « théorème des valeurs

intermédiaires ». En anglais, il n’y a pas de pluriel, ce qui est cohérent avec le théorème, qui garantit
l’existence d’au moins une valeur intermédiaire. Bien sûr, le théorème pourrait être généralisé à un
ensemble fini ou infini de valeurs intermédiaires, mais ce n’est pas ce qui est explicitement indiqué.
Dans [33] page 246, ce théorème n’a pas de nom particulier.
364 Chapitre 13 • Équations non linéaires

f(a)
y
f(a)
f(b) b
f(x)
a x
a x b f(b)

Figure 13.4 – À gauche, le théorème de la valeur intermédiaire. À droite, le théorème


de Bolzano.

f(a)
x b
f(x)
f(b)
a (a+b)/2

Figure 13.5 – Principe de l’algorithme de bissection.

La partie gauche de la figure 13.4 présente le théorème de la valeur intermédiaire


dans le cas particulier où f (b) ≤ y ≤ f (a). On observe que, dans ce cas particulier,
l’équation y = f (x) possède trois solutions différentes, mais le théorème ne garantit
qu’une seule de ces trois solutions. Le théorème de Bolzano est un cas particulier du
théorème précédent, dans lequel y = 0.
Théorème 13.3 (Théorème de Bolzano). Soit f une fonction réelle continue sur un
intervalle [a, b]. Si f (a) et f (b) sont de signes contraires, alors il existe x entre a et
b tel que f (x) = 0.
La partie droite de la figure 13.4 présente le théorème de Bolzano, dans le cas
particulier où f (a) > 0 et f (b) < 0. Ce théorème est exploité dans la méthode de la
dichotomie, que nous commençons par présenter dans un cas particulier.
√ √
Exemple 13.1 (Calcul de 2 par bissection). Calculons 2 par la méthode de la
dichotomie. C’est le zéro de la fonction f (x) = x2 − 2 pour tout x ≥ 0. Pour utiliser
l’algorithme de la bissection, nous avons besoin d’un intervalle initial√qui encadre le
zéro. On a f (1) = 1 − 2 = −1 < 0 et f (2) = 4 − 2 = 2 > 0. Donc 2 ∈ [1, 2]. Les
itérations de l’algorithme sont les suivantes.
• On considère le point au milieu√de l’intervalle [1, 2], c’est-à-dire le point x =
1+2
2 = 1.5. On a f (x) > 0, donc 2 ∈ [1, 1.5].
• On considère le point au milieu de l’intervalle [1, 1.5]. C’est le point x = 1+1.5
=
√ 2
1.25. On a f (x) < 0, donc 2 ∈ [1.25, 1.5].
• On considère le point x = 1.375, puis x = 1.312, etc.
La figure 13.5 présente le principe de l’algorithme de la bissection. Dans la figure,
on a f ((a+b)/2) > 0 et f (a) > 0. C’est pourquoi le prochain intervalle est [(a +b)/2, b].
De manière générale, à chaque itération de l’algorithme, on met à jour la variable a ou
b de telle sorte que f (a) et f (b) restent de signes contraires. Le script Python suivant
implémente la méthode de la bissection. En entrée de l’algorithme, il utilise a et b
qui sont les bornes de l’intervalle initial. On fait l’hypothèse que f (a) et f (b) sont
13.3 • Implémentation 365

non nuls et de signes contraires. De plus, l’utilisateur donne abstolx, une tolérance
absolue sur x. En sortie de l’algorithme, la variable c contient la solution approchée.
À chaque étape de l’algorithme, on calcule c au milieu de l’intervalle entre a et b,
et on évalue f(c). Si f(c) est exactement zéro, alors l’algorithme s’arrête. Sinon, on
met à jour a ou b, en fonction du signe de f(c).
1 fa = f (a )
2 fb = f (b )
3 c = (a + b ) / 2.0
4 fc = f (c )
5 while abs ( b - a) > abstolx :
6 if fc == 0:
7 break
8 elif sign ( fa ) != sign (fc ): # x* dans [a ,c]
9 b = c
10 fb = fc
11 else : # x * dans [c , b]
12 a = c
13 fa = fc
14 c = (a + b ) / 2.0
15 fc = f (c )
On remarque que la variable c est calculée avant d’entrer dans la boucle while.
En conséquence, la variable c a une valeur correcte, même dans le cas particulier où
la condition est fausse dès le début et qu’il n’y a aucune itération dans l’algorithme
(c’est-à-dire si l’intervalle donné par l’utilisateur est petit).

13.3 Implémentation
Dans cette section, nous présentons comment implémenter la condition d’encadre-
ment du zéro dans l’algorithme de la dichotomie et comment implémenter le critère
d’arrêt.
Comme le documentent les auteurs de [46] (p.162), une attention particulière doit
être accordée aux détails de l’implémentation des méthodes de recherche de zéro
lorsqu’on utilise des nombres à virgule flottante. Supposons que a et b sont deux
nombres réels tels que f (a)f (b) < 0. Le théorème de Bolzano (théorème 13.3) stipule
qu’il existe x ∈ [a, b] tel que f (x) = 0. Pour vérifier que la condition f (a)f (b) < 0 est
satisfaite, on peut être tenté d’implémenter le test suivant dans notre code :
1 if f (a ) * f( b) < 0.0: # Ne pas le faire
C’est une maladresse car cela peut générer des underflow ou overflow car le produit
f(a) * f(b) peut devenir trop grand et être représenté par le nombre à virgule
flottante INF (ou -INF) ou trop proche de zéro et être représenté par le nombre
à virgule flottante 0.0 (ou -0.0). Dans l’exemple suivant, nous présentons deux
cas particuliers dans lesquels une implémentation maladroite mène à une difficulté
lorsqu’on utilise des nombres à virgule flottante.
Exemple 13.2 (Une implémentation maladroite du test d’encadrement). Le script
suivant2 implémente la fonction f dont nous recherchons le zéro dans l’intervalle [a, b],
ainsi que la solution exacte x.
2Script Python : Zeros/Scripts/Py3/[Link].
366 Chapitre 13 • Équations non linéaires

1 import numpy as np
2 def f (x ):
3 y = np . exp (x) - 5. 221 469 6897 641 44 e173
4 return y
5

6 a = 350.0
7 b = 450.0
8 x = 400.0
Le script suivant évalue la fonction f aux points a, b et x, puis évalue le produit
fa * fb.
1 fa = f (a )
2 fb = f (b )
3 fx = f (x )
4 p = fa * fb
5 print ( " fa = %.3 e" % ( fa ))
6 print ( " fb = %.3 e" % ( fb ))
7 print ( " fx = %.3 e" % ( fx ))
8 print ( "p = %.3 e " % (p ))
Le script précédent affiche :
1 fa = -5.221 e +173
2 fb = 2.707 e +195
3 fx = 0.000 e +00
4 p = - inf
On observe que, bien que les deux nombres fa et fb soient représentables par des
nombres à virgule flottante, leur produit fa * fb ne l’est pas, ce qui génère un over-
flow. En effet, la valeur mathématique du produit est égale à −1.413 × 10369 ce qui
est inférieur au nombre à virgule flottante le plus négatif. Ce nombre réel est repré-
senté par le flottant -INF. Cela n’est pas un problème, car l’arithmétique des flottants
respecte le signe dans ce cas particulier (mais Python génère un avertissement).
Le cas suivant est plus problématique :
1 def f (x ):
2 y = np . exp (x) - 1. 915 169 596 7140 057 e -174
3 return y
4

5 a = -450.0
6 b = -350.0
7 x = -400.0
Si l’on exécute les mêmes instructions que précédemment, nous obtenons l’affichage
suivant :
1 fa = -1.915 e -174
2 fb = 9.930 e -153
3 fx = 0.000 e +00
4 p = -0.000 e +00
On observe que le produit p est représenté par le flottant zéro (ou plus exactement,
par le zéro négatif, puisque zéro a un bit de signe). En effet, le produit exact est égal
à −1.902 × 10−326, ce qui est très proche de zéro et est représenté par le nombre à
virgule flottante zéro (négatif, car le zéro possède un bit de signe qui est négatif dans
13.3 • Implémentation 367

ce cas particulier). Le problème est que le test d’encadrement maladroit n’est pas
vérifié :
1 >>> print (fa * fb < 0.0)
2 False

Pour résoudre ce problème, il suffit d’utiliser la fonction [Link] qui retourne 1


si l’argument est positif, zéro s’il est nul ou -1 s’il est négatif. La condition peut donc
être implémentée de la manière suivante :
1 if np . sign ( fa ) != np . sign ( fb ):
Nous mettons en œuvre cette méthode dans l’exemple suivant.
Exemple 13.3 (Une implémentation correcte du test d’encadrement). Dans les deux
cas précédents, nous obtenons3 :
1 >>> np . sign ( fa )
2 -1.0
3 >>> np . sign ( fb )
4 1.0
5 >>> print (np . sign ( fa ) != np . sign ( fb ))
6 True

Analysons maintenant l’implémentation de la condition d’arrêt de l’algorithme.


Dans le script présenté dans la section 13.2, la condition d’arrêt porte sur la longueur
de l’intervalle |b − a| :
1 abs (b - a) > abstolx # Co ndition A
où abstolx est une tolérance absolue sur x donnée par l’utilisateur. Ainsi, la boucle
s’arrête lorsque la longueur est inférieure à un seuil, ce qui mène à une tolérance
absolue sur x. Si la solution x est différente de zéro (ce qui est, nous le supposons, le
cas le plus fréquent), on préfère plutôt utiliser une tolérance relative, car elle permet
de garantir que la solution est associée à une erreur relative garantie. Pour l’obtenir,
on pourrait considérer la condition :
1 abs (b - a) > reltolx * abs ( b) # Condition B
où reltolx est une tolérance relative sur x donnée par l’utilisateur. Le problème
est que si x = 0 et si l’algorithme converge, alors b tend vers zéro. Dans ce cas, la
condition n’est jamais satisfaite et l’algorithme ne s’arrête jamais (ou bien s’arrête
au terme du nombre maximum d’itérations lorsque ce maximum est implémenté dans
l’algorithme). Une méthode simple consiste à considérer la condition d’arrêt :
1 abs (b - a) > reltolx * abs ( b) + abstolx # Cond ition C
Si abstolx = 0, alors la condition C est équivalente à la condition B.
Lorsqu’on fait des calculs en virgule flottante, on peut utiliser une valeur par
défaut du paramètre reltolx égale à un petit multiple de M où M est la précision
machine. C’est en effet la valeur optimale dans le cas idéal où le conditionnement
du problème est égal à 1. Avec des doubles, cela correspond environ à reltolx =
1.e-15. La valeur par défaut abstolx = 0 peut être choisie, car cela mène à une
erreur relative fondée uniquement sur reltolx. Cela laisse l’option, si l’utilisateur le
souhaite, de configurer la tolérance absolue si c’est nécessaire, par exemple si x est
très proche de zéro.
3Script Python : Zeros/Scripts/Py3/[Link].
368 Chapitre 13 • Équations non linéaires

13.4 Nombre d’itérations de la bissection


Dans cette section, nous analysons la vitesse de convergence de la méthode de la
bissection et évaluons le nombre d’itérations nécessaire pour atteindre une précision
prédéterminée. Nous allons observer la convergence presque linéaire √ de l’algorithme.
Dans l’exemple suivant, nous calculons une approximation de 2 par la méthode
de la bissection et observons la vitesse de convergence de l’algorithme.

Exemple 13.4 (Convergence de la méthode de la bissection). Reprenons les √données


de l’exemple 13.1 et utilisons la méthode de la dichotomie pour calculer 2. Dans
le script suivant 4, nous utilisons la fonction bisection du module fzero développé
pour ce cours5. Nous commençons par définir la fonction myFunction qui implé-
mente la fonction dont nous recherchons le zéro. Puis, nous faisons appel à la fonction
bisection qui prend en entrée la fonction et les bornes de l’intervalle de recherche
et retourne la variable xs contenant la solution approchée. L’algorithme retourne
également la variable history qui est une liste contenant les solutions intermédiaires
produites par l’algorithme. Par défaut, l’algorithme utilise un critère d’arrêt fondé sur
une tolérance relative, en utilisant la condition présentée dans la section précédente.
La valeur par défaut est égale à 2 M où M est la précision machine.
1 from fzero import bisect ion
2

3 def my Functi on (x) :


4 y = x ** 2 - 2
5 return y
6

7 a = 1.0
8 b = 2.0
9 xs , histor y = bi section ( myFunction , a , b )

Pour afficher la solution approchée à la dernière itération ainsi que la liste des points
intermédiaires, on peut utiliser le script suivant :
1 print ( " xs = " , xs )
2 for x _int erme diat e in history :
3 print ( "x =" , x_i nter medi ate )

L’algorithme affiche alors les points intermédiaires suivants :


1 x =1.0 000 000 000 000 000 0
2 x =2.0 000 000 000 000 000 0
3 x =1.5 000 000 000 000 000 0
4 x =1.2 500 000 000 000 000 0
5 x =1.3 750 000 000 000 000 0
6 ...
7 x =1.4 142 135 623 730 953 7
8 x =1.4 142 135 623 730 951 5
9 x =1.4 142 135 623 730 949 2

Environ 50 itérations sont nécessaires pour obtenir 16 chiffres décimaux corrects.


4Script Python : Zeros/Scripts/Py3/[Link].
5Script Python : Scripts-Eleves/Py3/[Link].
13.5 • Méthode de Newton 369

Si l’on se donne une tolérance absolue sur x, on peut prévoir le nombre d’itéra-
tions de la méthode de la dichotomie. En effet, après n itérations la longueur `n de
l’intervalle de recherche est :
`n = `1/2 n
pour n ≥ 1 où ` 1 est la longueur initiale. Cette remarque mène au théorème suivant.
Théorème 13.4 (Nombre d’itérations de la dichotomie). Soit f une fonction réelle
continue. On recherche x tel que f (x) = 0 par la méthode de la dichotomie. Soit [a, b]
l’intervalle initial contenant la racine, de longueur `1 = b − a. Soit  > 0 un réel. Si :

n = dlog2 (`1 /)e (13.2)

alors `n ≤ .
L’équation 13.2 fait intervenir la fonction « ceil », que nous avons déjà présentée
dans la définition 4.7 page 57. En d’autres termes, pour avoir un intervalle de longueur
inférieure à une tolérance absolue  donnée, il suffit de réaliser i itérations de la
méthode de la dichotomie, où i est donné par l’équation 13.2. La preuve de ce théorème
est donnée dans l’exercice 13.4. Par exemple, si l’on impose une tolérance absolue égale
à  = 2−52 ≈ 10 −16 et `1 = 1, alors n = 52 itérations sont nécessaires.
Soit xn le milieu de l’intervalle de recherche à l’itération n pour n ≥ 1. Soit e n =
|xn − x| l’erreur absolue où x est la solution exacte. Il n’est pas possible de démontrer
que en+1 ≤ 12 en c’est pourquoi on ne peut pas dire que la convergence est linéaire. En
pratique, l’erreur absolue est globalement décroissante, mais il arrive qu’elle remonte
légèrement lors d’une itération. Pourtant, on peut dire que, en moyenne, à chaque
itération, l’algorithme gagne un bit de précision, de telle sorte que, avec des nombres à
virgule flottante de type doubles, 52 itérations sont nécessaires. Les calculs précédents
montrent que la convergence de la dichotomie est approximativement linéaire, avec le
taux 1/2.
Exemple 13.5 (Convergence de la méthode de la bissection). Reprenons les données
de l’exemple 13.1. La figure 13.66 montre la convergence de la dichotomie dans le
cas de la fonction f (x) = x2 − 2 avec l’intervalle de recherche initial [1, 2]. On ob-
serve que l’erreur tend globalement vers zéro avec une tendance approximativement
linéaire en fonction du nombre d’itérations. L’erreur peut cependant occasionnelle-
ment augmenter, par exemple entre les itérations 2 et 3, ainsi qu’entre les itérations
8 et 9.

13.5 Méthode de Newton


Dans cette section, nous présentons la méthode de Newton (également nommée
méthode de Newton-Raphson) pour résoudre une équation non linéaire. Nous introdui-
sons la méthode et présentons un algorithme en Python qui implémente la méthode.
Soit x un zéro de la fonction f . On suppose que x1 , une approximation gros-
sière de x, est donné. Soit xn l’approximation de x à l’itération n. Considérons le
développement de Taylor de la fonction f au point xn :
f (xn+1 ) = f (xn ) + f 0(x n)(x n+1 − xn ) + O((xn+1 − xn )2 )
6Script Python : Zeros/Scripts/Py3/[Link].
370 Chapitre 13 • Équations non linéaires

Convergence de la dichotomie

Log10(erreur)
0

−10

0 20 40
Itérations

Figure 13.6 – Convergence de la dichotomie pour la fonction f (x) = x 2 − 2.

quand xn+1 − x n → 0. Négligeons le terme d’ordre 2 et supposons que xn+1 est


solution de l’équation f (xn+1 ) = 0. Cela implique :

f (xn ) + f 0 (xn )(xn+1 − x n ) = 0

et mène à la définition de la méthode de Newton.


Définition 13.3 (Méthode de Newton). Soit x1 une approximation de la solution.
La méthode de Newton est :
f (xn )
x n+1 = xn −
f 0 (x n)
pour n ≥ 1 si f 0(x n) 6= 0.
Étant donné xn, soit g la fonction définie par l’équation :

g(x) = f (xn ) + f0 (x n )(x − xn )

pour tout x ∈ R. Remarquons que le prochain itéré xn+1 est solution de l’équation
g(x) = 0. De plus, observons que la fonction g vérifie deux propriétés. Premièrement,
sa pente est égale à g 0 (x) = f 0(xn ). Deuxièmement, elle est telle que g (xn) = f (x n ).
En d’autres termes, au point xn , la méthode de Newton évalue la pente f 0 (xn ) et forme
une droite de pente f 0(xn ) passant par le point (xn , f (xn )). Le prochain point xn+1
est l’intersection de cette droite avec l’axe des abscisses.
Les itérations suivantes sont présentées dans la partie gauche de la figure 13.7. Au
point x n, on trace la droite verticale, puis la droite tangente à la courbe. Le point
x n+1 est l’intersection de la tangente avec l’axe des abscisses. On obtient une forme
en zigzag caractéristique de cette méthode. On observe sur la figure que la suite des
points x n converge rapidement vers la solution x et que les valeurs f (xn) tendent
rapidement vers zéro.

Exemple 13.6 (Calcul de 2 par la méthode de Newton). Reprenons √ les données de
l’exemple 13.1 et utilisons la méthode de Newton pour calculer 2. On considère le
point initial x = 1. Dans le script suivant7 , nous définissons la fonction myFunction
pour évaluer la fonction f et la fonction myFunctionPrime pour évaluer la dérivée f 0 .
Puis, nous utilisons la fonction newton du module fzero pour utiliser la méthode de
Newton.
7Script Python : Zeros/Scripts/Py3/[Link].
13.5 • Méthode de Newton 371

f(x 1)
f(xn-1 )
f(x 2) f(xn)
f(x 3) x
x1 x2 x3 xn-1 xn xn+1 x

Figure 13.7 – À gauche, itérations caractéristiques de la méthode de Newton. À


droite, principe de la méthode de la sécante.

1 from fzero import newton , newtongu i


2

3 def my Functi on (x) :


4 y = x ** 2 - 2
5 return y
6

7 def m yFun ctio nPr ime (x ):


8 y = 2 * x
9 return y
10

11 xs , histo ry = newton ( myFunction , 1.0 , myF unct ion Prim e )

La méthode de Newton génère les points intermédiaires suivants :


1 x =1.0 000 000 000 000 000 0
2 x =1.5 000 000 000 000 000 0
3 x =1.4 166 666 666 666 667 4
4 x =1.4 142 156 862 745 098 9
5 x =1.4 142 135 623 746 898 7
6 x =1.4 142 135 623 730 951 5

On observe que la méthode obtient une précision maximale (environ 16 chiffres déci-
maux corrects) en seulement 6 itérations.

La méthode de Newton a beaucoup d’avantages, mais possède aussi plusieurs li-


mitations. Premièrement, la fonction f doit être dérivable, ce qui impose une certaine
régularité. Deuxièmement, sur le plan pratique, il faut calculer f 0(x). Cela peut être
une limitation lorsqu’on peut évaluer f , mais pas sa dérivée. Pour calculer la dérivée
f 0 (x), on peut utiliser différentes méthodes. Dans le cas le plus simple, la dérivée est
fournie par l’utilisateur. Sinon, on peut utiliser des formules de différences finies et
nous avons vu plusieurs méthodes pour cela dans le chapitre 9. Dans certains cas, il
est possible d’utiliser des méthodes de différentiation automatique qui sont capables
d’évaluer exactement la dérivée, mais nous ne les présentons pas dans le cadre de ce
cours. Enfin, le point initial x1 doit être proche de la solution exacte x, faute de quoi
la méthode peut ne pas converger. Dans la section 13.6, nous verrons ce qui se passe
lorsque le point initial est éloigné du zéro.
L’algorithme Python suivant implémente la méthode de Newton. Il prend en entrée
un point initial x1 ainsi que reltolx, une erreur relative sur x. En sortie, l’algorithme
calcule la variable x contenant une approximation de la solution. À chaque itération,
la variable xprev contient x n tandis que la variable x contient x n+1 . La variable k
372 Chapitre 13 • Équations non linéaires

contient l’indice de l’itération en cours. Si le nombre d’itérations dépasse 100, alors


l’algorithme échoue et une exception est générée.

1 xprev = float ( " inf " )


2 x = x1
3 k = 0
4 while abs ( x - xprev ) > reltolx * abs ( x) :
5 xprev = x
6 fx = f (x )
7 s = fprime (x )
8 x = x - fx / s
9 k = k + 1
10 if k > 100:
11 raise Val ueErro r ( " Stop . " )

Le nombre d’itérations maximal, égal à 100 dans l’algorithme précédent, n’est pas fa-
cile à déterminer. Si le nombre maximum d’itérations est atteint, on peut soit augmen-
ter le nombre d’itérations maximum, soit analyser le problème et, peut-être, changer
de méthode numérique.
La condition d’arrêt :

1 abs (x - xprev ) > reltolx * abs ( x)

est une condition d’arrêt portant sur l’erreur relative sur x. La valeur initiale de xprev
est choisie de telle sorte que la condition d’arrêt est fausse lors de la première itération,
ce qui permet d’entrer dans la boucle itérative. Dans le meilleur cas, si l’évaluation
de la fonction f est suffisamment précise, on peut obtenir une approximation de la
solution exacte x telle que f (x) ≈ 0 avec une erreur égale à un multiple la précision
machine. C’est pourquoi, on peut choisir reltolx égal, par exemple, au double de la
précision machine  M, c’est-à-dire approximativement 4 × 10−16. En Python, on peut
utiliser les instructions suivantes, qui se fondent sur l’attribut float_info du module
sys.

1 from sys import floa t_info


2 reltolx = 2 * float_i nfo . epsil on

Nous avons analysé dans cette section la méthode de Newton et défini un critère
d’arrêt pour l’algorithme. Toutefois, nous ne connaissons pas la vitesse de conver-
gence de l’algorithme lorsque celui-ci converge, ni même les conditions assurant la
convergence de la méthode. Dans la prochaine section, nous analysons les conditions
permettant d’assurer la convergence de la méthode ainsi que sa vitesse de convergence,
lorsque celle-ci converge. Deuxièmement, nous avons vu dans la section 13.1 qu’une
équation non linéaire peut être mal conditionnée. On peut alors se demander quel est
le comportement de la méthode de Newton dans ce cas. Sur ce sujet, nous allons voir
dans la prochaine section des exemples pour lesquels la méthode de Newton échoue ou
possède une convergence très lente. Enfin, nous avons vu que la méthode de Newton
nécessite d’évaluer la dérivée de la fonction f . Si on ne dispose pas de la dérivée ou
qu’on ne souhaite pas utiliser une approximation de celle-ci, une alternative consiste
à utiliser la méthode de la sécante, que nous étudierons dans la section 13.7.
13.6 • Convergence de la méthode de Newton 373

13.6 Convergence de la méthode de Newton


Dans cette section, nous analysons la convergence de la méthode de Newton et
nous présentons des contre-exemples dans lesquels la méthode ne converge pas. En
particulier, nous allons observer que la méthode de Newton peut être très lente dans
le cas où nous tentons de calculer une racine multiple d’un polynôme.
Le théorème suivant présente la convergence quadratique de la méthode de New-
ton, sous certaines hypothèses.

Théorème 13.5 (Convergence de la méthode de Newton). Supposons que f ∈ C 2(R).


Supposons que x est un réel tel que f (x) = 0 avec f 0 (x) 6= 0. On considère l’erreur
absolue en = |x n − x| pour n ≥ 1. Alors, pour n ≥ 1, on a :
 00 
 f (ξ )  2
en+1 =  0 e
2f (xn )  n

où ξ est un réel entre x et xn .

Cette égalité est démontrée dans l’exercice 13.5. Dans l’exercice 13.6, on démontre
que, sous certaines hypothèses, l’égalité précédente implique que la méthode de New-
ton est associée à une convergence quadratique :

e n+1 = O(e2n ) quand n → +∞.

On peut en déduire que, sous certaines hypothèses, le nombre de chiffres corrects


est approximativement multiplié par deux à chaque itération. C’est une conséquence
immédiate de l’exercice 5.5, page 92. Plus précisément, soit x la solution de l’équation
non linéaire. Alors le nombre de chiffres est approximativement multiplié par 2 si
x ≈ 1 et :
|f 00(x)|
≈ 1.
2|f 0 (x)|
Lorsque le point initial x 1 est éloigné du zéro, la méthode de Newton peut diverger
comme nous le voyons dans l’exemple suivant.

Contre-exemple 13.1 (Division par zéro dans la méthode de Newton). On considère


la fonction f (x) = x3 + 3x2 − 6 pour tout x ∈ R. L’équation f (x) = 0 possède
une seule solution, égale à x = 1.195823345445647153 avec 17 chiffres significatifs.
On considère l’approximation initiale x1 = −2. Puisque f 0 (x) = 3x 2 + 6x, on a
f 0 (x1 ) = 3 × (−2)2 + 6 × (−2) = 0. Par conséquent, la méthode de Newton échoue
à cause d’une division par zéro dès la première itération. Dans la partie gauche de
la figure 13.88 , on présente la solution exacte x? ainsi que le point de départ x 1. La
cause du problème est le fait que le point initial est trop éloigné de la solution : un
point initial x1 plus proche de x? pourrait mener à une convergence plus sûre.

Le contre-exemple précédent est une des motivations pour d’autres méthodes de


recherche de zéros, en particulier la méthode de la sécante que nous allons étudier
dans la section suivante.
Dans certains cas, la méthode de Newton peut itérer sans fin, comme dans
l’exemple suivant.
8Script Python : Zeros/Scripts/Py3/[Link].
374 Chapitre 13 • Équations non linéaires

Zéro 1 f

f (x)
0 x1 0 Newton

y
−5 −1

−2.5 0.0 0.0 2.5


x x

Figure 13.8 – Deux cas de non-convergence de l’algorithme de Newton. À gauche,


une division par zéro. À droite, l’algorithme alterne sans fin entre deux valeurs.

Contre-exemple 13.2 (Non-convergence de la méthode de Newton). Pour tout réel


a, considérons la fonction9 :
p
f (x) = sign(x − a) |x − a|

pour tout réel x. L’unique solution est x = a. Si on utilise la méthode de Newton avec
le point initial x1 6= a, alors l’algorithme génère la suite {x n}n≥1 telle que :

x n+1 − a = −(xn − a)

pour n ≥ 1. Dans la partie droite de la figure 13.810 présente le cas où a = 2 et x1 = 1.


On observe que la méthode de Newton ne converge pas et alterne sans fin entre les
deux valeurs 1 et 3.

Si la racine recherchée est de multiplicité supérieure à 1, alors la convergence de


la méthode de Newton peut être très lente, comme le montre l’exemple suivant.

Contre-exemple 13.3 (Racine de multiplicité m). Pour tout entier m ≥ 1, consi-


dérons la fonction définie par l’équation f (x) = (x − 1)m pour tout x ∈ R. Quel que
soit la valeur entière de m, le réel x = 1 est une racine de la fonction f . Si m > 1,
alors f 0 (x) = m(x − 1)m−1 pour tout x ∈ R. C’est pourquoi, si m > 1, l’équation 13.1
implique que le conditionnement du zéro de la fonction f est infini, puisque f 0 (x) = 0
si x = 1. Si m est pair, alors x = 1 est un minimum global de la fonction f . Si m
est impair, alors le réel x = 1 n’est pas un optimum et on peut tenter d’observer le
comportement de la méthode de Newton avec le point initial x0 = 1.5. La figure 13.911
présente l’erreur absolue en fonction de l’indice de l’itération n pour trois valeurs du
paramètre m = 1, 3, 5, 7. On observe que la convergence de l’erreur absolue vers zéro
est rapide lorsque m = 1. Si m = 3, alors la convergence est plus lente. Avec m = 7, la
convergence est extrêmement lente et après 80 itérations, l’erreur absolue est encore
supérieure à 10−7 .

Le contre-exemple précédent est approfondi dans l’exercice 13.3, où nous montrons


que les racines de multiplicité m > 1 sont particulièrement mal conditionnées.
9Voir [104] page 121.
10Script Python : Zeros/Scripts/Py3/[Link].
11Script Python : Zeros/Scripts/Py3/[Link].
13.7 • Méthode de la sécante 375

f (x) = (x − 1)m
m=1

Erreur absolue
−2
10 m=3
m=5
10−5 m=7

0 50
Itérations

Figure 13.9 – Vitesse de convergence de la méthode de Newton vers la racine x = 1


de multiplicité m, pour différentes valeurs de m.

13.7 Méthode de la sécante


L’idée de la méthode de la sécante est la suivante : au lieu d’évaluer la dérivée
f (xn ), on estime la pente en fonction de xn et x n−1. Par rapport à la méthode de
0

Newton, le principal avantage est qu’il n’y a pas besoin de la dérivée f 0 (x). Comme
nous allons le voir, un des inconvénients est que la convergence est un peu plus lente
que la méthode de Newton. La définition suivante introduit la méthode de la sécante.

Définition 13.4 (Méthode de la sécante). Soient x1 et x2 deux approximations de


la solution. Dans la méthode de la sécante, on calcule la pente :

f (xn) − f (x n−1)
sn = (13.3)
x n − xn−1

pour n ≥ 2. Puis, on met à jour le point par la formule :

f (xn )
xn+1 = xn − (13.4)
sn

pour n ≥ 2.

La partie droite de la figure 13.7 présente le principe de la méthode de la sécante.


Par comparaison avec la partie gauche, on observe que la méthode de la sécante utilise
une pente qui est égale à la dérivée de la fonction pour un point situé entre x√n−1 et
xn . Dans l’exemple suivant, on utilise la méthode de la sécante pour calculer 2.

Exemple 13.7 (Approximation de 2 par la méthode de la sécante). Reprenons √ les
données de l’exemple 13.1 et utilisons la méthode de la sécante pour calculer 2. On
considère l’intervalle de recherche initial [1, 2]. Dans le script suivant12 , on utilise la
fonction secant du module fzero, qui prend en entrée la fonction à annuler ainsi
que les bornes de l’intervalle de recherche initial, et retourne la solution approchée xs
ainsi que la liste history des points intermédiaires.
12 Script Python : Zeros/Scripts/Py3/[Link].
376 Chapitre 13 • Équations non linéaires

1 from fzero import secant


2

3 def my Functi on (x) :


4 y = x ** 2 - 2
5 return y
6

7 a = 1.0
8 b = 2.0
9 xs , histor y = secant ( myFunction , a , b )

La méthode produit les points intermédiaires suivants :


1 x =1.0 000 000 000 000 000 0
2 x =2.0 000 000 000 000 000 0
3 x =1.3 333 333 333 333 334 8
4 x =1.4 000 000 000 000 001 3
5 x =1.4 146 341 463 414 633 4
6 x =1.4 142 114 384 748 700 8
7 x =1.4 142 135 620 573 204 1
8 x =1.4 142 135 623 730 953 7
9 x =1.4 142 135 623 730 951 5

La méthode converge à une précision maximale (c’est-à-dire environ 16 chiffres déci-


maux corrects) en seulement 7 itérations. C’est seulement une itération de plus que
la méthode de Newton.

Pour pouvoir analyser la méthode de la sécante, il est utile d’introduire une nota-
tion permettant de définir un intervalle à partir d’une liste de valeurs réelles.

Définition 13.5 (Intervalle généralisé). Soit {x1 , x 2, . . . , xn } un ensemble de n réels.


On note :
int(x 1, x 2, . . . , x n) = [a, b]
l’intervalle dont les bornes sont a = min(x 1, x2 , . . . , x n) et b = max(x 1 , x2 , . . . , xn ).

Le théorème suivant indique l’erreur de la méthode de la sécante.

Théorème 13.6 (Convergence de la méthode de la sécante). Supposons que f ∈


C 2 (R). On suppose que x est tel que f (x) = 0 et on fait l’hypothèse que f0 (x) 6= 0.
On considère la méthode de la sécante. Soit en = |x − xn | l’erreur absolue à l’itération
n. Alors :
 00 
 f (ξ ) 

e n+1 =  0 0  ene n−1 (13.5)
2f (ξ )

où ξ est un point dans l’intervalle int(x, x n−1, xn ) et ξ 0 est un point dans l’intervalle
int(xn−1 , xn ).

On peut montrer (voir les exercices 13.7 et 13.8) que, sous certaines hypothèses :

en+1 = O(e φn ) quand n → +∞



où φ = (1 + 5)/2 ≈ 1.6 est le nombre d’or. Comme la constante 1.6 est assez proche
de celle de Newton (qui vaut 2), la convergence de la méthode de la sécante est un
13.8 • La condition d’arrêt 377

peu inférieure à la vitesse de convergence de la méthode de Newton dans la plupart


des cas.
L’algorithme Python suivant implémente la méthode de la sécante. Il prend en
entrée deux points a et b tels que f (a) et f (b) sont de signes contraires. En sortie,
l’algorithme calcule la variable c contenant une approximation de la solution. À chaque
itération de l’algorithme, la variable a contient la valeur de xn−1 et la variable b
contient la valeur de x n.
1 fa = f (a )
2 fb = f (b )
3 while abs (b - a) > reltolx * abs ( b) :
4 c = a # c = x (n -1)
5 fc = fa
6 a = b # a = x (n )
7 fa = fb
8 t = fc / fb # t = f (x (n - 1) ) / f( x( n) )
9 b = b + (b - c) / (t - 1.0)
10 fb = f (b )

L’algorithme précédent utilise une formulation particulière de la méthode de la


sécante, qui permet de minimiser le nombre d’opérations arithmétiques. Cette formu-
lation est présentée dans l’exercice 13.9.

13.8 La condition d’arrêt


Les différents algorithmes que nous avons vus sont tous fondés sur une condition
d’arrêt, dont le choix est crucial sur la qualité de la solution approchée. Or des consi-
dérations pratiques peuvent avoir un grand impact sur le résultat, comme nous allons
le voir.
Dans le but d’analyser l’impact de cette condition d’arrêt, considérons l’algorithme
de la bissection. Soit x ∈ R la solution exacte de l’équation non linéaire. Supposons que
l’utilisateur donne la tolérance absolue abstolx. Dans ce cas, la condition suivante :
1 abs (b - a) > abstolx

permet d’arrêter l’algorithme lorsque la longueur de l’intervalle est inférieure ou égale


à la valeur donnée par abstolx.
Ce choix peut être malheureux dans le cas où la solution exacte est très proche de
zéro. Par exemple, supposons que l’utilisateur décide d’utiliser la tolérance absolue
abstolx=1.e-4. Supposons, de plus, que la solution exacte est x = 10−10 et que
l’intervalle de recherche actuel est a = 0 et b = 10−5 . Dans ce cas, on a b − a =
10−5 < 10 −4 , de telle sorte que l’algorithme s’arrête. Pourtant, même si l’erreur
absolue est effectivement correcte, il n’y a aucun chiffre significatif dans le résultat.
L’instruction abs(b - a) / abs(b) génère une division par zéro lorsque b = 0.
C’est pourquoi on peut utiliser plutôt la condition suivante :
1 abs (b - a) > reltolx * abs ( b)

qui permet d’arrêter l’algorithme lorsque la longueur de l’intervalle est inférieure à


un seuil qui dépend de la tolérance relative et de b. Si b est non nul, cela revient à
imposer que l’erreur relative (b − a)/b est inférieure à abstolx. Ainsi, si l’utilisateur
378 Chapitre 13 • Équations non linéaires

choisit, par exemple, reltolx = 1.e-4, alors l’algorithme ne s’arrête que lorsqu’il y
a environ quatre chiffres significatifs.
Supposons maintenant que la solution exacte est x = 0. Dans ce cas, la condition
d’arrêt précédente est maladroite et la boucle ne s’arrêtera pas avant longtemps : une
tolérance absolue serait plus appropriée.
Dans l’idéal, on souhaite donc pouvoir disposer à la fois d’une tolérance relative
et d’une tolérance absolue. Pour cela, on peut utiliser le critère d’arrêt :
1 abs (b - a) > reltolx * abs ( b) + abstolx

où abstolx est une tolérance absolue. Cela oblige l’utilisateur à fournir deux pa-
ramètres au lieu d’un. Le compromis suivant est souvent utilisé, qui combine une
tolérance absolue à une tolérance relative :
1 abs (b - a) > reltolx * max ( abs ( b) , 1.0)

Si |x| ≥ 1, alors la condition impose une tolérance relative. Sinon, la condition stipule
une tolérance absolue. Dans la plupart des cas, la condition précédente s’avère être
un compromis acceptable.

13.9 Application : gaz réels


Selon la loi des gaz parfaits, l’équation P V = nRT indique le lien entre la pression
P (P a), le volume V (m3), le nombre de moles n, la constante des gaz parfaits R =
8.3144621 (J/K/mol) et la température T (K). L’équation d’état de Van Der Waals
est une équation qui tente d’approcher le comportement des gaz réels de manière plus
précise. Elle tient compte du volume des molécules (ce qui modifie V ) et de la force
d’attraction entre les molécules (ce qui modifie P ). L’équation de Van Der Waals est :
 
n2 a
P + 2 (V − nb) = nRT
V

où a (J · m 3/mol 2) et b (m3/mol) sont des constantes dépendantes du gaz.


Les deux équations précédentes sont applicables uniquement quand le gaz est dans
cet état, c’est-à-dire que l’on fait l’hypothèse que la pression P n’est pas excessivement
importante (en fonction de la température et du volume) [7]. On peut facilement
les inverser pour obtenir la pression en fonction du volume. La loi des gaz parfait
implique :
nRT
P = . (13.6)
V
L’équation de Van Der Waals implique :

nRT n 2a
P = − 2. (13.7)
V − nb V
La figure 13.10 13 présente, à la température T = 300 (K) l’évolution de la pres-
sion en fonction du volume pour V dans l’intervalle [10 −3 , 10−1 ] pour du dioxyde
de carbone (CO2), pour lequel les constantes de Van Der Waals sont a = 0.364 et
13Script Python : Zeros/Scripts/Py3/[Link].
13.9 • Application : gaz réels 379

Température =300 (K)

Pression (10 5 Pa)


103
102 Gaz parfait
101 Van Der Waals
100

10−3 10 −1
Volume (m 3)

Figure 13.10 – Pression en fonction du volume dans un gaz.

b = 4.267 × 10−5. Le graphique, en double échelle logarithmique, montre que, pour un


gaz parfait, le logarithme de la pression varie linéairement en fonction du logarithme
du volume. On constate que la loi de Van Der Waals prédit une pression un peu
inférieure.
Pour une mole de CO2 (c’est-à-dire n = 1), à la pression égale à P = 2 × 105 (Pa),
on souhaite calculer le volume V . Bien sûr, pour un gaz parfait, il est facile d’inverser
l’équation 13.6, qui implique :
nRT
V = . (13.8)
P
Pour un gaz réel, il est moins facile d’inverser l’équation 13.7, qui mène à un polynôme
de degré 3 en V . Il est possible d’utiliser les formules de Cardan pour trouver les racines
de ce polynôme. Toutefois, on peut également utiliser une méthode numérique pour
trouver V solution de l’équation non linéaire suivante :
nRT n2 a
f (V ) = P − − 2 = 0. (13.9)
V − nb V
On utilise la méthode de la dichotomie avec [10−3 , 10−1 ] comme intervalle de
recherche initial pour V . Pour utiliser la méthode de Newton, on utilise l’équation 13.8
pour initialiser l’algorithme avec la solution exacte lorsque le gaz est parfait. Ainsi,
la méthode de Newton n’aura qu’une petite correction à effectuer. Nous pourrions
calculer la dérivée f 0(V ) en dérivant l’équation 13.9 analytiquement. Pour éviter une
éventuelle erreur de calcul, nous utilisons une dérivée numérique, fondée sur la formule
de différence finie centrée :
f (V + h) − f (V − h)
f 0 (V ) = + O(h 2).
2h
On choisit le pas de différentiation donné dans la table 9.1. On obtient les résultats
suivants :
? −2
V parf ait = 1.24717080000000015 × 10 (m3)
?
V dichotomie = 1.23677285325133075 × 10 −2 (m 3)
?
V Newton = 1.23677285325131340 × 10 −2 (m3 ).
Pour la méthode de la dichotomie, on a f (V ?) ≈ 10−9 après 50 itérations. Pour la
méthode de Newton, on a f (V ? ) = 0 après 2 itérations.
380 Chapitre 13 • Équations non linéaires

Méthode Erreur Vitesse de convergence


Bissection ` n = 2` 1n Presque linéaire
Sécante en+1 = O(e1n.6 )
Newton en+1 = O(e2n ) Quadratique

Table 13.1 – Caractéristiques de plusieurs méthodes pour la résolution d’équations


linéaires, classées par vitesse de convergence croissante.

13.10 Conclusion
La table 13.1 présente les principales caractéristiques des trois méthodes que nous
avons étudiées dans ce chapitre, c’est-à-dire les méthodes de la bissection, de la sécante
et de Newton. La méthode la plus rapide de cette table est la méthode de Newton,
puisque sa vitesse de convergence est quadratique. Un des problèmes de cette méthode
est que l’initialisation de l’algorithme peut être difficile : si on choisit un point initial
trop éloigné de la solution, alors la méthode peut diverger. Une solution peut consister
à résoudre une équation approchée par une méthode exacte, puis à utiliser la valeur
comme point de départ de la méthode de Newton. Une alternative consiste à utiliser
quelques itérations de la méthode de la bissection, avant d’utiliser ce point approché
comme point de départ de la méthode de Newton. Enfin, si le calcul de la dérivée de
la fonction est problématique, on peut utiliser la méthode de la sécante.
Pour aller plus loin sur ce thème, on peut analyser la méthode de la fausse position
et ses variantes, la méthode de Halley ou encore la méthode de Riddler. Ces méthodes
peuvent se comparer en termes de vitesses de convergence, mais également en termes
de robustesse (voir sur ce thème le livre de R. Brent [16]). Ces méthodes ne sont pas
au programme de ce cours. Sur le thème des équations non linéaires, on peut consulter
les notes de M. Heath [66], en particulier le chapitre 5 « Nonlinear Equations ». Le
chapitre 25 du livre de N. Higham [70] « Nonlinear systems and Newton’s method »
est intéressant. On peut aussi consulter le chapitre 9 « Root finding and nonlinear sets
of equations » de [113].

13.11 Notes et références


Dans la section 13.3, nous avons analysé les difficultés à résoudre pour implémenter
l’algorithme de la dichotomie. Des précautions supplémentaires peuvent être néces-
saires pour obtenir une implémentation convenable d’un algorithme de recherche de
zéro. Plus de détails sur ce thème sont présentés dans [46, 16].
La convergence de la méthode de Newton est assurée sous certaines hypothèses, au
moins dans un voisinage de la solution. C’est ce qui est démontré, par exemple, dans
le chapitre 2 « Solutions of equations in one variable », p.70, théorème 2.6 de [17].
Les cas de divergence ou de non-convergence de la méthode de Newton sont souvent
cités dans la littérature. Un contre-exemple similaire à l’exemple 13.1 est présenté
dans [113], page 363. Le contre-exemple 13.2 est présenté dans [104], page 121. Des
exemples semblables peuvent être trouvés par exemple dans [81], page 158.
L’exemple de l’analyse des gaz réels présenté dans la section 13.9 est également
présenté dans [115], page 280.
La table 13.2 présente les fonctions du module [Link] développé pour ce livre.
13.12 • Exercices 381

bisection Résout l’équation par la dichotomie


bisectiongui Résout l’équation par la dichotomie (avec graphique)
newton Résout l’équation par la méthode de Newton
newtongui Résout l’équation par la méthode de Newton
(avec graphique)
secant Résout l’équation par la méthode de la sécante
secantgui Résout l’équation par la méthode de la sécante
(avec graphique)
zeroin Résout l’équation par la méthode de Dekker-Brent
zeroingui Résout l’équation par la méthode de Dekker-Brent
(avec graphique)
test_problems Une collection de problèmes
iqi Résout l’équation par approximation quadratique inverse
iqigui Résout l’équation par approximation quadratique inverse
(avec graphique)

Table 13.2 – Fonctions du module [Link].

13.12 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.

* Exercice 13.1 (Conditionnement d’un zéro) Démontrer le théorème 13.1, page 362.

Exercice 13.2 (Conditionnement de certains zéros)


1. Calculer le conditionnement des zéros de la fonction f (x) = x 2 − 1 pour x ∈ R. Les
zéros de f sont-ils bien conditionnés ?
2. Calculer le conditionnement des zéros de la fonction f (x) = x 3 pour x ∈ R. Le zéro
de f est-il bien conditionné ?

* Exercice 13.3 (Conditionnement d’une racine de multiplicité m) Soit f une fonction


réelle de classe Cm (R) et un réel x tel que f (x) = 0, f 0(x) = f 00 (x) = . . . = f (m−1)(x) = 0
et f (m)(x) 6= 0. Lorsque f est un polynôme, un tel zéro de f est, par définition, une racine
de multiplicité m. On considère le conditionnement :

eabs (x, x)
˜
cm (x) = lim
∆x→0 eabs(y, y)
˜ 1/m

où y = f (x), x̃ = x + ∆x et ỹ = f (x̃).
m!
1. Montrer que c m (x) = 1/m .
|f (m) (x)|
2. Supposons que ∆x est petit. En déduire que, si eabs (y, y˜) ≈ M où  M est la précision
1/m
machine et si f(m) (x) ≈ 1, alors e abs(x, x
˜) ≈ m!M .

Remarque 13.1 (Erreur absolue pour une racine de multiplicité m). Considérons des nombres
à virgule flottante, ce qui mène à M = 2.220 × 10−16 avec 4 chiffres significatifs. Dans la
table 13.3, nous évaluons l’erreur absolue entre x et x̃ pour une racine de multiplicité m si
eabs(y, y˜) ≈  M et f(m) (x) ≈ 1. On observe que l’erreur absolue augmente très rapidement
382 Chapitre 13 • Équations non linéaires

m 1 2 3 4
eabs (x, x
˜) 2.220 × 10−16 2.980 × 10−8 3.633 × 10−5 2.930 × 10 −3
m 5 6 7 8
eabs (x, x
˜) 8.881 × 10−2 1.772 2.926 × 101 4.455 × 10 2

Table 13.3 – Erreur absolue entre x et x̃ pour une racine de multiplicité m si


eabs(y, y˜) ≈  M et f (m)(x) ≈ 1.

avec m, ce qui montre que calculer précisément une racine de multiplicité m > 1 peut être
difficile.

* Exercice 13.4 (Nombre d’itérations de la dichotomie) Démontrer le théorème 13.4 page


369.

* Exercice 13.5 (Erreur de la méthode de Newton) Utiliser le théorème de Taylor et


démontrer le théorème 13.5 page 373.

* Exercice 13.6 (Taux de convergence de la méthode de Newton) Soit f ∈ C 2(R). Soit x


un réel tel que f (x) = 0 et f 0 (x) 6= 0. On considère l’erreur absolue en = |xn − x| pour n ≥ 1.
Supposons que I ⊂ R est un intervalle réel contenant x et la suite {xn }n≥1. Supposons qu’il
existe deux réels m et M , tels que, pour tout x ∈ I , on a :

|f 0 (x)| ≥ m > 0 et |f 00(x)| ≤ M. (13.10)

Montrer que en+1 = O (e2n ) quand n → ∞.


Remarque 13.2 (Hypothèses de la démonstration). Des hypothèses similaires aux inégalités
13.10 sont citées dans [122] pour l’étude de la convergence de la méthode de la sécante. Ces
hypothèses sont également utilisées dans le théorème 6.3.2, p.638 du chapitre 6 « Solving
Scalar Nonlinear equations » de [28], pour l’étude de la convergence de la méthode de Newton.

** Exercice 13.7 (Erreur de la méthode de la sécante (1)) Démontrer le théorème 13.6.


Indication. Utiliser le théorème 8.7, page 193.

* Exercice 13.8 (Erreur de la méthode de la sécante (2)) Soit f ∈ C2 (R). On suppose


que x est tel que f (x) = 0 et on fait l’hypothèse que f 0 (x) 6= 0. On considère la méthode
de la sécante. De manière informelle, montrer que l’équation 13.5 implique
√ qu’il existe une
φ
constante C positive telle que e n+1 = Ce n pour n ≥ 1 où φ = (1 + 5)/2.

Exercice 13.9 (Autre formulation pour la méthode de la sécante) Montrer que la méthode
de la sécante peut s’exprimer sous la forme :
xn − x n−1
x n+1 = x n + , tn = f (xn−1 )/f (xn )
tn − 1
pour tout n ≥ 2.
Chapitre 14

Optimisation

Étant donné une fonction réelle f , le problème de l’optimisation à un paramètre


(sans contraintes) consiste à chercher le nombre réel x qui minimise f (x) :
min f (x).
x∈R

Dans le contexte de l’optimisation, la fonction f est nommée fonction objectif. Elle


peut représenter un coût (par exemple en Euros), une masse (en kilogrammes), etc.
Une situation fréquente est la suivante : lorsque la variable x augmente, la fonction
commence par décroître, puis augmente à nouveau. L’optimum correspond alors à un
compromis.
Par exemple, lorsqu’on souhaite placer un satellite en orbite géostationnaire, un
lanceur tel qu’Ariane 5 ou VEGA peut être utilisé1. L’objectif est souvent de maximi-
ser la charge utile constituée des satellites à mettre en orbite : l’entreprise qui opère
le lancement est en effet rémunérée en fonction de ce paramètre. Il serait suffisant
d’embarquer davantage de carburant pour mettre en orbite des satellites plus lourds.
Mais si la masse totale est imposée, un compromis doit être trouvé entre la masse
de carburant et la masse de la charge utile. De plus, de manière très simplifiée, des
contraintes s’ajoutent portant sur les conditions initiales du lancement, les conditions
finales de la mission (par exemple l’altitude et l’inclinaison de l’orbite finale), la tra-
jectoire à utiliser ainsi que d’autres paramètres du modèle. Dans ce but, le Centre
National d’Études Spatiales (CNES) et l’Office National d’Études et de Recherches
Aérospatiales (ONERA) développent des logiciels d’optimisation spécifiques2.
Ce chapitre développe les concepts d’optimalité introduits dans la section 3.3. Nous
avons déjà utilisé une méthode d’optimisation dans le chapitre 9 sur la différentiation.
Plus précisément, nous avons montré dans la section 9.2 comment calculer le pas de
différentiation optimal permettant de réaliser un compromis entre l’erreur de tronca-
ture de la formule de Taylor et les erreurs d’arrondi. D’une manière plus générale, les
méthodes de différentiation peuvent être utiles dans le contexte de l’optimisation. Par
exemple, un minimum x peut être caractérisé en fonction des dérivées premières et
secondes en ce point. Pour le démontrer, nous utiliserons le développement de Taylor,
introduit dans le chapitre 3. Si on ne peut pas évaluer ces dérivées directement, on
peut utiliser les méthodes de différentiation pour en calculer des valeurs approchées.
1Voir [27].
2Voir [10].

383
384 Chapitre 14 • Optimisation

5
Global

y
0
Local
−10 0 10
x

Figure 14.1 – Un minimum local et un minimum global.

f( x)
f(x)

a b x x-δ x x+δ
Figure 14.2 – À gauche, optimisation avec contraintes de bornes. À droite, minimum
local fort.

Dans ce chapitre, nous présentons les principes de l’optimisation d’une fonction


d’une variable réelle, sans contraintes. Nous présentons la méthode du nombre d’or et
nous présentons la sensibilité d’un minimum aux erreurs d’arrondi. Nous analysons le
problème de l’optimisation du rayon d’une boîte de soupe.

Exemple 14.1 (Plusieurs types de minimums). La figure 14.1 3 présente différents


types de minimums associés à la fonction f (x) = sin(x) + 1005
x2 pour tout x ∈ R.
Le point situé en x = −1.428 est un optimum global, car la valeur de la fonction en
ce point est strictement inférieure à toute autre valeur. Le point x = 4.271 est un
optimum local, car il existe un autre point, par exemple x = −1.428, pour lequel la
valeur de la fonction est plus petite.

Remarque 14.1 (Optimisation avec contraintes). Dans certains cas, le paramètre x à


optimiser doit se trouver entre deux bornes a et b. Dans ce cas, on recherche x solution
du problème :
min f (x).
x∈[a,b]

La partie gauche de la figure 14.2 présente différents types de minima lors d’une
optimisation à un paramètre avec des contraintes de bornes. Le point orange, au
centre, est un minimum local et la croix verte, localisée sur la contrainte minimale
x = a, est le minimum global. Lorsqu’on considère des bornes, on a pas nécessairement
f 0 (x) = 0 au minimum : dans le cas présenté dans la figure, le minimum global x = a
est tel que f 0 (b) 6= 0. C’est pourquoi d’autres conditions sont nécessaires, mais elles
ne sont pas au programme de ce livre.

14.1 Propriétés des minima


Dans cette section, nous introduisons la définition d’un minimum local ou global,
faible ou fort. Puis, nous introduisons les théorèmes qui permettent de caractériser de
3Script Python : Optim/Scripts/Py3/[Link].
14.1 • Propriétés des minima 385

tels points. Nous illustrons ces définitions par des exemples. Nous commençons par
introduire la définition d’un minimum local fort.
Définition 14.1 (Minimum local fort). Le point x est un minimum local fort s’il
existe δ > 0 tel que, pour tout y ∈ [x − δ, x + δ] avec y 6= x, on a f (x) < f (y).
Dans la définition précédente, l’intervalle [x − δ, x + δ] est un voisinage de x de
rayon δ. En d’autres termes, dans un voisinage de x, tout point y différent de x a
une valeur de f strictement plus grande. La définition précédente est restreinte à un
voisinage, de rayon δ . Cette situation est présentée dans la partie droite de la figure
14.2. Par opposition au minimum local fort précédent, la définition suivante présente
la notion de minimum local faible.
Définition 14.2 (Minimum local faible). Le point x est un minimum local faible s’il
existe δ > 0 tel que, pour tout y ∈ [x − δ, x + δ], on a f (x) ≤ f (y).
En d’autres termes, dans un voisinage de x, tout point y différent de x a une valeur
de f supérieure ou égale. Le point important dans la définition précédente est qu’on
utilise le signe inférieur ou égal. Si on ne précise ni « faible », ni « fort », alors c’est
implicitement « faible ». Nous introduisons maintenant la définition d’un minimum
global fort.
Définition 14.3 (Minimum global fort). Le point x est un minimum global fort si,
pour tout y ∈ R, avec y 6= x, on a f (x) < f (y).
La définition précédente n’est pas restreinte à un voisinage de x : elle est vraie
pour tout y ∈ R.
Exemple 14.2 (Minimum global fort). Considérons la fonction f (x) = x2, pour tout
x ∈ R. Le minimum global fort est x = 0.
Un minimum global fort est nécessairement unique, comme on le montre dans
l’exercice 14.7. Dans les deux théorèmes suivants, nous introduisons les propriétés
nécessaires ou suffisantes pour caractériser un minimum. Une difficulté importante
avec ces théorèmes est qu’ils ne fournissent pas des conditions nécessaires et suffi-
santes : chaque théorème est associé à une implication dans un sens particulier. Dans
ce contexte, l’attention doit se porter sur les inégalités, dont certaines sont strictes. Le
théorème ci-dessous indique des conditions nécessaires pour caractériser un minimum.
Théorème 14.1 (Conditions nécessaires pour un minimum 1D sans contraintes).
Supposons que f ∈ C2 (R). Si le point x ∈ R est un minimum local alors f0 (x) = 0 et
f 00 (x) ≥ 0.
La preuve de ce théorème est donnée dans l’exercice 14.4. L’égalité f 0 (x) = 0 est
appelée la condition du premier ordre, portant sur la pente. L’inégalité f 00(x
S) ≥ 0 est
appelée la condition du second ordre, portant sur la courbure en forme de « ». Dans
ce cas, on dit queTla fonction est convexe. Dans le cas où la courbure de la fonction
est en forme de « », on dit que la fonction est concave. Le théorème suivant indique
des conditions suffisantes pour caractériser un minimum.
Théorème 14.2 (Conditions suffisantes pour un minimum 1D sans contraintes).
Supposons que f ∈ C2 (R). Soit x ∈ R tel que f 0(x) = 0 et f 00(x) > 0 alors le point x
est un minimum local fort.
386 Chapitre 14 • Optimisation

f( x) f( x)

x f(x)
x
a x b
Figure 14.3 – À gauche, un faux minimum : un vrai maximum. Au centre, un faux
minimum : un vrai point d’inflexion. À droite, une fonction unimodale.

Ce théorème est démontré dans l’exercice 14.6. La condition f 00 (x) > 0 garantit
que les points au voisinage de x ont une valeur de f strictement plus grande, car la
courbure est strictement positive.

Exemple 14.3 (Le point x est un minimum local fort avec f (x) = 0 et f 00(x) > 0).
Considérons la fonction f (x) = x2 pour tout x ∈ R. On a f 0 (x) = 2x et f 00(x) = 2
pour tout x ∈ R. Par conséquent, pour x = 0, on a f 0 (x) = 0 et f 00 (x) > 0. Dans ce
cas, le théorème 14.2 permet de conclure que le point x = 0 est un minimum local
fort.

Les deux contre-exemples qui suivent présentent des cas où la condition du premier
ordre pour un minimum est satisfaite, mais pas la condition du second ordre : ce sont
des « faux » minimums.

Exemple 14.4 (Le point x est un maximum local fort avec f 0(x) = 0 et f 00 (x) < 0).
La partie gauche de la figure 14.3 présente un faux minimum, qui est, en revanche,
un vrai maximum. Dans ce cas, on a f 0(x) = 0, mais f 00(x) < 0. Considérons par
exemple la fonction f (x) = −x 2 pour tout x ∈ R. On a f 0 (x) = −2x et f00(x) = −2
pour tout x ∈ R. On a f 0 (0) = 0 ce qui montre que la condition du premier ordre est
satisfaite au point x = 0. Cependant, le théorème 14.2 ne permet pas de conclure au
sujet du point x = 0 puisque f 00(0) < 0.

Exemple 14.5 (Le point x est un point d’inflexion avec f 0 (x) = 0 et f 00 (x) = 0). La
partie centrale de la figure 14.3 présente un second type de faux minimum : c’est, en
fait, un point d’inflexion. Dans ce cas, on a f 0 (x) = 0, mais f 00(x) = 0, ce qui implique
que la courbure est localement nulle. Considérons par exemple la fonction f (x) = x 3
pour tout x ∈ R. Dans ce cas, on a f 0 (x) = 3x2 et f 00 (x) = 6x pour tout x ∈ R. On
a f 0 (0) = 0 ce qui montre que la condition du premier ordre est satisfaite au point
x = 0. Mais le théorème 14.2 ne permet pas de conclure, car f 00 (0) = 0.

Dans l’exemple suivant, les conditions du théorème 14.2 ne sont pas satisfaites,
mais on observe tout de même un minimum local fort.

Exemple 14.6 (Le point x est un minimum local fort avec f (x) = 0 et f 00(x) = 0).
On considère la fonction f (x) = x4 au point x = 0. Dans ce cas, on a f 0(x) = 4x 3 et
f 00 (x) = 12x 2 pour tout x ∈ R. On a donc f 0 (0) = 0 et f 00 (0) = 0. Cela montre que
la condition du premier ordre est satisfaite au point x = 0. Cependant le théorème
14.2 ne permet pas de conclure puisque f 00 (0) = 0, bien que le point x = 0 soit un
optimum global fort.
14.2 • Méthode du nombre d’or 387

f(x) Cas A f(x) Cas B


f(x 2) f(x1 )
f(x 1) f(x2 )

a x x1 x2 b a x1 x2 x b

Figure 14.4 – Analyse d’une fonction unimodale. À gauche, le cas A. À droite, le


cas B.

14.2 Méthode du nombre d’or


La méthode du nombre d’or est une méthode d’optimisation qui fait l’hypothèse
que la fonction f est unimodale. Un des intérêts de cette méthode est qu’elle ne né-
cessite pas d’évaluer la dérivée de la fonction f . De ce point de vue, la méthode du
nombre d’or est à l’optimisation ce que la méthode de la dichotomie est à la résolution
d’une équation non linéaire. Avant de décrire la méthode du nombre d’or, nous allons
définir une propriété de certaines fonctions. Nous verrons ensuite comment définir une
méthode permettant d’identifier le minimum pour cette classe particulière de fonc-
tions. Une hypothèse naturelle pour la recherche d’un minimum est que, au voisinage
du minimum recherché, la fonction est décroissante, puis croissante. La définition
suivante formalise cette idée et introduit la définition d’une fonction unimodale.

Définition 14.4 (Fonction unimodale). Soit f une fonction réelle sur l’intervalle [a, b].
La fonction f est unimodale s’il existe un unique x ∈ [a, b] tel que f est strictement
décroissante sur l’intervalle [a, x] et f est strictement croissante sur l’intervalle [x, b].

La partie droite de la figure 14.3 présente les propriétés d’une fonction unimodale.
L’algorithme du nombre d’or est fondé sur la propriété suivante.

Théorème 14.3 (Propriété d’une fonction unimodale). Supposons que f est unimo-
dale sur [a, b] et soient x1 et x 2 tels que a ≤ x 1 < x2 ≤ b. Soit x le minimum de
f dans l’intervalle [a, b]. Si f (x1) ≤ f (x 2 ), alors x ≤ x2. Si f (x1 ) ≥ f (x2 ), alors
x ≥ x1 .

Le théorème montre que, lorsqu’on considère une fonction unimodale, on peut


déterminer la position de l’optimum en comparant la valeur de la fonction en deux
points x 1 et x2 . Ce théorème est démontré dans l’exercice 14.8. La figure 14.4 présente
l’analyse d’une fonction unimodale lorsqu’on recherche le minimum x. Le cas A illustre
que si f (x 1) ≤ f (x2), alors x ≤ x 1. Le cas B illustre que si f (x 1) ≥ f (x2 ), alors x2 ≤ x.
Ces figures montrent qu’il est intéressant d’évaluer la fonction f aux points x1 et x 2 ,
mais on ne sait pas encore comment les déterminer.
Il est facile de voir que la méthode de la dichotomie ne permet pas de trouver un
minimum. Pour le voir, recherchons l’optimum dans l’intervalle [a, b] et exploitons la
valeur de la fonction f au milieu m = a+ b
2 . Premièrement, appliquons le théorème
14.3 avec x1 = m et x2 = b. On peut considérer deux cas. Si f (m) ≤ f (b) alors x ≤ b.
Dans ce cas, nous n’avons rien appris sur la position de l’optimum et l’intervalle de
recherche initial est inchangé. Si f (m) ≥ f (b) alors x ≥ m. Dans ce cas, on peut
rechercher l’optimum dans l’intervalle [m, b]. Deuxièmement, appliquons le théorème
avec x1 = a et x2 = m. De même, on peut considérer deux cas. Si f (a) ≤ f (m)
388 Chapitre 14 • Optimisation

f(x) 0 1/3 2/3 1


Itération n

Itération n+1
a m x b 0 2/9 4/9 2/3

Figure 14.5 – À gauche, la méthode de la dichotomie ne permet pas de construire


un algorithme d’optimisation. À droite, principe d’une hypothétique méthode de la
trisection.

alors x ≤ m. Dans ce cas, on peut rechercher l’optimum dans l’intervalle [a, m]. Si
f (a) ≥ f (m) alors x ≥ a. Dans ce cas, nous n’avons rien appris sur la position de
l’optimum et l’intervalle de recherche initial est inchangé.
De manière plus générale, si f (m) ≤ f (b) et f (a) ≥ f (m), l’algorithme ne peut
pas progresser. C’est la situation présentée dans la partie gauche de la figure 14.5,
dans laquelle le point m = (a + b)/2 est le milieu de l’intervalle [a, b]. Dans la figure,
la valeur de la fonction au milieu m est plus petite que f (a) et f (b). Le théorème 14.3
implique que x ∈ [a, b], mais cela ne permet pas de réduire l’intervalle de recherche.
Ainsi, deux points x1 et x2 différents des extrémités a et b sont nécessaires dans
l’intervalle de recherche [a, b], mais la dichotomie n’utilise qu’un seul point.
La méthode de la trisection serait concevable, mais il y a un inconvénient, qui
est présenté dans la partie droite de la figure 14.5. Supposons que l’intervalle de
recherche est l’intervalle [0, 1] et que l’optimum est dans l’intervalle [1/3, 2/3]. Faisons
l’hypothèse que l’algorithme détermine que l’optimum se situe dans l’intervalle [0, 2/3].
Alors la fonction doit être évaluée aux points 13 23 = 29 et 23 23 = 49 . On observe qu’aucun
de ces deux points n’était utilisé à l’itération précédente. On voit que la méthode de
la trisection ne permet pas de réutiliser les évaluations de l’itération précédente : deux
appels à f sont nécessaires à chaque itération.
Le problème précédent est résolu par la méthode du nombre d’or, due à Kiefer [80].
La méthode du nombre d’or permet de réutiliser certaines évaluations de l’itération
précédente de telle sorte qu’un seul nouvel appel à f est nécessaire à chaque itération.
On note [a1 , b1 ] = [a, b] l’intervalle de recherche initial et on note [an , bn ] l’intervalle de
recherche à l’itération n, pour n = 1, 2, . . .. Soit ρ ∈ [0, 1] un paramètre réel inconnu.
L’algorithme utilise les deux réels :

x1,n = (1 − ρ)an + ρbn (14.1)


x2,n = ρan + (1 − ρ)bn (14.2)

pour n ≥ 1. L’algorithme du nombre d’or fait l’hypothèse que la fonction f est


unimodale. Il est fondé sur le raisonnement suivant. Si f (x1,n ) ≤ f (x2,n) alors x ∈
[an , x 2,n]. Dans ce cas, les bornes du nouvel intervalle de recherche sont an+1 = an
(la borne de gauche ne change pas) et bn+1 = x2,n . Si f (x1,n ) > f (x2,n) alors x ∈
[x1,n , b n]. Dans ce cas, les bornes du nouvel intervalle de recherche sont an+1 = x1,n
et bn+1 = b n (la borne de droite ne change pas). De plus, le paramètre ρ est choisi
dans le but de réutiliser le point approprié à chaque itération, ainsi que l’évaluation
correspondante de la fonction. Plus précisément : si f (x 1,n) ≤ f (x2,n ) alors x2,n+1 =
x 1,n ; si f (x 1,n) > f (x 2,n ) alors x1,n+1 = x2,n . Cela mène au théorème suivant.
Théorème 14.4 (Méthode du nombre d’or). Supposons que la fonction f est uni-
14.2 • Méthode du nombre d’or 389

modale. Si :

ρ= 2−φ (14.3)

où φ = 1+ 5
2 est le nombre d’or, alors la méthode du nombre d’or évalue la fonction
f une seule fois par itération.
La preuve de ce théorème est donnée dans l’exercice 14.9. L’évaluation numérique
des paramètres ρ et φ permet de mieux comprendre l’algorithme. On a φ = 1.618,
ρ = 0.3820 et 1 − ρ = 0.6180. En d’autres termes, les points x1,n et x2,n découpent
approximativement l’intervalle [an, b n ] en trois parties dans laquelle le segment du
milieu, c’est-à-dire l’intervalle [x1,n, x 2,n], est un peu plus petit.
L’algorithme Python suivant implémente la méthode du nombre d’or. Il est extrait
de la fonction goldensection4 , créée pour ce livre. Il prend en entrée deux points a
et b, avec a < b et restreint itérativement cet intervalle de recherche pour terminer
avec un intervalle proche du minimum de f . De plus, l’utilisateur doit fournir abstolx
représentant une tolérance absolue sur x.
1 fa = f (a )
2 fb = f (b )
3 x1 = (1.0 - rho ) * a + rho * b
4 f1 = f ( x1 )
5 x2 = rho * a + (1.0 - rho ) * b
6 f2 = f ( x2 )
7 while abs ( b - a) > abstolx :
8 if f1 <= f2 : # x * dans [a , x2 ]
9 b = x2
10 fb = f2
11 x2 = x1
12 f2 = f1
13 x1 = (1.0 - rho ) * a + rho * b
14 f1 = f ( x1 )
15 else : # x * dans [x1 , b ]
16 a = x1
17 fa = f1
18 x1 = x2
19 f1 = f2
20 x2 = rho * a + (1.0 - rho ) * b
21 f2 = f ( x2 )
Pour les mêmes raisons que celles évoquées dans la section 13.3, on peut remplacer
la condition d’arrêt :
1 abs (b - a ) > abstolx
par la condition :
1 abs (b - a) > reltolx * max ( abs ( b) , 1.0)
où le seuil est calculé en fonction de reltolx, une tolérance relative sur x donnée par
l’utilisateur.
Pour des raisons qui seront détaillées dans la section 14.3, lorsqu’on fait des calculs

en virgule flottante, on peut utiliser M comme valeur par défaut pour reltolx
4Script Python : Scripts-Eleves/Py3/[Link].
390 Chapitre 14 • Optimisation

où M est la précision machine. C’est en effet, sous certaines hypothèses, la valeur


optimale dans le cas idéal où le conditionnement du problème est égal à 1. Avec
des doubles, cela correspond environ à reltolx=1.e-8. Dans l’exercice 14.10, nous
montrons que, à chaque itération, l’intervalle [a, b] est réduit d’un facteur 1 − ρ =
φ − 1 = 0.6180 avec 4 chiffres significatifs. Cela mène au théorème suivant.

Théorème 14.5 (Convergence de la méthode du nombre d’or). On considère la


méthode du nombre d’or. Supposons que la fonction f est unimodale. Supposons que
l’intervalle de recherche initial est [a, b] avec a < b. Soit  > 0 un réel représentant
une tolérance absolue sur x. Soit β > 1 un réel représentant la base du logarithme. Si
le nombre d’itérations est égal à :
  

logβ b−a
n=  log (1 − ρ) 
 (14.4)
 β 

alors la longueur de l’intervalle après n itérations est inférieure à .

Le théorème précédent est démontré dans l’exercice 14.10. Lorsqu’on fait des cal-
culs en virgule flottante avec des doubles, nous verrons par la suite pourquoi il n’est
pas possible, sous certaines hypothèses, de réduire l’intervalle final à une longueur

inférieure à M = 2−26 où  M = 2 −52 est la précision machine. Supposons que l’in-
tervalle initial est de longueur b − a = 1. L’équation 14.4 est vraie quelle que soit la
base β du logarithme. En utilisant par exemple la base β = 2, le théorème précédent
montre que le nombre d’itérations nécessaires pour avoir un intervalle de longueur

 M = 2−26 est :
 
−26
= d37.54e = 38. (14.5)
log 2 (1 − ρ)

14.3 Conditionnement de l’optimisation


Dans cette section, nous analysons la sensibilité de la solution d’un problème
d’optimisation à des perturbations dans la fonction f . Comme nous allons le voir,
cela nous permettra de choisir judicieusement la tolérance absolue d’un algorithme
d’optimisation. Le théorème suivant montre que, au voisinage d’un minimum local x,
la fonction f évolue de manière quadratique.

Théorème 14.6 (Optimisation et sensibilité aux perturbations). Supposons que f


est de classe C2 (R). Supposons
√ que x est un minimum local de f . Soit  > 0 un réel.
Pour tout réel h tel que |h| ≤ , il existe ξ entre x et x + h tel que :

f (x + h) − f (x) ≤ f 00(ξ). (14.6)
2

Démonstration. Puisque la fonction est de classe C2 (R), on peut réaliser un dévelop-


pement de Taylor de f au voisinage de x. Par conséquent, il existe ξ entre x et x + h
tel que :
0 h2 00
f (x + h) = f (x) + hf (x) + f (ξ).
2
14.3 • Conditionnement de l’optimisation 391

Par hypothèse, le point x est un minimum local. Le théorème 14.1 montre alors que
2
f 0 (x) = 0, ce qui implique f (x + h) = f (x) + h2 f 00(ξ). Par conséquent, on a l’égalité
2 √
f (x + h) − f (x) = h2 f 00(ξ). Puisque |h| ≤  par hypothèse, cela implique h2 ≤ , ce
qui mène à l’équation 14.6.

Remarque 14.2. Si  est suffisamment petit, puisque f est régulière, alors f (x + h) −


f (x) ≥ 0 et f 00 (ξ) ≥ 0. Plus précisément, puisque f ∈ C2 (R), il existe  suffisamment
petit tel que f 00(ξ) ≥ 0. De plus, si  est suffisamment petit, on a bien f (x + h) ≥ f (x),
puisque, par hypothèse, x est un minimum local. Cela implique f (x + h) − f (x) ≥ 0.
Supposons que  = M est la précision machine sur un système à virgule flottante.
Si f 00(x) est du même ordre de grandeur que f (x), alors le membre de droite est
relativement petit par rapport à f (x). Par conséquent, si le point x est modifié d’une

valeur inférieure à M , alors la fonction f est modifiée d’une valeur comparable à
la précision d’évaluation de f : dans ce cas, le changement n’est pas numériquement

mesurable. En général, une tolérance absolue sur x inférieure à M n’est pas utile en
première approximation (mais cela peut dépendre de la valeur de la dérivée seconde à
l’optimum). Avec les doubles utilisés en Python, cela signifie que, en général, il n’est

pas pertinent d’utiliser une tolérance absolue inférieure à M ≈ 10 −8 . La cause
principale est que, au voisinage de x, la fonction f (x + h) évolue comme une fonction
quadratique, car elle est dominée par le terme h2 .
Ce phénomène peut être augmenté ou diminué en fonction de la courbure locale de
f en x. En effet, si f 00(x) est proche de zéro, alors la fonction f (x + h) est « aplatie »
(sa courbure est faible) et il faut une perturbation de x plus grande pour obtenir
un changement de f . Au contraire, si f 00(x) est grand, alors une perturbation de x
plus petite peut être suffisante pour obtenir un changement dans f . Cette sensibilité
dépend également de l’ordre de grandeur de |f (x)|. En effet, si |f (x)| est proche de
zéro, alors une courbure même modérée aura un effet sur f . Au contraire, si |f (x)|
est grand, alors il faut une courbure importante pour obtenir un changement dans
f . La définition suivante formalise cette analyse et présente le conditionnement du
minimum d’une fonction.

Définition 14.5 (Conditionnement d’un minimum). Soit f une fonction réelle de


classe C2(R). Soit x un minimum local tel que x 6= 0 et f (x) 6= 0. On considère la
perturbation h > 0, ainsi que x̃ = x + h, y = f (x) et y˜ = f (x̃). Le conditionnement
du minimum est :
erel (x, x)
˜
c min(x) = lim p (14.7)
h→0 erel (y, y)
˜

où e rel est l’erreur relative.

On observe que le dénominateur de la fraction implique la racine carrée de l’erreur


relative, ce qui ne correspond pas à la définition habituelle du conditionnement, qui
devrait plutôt impliquer l’erreur relative. Comme nous allons le voir par la suite, cette
définition permet d’exploiter le développement de Taylor de la fonction f au voisinage
d’un minimum local et mène à une expression simple du conditionnement.
Remarque 14.3 (Hypothèses de la définition). Dans la définition précédente, on fait
l’hypothèse que x 6= 0 ce qui permet de calculer erel (x, x).
˜ On fait également l’hypo-
thèse que f (x) 6= 0 ce qui permet de calculer erel (y, y).
˜ De plus, nous insistons sur le
392 Chapitre 14 • Optimisation

fait que la définition du conditionnement présentée ici est spécifiquement définie pour
l’optimisation et n’est pas celle présentée dans la section 5.3.
Le théorème suivant permet d’obtenir une formulation explicite du conditionne-
ment d’un minimum, sous certaines hypothèses de régularité sur f .

Théorème 14.7 (Conditionnement d’un minimum). Soit f une fonction réelle de


classe C 2 (R). Soit x 6= 0 un minimum local fort tel que f (x) =
6 0. Alors :
s
1 2|f (x)|
c min(x) = . (14.8)
|x| f 00 (x)

De plus, le nombre de chiffres décimaux significatifs dans x par rapport au nombre de


chiffres décimaux significatifs dans y = f (x) est :
1
LRE 10(x, x)
˜ ≈ LRE10 (y, y)
˜ − log10 (cmin (x)) (14.9)
2
lorsque h → 0.
Ce théorème est démontré dans l’exercice 14.11.
Remarque 14.4 (Hypothèses du théorème). Dans le théorème précédent, on fait l’hy-
pothèse que x est un minimum local fort. Cela implique que f 00(x) > 0, ce qui permet
de pouvoir placer le terme f 00(x) au dénominateur dans l’équation 14.8.
L’équation 14.8 implique :
 
1 2|f (x)|
log10(c min (x)) = − log10 (|x|) + log10 . (14.10)
2 f 00(x)

Il n’est, en théorie, pas possible de séparer les termes de l’équation précédente (ils
peuvent, dans certains cas, se compenser mutuellement). Toutefois, pour clarifier
le problème, nous analysons les termes de l’équation précédente l’un après l’autre.
L’équation 14.8 montre que le conditionnement peut être grand si |x| est proche de
zéro. En effet, dans ce cas, même une petite perturbation h peut provoquer un grand
changement relatif dans x. D’autre part, le conditionnement peut être grand si le ratio
| f (x )|
f 00 (x) est grand. L’équation 14.10 montre que le nombre de chiffres décimaux perdus
n’est égal qu’à la moitié du logarithme du ratio précédent. L’équation 14.9 montre
que le minimum x possède la moitié des chiffres significatifs de f (x). Par exemple, si
le nombre de chiffres significatifs dans f (x) est d’environ 16 chiffres décimaux, alors,
au mieux, le nombre de chiffres significatifs dans x est 8. Le terme log10 (cmin (x))
représente le nombre de chiffres significatifs perdus à cause du conditionnement du
problème.
La figure 14.6 présente le conditionnement d’un problème d’optimisation. Le trait
plein représente la fonction f (x) et les deux traits pointillés représentent une évalua-
tion de f (x) entachée d’erreur. Au voisinage de l’optimum x, la formule de Taylor
implique :
1
f (x + h) ≈ f (x) + h 2f 00(x)
2
si h > 0 est petit. Dans les deux figures, l’erreur sur f (x) (verticale) est identique.
On observe qu’une petite erreur (positive) d’évaluation sur f (x) conduit à une erreur
14.4 • Application : conduction de la chaleur 393

Bien conditionné
Mal conditionné

f(x+h) f(x+h)
f(x) f(x)

x-h x x+h x-h x x+h


Figure 14.6 – Conditionnement d’un problème d’optimisation. À gauche, un pro-
blème bien conditionné. À droite, un problème mal conditionné.

de localisation de l’optimum. Dans la partie gauche de la figure 14.6, la fonction est


associée à une forte courbure, ce qui implique que f 00(x) est grand. Cela conduit à une
localisation de l’optimum qui se situe dans un intervalle plutôt étroit : la précision de
calcul de x est grande. Dans la partie droite de la figure, la fonction est associée à une
faible courbure, ce qui implique que f 00(x) est petit. Cela conduit à une localisation
de l’optimum qui se situe dans un intervalle plutôt large : la précision de calcul de x
est faible.

14.4 Application : conduction de la chaleur


Dans cette section, nous présentons comment déterminer la densité optimale d’une
laine de verre en minimisant la conductivité.
Le coefficient de conductivité thermique λ, en W.m−1 .K−1 , est la quantité d’éner-
gie traversant un m2 de paroi pour un mètre d’épaisseur de matériau et pour une
différence de température de 1 K entre les deux faces pendant une unité de temps
[74]. Elle est mesurée à une température égale à 10 °C. Dans les matériaux poreux
comme les laines de verre, la transmission de la chaleur s’effectue par conduction
gazeuse (dans l’air), par conduction dans la matière (dans la partie solide) et par
rayonnement infrarouge. La conductivité peut alors être modélisée en fonction de la
densité ρ du matériau par l’équation :
c
λ(ρ) = a + bρ +
ρ
pour tout ρ > 0, où a > 0, b > 0 et c > 0 sont trois constantes. Le coefficient a
est associé à la conduction dans le gaz, le coefficient b est associé à la conduction
dans la matière et le coefficient c est associé au rayonnement. Cette fonction est
présentée dans la figure 14.7 pour des paramètres proches d’une laine de verre c’est-
à-dire a = 0.034, b = 4.739 × 10−6 et c = 0.03815. On observe dans la figure 14.75
que la conductivité atteint un minimum. Pour obtenir un matériau isolant, il faut
minimiser la conductivité. Ce problème peut être résolupexactement, comme on le
montre dans l’exercice 14.2. La densité optimale est ρ? = cb . Dans le script suivant,
nous utilisons la fonction goldensection développée pour ce cours. Nous utilisons
une tolérance égale à 10−8 .
1 from optim import gol dens ecti on
5Script Python : Optim/Scripts/Py3/[Link].
394 Chapitre 14 • Optimisation

0.03525

λ(ρ)
0.03500

100 200
ρ

Figure 14.7 – Conductivité thermique d’une laine de verre en fonction de la densité.

3 def co nduc tivit y (x) :


4 a = 0.034
5 b = 4.739 e -06
6 c = 0.0 3815
7 y = a + b * x + c / x
8 return y
9

10 reltolx = 1.0 e -8
11 x_opt , f_opt = go lden secti on (
12 conductivity , 30.0 , 200.0 , reltolx )

Avec la fonction goldensection, il faut 40 itérations pour obtenir ρ ? = 89.72 et


λ(ρ? ) = 0.03485 avec plus de 7 chiffres exacts.

14.5 Conclusion
Dans ce chapitre, nous n’avons fait qu’effleurer un vaste domaine qui ne cesse de
se développer. Sur le thème de l’optimisation, le livre de Gill, Murray et Wright [53]
reste, bien qu’il soit un peu ancien, une référence intéressante. D’autres méthodes
d’optimisation et des cas d’applications en Python sont présentés dans [81] chapitre
10. Les ouvrages [108, 78, 14] développent le sujet de l’optimisation de manière plus
approfondie.

14.6 Notes et références


La méthode du nombre d’or est décrite dans [53], chapitre 4 « Unconstrained Op-
timization ». Le même algorithme est décrit dans l’ouvrage de Brent [16], chapitre 5
« Minimizing a function of one variable ». Dans « Numerical Recipes » [113], l’algo-
rithme est décrit dans la section 10.1 « Golden section search in one dimension ».
La table 14.1 présente les fonctions du module [Link] développé pour ce livre.

14.7 Exercices
Nous rappelons que les exercices présentés dans cette section, ainsi que dans tous les
chapitres qui suivent, sont notés en fonction de leur niveau de difficulté. La table 1 page 4
présente cette classification.
14.7 • Exercices 395

goldensection Minimise une fonction par la méthode du nombre d’or


goldensectiongui Minimise une fonction par la méthode du nombre d’or
(avec graphique)

Table 14.1 – Fonctions du module [Link].

f( x) f( x)
1

0 x 0 x

Figure 14.8 – À gauche, la fonction f (x) = 0 si x = 0 et f (x) = 1 sinon possède un


minimum global en un point où la fonction n’est pas continue. À droite, la fonction
valeur absolue possède un minimum global en un point où la dérivée n’existe pas.

Exercice 14.1 (Optimisation : exemples et contre-exemples) Pour chacune des fonctions


suivantes, dessiner l’allure de la fonction f , calculer f 0 (x), déterminer le point x atteignant
le minimum et calculer f 00 (x) en ce point. Pour cela, on utilisera si possible le théorème 14.2,
ou bien la définition 14.3. On considère les fonctions : 1. f (x) = x2 pour tout x ∈ R ; 2.
f (x) = x 3 pour tout x ∈ R ; 3. f (x) = −x 2 pour tout x ∈ R ; 4. f (x) = |x| pour tout x ∈ R ;
5. f (x) = 0 si x = 0 et f (x) = 1 sinon.

Exercice 14.2 (Conduction de la chaleur) On considère le problème de conduction de la


chaleur présenté dans la section 14.4.
1. Calculer la densité ρ? en fonction de a, b, c telle que la conductivité λ est localement
minimale.
2. Calculer la conductivité λ(ρ? ) minimale.
3. Montrer que ρ? satisfait la condition du second ordre, ce qui prouve qu’il s’agit bien
d’un minimum local.

Exercice 14.3 (Ramer ou courir ?) On considère le problème 6 dans la figure 14.9.


Une personne souhaite aller le plus rapidement possible du point A au point C. On fait
l’hypothèse que la distance entre les deux rives est |AP | = 3 (km). On fait l’hypothèse que
la distance entre le point P et le point C est |P C | = 8 (km). Une rivière lui barre le chemin,
c’est pourquoi il s’est équipé d’un bateau à rame. La première idée qui lui vient est d’aller
directement du point A au point C à la rame. Cette personne réalise ensuite qu’elle peut
aller moins vite sur l’eau que sur la terre : elle peut ramer à vr =6 km/h et courir à vc =8
km/h. Puisqu’elle peut courir plus vite, la seconde idée qui lui vient est d’aller directement
au point P à la rame, puis d’aller du point P au point C en courant. Une troisième idée lui
vient : aller du point A à un point B à la rame, puis du point B au point C en courant :
mais comment choisir le point B pour que le parcours soit le plus rapide possible ? On note
x la distance entre les points P et B.
1. Montrer que la durée totale du parcours est :

x2 + 9 8−x
f (x) = + (14.11)
6 8
6Voir [138], page 11.
396 Chapitre 14 • Optimisation

3 km
A P
x
Rivière B
8 km
C

Figure 14.9 – Pour aller de A à C, on peut nager de A à B, puis courir de B à C.


Comment choisir le point B ?

f( x) f( x) f'(x)>0 et δ<0
f'(x)<0 et δ>0

x*+δ x* x
x* x*+δ x

Figure 14.10 – Deux cas utilisés dans la preuve pour les conditions du premier ordre.
Sur la gauche, le cas f0 (x? ) < 0, où nous considérons la « direction » δ > 0. Sur la
droite, le cas f 0(x ? ) > 0, où nous considérons la « direction » δ < 0.

pour tout x ∈ [0, 8].


2. Calculer x? tel que la durée f est minimale.
3. Montrer que x? satisfait la condition du second ordre, ce qui prouve qu’il s’agit bien
d’un minimum local.

** Exercice 14.4 (Conditions nécessaires pour un minimum 1D sans contraintes) Sup-


posons que f ∈ C2 (R). Supposons que le point x? est un minimum local faible.
1. Montrer que f 0 (x? ) = 0. Indication. Montrer que f0 (x? ) ≥ 0, puis montrer que
f0 (x? ) ≤ 0.
2. En déduire que f00 (x? ) ≥ 0.

* Exercice 14.5 (Continuité et positivité locale) Supposons que f est continue sur R. Soit
x ∈ R tel que f (x) > 0. Montrer qu’il existe δ > 0 tel que, si y ∈ [ x − δ, x + δ ] alors f (y ) > 0.
Remarque 14.5 (Continuité et positivité locale). L’exercice précédent montre que si f est
continue et si f (x) est strictement positif, alors cette propriété reste vraie dans un voisinage
de x.

* Exercice 14.6 (Conditions suffisantes pour un minimum 1D sans contraintes) Démon-


trer le théorème 14.2 page 385.

* Exercice 14.7 (Unicité du minimum global fort) Supposons que x? est un minimum
global fort dans le sens de la définition 14.3. Montrer que x? est unique.

* Exercice 14.8 (Propriété d’une fonction unimodale) Démontrer le théorème 14.3. In-
dication. Montrer la contraposée, c’est-à-dire montrer premièrement que, si x2 < x ?, alors
f (x1 ) > f (x2 ), et deuxièmement que, si x? < x1, alors f (x 1 ) < f (x2 ).
14.7 • Exercices 397

** Exercice 14.9 (Itérations de la méthode du nombre d’or (1)) On suppose que f est
une fonction réelle unimodale et on souhaite trouver x ∗ qui minimise la fonction f dans un
intervalle [a, b] donné. On considère la méthode du nombre d’or. On note [ a, b] = [a1 , b1 ]
l’intervalle initial de recherche initial et on note [an , bn ] l’intervalle de recherche à l’itération
n. Soit ρ ∈ [0, 1] un paramètre réel inconnu. On suppose que l’algorithme utilise les deux
réels x1,n et x2,n donnés par les équations 14.1 et 14.2, page 388.
— Si f (x 1,n) ≤ f (x2,n ), alors le théorème 14.3 implique que x∗ ∈ [a n , x2,n]. Dans ce cas,
l’algorithme procède à la mise à jour des variables de la manière suivante :

a n+1 = an , x2,n+1 = x1,n , bn+1 = x 2,n (14.14)

tandis que x1,n+1 est calculé par l’équation 14.1. La clé de l’algorithme est que l’équa-
tion x2,n+1 = x1,n permet de réutiliser le point x1,n de l’itération précédente. La mise
à jour est présentée dans le tableau suivant.
an x 1,n x2,n bn
| | |
an+1 x1,n+1 x 2,n+1 bn+1
— Si f (x 1,n) > f (x2,n ), alors le théorème 14.3 implique que x∗ ∈ [x 1,n , b n]. Dans ce cas,
l’algorithme procède à la mise à jour des variables de la manière suivante :

a n+1 = x1,n , x 1,n+1 = x 2,n, b n+1 = bn (14.15)

tandis que x2,n+1 est calculé par l’équation 14.2. La clé de l’algorithme est que l’équa-
tion x1,n+1 = x2,n permet de réutiliser le point x2,n de l’itération précédente. La mise
à jour est présentée dans le tableau suivant.
an x1,n x 2,n bn
| | |
a n+1 x 1,n+1 x2,n+1 bn+1
L’objectif de cet exercice est de déterminer ρ de telle sorte que la réutilisation soit possible.
1. On suppose que f (x1,n ) ≤ f (x 2,n). Montrer que l’équation x2,n+1 = x1,n (c’est-à-dire
la réutilisation) implique que ρ satisfait l’équation :

ρ2 − 3ρ + 1 = 0. (14.16)

2. On suppose que f (x1,n ) > f (x 2,n). Montrer que l’équation x1,n+1 = x2,n (c’est-à-dire
la réutilisation) implique que ρ satisfait l’équation 14.16.
3. Calculer les deux racines de l’équation 14.16 et montrer que la seule solution appar-
tenant à l’intervalle [0, 1] est donnée

par l’équation√ 14.3 page 389. Indication. On
utilisera les valeurs numériques 3+2 5 = 2.618 et 3−2 5 = 0.3820.

* Exercice 14.10 (Itérations de la méthode du nombre d’or (2)) On considère la méthode


du nombre d’or pour la minimisation d’une fonction à un paramètre. On suppose que la
fonction f est unimodale. On note [a, b] l’intervalle initial de recherche et on suppose que
a < b.
1. Montrer que, quelle que soit la branche de l’algorithme utilisée à l’itération n, on a
bn+1 − an+1 = (bn − a n )(1 − ρ ). En d’autres termes, la longueur de l’intervalle est
réduite d’un facteur 1 − ρ.
2. Montrer que si le nombre d’itérations n satisfait l’équation 14.4, alors la longueur de
l’intervalle après n itérations est inférieure à . Indication. Commencer par démon-
trer l’égalité pour β = e où e est le nombre d’Euler, puis généraliser pour une base
arbitraire. Puis observer que log(1 − ρ) = −0.4812.
398 Chapitre 14 • Optimisation

f (x)
0
−5 0 5
x
 
Figure 14.11 – La fonction f (x) = exp −x12 .

* Exercice 14.11 (Conditionnement d’un minimum) On considère les hypothèses du


théorème 14.7, page 392. Démontrer l’égalité 14.8. En déduire l’égalité 14.9.
Remarque 14.6 (Théorème de Taylor et optimisation). On peut faire un lien entre la formule
de Taylor et l’optimisation. En effet, soit f ∈ C n (R) et a ∈ R un point. On peut démontrer
que, si f 0 (a) = ... = f (n−1)(a) = 0, si f (n) (a) > 0 et si n est pair, alors le point a est un
minimum local de la fonction f ([127] théorème 2 page 411). Au contraire, si il n’existe aucun
entier n pour lequel la dérivée f (n)(a) est strictement positive, alors on ne peut rien déduire :
l’exercice suivant présente un exemple de cette situation.

 
** Exercice 14.12 (Une fonction aplatie) On considère la fonction f (x) = exp − x12
pour tout x ∈ R tel que x 6= 0.
1. Montrer que limx→0 f (x) = 0. Ainsi, par continuité, on a f (0) = 0.
2. Montrer que, pour tout n 6= 0, on a :
 
(n) 1
f (x) = P n(1/x) exp − 2 (14.18)
x
pour tout x ∈ R tel que x 6= 0, où Pn est un polynôme de degré impair. Indication.
On créera la suite de polynôme Pn par récurrence sur n.
3. En déduire que, pour tout n 6= 0, on a limx→0 f (n)(x) = 0. Ainsi, par continuité, on a
f(n) (0) = 0 pour tout n 6= 0.

Remarque 14.7 (Une fonction aplatie). La fonction précédente est présentée dans la figure
14.11 7 . On observe que le point x = 0 est un minimum global de la fonction. En effet, les
propriétés de la fonction exponentielle impliquent que f (x) > 0 pour tout x 6= 0. Enfin,
on a f(0) = 0 par continuité. De plus, la fonction f est telle que toutes ses dérivées sont
nulles au point x = 0. Cet exemple confirme le théorème 14.1 dans le sens où les conditions
sont effectivement nécessaires. De manière plus intéressante, cet exemple confirme que les
conditions indiquées dans le théorème 14.2 sont suffisantes, mais non nécessaires.

7Script Python : Optim/Scripts/Py3/[Link].


Chapitre 15

Conclusion

Dans ce livre, nous avons analysé les principes fondamentaux pour créer des mé-
thodes numériques et nous avons présenté certaines d’entre elles. Dans cette conclu-
sion, nous voudrions mettre en avant plusieurs sujets généraux associés à ces mé-
thodes.
Dans la section 5.4, nous avons introduit le conditionnement d’un problème. Nous
avons vu que lorsque les données d’un problème sont perturbées, alors la solution est
également perturbée : le conditionnement quantifie cette perturbation, de manière
absolue ou relative. Souvent, nous avons perturbé la valeur de la fonction considé-
rée. Toutefois, pour certains problèmes, on peut perturber plusieurs éléments. Par
exemple, nous avons vu que pour l’intégration, on peut perturber l’intégrande ou les
bornes d’intégration (ou les deux). La table 15.1 présente un index du conditionnement
de différents problèmes. La table 15.2 présente le conditionnement de ces problèmes.
Un point important de ces conditionnements est qu’ils sont associés au problème et,
par conséquent, indépendants de la méthode numérique considérée. Si le problème que
nous considérons est mal conditionné, alors le plus prudent est de modifier le problème
pour le régulariser. Lorsqu’on ne peut pas procéder ainsi, alors une méthode numérique
adaptée devrait être sélectionnée. Dans tous les cas, même avec une méthode très
précise, la solution du problème est instable quelle que soit la méthode choisie. De plus,
l’utilisation d’une méthode numérique potentiellement inappropriée peut déteriorer le
conditionnement de la solution approchée. C’est la situation que nous avons vue, par
exemple, dans la section 5.5 au sujet de la fonction exp(x) − 1 lorsque x est proche de
zéro. Pour le comprendre, nous avons observé le problème de cancellation des chiffres
significatifs, dû au mauvais conditionnement de la fonction somme si sa valeur est
proche de zéro.
Dans la section 5.9, nous avons établi la différence entre un algorithme et son im-
plémentation et nous avons vu que toutes les implémentations ne sont pas égales du
point de vue de leur qualité. Plusieurs sujets méritent une attention particulière et, en
particulier, la précision et la performance. Du point de vue de la précision, la prise en
compte des nombres à virgule flottante peut mener à une implémentation spécifique.
Par exemple, nous avons vu dans la section 5.5 comment utiliser les fonctions log1p
et expm1 en Python, alors que ces fonctions n’ont, dans un contexte mathématique,
aucun intérêt. Une des fonctions les plus utilisées dans ce contexte est la fonction
logarithmique, car elle réduit l’amplitude des nombres ce qui permet d’éviter de gé-
nérer des nombres à virgule flottante exceptionnels tels que INF et -INF. Du point

399
400 Chapitre 15 • Conclusion

Problème Section
Fonction scalaire 5.4 page 80
Fonction vectorielle 5.6 page 85
Somme 5.7 page 87
Fonctions élémentaires Exercice 5.12 page 94
log1p et expm1 Exercice 5.13 page 94
Composition de fonctions Exercice 5.21 page 96
Matrices Exercice 7.3 page 168
Système d’équations linéaires 7.3 page 134
Interpolation 8.8 page 200
Différentiation 9.4 page 229
Moindres carrés linéaires 10.4 page 259
Intégrale 11.1 page 278
Équation non linéaire 13.1 page 362
Optimisation 14.3 page 390

Table 15.1 – Index du conditionnement de différents problèmes.

Nom Perturbation Conditionnement


 0  Type
 xf (x) 
Fonction scalaire f  f (x)  Relatif
f |f 0 (x)| Absolu
kxk
Fonction vectorielle f kf (x)k kJ(x)k Relatif
f kJ (x)k Absolu
Équations linéaires A ou b kAkkA−1 k P Relatif
Interpolation f maxx∈[x1 ,xn ] nk=1 |L k(x)| Absolu
2|f (x)|
Différentiation f h|f 0(x)| Relatif

Moindres carrés A κ2 (A) 1 + κ2 (A) tan(
η
θ)
Relatif
κ 2(A)
linéaires b η cos(θ ) Relatif
kf k∞
Intégration f (b − a) R b  Relatif
f (x)dx
a

b R |bbf (b)|  Relatif


 f (x)dx
a
Zéro f 1
|f0(qx)| si f (x) 6= 0
0 Absolu
1 2|f (x)|
Minimisation f |x| f 00 (x) Spécifique

Table 15.2 – Conditionnement de différentes problèmes.


401

de vue de la performance, les caractéristiques spécifiques du langage ne peuvent être


ignorées. Une des méthodes les plus utiles dans le contexte d’un langage interprété
tel que le Python est la vectorisation. Par exemple, nous avons vu dans la section
7.5 comment exploiter la méthode outer dans le contexte de la méthode du pivot
de Gauss. Connaître ces éléments et savoir les utiliser ne relève ni de l’intuition, ni
du bon sens.
Le corollaire de ce constat est que l’implémentation robuste, précise et performante
d’une méthode numérique nécessite du travail. C’est la raison pour laquelle implémen-
ter une méthode numérique à des fins non pédagogiques peut être imprudent si on
n’y prend pas garde. On peut aboutir à une implémentation naïve, pour laquelle nous
ne disposons pas nécessairement des compétences pour identifier exactement en quoi
elle est imparfaite, quel est son niveau d’imperfection et pourquoi cela peut être un
problème pour résoudre tel ou tel problème particulier. Si l’objectif est d’obtenir un
résultat précis avec peu d’investissement, il est généralement plus efficace d’utiliser
une librairie spécifiquement développée dans ce but, comme NumPy ou SciPy. Au
contraire, si les objectifs sont de comprendre et de se former, l’implémentation peut
être bénéfique. De plus, en s’appuyant sur la bibliographie tant mathématique qu’in-
formatique (les livres, les articles et les librairies de calcul numérique), nous avons vu
qu’il est possible d’obtenir de bons résultats. On constate par exemple qu’au début
des années 2000, beaucoup de contributeurs initiaux du projet SciPy étaient étudiants
au moment de la création du projet [144]. Quand on en a le temps, l’idéal est de faire
les deux, c’est-à-dire à la fois développer ses propres fonctions pour comprendre les
méthodes et utiliser des librairies pour produire des résultats.
Aujourd’hui, la popularité de la librairie SciPy tient certainement à plusieurs
facteurs, et en particulier son code source, sa documentation, ses tests unitaires et
l’activité des forums de discussion. On peut contribuer activement au développement
des librairies NumPy ou SciPy puisqu’elles sont open source ce qui signifie que leur
code source est ouvert1.

1
[Link]
Bibliographie

[1] J. Abadie et Y. Salhi. « Sur la dérivation numérique en optimisation ». In :


RAIRO-Operations Research 22.1 (1988), p. 1-26.
[2] M. Abramowitz et I. A. Stegun. Handbook of Mathematical Functions with
Formulas, Graphs, and Mathematical Tables. 10th Edition. Dover Publications
Inc., 1972.
[3] Grégoire Allaire et Sidi Mahmoud Kaber. Numerical Linear Algebra. Texts
in Applied Mathematics. Springer, 2008.
[4] Laurent Anné, Quang Tran et William Symes. « Dispersion and cost analysis
of some finite difference schemes in one-parameter acoustic wave modeling ».
In : Computational Geosciences 1 (1 1997), p. 1-33. issn : 1420-0597.
[5] Uri M. Ascher. Numerical Methods for Evolutionary Differential Equations.
SIAM, 2008.
[6] Uri M. Ascher et Linda R. Petzold. Computer Methods for Ordinary Diffe-
rential Equations and Differential - Algebraic Equations. Johns Hopkins Uni-
versity Press, 1998.
[7] Stefan Bachu. « Screening and ranking of sedimentary basins for sequestration
of CO2 in geological media in response to climate change ». In : Environmental
Geology 44 (2003), p. 277-289.
[8] Sudipto Banerjee et Anindya Roy. Linear algebra and matrix analysis for
statistics. T. 181. CRC Press, 2014.
[9] Robert G. Bartle et Donald R. Sherbert. Introduction to Real Analysis (3rd
ed.) John Wiley & Sons, Inc., 2000.
[10] Nicolas Berend et Christophe Talbot. « Overview of some optimal control
methods adapted to expendable and reusable launch vehicle trajectories ». In :
Aerospace science and technology 10.3 (2006), p. 222-232.
[11] Ake Björck. Numerical Methods for Least Squares Problems. Society for In-
dustrial Applied Mathematics, 1996.
[12] Przemyslaw Bogacki et Lawrence F. Shampine. « A 3(2) pair of Runge-Kutta
formulas ». In : Applied Mathematics Letters 2.4 (1989), p. 321-325.
[13] Carl De Boor. A practical guide to splines. Springer, 2001.
[14] Stephen Boyd et Lieven Vandenberghe. Convex Optimization. Cambridge
University Press, mars 2004.

403
404 Bibliographie

[15] Martin Braun. Differential equations and their applications, Fourth Edition.
Texts in applied mathematics. Springer, 1993.
[16] Richard P. Brent. Algorithms for Minimization Without Derivatives. Dover
Publications, 2013.
[17] Richard L. Burden et J. Douglas Faires. Numerical Analysis, Ninth Edition.
Brooks/Cole, Cengage Learning, 2011.
[18] Edmund R. Burke. High Tech Cycling, 2nd Edition. Human Kinetics, 2003.
[19] John Butcher. John Butcher’s tutorials. Introduction to Runge-Kutta me-
thods. 2008.
[20] Torkild Carstens. « Experiments with supercooling and ice formation in
flowing water ». In : Geofysiske Publikasjoner. Geophysica Norwegica. 26.9
(1966).
[21] CEA. Les 20 ans du programme simulation. Rapp. tech. CEA, 2016.
[22] Steven C. Chapra. Applied Numerical Methods with MATLAB for Engineers
and Scientists, Third Edition. McGraw-Hill, 2012.
[23] R. H. Clewley et al. PyDSTool, a software environment for dynamical sys-
tems modeling. [Link] 2007.
[24] The SciPy community. Integration and ODEs ([Link]). http : / /
[Link]. 2014.
[25] The SciPy community. Linear Algebra ([Link]). [Link]
org. 2014.
[26] Keith Conrad. The Remainder In Taylor Series. [Link]
[Link]. 2016.
[27] Francesco Cremaschi. « Trajectory optimization for launchers and re-entry
vehicles ». In : Modeling and Optimization in Space Engineering. Springer,
2012, p. 159-185.
[28] G. Dahlquist et A. Björck. Numerical Methods. Society for Industrial and
Applied Mathematics, 2008.
[29] Steven F. Daly. Report on Frazil Ice. Rapp. tech. International Association
for Hydraulic Research, 1994.
[30] Danski14. « Flowchart showing the relationship between experiment, simula-
tion and theory. Ideas adopted from Allen and Tildesly, "Computer Simulation
of Liquids". » [Link]. Juin 2012.
[31] Philip J. Davis et Philip Rabinowitz. Methods of numerical integration. Aca-
demic Press, 1975.
[32] Czech Technical University in Prague Department of physics. Determina-
tion of temperature coefficient of resistance of metals. http: / / aldebaran.
[Link]/vyuka/physics_1/Labs/[Link]. 2011.
[33] Jacques Dixmier et Pierre Dugac. Cours de mathématiques du premier cycle :
Première année, Seconde Edition. Gauthier-Villars, 1976.
[34] Allen B. Downey. Think Python, How to Think Like a Computer Scientist.
2nd Ed. [Link]/thinkpython. O’Reilly Media, 2016.
Bibliographie 405

[35] J. Dumontet et J. Vignes. « Détermination du pas optimal dans le calcul


des dérivées sur ordinateur ». In : R.A.I.R.O Analyse numérique 11.1 (1977),
p. 13-25.
[36] Jacques Dumontet. « Algorithme de dérivation numérique : étude théo-
rique et mise en œuvre sur ordinateur ». Thèse de doct. Université de Béjaia-
Abderrahmane Mira, 1973.
[37] David Eberly. « Derivative approximation by finite differences ». Geometric
tools. [Link] 2008.
[38] C. Henry Edwards, David Penney et David Calvis. Differential equations
and boundary value problems, 5th Edition. Pearson, 2015.
[39] Terje O. Espelid. « Doubly adaptive quadrature routines based on Newton–
Cotes rules ». In : BIT Numerical Mathematics 43.2 (2003), p. 319-337.
[40] J. Douglas Faires et Richard Burden. Numerical Methods, Second Edition.
Brooks/Cole, Pacific Grove, CA, USA, 1998.
[41] Paola Favati, Grazia Lotti et Francesco Romani. « Algorithm 691 : Impro-
ving QUADPACK automatic integration routines ». In : ACM Transactions
on Mathematical Software (TOMS) 17.2 (1991), p. 218-232.
[42] G.B. Folland. Higher-Order Derivatives and Taylor’s Formula in Several
Variables. 2014.
[43] Bengt Fornberg. « Generation of finite difference formulas on arbitrarily spa-
ced grids ». In : Math. Comp. 51.184 (1988), p. 699-706.
[44] George E Forsythe. What is a satisfactory quadratic equation solver ? Rapp.
tech. CS76. Stanford University, Department of computer science., 1967.
[45] George E. Forsythe. How do you solve a quadratic equation ? Rapp. tech.
CS40. Stanford University, Department of computer science., 1966.
[46] George E. Forsythe, Michael A. Malcolm et Cleve Moler. Computer me-
thods for mathematical computations. Prentice-Hall Series in Automatic Com-
putation, 1977.
[47] Walter Gander et Walter Gautschi. « Adaptive Quadrature - Revisited ».
In : BIT Numerical Mathematics 40 (2000), p. 84-101.
[48] Walter Gautschi. « Norm estimates for inverses of Vandermonde matrices ».
In : Numerische Mathematik 23.4 (1975), p. 337-347.
[49] Walter Gautschi. Numerical Analysis, Second Edition. Birkhäuser, 2012.
[50] Walter Gautschi. Orthogonal Polynomials. Computation and approximation.
Oxford Science Publications, 2004.
[51] Curtis F. Gerald et Patrick O. Wheatley. Applied Numerical Analysis (7th
Edition). Pearson, 2003.
[52] H. Gié et J. P. Sarmant. « Le portrait de phase des oscillateurs ». In : Bulletin
de l’union des physiciens 86.744 (1992), p. 719.
[53] P. E. Gill, W. Murray et M. H. Wright. Practical optimization. London :
Academic Press, 1981.
[54] David Goldberg. « What Every Computer Scientist Should Know About
Floating-Point Arithmetic ». In : ACM Computing Surveys 23.1 (mars 1991).
406 Bibliographie

[55] Gene H. Golub et Charles. F. Van Loan. Matrix computations, 4th Edition.
Johns Hopkins University Press, 2013.
[56] Frédéric Grappe. Etude des variables de la performance en sport. Application
au cyclisme. Rapp. tech. Université de Franche-Comté. Candidature à une
Habilitation à diriger des recherches, sept. 2000.
[57] Joseph F. Grcar. « Mathematicians of Gaussian Elimination ». In : Notices
of the AMS 58.6 (2011), p. 782-792.
[58] David F. Griffiths et Desmond J. Higham. Numerical methods for ordinary
differential equations. Springer, 2010.
[59] K.T. Gursel et S.N. Nane. « Non-linear finite element analyses of automo-
biles and their elements in crashes ». In : International Journal of Crashwor-
thiness 15.6 (déc. 2010), p. 667-692.
[60] Ernst Hairer et Christian Lubich. Numerical solution of ordinary differential
equations. Prepared for The Princeton Companion to Applied Mathematics,
ed. Nicholas J. Higham. Princeton, NJ : Princeton University Press, forthco-
ming. Jan. 2012.
[61] Charles A. Hall et W. Weston Meyer. « Optimal error bounds for cu-
bic spline interpolation ». In : Journal of Approximation Theory 16.2 (1976),
p. 105-122.
[62] P. C. Hansen, V. Pereyra et G. Scherer. Least Squares Data Fitting with
Applications. Johns Hopkins University Press, 2013. isbn : 9781421407869.
[63] H.Z. Hassan, A.A. Mohamad et G.E. Atteia. « An algorithm for the fi-
nite difference approximation of derivatives with arbitrary degree and order
of accuracy ». In : Journal of Computational and Applied Mathematics 236.10
(2012), p. 2622-2631. issn : 0377-0427. doi : [Link] 10.1016/
[Link].2011.12.019. url : [Link]
article/pii/S0377042711006339.
[64] Mi He. « Characterization of fracture behavior of zirconium alloys for fuel rod
cladding of nuclear power plant in the post-quench stage of a LOCA ». Thèse
de doct. Ecole Nationale Supérieure des Mines de Paris, nov. 2012.
[65] Raymond L. Heacock. « The Voyager Spacecraft ». In : Proceedings of the
Institution of Mechanical Engineers 194.1 (1980), p. 211-224.
[66] Michael T. Heath. Scientific Computing : An Introductory Survey, Revised
Second Edition. SIAM, 2018.
[67] P. Henrici. Elements of numerical analysis. Wiley, 1964.
[68] Hepianews. « Newsletter de la haute école du paysage d’ingéniérie et d’achi-
tecture de Genève ». Zoom sur les métiers d’ingénieur. Nov. 2012.
[69] N. J. Higham. « Gaussian elimination ». In : WIREs Comp Stat 3 (2011),
p. 230-238.
[70] Nicholas J. Higham. Accuracy and Stability of Numerical Algorithms, Second
Edition. Society for Industrial Applied Mathematics, 2002.
[71] Morris W. Hirsch, Stephen Smale et Robert. L. Devaney. Differential Equa-
tions, Dynamical Systems, and an introduction do chaos, Third Edition. Else-
vier, 2013.
Bibliographie 407

[72] IEEE Computer Society. IEEE standard for binary floating-point arithme-
tic. T. 754. IEEE, 1985.
[73] IEEE Task P754. IEEE 754-2008, Standard for Floating-Point Arithmetic.
New York, NY, USA : IEEE, août 2008, p. 58.
[74] Isover. Guide de la thermique du bâtiment. 2014.
[75] Dunham Jackson. Über die Genauigkeit der Annäherung stetiger Funktio-
nen durch ganze rationale Funktionen gegebenen Grades und trigonometrische
Summen gegebener Ordnung. Dieterich’schen Universität–Buchdruckerei, 1911.
[76] Karen E. Jackson et al. A History of Full-Scale Aircraft and Rotorcraft Crash
Testing and Simulation at NASA. Rapp. tech. NASA Langley Research Center,
2004.
[77] William Kahan. « Handheld calculator evaluates integrals ». In : Hewlett-
Packard Journal 31.8 (1980), p. 23-32.
[78] C. T. Kelley. Iterative Methods For Optimization. SIAM, 1999.
[79] C. T. Kelley. Solving nonlinear equations with Newton’s method. SIAM, 2003.
[80] J. Kiefer. « Sequential minimax search for a maximum ». In : Proceedings of
the American Mathematical Society 4.3 (1953), p. 502-506.
[81] Jaan Kiusalaas. Numerical Methods in Engineering with Python, 2nd Edi-
tion. Cambridge University Press, 2010.
[82] S. Kleiven. « Biomechanics and thresholds for MTBI in humans ». In : MTBI
Pre-Congress Symposium. IBIA CONGRESS, Lisbon, Portugal, 4 8 2008 (avr.
2008).
[83] S. Kleiven. « Evaluation of head injury criteria using a finite element model ».
In : IJCrash 11 (mars 2006), p. 65-79.
[84] S. Kleiven. « Predictors for Traumatic Brain Injuries Evaluated through Ac-
cident Reconstructions ». In : 51st Stapp Car Crash Conference (2007).
[85] Svein Kleiven et Hans von Holst. « Consequences of head size following
trauma to the human head ». In : Journal of Biomechanics 35.2 (2002), p. 153-
160. issn : 0021-9290.
[86] Z. Kopal. Numerical Analysis. John Wiley & Sons, New York, 1955.
[87] Arnold R. Krommer et Christoph W. Ueberhuber. Computational Integra-
tion. SIAM, 1998.
[88] Arnold R. Krommer et Christoph W. Ueberhuber. Numerical Integration
on Advanced Computer Systems. Lecture notes on computer science. Springer-
Verlag, 1994.
[89] E. K. Vipin Kumar. Numpy/Scipy with Intel® MKL. Rapp. tech. Intel, 2012.
[90] Gerard Le Lann. The Ariane 5 Flight 501 Failure - A Case Study in System
Engineering for Computing Systems. Rapp. tech. RR-3079. INRIA, 1996.
[91] Pierre Lavaurs. DEUG MIAS, unité d’enseignement 11, année 2002-2003.
Rapp. tech. Université Lyon I, 2002.
[92] Maurice Lemaire. Fiabilité des structures : couplage mécano-fiabiliste statique.
Lavoisier, 2005.
408 Bibliographie

[93] Randall J. Leveque. Finite Difference Methods for Ordinary and Partial Dif-
ferential Equations. SIAM, 2007.
[94] François Liret et Dominique Martinais. Algèbre et géométrie, 2e année. Du-
nod, 2003.
[95] François Liret et Dominique Martinais. Analyse, 1re année, Deuxième Édi-
tion. Dunod, 2003.
[96] François Liret et Dominique Martinais. Analyse, 2e année. Dunod, 2008.
[97] Q. Louveaux. Introduction aux méthodes numériques. Univ. Liège. Faculté
des sciences appliquées. 2010.
[98] John C. Mason et David C. Handscomb. Chebyshev polynomials. CRC press,
2002.
[99] Nicholas Maxwell. « Notes on the derivation of Finite Difference kernels, on
regularly spaced grids, using arbitrary sample points ». 2010.
[100] B. D. McCullough et Berry Wilson. « On the accuracy of statistical proce-
dures in Microsoft Excel 97 ». In : Computational Statistics & Data Analysis
31 (juill. 1999), p. 27-37.
[101] William Marshall McKeeman. « Algorithm 145 : Adaptive Numerical Inte-
gration by Simpson’s Rule ». In : Commun. ACM 5.12 (déc. 1962), p. 604.
[102] Wes McKinney. Python for data analysis : Data wrangling with Pandas,
NumPy, and IPython. O’Reilly Media, Inc., 2012.
[103] MIPS. Helmet safety. Brain protection system. [Link]. 2020.
[104] Cleve Moler. Numerical Computing with Matlab. Society for Industrial Ap-
plied Mathematics, 2004.
[105] Banque Mondiale. Transport aérien, voyageurs transportés. [Link].
2020.
[106] Jean-Michel Muller et al. Handbook of Floating-Point Arithmetic. Birkhäuser
Boston, 2010, p. 572.
[107] NASA. « The National Advisory Committee for Aeronautics ». [Link]
[Link]/ames/ the- national- advisory- committee- for- aeronautics.
Juin 2019.
[108] Jorge Nocedal et Stephen J. Wright. Numerical Optimization. Springer,
1999.
[109] Anders Omstedt et Urban Svensson. « Modeling supercooling and ice for-
mation in a turbulent Ekman layer ». In : Journal of Geophysical Research :
Oceans 89.C1 (1984), p. 735-744.
[110] G. Le Petit et al. Discriminer un essai nucléaire d’un évènement nucléaire
civil. Rapp. tech. Chocs. Avancées scientifiques et techniques de la direction
des applications militaires. CEA – DAM – Île-de-France, 2008.
[111] Peter Philip. Numerical Analysis I. Avr. 2015.
[112] Mark Pilgrim. Dive into Python. [Link]. Apress, 2009.
[113] W. H. Press et al. Numerical Recipes in C, Second Edition. Cambridge Uni-
versity Press, 1992.
Bibliographie 409

[114] Jingmei Qiu. Polynomial Interpolation : error analysis. MATH 4364 - Intro-
duction to Numerical Analysis in Scientific Computing. 2012.
[115] Alfio Quarteroni, Riccardo Sacco et Fausto Saleri. Numerical Mathema-
tics. Springer, 2000.
[116] Anthony Ralston. « Runge - Kutta Methods with Minimum Error Bounds ».
English. In : Mathematics of Computation 16.80 (1962), pp. 431-437. issn :
00255718.
[117] Sheldon Ross. Introduction to Probability and Statistics for Engineers and
Scientists, 3rd ed. Elsevier, 2004.
[118] Guido van Rossum, Barry Warsaw et Nick Coghlan. « PEP 8 – Style Guide
for Python Code ». [Link] 2001.
[119] Yousef Saad. Iterative methods for sparse linear systems. SIAM, 2003.
[120] Mark F. Schilling, Ann E. Watkins et William Watkins. « Is Human
Height Bimodal ? » In : The American Statistician, American Statistical Asso-
ciation 56.3 (2002), p. 223-229.
[121] L. F. Shampine. « Accurate numerical derivatives in MATLAB ». In : ACM
Trans. Math. Softw. 33.4 (2007), p. 26. issn : 0098-3500. doi : [Link]
[Link]/10.1145/1268776.1268781.
[122] L. F. Shampine, R. C. Allen Jr. et S. Pruess. Fundamentals of numerical
computing. Johns Wiley & Sons, Inc., 1997.
[123] Thomas S. Shores. Applied linear algebra and matrix analysis. T. 2541. Sprin-
ger, 2007.
[124] Robert Skeel. « Roundoff error and the Patriot missile ». In : SIAM News
25.4 (1992), p. 11.
[125] Simon J. Smith. « Lebesgue constants in polynomial interpolation ». In : An-
nales Mathematicae et Informaticae 33 (2006), p. 109-123.
[126] Fabien Souillé, Florent Taccone et Chaymae El Mertahi. « A Multi-class
Frazil Ice Model for Shallow Water Flows ». In : Online proceedings of the pa-
pers submitted to the 2020 TELEMAC-MASCARET User Conference October
2020. 2020, p. 122-129.
[127] Michael Spivak. Calculus, 3d Edition. Publish or perish, 1994.
[128] William Squire et George Trapp. « Using Complex Variables to Estimate
Derivatives of Real Functions ». In : SIAM Rev. 40.1 (1998), p. 110-112. issn :
0036-1445. doi : [Link]
[129] R. S. Stepleman et N. D. Winarsky. « Adaptive Numerical Differentiation ».
In : Mathematics of Computation 33.148 (1979), p. 1257-1264. issn : 00255718.
[130] Gilbert W. Stewart. Afternotes on numerical analysis. Society for Industrial
et Applied Mathematics, 1996.
[131] Gilbert W. Stewart. Matrix Algorithms Volume 1, Basic Decompositions.
Society for Industrial et Applied Mathematics, 1998.
[132] Gilbert Strang. Introduction to linear algebra, 4th Edition. Wellesley-Camb-
ridge Press, 2009.
410 Bibliographie

[133] Urban Svensson et Anders Omstedt. « Simulation of supercooling and size


distribution in frazil ice dynamics ». In : Cold Regions Science and Technology
22.3 (1994), p. 221-233.
[134] Gerald Teschl. Ordinary Differential Equations and Dynamical Systems.
American Mathematical Society, 2010.
[135] Lloyd N. Trefethen. Approximation Theory and Approximation Practice,
Extended Edition. SIAM, 2019.
[136] Lloyd Nicolas Trefethen et David Bau III. Numerical linear algebra. Society
for Industrial et Applied Mathematics, 1997.
[137] Timothy G. Trucano et al. « Calibration, validation, and sensitivity analysis :
What’s what ». In : Reliability Engineering & System Safety 91.10-11 (2006),
p. 1331-1357.
[138] Kiryl Tsishchanka. Optimization Problems. [Link]
New York University, Department of Mathematics. Août 2010.
[139] A.H. Turetskii. « The bounding of polynomials prescribed at equally distri-
buted points ». In : Proc. Pedag. Inst. Vitebsk, (en Russe) 3 (1940), p. 117-127.
[140] Statistical Abstract of the United States U.S. Census Bureau. Table 209.
Cumulative Percent Distribution of Population by Height and Sex : 2007-2008.
2012.
[141] Christoph W. Ueberhuber. Numerical Computation Vol. 1 : methods, soft-
ware and analysis. Springer-Verlag, 1997.
[142] Stefan Van Der Walt, S Chris Colbert et Gael Varoquaux. « The NumPy
array : a structure for efficient numerical computation ». In : Computing in
science & engineering 13.2 (2011), p. 22-30.
[143] Jake VanderPlas. Python data science handbook : Essential tools for working
with data. O’Reilly Media, Inc., 2016.
[144] Pauli Virtanen et al. « SciPy 1.0 : fundamental algorithms for scientific com-
puting in Python ». In : Nature methods 17.3 (2020), p. 261-272.
[145] Shuang Ming Wang et J. C. Doering. « Numerical Simulation of Supercoo-
ling Process and Frazil Ice Evolution ». In : Journal of Hydraulic Engineering
131.10 (2005).
[146] Wikimedia Commons. File : [Link] — Wikimedia Commons,
the free media repository. 2020.
[147] Wikimedia Commons. File : IEEE754 simple [Link] — Wikimedia
Commons, the free media repository. 2020.
[148] Wikimedia Commons. File : Matrix multiplication row column correspon-
[Link] — Wikimedia Commons, the free media repository. 2020.
[149] Wikimedia Commons. File : [Link] — Wikimedia Commons,
the free media repository. 2020.
[150] Wikimedia Commons. File : Sintay [Link] — Wikimedia Commons, the
free media repository. 2020.
[151] Wikimedia Commons. File : Tangent to a [Link] — Wikimedia Commons,
the free media repository. 2018.
Bibliographie 411

[152] Wikipedia. Birthday attack — Wikipedia, The Free Encyclopedia. 2014.


[153] James Hardy Wilkinson. « Error analysis of direct methods of matrix inver-
sion ». In : Journal of the ACM (JACM) 8.3 (1961), p. 281-330.
[154] James Hardy Wilkinson. Rounding errors in algebraic processes. Notes on
applied science No. 32, Her Majesty’s Stationery Office, London, 1963.
[155] Dan Zuras et al. « IEEE standard for floating-point arithmetic ». In : IEEE
Std 754.2008 (2008), p. 1-70.
Index

A polynôme de, 186


Adams-Bashforth à deux pas, Cholesky (décomposition), 263, 272
méthode, 355 classe d’une fonction, 39
aiguille, 308 CNES, 383
ajustement de courbe, 254 colinéaires (vecteurs), 130
angle (entre deux vecteurs), 118 commutantes, 108
Apollo, 24 complexité, 148
args (arguments supplémentaires), composite
301, 309 méthode d’intégration, 285, 296
Ariane 5, 25 conditionnement
array, 99 composition de deux fonctions, 96
autonome, système d’EDO, 354 d’un zéro, 362
d’une fonction, 80
B d’une matrice, 135
backward, 79 de l’interpolation, 200
base canonique, 98 de l’intégrale, 318
batterie, 89 de l’optimisation, 390
binaire (représentation d’un entier), de la matrice de conception, 257
50 des moindres carrés linéaires, 259
bissection, 363 produit de deux matrices, 168
bits, 50 convergence
Bogacki, 339 linéaire, 72
Bogacki-Shampine, méthode d’ordre ordre p, 72
2-3, 339 critique point, 326
Boole, règle de, 288
bruit, 255 D
Butcher, 357 dichotomie, 73, 74, 363
tableau de, 334 différence finie, 216
directe, 79
C double, 52
calage, 254 Dumontet J., 230
cancellation, 85, 228 dérivée d’une fonction, 215
Cauchy, problème de, 319 développement limité, 42
CEA, 25
ceil, 57 E
CESTA, 25 entier
Chebyshev, 267 non signé, 50

413
414 Index

signé, 51 I
équilibre, solution, 326 IEEE 754, 53
erreur implémentation, 91
absolue, relative, 76 INF, 62, 365, 372
de discrétisation globale, 336 infinie, norme d’une fonction, 197, 279
de discrétisation locale, 335 intégrande, 277
Euler inverse, 79
erreur de la méthode, 355 inégalité triangulaire, 102
méthode, 327
expm1, 84, 89 J
Jackson (théorème), 197
F jacobienne, 87, 244, 350
facteur de croissance, 153 matrice, 323
Fermat, 44
fiabilité, 308 K
floor, 57 Kiefer, 388
flottant
L
dénormalisé, 58
Lagrange
extrême, 59
polynôme, 180
nombre, 53
théorème de Taylor, 41
normalisé, 57
Lambert (fonction), 350
système, 52
Landau (notation), 36
forward, 79
Lebesgue
constante, 199
G fonction, 199
Gander Walter, 301 lipschitzienne, fonction, 358
Gauss C.F., 129 log-erreur relative, 78
pivot, 139 log1p, 83, 90
transformation, 151 logarithme (de base arbitraire), 56
gaussienne, 204, 254, 309 LRE (log-erreur relative), 78
Gautschi Walter, 301
Givens, rotations, 268 M
gradient, 247 matrice, 103
Gram, 262 addition, 104
Gram-Schmidt, méthode, 268 carrée, 114
grand O de conception, 255
au voisinage de zéro, 36 de Hilbert, 166
vers l’infini, 37 de Vandermonde, 188, 256
diagonale, 114
H identité, 116
hachage, 90 inverse, 116
HEPIA, 23 multiplication d’une matrice par
Hermite, interpolation, 202, 285 un scalaire, 105
hessienne, 247 orthogonale, 168
Heun permutation, 116
erreur de la méthode, 355 produit matrice-matrice, 107
méthode, 331 produit matrice-vecteur, 106
Hilbert (matrice), 166 rang, 132
Index 415

transposée, 105 pas de différentiation, 216


triangulaire, 114 Patriot, 67
MAVIC, 23 Peano
minimum théorème de Taylor, 42
global fort, 385 permutation
local faible, 385 matrice, 124
local fort, 385 phi, φ
missile, 67 convergence, 72
moindres carrés linéaires, 259 méthode de la sécante, 377
Moler Cleve, 3 méthode du nombre d’or, 389
monique (polynôme), 193 pi, π , 67
monôme, 179 pile, 301
Moore-Penrose, 272 plafond, 57
Moore-Penrose (inverse), 259 plancher, 57
multicolinéarité, 130, 161 pochoir, 217
multiplicateurs, 145 point milieu (formule), 284
polynôme
N interpolateur, 179
NACA, 23 interpolateur de Lagrange, 181
NAN, 62 monique, 193
NASA, 23 nodal, 193
NCAP, 24 produit tensoriel, 115
Neptune, 25 projection orthogonale, 119
Newton (méthode), 74, 370
Newton-Cotes (formules), 291 Q
nodal (polynôme), 193 QR (décomposition), 268
nombre d’or, 377 quadrature, 277
nombre d’or (méthode), 389
nombre à virgule flottante, 49 R
normale (loi de distribution), 309 Ralston, 340
norme rang
matricielle, 109 colonne, 132
vectorielle, 102 ligne, 134
norme infinie d’une fonction, 197, 279 plein, 132
NumPy, 27, 99, 401 recensement, 309
Richardson
O extrapolation, 232, 246
ONERA, 383 intégration, 285
or robotique, 119
méthode du nombre d’or, 389 Rolle (super), 46
nombre d’or, 377 Rolle, théorème, 39
ordre de précision, 217, 337 Romberg, méthode, 233
orthogonale Runge, 295
matrice, 124, 168, 266, 268 erreur de la méthode, 355
projection, 119 méthode, 331
orthogonaux (vecteurs), 101 Runge-Kutta d’ordre 4, méthode, 333
overflow, 62, 306, 365 récursivité, 301
réseau électronique, 161
P résidu
416 Index

système d’équations linéaires, 153 TERA, 25


théorème fondamental de l’analyse,
S 216
SciPy, 27, 166, 203, 300, 324, 344, 401 transport aérien, 252
Scud, 67
sécante, méthode, 375 U
Shampine, 339 underflow, 62, 306, 365
Simpson unimodale (fonction), 387
composite, 286
formule, 285 V
sous-linéaire, 72 Van Der Waals, 378
spline, 202, 285 Vandermonde, 209
stabilité inverse, 80 Vandermonde, matrice, 188, 256
stationnaire, solution, 326 vecteur, 98
stencil, 217 ligne, colonne, 98
Stewart, G.W., 87 linéairement dépendant, 130
Strang Gilbert, 274 multiplication d’un vecteur par
super-linéaire, 72 un scalaire, 99
SVD (décomposition), 272 produit scalaire, 100
système d’équations linéaires, 133 somme, 99
vecteurs
T orthogonaux, 101
Taylor vectorisation, 145, 185
polynôme, 46 Vignes J., 230
polynôme de Taylor, 40 Voyager 2, 25
pour l’interpolation, 193
théorème avec reste de Lagrange, W
41 Weierstrass, 123, 313
théorème avec reste de Peano, 42 Wilkinson J.H., 129, 154
Tchebychev, 186 Windermere, éventail, 360

Vous aimerez peut-être aussi