Fiche récapitulative générée pour impression / export PDF.

Licence 2 · Analyse numérique L2 — Méthodes d'approximation

Erreurs numériques et stabilité

Erreurs numériques et stabilité

1. Représentation des nombres en machine

Un ordinateur ne représente les nombres réels qu'avec une précision finie (en général en virgule flottante, sur 6464 bits pour le type "double" usuel, soit environ 1515-1616 chiffres décimaux significatifs). Tout calcul introduit potentiellement une petite erreur d'arrondi, de l'ordre de εmachine1016\varepsilon_{\text{machine}} \approx 10^{-16} pour le double.

Erreur absolue et erreur relative : si x~\tilde x est une valeur approchée de xx, on définit :

erreur absolue=x~x,erreur relative=x~xx (si x0)\text{erreur absolue} = |\tilde x - x|, \qquad \text{erreur relative} = \frac{|\tilde x-x|}{|x|} \ (\text{si } x\neq0)

L'erreur relative est souvent plus pertinente : une erreur absolue de 11 est négligeable si x=1010x=10^{10}, mais catastrophique si x=103x=10^{-3}.

2. Propagation des erreurs dans les opérations élémentaires

Addition/soustraction : si a~=a+δa\tilde a = a+\delta_a et b~=b+δb\tilde b = b+\delta_b, alors a~+b~=(a+b)+(δa+δb)\tilde a+\tilde b = (a+b)+(\delta_a+\delta_b) : les erreurs absolues s'additionnent (au pire, en valeur absolue).

Phénomène de cancellation catastrophique : lorsqu'on soustrait deux nombres très proches, l'erreur relative du résultat peut devenir énorme, même si les erreurs absolues initiales sont minimes. Exemple : si a=1,000001a=1{,}000001 et b=1,000000b=1{,}000000 (connus chacun avec une erreur absolue 107\approx10^{-7}), alors ab=0,000001=106a-b = 0{,}000001 = 10^{-6}, mais l'erreur absolue sur ce résultat (qui reste 107\approx10^{-7}) représente maintenant une erreur relative de 10%10\% sur le résultat — alors qu'elle n'était que de 10710^{-7} sur aa et bb séparément.

Exemple classique de reformulation pour éviter la cancellation : pour résoudre x22px+q=0x^2-2px+q=0 avec pp grand et qq petit, la formule usuelle x=p±p2qx = p\pm\sqrt{p^2-q} souffre de cancellation pour la racine proche de 00 (différence de deux quantités proches). On préfère alors calculer d'abord la racine "facile" x1=p+p2qx_1=p+\sqrt{p^2-q} (somme, pas de cancellation), puis utiliser la relation produit des racines x1x2=qx_1 x_2=q pour obtenir x2=q/x1x_2 = q/x_1 sans soustraction dangereuse.

3. Conditionnement d'un problème

Le conditionnement mesure la sensibilité de la solution d'un problème à de petites perturbations des données d'entrée. Pour une fonction ff et une perturbation relative ε\varepsilon de l'entrée xx, le conditionnement (relatif) est approximativement :

κ(x)xf(x)f(x)\kappa(x) \approx \left|\frac{x\,f'(x)}{f(x)}\right|

Un problème est dit bien conditionné si κ\kappa est petit (les petites erreurs sur les données restent petites sur le résultat), et mal conditionné si κ\kappa est grand (de minuscules erreurs d'entrée peuvent être amplifiées énormément).

Exemple : pour f(x)=xf(x)=\sqrt{x}, κ(x)=x×12xx=12\kappa(x) = \left|\dfrac{x\times\frac{1}{2\sqrt x}}{\sqrt x}\right| = \dfrac12 : c'est un problème bien conditionné, peu sensible. En revanche, pour f(x)=1x1f(x)=\dfrac{1}{x-1} près de x=1x=1, le conditionnement explose (ff varie extrêmement vite), traduisant une grande sensibilité.

Important : le conditionnement est une propriété du problème mathématique lui-même, indépendante de l'algorithme utilisé pour le résoudre. Un problème mal conditionné restera difficile à résoudre précisément quel que soit l'algorithme.

4. Stabilité d'un algorithme

La stabilité d'un algorithme, à l'inverse, décrit comment celui-ci propage (ou amplifie) les erreurs d'arrondi au cours de ses propres calculs intermédiaires, même pour résoudre un problème bien conditionné. Un algorithme instable peut donner des résultats très imprécis (ou complètement faux), même appliqué à un problème bien conditionné, à cause d'une accumulation ou amplification d'erreurs à chaque étape.

Exemple classique (calcul d'une suite récurrente) : la suite définie par I0=ln(6/5)I_0=\ln(6/5) et In=1n5In1I_n = \dfrac1n - 5I_{n-1} (provenant du calcul de 01xnx+5dx\int_0^1 \frac{x^n}{x+5}dx) vérifie mathématiquement In0I_n\to0, mais le calcul numérique de cette récurrence, démarré avec I0I_0 légèrement arrondi, voit son erreur initiale multipliée par 5-5 à chaque étape : après quelques itérations seulement, les valeurs calculées deviennent absurdes (négatives ou explosant en valeur absolue), bien que la suite exacte reste positive et tende vers 00. C'est un algorithme numériquement instable, car le facteur d'amplification (5-5, en valeur absolue >1>1) fait croître l'erreur exponentiellement.

5. Stabilité : critère qualitatif

De façon générale, un algorithme itératif de la forme en+1λene_{n+1} \approx \lambda\, e_n sur l'erreur ene_n est :
- Stable si λ1|\lambda|\leq1 (l'erreur ne croît pas, ou décroît) ;
- Instable si λ>1|\lambda|>1 (l'erreur est amplifiée à chaque étape, donc explose exponentiellement après suffisamment d'itérations).

Remède pratique courant : lorsqu'une récurrence "vers l'avant" est instable, on peut souvent la rendre stable en la parcourant "à l'envers" (de nn grand vers nn petit), si le problème s'y prête, car le facteur d'amplification est alors inversé (1/λ1/\lambda, qui devient <1<1 si λ>1|\lambda|>1).

6. Exemple résolu de synthèse

Énoncé : on veut calculer f(x)=x+1xf(x) = \sqrt{x+1}-\sqrt{x} pour xx grand (par exemple x=1010x=10^{10}). Pourquoi le calcul direct est-il numériquement mauvais, et quelle reformulation éviter ce problème ?

Résolution : pour xx grand, x+1\sqrt{x+1} et x\sqrt{x} sont deux nombres très proches : leur soustraction directe souffre de cancellation catastrophique (perte de précision relative). On reformule en multipliant par la quantité conjuguée :

f(x)=x+1x=(x+1x)(x+1+x)x+1+x=(x+1)xx+1+x=1x+1+xf(x) = \sqrt{x+1}-\sqrt{x} = \frac{(\sqrt{x+1}-\sqrt x)(\sqrt{x+1}+\sqrt x)}{\sqrt{x+1}+\sqrt x} = \frac{(x+1)-x}{\sqrt{x+1}+\sqrt x} = \frac{1}{\sqrt{x+1}+\sqrt x}

Cette nouvelle expression ne comporte qu'une somme au dénominateur (pas de soustraction de quantités proches), donc elle est numériquement stable et se calcule sans perte de précision, même pour xx très grand.

Exercices de la leçon

Exercice 1

Quelle est l'erreur relative si x=1000x=1000 et x~=1000,5\tilde x = 1000{,}5 ?

Corrigé

Erreur absolue =1000,51000=0,5=|1000{,}5-1000|=0{,}5. Erreur relative =0,51000=0,0005=0,05%=\dfrac{0{,}5}{1000}=0{,}0005=0{,}05\%.

Exercice 2

Vrai ou faux : l'erreur relative est toujours plus pertinente que l'erreur absolue pour juger de la qualité d'une approximation.

Corrigé

Vrai (dans la quasi-totalité des cas pratiques). L'erreur relative tient compte de l'ordre de grandeur de la quantité approchée, contrairement à l'erreur absolue qui peut être trompeuse (négligeable pour un grand nombre, énorme pour un petit nombre).

Exercice 3

Le phénomène de cancellation catastrophique se produit typiquement lors de :

Corrigé

La cancellation catastrophique survient lors de la soustraction de deux nombres très proches en valeur : l'erreur absolue (petite) reste similaire, mais le résultat (petit) fait que l'erreur relative explose.

Exercice 4

Un algorithme dont l'erreur est multipliée par λ=0,3\lambda=0{,}3 à chaque étape est-il stable ?

Corrigé

Oui, l'algorithme est stable car λ=0,3<1|\lambda|=0{,}3<1 : l'erreur décroît à chaque étape, elle ne s'amplifie pas.

Exercice 5

Calculer le conditionnement κ(x)=xf(x)/f(x)\kappa(x) = |xf'(x)/f(x)| pour f(x)=x2f(x)=x^2.

Corrigé

f(x)=2xf'(x)=2x. κ(x)=x×2xx2=2x2x2=2\kappa(x) = \left|\dfrac{x\times2x}{x^2}\right| = \left|\dfrac{2x^2}{x^2}\right| = 2. Le conditionnement est constant (égal à 22) : élever au carré amplifie modérément (et de façon constante) les erreurs relatives.

Exercice 6

Reformuler f(x)=1cos(x)x2f(x) = \dfrac{1-\cos(x)}{x^2} pour xx proche de 00 afin d'éviter la cancellation (indication : utiliser 1cosx=2sin2(x/2)1-\cos x = 2\sin^2(x/2)).

Corrigé

En utilisant 1cosx=2sin2(x/2)1-\cos x = 2\sin^2(x/2), on obtient f(x)=2sin2(x/2)x2f(x) = \dfrac{2\sin^2(x/2)}{x^2}. En écrivant x2=4(x/2)2x^2=4(x/2)^2, f(x)=2sin2(x/2)4(x/2)2=12(sin(x/2)x/2)2f(x) = \dfrac{2\sin^2(x/2)}{4(x/2)^2} = \dfrac12\left(\dfrac{\sin(x/2)}{x/2}\right)^2. Cette formule évite complètement la soustraction 1cos(x)1-\cos(x) (qui souffre de cancellation pour xx proche de 00, car cos(x)1\cos(x)\approx1), en la remplaçant par une expression utilisant uniquement le sinus, numériquement stable.

Exercice 7

Vrai ou faux : le conditionnement d'un problème dépend de l'algorithme utilisé pour le résoudre.

Corrigé

Faux. Le conditionnement est une propriété intrinsèque du problème mathématique (la sensibilité de la solution exacte aux perturbations des données), indépendante de l'algorithme. C'est la stabilité, en revanche, qui dépend de l'algorithme choisi.

Exercice 8

Calculer f(x)=x+1xf(x)=\sqrt{x+1}-\sqrt x pour x=108x=10^8 par la formule directe et par la formule reformulée 1x+1+x\dfrac{1}{\sqrt{x+1}+\sqrt x}, et comparer la fiabilité.

Corrigé

Formule directe : 108+110000,00005\sqrt{10^8+1}\approx10000{,}00005 et 108=10000\sqrt{10^8}=10000. Leur différence théorique est 5×105\approx5\times10^{-5}, mais en représentation flottante (environ 1515-1616 chiffres significatifs), 10000,0000510000{,}00005 ne conserve que quelques chiffres significatifs après la virgule utiles, ce qui peut dégrader fortement la précision relative du résultat de la soustraction. Formule reformulée : 1108+1+108120000,000055×105\dfrac{1}{\sqrt{10^8+1}+\sqrt{10^8}} \approx \dfrac{1}{20000{,}00005} \approx 5\times10^{-5}, calculée comme une simple division de deux quantités bien représentées, sans aucune soustraction dangereuse : le résultat est numériquement fiable. Cet exemple illustre concrètement l'intérêt de la reformulation algébrique pour la stabilité numérique.

Exercice 9

Une récurrence vérifie en+1=3ene_{n+1} = -3e_n sur l'erreur (où ene_n est l'écart entre la valeur calculée et la valeur exacte). Si e01010e_0 \approx 10^{-10} (erreur d'arrondi initiale), estimer e20e_{20} et conclure sur la stabilité.

Corrigé

e20=(3)20e0=320×1010e_{20} = (-3)^{20} e_0 = 3^{20}\times10^{-10} (le signe disparaît car l'exposant est pair). 320=(310)2=5904923,49×1093^{20} = (3^{10})^2 = 59049^2 \approx 3{,}49\times10^9. Donc e203,49×109×10100,35e_{20} \approx 3{,}49\times10^9\times10^{-10} \approx 0{,}35. Une erreur initiale microscopique (101010^{-10}, de l'ordre de la précision machine) est devenue, après seulement 2020 étapes, de l'ordre de 0,350{,}35 — totalement inacceptable. L'algorithme est fortement instable (facteur d'amplification λ=3>1|\lambda|=3>1 à chaque étape).

Exercice 10

Vrai ou faux : un problème bien conditionné, résolu par un algorithme instable, peut tout de même donner des résultats numériquement faux.

Corrigé

Vrai. Le conditionnement (propriété du problème) et la stabilité (propriété de l'algorithme) sont des notions distinctes. Même si le problème mathématique est peu sensible aux perturbations, un algorithme mal conçu peut amplifier les erreurs d'arrondi à chaque étape de calcul et produire un résultat final très imprécis, voire absurde.

Exercice 11

Pour résoudre x2106x+1=0x^2-10^6x+1=0, expliquer pourquoi la formule usuelle des racines x=106±101242x=\dfrac{10^6\pm\sqrt{10^{12}-4}}{2} pose un problème pour l'une des deux racines, et proposer une meilleure méthode de calcul.

Corrigé

10124106\sqrt{10^{12}-4} \approx 10^6 (la correction due au 4-4 est négligeable face à 101210^{12}). Donc la racine x2=106101242x_2 = \dfrac{10^6-\sqrt{10^{12}-4}}{2} est le quotient par 22 d'une soustraction de deux quantités quasi identiques (10610^6 et 106\approx10^6) : cancellation catastrophique, perte de précision relative importante. En revanche x1=106+101242x_1 = \dfrac{10^6+\sqrt{10^{12}-4}}{2} (addition) est calculée sans problème. Méthode stable : calculer x1x_1 par la formule directe (fiable), puis utiliser la relation produit des racines x1x2=ca=1x_1 x_2 = \dfrac{c}{a}=1 (ici c=1,a=1c=1,a=1 dans ax2+bx+cax^2+bx+c) pour obtenir x2=1x1x_2 = \dfrac{1}{x_1}, qui ne comporte qu'une division, sans cancellation.

Exercice 12

Vrai ou faux : la précision machine (de l'ordre de 101610^{-16} pour le type double) signifie qu'aucun calcul numérique ne peut jamais avoir d'erreur supérieure à 101610^{-16}.

Corrigé

Faux. La précision machine εmachine1016\varepsilon_{\text{machine}}\approx10^{-16} est l'ordre de grandeur de l'erreur d'arrondi à chaque opération élémentaire. Mais ces erreurs peuvent s'accumuler ou être amplifiées au fil de nombreuses opérations (en particulier avec un algorithme instable), conduisant à des erreurs finales bien supérieures à 101610^{-16} — voire à des résultats complètement faux, comme illustré par l'exemple de la suite InI_n du cours.

Exercice 13

Soit f(x)=ex1f(x) = e^x - 1, calculée près de x=0x=0 par la formule directe (calcul de exe^x puis soustraction de 11). Pourquoi cela pose-t-il un problème, et comment l'éviter (mention du développement en série) ?

Corrigé

Pour xx proche de 00, ex1e^x \approx 1, donc le calcul ex1e^x-1 est une soustraction de deux quantités très proches : cancellation catastrophique, perte de précision relative importante sur le résultat (qui devrait être proche de xx, une petite quantité). Solution : utiliser directement le développement en série ex1=x+x22+x36+e^x-1 = x+\dfrac{x^2}{2}+\dfrac{x^3}{6}+\cdots, qui ne comporte aucune soustraction de grandes quantités, ou (en pratique informatique) la fonction dédiée souvent appelée \"expm1\" dans les bibliothèques numériques, spécifiquement conçue et implémentée pour rester stable près de x=0x=0.

Exercice 14

Donner la définition du conditionnement absolu (plutôt que relatif) d'un problème ff en un point xx, et expliquer en quoi il diffère du conditionnement relatif.

Corrigé

Le conditionnement absolu est κabs(x)=f(x)\kappa_{\text{abs}}(x) = |f'(x)| : il mesure directement de combien une petite erreur absolue δ\delta sur xx se traduit en erreur absolue sur f(x)f(x), via l'approximation f(x+δ)f(x)f(x)δf(x+\delta)-f(x)\approx f'(x)\delta. Le conditionnement relatif κrel(x)=xf(x)f(x)\kappa_{\text{rel}}(x) = \left|\dfrac{xf'(x)}{f(x)}\right| normalise cette sensibilité par les ordres de grandeur de xx et f(x)f(x) eux-mêmes, ce qui le rend indépendant des unités de mesure choisies et généralement plus pertinent pour juger de la difficulté intrinsèque d'un problème (une grande sensibilité absolue peut être anodine si xx et f(x)f(x) sont eux-mêmes très grands).

Exercice 15

Expliquer pourquoi, pour calculer n!n! pour nn grand, on préfère souvent travailler avec ln(n!)\ln(n!) (ou la formule de Stirling) plutôt que de calculer n!n! directement, du point de vue de la stabilité/représentation numérique.

Corrigé

n!n! croît extrêmement vite (plus vite que toute exponentielle) et dépasse la plage représentable par un nombre flottant standard (overflow) pour des valeurs de nn relativement modestes (par exemple n!n! dépasse 1030810^{308}, la limite du type double, vers n171n\approx171). En revanche, ln(n!)=k=1nln(k)\ln(n!) = \sum_{k=1}^n \ln(k) croît beaucoup plus lentement (de l'ordre de nlnnn\ln n par la formule de Stirling), restant dans une plage de valeurs numériquement représentable sans dépassement de capacité, même pour des nn très grands. De nombreux calculs pratiques (rapports de factorielles, coefficients binomiaux, vraisemblances en statistique) peuvent alors se faire en passant par les logarithmes (additions au lieu de multiplications, soustractions au lieu de divisions) puis en repassant à l'exponentielle seulement à la fin si nécessaire, évitant ainsi tout débordement intermédiaire.

AlphaMath Académie · Erreurs numériques et stabilité · Analyse numérique L2 — Méthodes d'approximation