ChronoMath, une chronologie des MATHÉMATIQUES
à l'usage des professeurs de mathématiques, des étudiants et des élèves des lycées & collèges

Accumulation des erreurs d'arrondi                     niveau TerS     » voir aussi...
     
» Numération binaire, codage et arrondis , aspect mathématique de l'arrondi

Le but de cette étude est de montrer l'effet (très) néfaste des erreurs d'arrondi d'un ordinateur dans le calcul d'une intégrale somme toute relativement banale.

 i  Cette illustration des dangers de l'informatique dont les victimes sont d'innocents élèves de Terminale trahis par leur calculatrice, s'appuie sur l'excellent exemple de Jacques Hervé Saïac dans L'informatique appliquée au calcul scientifique, page 140, Ed. Dunod, Paris-1989.

Pour tout n de N, on considère les intégrales sur l'intervalle [1,e]:

In = [1,e] (ln x)n dx  ,  ln désigne le logarithme népérien, e est leur base

» depuis 2011, l'intégration par parties a disparu du programme des classes Terminales. On peut remplacer c/ par la question équivalente suivante :

Programmation de la méthode en JavaScript :  

Écrivons le petit programme JavaScript fort simple ci-dessous permettant le calcul de I20. Après exécution, vous devriez être étonné, voire déçu, du résultat affiché :

<SCRIPT LANGUAGE=JavaScript>
function Acc()
{
wdow=open("","","height=500,width=450,scrollbars=1");
wdow.document.write("<PRE>")
i=1;
for(n=2;n<=50;n++)
{
j=i;i=Math.exp(1)-n*i;wdow.document.writeln("n = "+n+" ,I(n) = "+i+" , nI(n-1) = "+n*j)
}
}
</SCRIPT>

 

»  fonctions mathématiques usuelles


On part de I = 1, c'est à dire I1, et on calcule In ainsi que In-1 pour vérifier la stabilité des calculs. In-1 est récupéré dans J avant le calcul de In stocké dans I. Hélas, malgré ces quelques précautions, tout se gâte très vite. Le résultat est clairement aberrant dès I18.

Vu que I1 = 1, il n'y a pas d'erreur de calcul sur cette valeur. Notons I'n la valeur machine de In. A chaque itération, il se greffe, pour In (n >1), une erreur de calcul et une erreur de stockage que nous supposons temporairement du même ordre et que nous notons ε.

Nous allons montrer que l'erreur absolue commise par l'ordinateur sur In est sensiblement proportionnelle à n! , où n! désigne la factorielle de n, soit : 2 × 3 × ... × n. Ce qui n'est guère encourageant.

Les facteurs d'erreurs sont :

  1. l'erreur sur I2 qui se cumule à chaque itération;
  2. l'erreur d'arrondi au stockage de chaque In;
  3. l'erreur sur la différence e - nIn-1 car ces nombres sont théoriquement très voisins.

   Dans toute la suite, la notation A = B [k] signifiera que A égale B à k près.

En tenant seulement compte de 1.et 2. ci-dessus :

Il apparaît alors que si δn (n > 2) est l'erreur sur In, alors :

I'n = In  n] ⇒ I'n+1 = In+1   [(n + 1).δn + ε ]

Pour n > 2, l'erreur est multipliée par le rang et augmentée de ε à chaque itération :

δn+1> (n+1)δn

On en déduit :

δn > n! × δ2/2,  soit δn > ε × n!

Ceci est tout à fait tragique et abominable, car avec un ordinateur travaillant à 10-16 près, on peut s'attendre au pire du côté de n = 16. De plus, du fait que nIn tend vers e, l'ordinateur fait, à chaque itération, la différence de deux nombres "presque" égaux", donc la somme de deux nombres "presque" opposés (cf. erreur sur la somme), ce qui laisse prévoir des erreurs considérables et grandissantes dès n = 16. Ce que confirme les calculs de la machine.

On peut toutefois se sortir de ce mauvais pas, comme l'indique J.H. Saïac, de la façon suivante :

Un raisonnement "inverse" analogue au précédent permet d'estimer l'erreur à :

ε / (50 × 49 × ... × 21) = e / (51 × 50 × ... × 21)

C'est dire que l'erreur sur I20 sera négligeable, d'autant que cette fois, la différence

e - In = e + (-In)

n'est pas l'addition de deux nombres "presque" égaux. Cette prévision est confirmée par l'ordinateur dans le programme ci-après :

<SCRIPT LANGUAGE=JavaScript>
function Acc2()
{
wdow=open("","","height=480,width=480,scrollbars=1");
wdow.document.write("<PRE>")
i=0;
for(n=50;n>=1;n--)
{
i=(Math.exp(1)-i)/n;
nm1=n-1;
wdow.document.writeln("n = "+nm1+" , I(n) = "+i)
}
}
</SCRIPT>




L'exécution de ce programme fournit :

  • I20 = 0.123803830762569... avec une erreur théoriquement négligeable pour aboutir à I2= 0,718281828459045...
    c'est bien e - 2 = e - I1 à 10-15 près.
  • I1= 1 (exactement...), Io = 1,718281828459045... c'est bien e - 1 à 10-15 près.
» fonctions mathématiques usuelles

© Serge Mehl - www.chronomath.com