Ebook MéthodesNumériquesAvecPython 416p
Ebook MéthodesNumériquesAvecPython 416p
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
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
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
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
Table 3 – Notations.
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
(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
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
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
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
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
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
15 Conclusion 399
Bibliographie 403
Index 413
Première partie
Prolégomènes au calcul
scientifique
17
Chapitre 1
19
20 Chapitre 1 • À quoi sert le calcul numérique ?
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.
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.
Modèle du
Système réel
système
Théories
Expériences Simulations approchées
Comparer et améliorer
expérience, simulation
et théorie
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.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 ?
Python
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 ’ >
Indice i 0 1 2
Variable a[i] a[0] a[1] a[2]
Valeur 9. 5. 11.
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)
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)
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.
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].
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
|f(x)| 5x 3 − 6x 2 + 3
M|g(x)| 25 14x3
y
0
x0 x 0.5 1.0 1.5
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 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.
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)).
1
ξ = 0.5560
f(x)
y
0
a ξ b x
0 1
x
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.
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.
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
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
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 (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!
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).
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.
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
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 :
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
** 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 :
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 :
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 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.
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
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.
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.
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.
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
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.
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)
−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
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
logβ(β x ) = x, (4.6)
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 :
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)
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.
µ = βemin . (4.12)
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
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.
RN(x)
f- x f+
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
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.
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
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
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
ℝ (ex. : π)
ℚ (ex. : 1/3)
𝔻 (ex. : 1/10)
𝔹 (ex. : 1/210000)
𝔽64
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 :
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
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
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 .
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.
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)
β β
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.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
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
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 ? |
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
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érobeaucoup 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 :
x? = 0.6823278038280193273694837...
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
i 0 1 2 3 4 5 ...
ei 10−1 10−2 10−4 10−8 10 −16 10−32 ...
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.
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 ∞
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̃|
— 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.
eabs (αx, αx
˜) = αe abs (x, x
˜) et erel (αx, αx
˜) = erel (x, x
˜ ).
b=2 b = 10
LRE min 0 0
LRE max 53 15.95
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
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.
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)
˜
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
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.
−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
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
log1p(x) = log(1 + x)
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
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
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.
s(x 1 , x2) = x 1 + 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 |
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 :
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 + x22.
|ỹ − y| kxk1
e rel(y, y)
˜ = ≤ .
|y| |x1 + x 2 |
kxk1
Introduisons κ = |x 1+x 2 | . Nous obtenons :
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.
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 ))
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.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.
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)
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)
2. Supposons que µ = 1
2
et considérons la base b = 2. Soit di le nombre de chiffres corrects
en base b :
Montrer que :
di+1 = 1 + d i (5.21)
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)
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
L’équation 5.29 montre que le conditionnement absolu d’une fonction est égal à la dérivée
première de la fonction.
3. Montrer que lim x→0 c expm1(x) = 1 ce qui implique cexpm1 (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)
pour tout x ∈ R et :
crel rel rel
f ◦g (x) = cf (g (x)) cg (x)
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.
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.
pour i = 1, 2, ..., n.
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.
hx, yi = xT y.
2 for i in range ( n) :
3 p = p + x[ i] * y [i ]
x T y = 0.
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
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
x2
0 0 0
−1 −1 −1
−1 0 1 −1 0 1 −1 0 1
x1 x1 x1
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.]])
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.
× 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.
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
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.
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.
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
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
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.
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∞ .
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.
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.
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.
kAyk2
kAk 2 = .
kyk 2
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
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
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.
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 .
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 :
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.
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.
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 :
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.
xT y
λ= = kxk 2 cos(θ).
kyk 22
hy, x − λyi = 0.
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.
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
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.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
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.
Aej = a j (6.8)
** 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
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
kAk1 ≤ α. (6.11)
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
Pn
Soit α = max i=1,...,m j=1
|a ij|. On souhaite démontrer que kAk∞ = α.
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 :
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.14 (Norme matricielle maximum et autres normes) Pour tout matrice
A ∈ Rm×n , montrer que :
* 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.
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)
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
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
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 en déduit :
(
α 1 + 3α2 = 0
α2 = 0.
Cela implique :
(
α1 − 2α2 = 0
2α 1 − 4α2 = 0.
c’est-à-dire Aα = 0 avec :
1 3 α1
A= et α= .
2 4 α2
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
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.
Ax = b. (7.2)
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.
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 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
L’équation 7.4 qui définit le conditionnement implique que, si A est une matrice
inversible, alors :
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
pour i = 1, . . . , n. L’opération :
L i ← Li + α × L j
• 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 :
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
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
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
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.
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])
U x = b.
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
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)
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
(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)
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 :
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.
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
γ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é.
(A + ∆A) x̃ = b (7.18)
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 :
kAx̃ − bk ∞
≤ n2 γ3n ρn (7.20)
kAk∞ kx̃k ∞
kx − x̃k ∞
≤ n 2γ3n ρn κ∞ (A) (7.21)
k x̃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
où LREmin
10 est définie par :
LREmin 2
10 (A) = − log 10(3n γ n κ∞ (A) M ).
x1 x1
ou égale à :
F = {x̃ ∈ Rn | kAx̃ − bk 2 ≤ }.
Puisque Ax = b, les points dans cet ensemble doivent satisfaire l’inégalité :
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, cequi 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
δ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.
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
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.
R R R
Vs i1 R i2 R i3 R
R R R
Figure 7.7 – Un réseau de résistances.
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])
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.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
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
À 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
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
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
Matrice de Hilbert
1017
Conditionnement
1
2
1011
∞
105
5 10
Taille de la matrice
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 :
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
1 import scipy
2
* 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
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)
QQ T = I n . (7.40)
2. Soit Q ∈ Rn×n une matrice orthogonale. Montrer que, pour tous vecteurs x, y ∈ Rn ,
on a :
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.
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.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)
* 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.
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 :
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
pour k = 1, . . . , n − 1. Soit :
L k = (M0k) −1 (7.53)
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 :
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)
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
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 .
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.
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.
Pour cela, vous ferez passer à chaque étape les termes précédemment calculés dans le second
membre.
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.
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.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
kAxk kAxk
λ = min et µ = max .
kxk=1 kxk kxk=1 kxk
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.
177
178 Chapitre 8 • Interpolation
4
Interpolation
2 Ajustement
y
0
0 2 4
x
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.
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
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 :
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 :
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.
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
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
Polynômes de Lagrange
1 L1
L2
0 L3
L4
−1 0 1
x
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
é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
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é.
5 Données
Linéaire
y
0 Polynomial
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.
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
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.
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.
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
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)
P (x) = 1 × x3 − 2 × x 2 + 0 × x + 1 = x3 − 2x2 + 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
π
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 peuamé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.
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 :
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].
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.
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
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 )|)
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
Erreur abs.
0.1 Lin. p. m.
Polynôme
0.0
0 5
x
Le phénomène de Runge
1
f (x)
6 pts
y
0 10 pts
−1 0 1
x
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)
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
Constante de Lebesgue
Équidistants
2 1014
Chebyshev
λ5 (x)
Λn
106
1
−1 0 1 0 50
x n
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
kP (y + ∆y) − P (y)k∞
≤ Λn (X )
k∆yk ∞
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.
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.
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
x n−x1
Puisque h = n−1 , l’équation 8.28 implique37 :
kf − P k∞ = O n−4 . (8.29)
pf = Φ(−β )
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 :
log10 (Pf )
−5
0 5
β
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
Table 8.3 – Interpolation de log10 (pf ) pour β = 4.5 par quatre méthodes d’inter-
polation.
Interpolation
Lin. p. m.
10 −2
Erreur abs.
Équidistant
Chebyshev
10 −3
Spline
10 −4
0 2 4
β
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
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
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)
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.
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.
xi = x 1 + h(i − 1) (8.37)
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
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
1 f (x) = sin(x)
f (a) + (x − a)f 0(a)
y
0
−1
0.0 2.5 5.0
x
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 ()
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).
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 :
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
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.
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)!
eabs
10−6
10 −10 10−4
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.
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
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
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 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
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)|
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
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
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
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.
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é.
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.
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)
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.
10−8 10−3
h
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
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.
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 :
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 :
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 :
gi-1,j
gi,j gi,j+1
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.
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.
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)
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 1 2 4 6 8 10
2 log10 (p) 0.3010 0.6021 1.204 1.806 2.408 3.010
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
On obtient :
11 Script Python : Diff/Scripts/Py3/[Link].
240 Chapitre 9 • Différentiation
eabs
10 −7 x = 104
10−11 10 −5
h
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
Altitude (m)
300
200
100
0 5 10
Temps (s)
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.
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.
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 :
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.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)
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.
∂f (x)
∇f(x)i =
∂xi
∂ 2f(x)
H(x) ij =
∂x i ∂xj
9.12 • Exercices 247
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
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
Montrer que :
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.
251
252 Chapitre 10 • Moindres carrés linéaires
Table 10.1 – Nombre annuel de passagers (en milliards) utilisant le transport aérien
dans le monde entre 1971 et 2019.
y(t) = β1 t2 + β2 t + β 3
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 " )
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
On peut exprimer les prévisions du modèle sous une forme matricielle, comme le
montre le théorème suivant.
y ≈ X β.
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
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(t) = ke λt
log(y(t)) = log(k) + λt = β1 t + β2
Considérons le modèle :
n
X
yi ≈ β jφ j (ti ), i = 1, ..., m.
j=1
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
A† = (AT A)−1A T .
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.
κ2 (X )
cy (X, y) = (10.5)
η cos(θ)
où
kXβk 2
cos(θ) =
kyk2
et :
kδβk2 kδyk 2
≤ c y (X, y) . (10.6)
kβk2 kyk2
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.
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.
X T X β = X T y. (10.10)
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.
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
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.
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
X = QR
n n
X = Q R X = Q1 R1
m m 0
0
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
Rβ ≈ Q T y.
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.
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
Résistivité (Ω.m)
115 Données
110 Modèle
105
40 60
Température (°C)
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].
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.
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 :
5 Modèle
Données
y
0
0.0 2.5
t
X T X β = X T y. (10.12)
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}.
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
y
r
R(X)
Xβ^
Xβ
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.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).
*** 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
Q = (Q1 , Q 2 ) (10.17)
.
φ j (tm)
Intégration
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, la suite, on suppose que f est continûment dérivable sur [a, b].
eabs(f, f + δ) = kδ k. (11.4)
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.
Alors :
Alors :
|bf (b)|
crel(b) = R b .
(11.12)
a f (x)dx
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
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.
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
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
h
S= (f (a) + 4f (c) + f (b)) (11.23)
6
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.
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
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 :
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 :
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
Milieu
Erreur absolue
10−5
Trapèze
10−14 Simpson
Simpson S 2
10−23
Boole
10 −7 10−3
h
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.
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.
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
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
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
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
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.
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
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
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.
xk +xk+1
où x̄ k = 2 est le milieu de l’intervalle [x k, xk+1 ] pour k = 1, 2, . . . , n − 1.
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.
y
0 0 0
−1 0 1 −1 0 1 −1 0 1
x x x
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ù 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
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.
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.
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
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 )
sin(x)/x
1
y
0
0 2
x
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
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 :
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
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.
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
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σ
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
P (X > 2) ≈ 0.0002499
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.
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.
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.
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.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
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
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.
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.
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 :
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.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.
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].
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 :
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.
c abs(f, a, b) ≤ b − a. (11.81)
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.
Équations différentielles
ordinaires
dy(t)
= f (t, y (t)) (12.1)
dt
pour tout t ≥ t0 avec la condition initiale :
y(t0 ) = y0 . (12.2)
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) = y0 . (12.4)
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)
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.
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
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 :
J(y) = . . .
∂fm
∂y1 . . . ∂f m
∂y m
ẍ(t) = −x(t)
Alors :
ẋ(t) ẋ(t) y 2(t)
ẏ(t) = = = .
ẍ(t) −x(t) −y 1(t)
pour tout t ≥ t0 . Ce nouveau problème n’implique que des dérivées d’ordre un.
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.
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
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 n + h) ≈ y (t n) + hf (t n, y (tn ))
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.
Dans l’exemple suivant, nous utilisons la méthode d’Euler pour résoudre l’équation
différentielle de l’oscillateur harmonique.
Diagramme de phase
1 Euler
y[1]
0 Exact
−1
−2.5 0.0 2.5
y[0]
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 l’exemple suivant, nous utilisons la méthode d’Euler pour résoudre l’équation
différentielle ordinaire associée à la fonction exponentielle.
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
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
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.
Runge
y n+1
s1 s1 s2
yn yn
h
tn t n+1 tn tn + 2 tn+1
Heun
y n+1
s2
yn s1 yn s1
tn tn+1 tn tn+1
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 .
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
γ 1 + ... + γk = 1. (12.20)
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
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
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.
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.
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
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.
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.
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 )
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.
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
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].
d n+1 = Mn hp+1
n + O(hp+2 ) (12.27)
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 :
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
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
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
−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)
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.
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.
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 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
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
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
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)
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)
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
20 t=0
t=30.00
y3
0
−20
−25 0 25
y2
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.
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.
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).
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.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 :
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
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.
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.
f(y)
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 :
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 :
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
* 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 .
pour n ≥ 0.
1. Montrer que, pour n ≥ 0, on a :
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)
X
n−1
en ≤ (1 + hL) j Mh 2 . (12.84)
j=0
(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
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.
361
362 Chapitre 13 • Équations non linéaires
x x x
y
~
0
x x+Δx
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 .
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)
˜
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.
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)
f(a)
x b
f(x)
f(b)
a (a+b)/2
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
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 )
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 :
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.
Convergence de la dichotomie
Log10(erreur)
0
−10
0 20 40
Itérations
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
On observe que la méthode obtient une précision maximale (environ 16 chiffres déci-
maux corrects) en seulement 6 itérations.
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 :
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.
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
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 :
Zéro 1 f
f (x)
0 x1 0 Newton
y
−5 −1
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)
f (x) = (x − 1)m
m=1
Erreur absolue
−2
10 m=3
m=5
10−5 m=7
0 50
Itérations
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.
f (xn) − f (x n−1)
sn = (13.3)
x n − xn−1
f (xn )
xn+1 = xn − (13.4)
sn
pour n ≥ 2.
7 a = 1.0
8 b = 2.0
9 xs , histor y = secant ( myFunction , a , b )
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.
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 :
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.
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
10−3 10 −1
Volume (m 3)
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.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.
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
avec m, ce qui montre que calculer précisément une racine de multiplicité m > 1 peut être
difficile.
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
383
384 Chapitre 14 • Optimisation
5
Global
y
0
Local
−10 0 10
x
f( x)
f(x)
a b x x-δ x x+δ
Figure 14.2 – À gauche, optimisation avec contraintes de bornes. À droite, minimum
local fort.
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.
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
a x x1 x2 b a x1 x2 x b
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 .
Itération n+1
a m x b 0 2/9 4/9 2/3
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 :
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
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 − ρ)
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.
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 .
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)
0.03525
λ(ρ)
0.03500
100 200
ρ
10 reltolx = 1.0 e -8
11 x_opt , f_opt = go lden secti on (
12 conductivity , 30.0 , 200.0 , reltolx )
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.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
f( x) f( x)
1
0 x 0 x
3 km
A P
x
Rivière B
8 km
C
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.
* 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.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 :
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 :
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.
f (x)
0
−5 0 5
x
Figure 14.11 – La fonction f (x) = exp −x12 .
** 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.
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
1
[Link]
Bibliographie
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
[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
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