Contrôler la propagation des erreurs de calculs numériques

La méthode CESTAC

a marqué ce sujet comme résolu.

J'ai corrigé les fautes (celles que j'ai vues) jusqu'à la section "Contrôle et estimation stochastiques des arrondis de calculs ". Mes remarques sur le contenu :

Introduction

mais l'on pourrait penser que le réduire autant que notre temps ou puissance de calcul le permet

ent ?

Que nenni !

Italique ?

Rappels d'arithmétique flottante

Par définition, un nombre normal

Pourquoi ne pas avoir simplement donner un lien vers Wikipédia ?

Il est normal en toute base si quelle que soit la base il est normal.

C'est juste pour introduire l'expression "normal en toute base" ? Le cas échéant, il ne me semble pas déconnant de formuler de la sorte : "Il est dit normal en".

C'est ainsi qu'en machine, un nombre flottant

Certes, ce sont des rappels, mais tu n'as pas introduit à la notion de nombre flottant. Tu pourrais le faire rapidement au niveau de "Autrement dit, il est impossible de représenter parfaitement l'ensemble des réels avec un ordinateur." : "Autrement dit, il est impossible de représenter parfaitement l'ensemble des réels avec un ordinateur. On approxime ces derniers par des nombres appelés flottants".

la norme nous garantit que a⊕b=Arr(a+b)a⊕b=Arr(a+b).

On comprend assez facilement, mais le $a$ de gauche n'est (en général) pas le même que celui de droite. Comme plus haut tu as parlé de $x$ et $X$, tu pourrais mettre ici les flottants en majuscules.

Contrôle et estimation stochastiques des arrondis de calculs

Si l'on effectue le calcul (x+y)+z(x+y)+z, on trouve 1.23000×10−31.23000×10−3, cependant, le calcul x+(y+z)x+(y+z) donnera 1.23456×10−31.23456×10−3. On voit donc que l'ordre des opérations importe.

Tu pourrais expliciter ce que tu entends pas "le calcul". Si je prends une feuille et un crayon, j'obtiens le même résultat. Par exemple, tu pourrais donner une implémentation en C, ou du Python en console :

1
2
3
4
5
6
7
>>> x = 0.00123456
>>> y = 1.000000
>>> z = -y
>>> (x+y)+z
0.0012345600000001067
>>> x + (y+z)
0.00123456

Le coeur de CESTAC est de tirer partie de la grande variabilité des résultats obtenus par perturbations et permutations

Il me semble intéressant d'indiquer entre parenthèses ce que tu entends pas perturbations et permutations (je n'aurais pas su pour le premier si tu ne me l'avais pas expliqué dans le sujet de bêta).

La version synchrone consiste cette fois à faire évoluer l'échantillon à chaque opération d'affectation et utiliser la moyenne empirique de celui-ci pour les tests conditionnels.

J'ai eu du mal à comprendre cette phrase sans le schéma du dessous. Notamment, je ne comprends pas ce que tu entends par "tests conditionnels".

Illustration de la méthode synchrone sur le même exemple que précédemment :

Je n'ai peut-être pas compris le principe de cette méthode, mais pourquoi $\bar{X}_1$ n'est pas réutilisé dans la suite du calcul ?

Merci.

+0 -0

Pourquoi ne pas avoir simplement donner un lien vers Wikipédia ?

Parce que la preuve est courte et que je préfère qu'elle soit autonome plutôt que de devoir renvoyer vers Wikipédia.

la norme nous garantit que a⊕b=Arr(a+b)a⊕b=Arr(a+b).

Il y a deux affectations implicites effectivement.

Tu pourrais expliciter ce que tu entends pas "le calcul". Si je prends une feuille et un crayon, j'obtiens le même résultat.

Si tu fais x+y, il faut aligner les exposants en premier lieu pour ensuite additionner. Et donc tu trouves $x+y = 1.00123*10^{0}$. Ajoute z et tu obtient $1.23000*10^{-3}$. De l'autre côté, y+z te donne zéro, et donc en rajoutant $x$ tu retrouves la valeur de $x$.

Par exemple, tu pourrais donner une implémentation en C, ou du Python en console :

Faudrait passer sur une précision de 15 chiffres après la virgules, et donc changer l'exemple qui ne fonctionne pas nativement en C ou Python.

Il me semble intéressant d'indiquer entre parenthèses ce que tu entends pas perturbations et permutations (je n'aurais pas su pour le premier si tu ne me l'avais pas expliqué dans le sujet de bêta).

Bien vu, il y a un gros décallage entre le moment où je dis que le coeur de CESTAC ce sont les perturbations et permutations et le moment où je les définis. J'ai rajouté une précision pour chacun des deux termes.

J'ai eu du mal à comprendre cette phrase sans le schéma du dessous. Notamment, je ne comprends pas ce que tu entends par "tests conditionnels".

J'ai remplacé tests conditionnels par embranchements. Des if dans un programme donc. Dans la version asynchrone il est possible que la suite $X^1_n$ converge vers une autre solution que $X^2_n$, auquel cas l'estimation n'a aucun sens. L'autre problème qui conduit au même résultat c'est si les valeurs de $X^1$ et $X^2$ pour un $n$ donné sont assez différentes pour changer le résultat d'un embranchement : on ne visite pas les mêmes partis du programme ou en tout cas pas de la même manière, et donc l'estimation n'as aucun sens. Utiliser la moyenne empirique ou, comme rajouté, la valeur d'une suite particulière et de manière systématique, permet de contrer cela. Mais cela suppose la synchronisation.

Je n'ai peut-être pas compris le principe de cette méthode, mais pourquoi $\bar{X}_1$ n'est pas réutilisé dans la suite du calcul ?

Tu fais évolué l'échantillon et pas une seule valeur. Ne va pas croire que l'on affecte à $X$ la moyenne empirique de l'échantillon a une étape donnée et que l'on oublie l'échantillon après.

Si tu fais ça, tu n'estimes rien du tout et tu ne propages rien du tout. Tu ne fait qu'estimer la variabilité des résultats que tu peux obtenir en perturbant un flottant particulier et ça… je sais déjà à l'avance ce que cela va faire: $10^{-15}$ voire $10^{-16}$ selon le flottant.

Exemple:

$X$ et deux fonctions $f$ et $g$. La procédure c'est $g o f$.

Ce qu'il ne faut pas faire:

  1. X_1 = f(X)
  2. On génére par perturbation $(X^i_1)_i$.
  3. On calcule $\bar X_1$.
  4. X_2 = g(\bar X_1)
  5. Refaire 2. et 3.

Ce qu'il faut faire:

  1. X_1 = f(X)
  2. On génére par perturbation $(X^i_1)_i$.
  3. S'il y a un test conditionnel (genre Si X > 10) on calculera $\bar X$ pour le test, ou on choisira arbitrairement $X^1$.
  4. Pour chaque $i$, $X^i_2 = g(X^i_1)$
  5. Tu perturbes tous les $X^i_2$.

J'ai repris ma lecture :

CESTAC sur un algorithme iteratif

la soustraction de termes très proches conduits à des petites valeurs dont la valeur peut n'être nullement significative.

Je ne suis pas sûr de comprendre cela, surtout que tu as une valeur de valeurs.

La notion de zéro machine ne doit pas être confondue avec la notion d'epsilon machine ni avec le zéro tel qu'il est représenté dans la norme IEE754.

Tu pourrais peut-être expliciter la notion de zéro machine. La définition que tu donnes est claire, mais la reformuler "en français" me semble intéressant.


Je ne me suis pas attardé sur la dernière section. J'ai corrigé les fautes que j'ai vues dans tout le tutoriel.

Encore du bon boulot, merci. :)

+0 -0

Bonjour les agrumes !

La bêta de votre article « Contrôler la propagation des erreurs de calculs numériques » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.

J'ai simplement tenu compte de ta première remarque. Pour la reformulation, je me suis posé devant la définition, essayé de trouver une reformulation en français qui vaille le coup, et je n'ai pas trouvé.

Tu penses qu'on est bon pour mettre ça en validation ?

+0 -0

Pour la reformulation, je me suis posé devant la définition, essayé de trouver une reformulation en français qui vaille le coup, et je n'ai pas trouvé.

"Autrement dit, $X$ est un zéro machine quand il est nul ou qu'il n'a aucun chiffre significatif" ?

Tu penses qu'on est bon pour mettre ça en validation ?

Il faudrait que je m'y replonge un coup dedans, mais j'ai toujours du mal avec les méthodes asynchrone et synchrone. Je manque malheureusement de temps en ce moment pour être plus constructif, mais tu pourrais peut-être prendre un exemple concret ?

+0 -0
Ce sujet est verrouillé.