Annulation catastrophique

De testwiki
Aller à la navigation Aller à la recherche

Modèle:Orphelin

En analyse numérique, l'annulation catastrophique [1]Modèle:,[2] est le phénomène qui peut apparaitre lors du calcul de la différence de bonnes approximations de deux nombres proches et peut alors donner une très mauvaise approximation de la différence des nombres d'origine.

Par exemple, s'il y a deux bâtons , un de longueur L1=253.51cm et l'autre de longueur L2=252.49cm, et qu'ils sont mesurés avec une règle qui n'est précise qu'au centimètre près, alors les approximations pourraient être de L~1=254cm et L~2=252cm. On peut les voir comme de bonnes approximations, en erreur relative, des vraies longueurs : en effet, les approximations sont en erreur de moins de 2% des vraies longueurs : |L1L~1|/|L1|<2%.

Cependant, si on fait la soustraction des longueurs approximatives, la différence sera L~1L~2=254cm252cm=2cm, alors que la véritable différence entre les longueurs est de L1L2=253.51cm252.49cm=1.02cm. La différence des approximations, 2cm, a une erreur relative de près de 100 % de la valeur de la différence des valeurs vraies, 1.02cm.

L’annulation catastrophique n’est pas affectée par la taille des entrées — elle s’applique aussi bien aux entrées grandes comme petites. Cela dépend uniquement de l’amplitude de la différence et de l’erreur commise sur les valeurs d'entrées. Ainsi, on aurait exactement la même erreur qui se produirait en soustrayant 52cm à 54cm avec comme approximations 52.49cm et 53.51cm, ou en soustrayant 2.00052km depuis 2.00054km en partant des approximations 2.0005249km et 2.0005351km.

Une annulation catastrophique peut se produire même si la différence est calculée exactement, comme dans l'exemple ci-dessus — ce n'est pas une propriété d'un type particulier d'arithmétique comme l'arithmétique à virgule flottante ; il est plutôt inhérent à la soustraction, lorsque les entrées sont elles-mêmes des approximations. En effet, en arithmétique à virgule flottante, lorsque les entrées sont suffisamment proches, la différence en virgule flottante est calculée exactement, par le lemme de Sterbenz — il n'y a pas d'erreur d'arrondi introduite par l'opération de soustraction en virgule flottante.

Analyse formelle

Formellement, une annulation catastrophique se produit parce que la soustraction est mal conditionnée aux entrées proches : même si les approximations x~=x(1+δx) et y~=y(1+δy) ont des erreurs relatives |δx|=|xx~|/|x| et |δy|=|yy~|/|y| faibles par rapport aux vraies valeurs x et y, l'erreur relative de la différence x~y~ des approximations par rapport à la différence des vraies valeurs est inversement proportionnelle à la différence des vraies valeurs :x~y~=x(1+δx)y(1+δy)=xy+xδxyδy=(xy)(1+xδxyδyxy).Ainsi, l'erreur relative de la différence exacte x~y~ des approximations à partir de la différence xy des vraies valeurs vaut|xδxyδyxy|.qui peut être arbitrairement grand si les vraies valeurs x et y sont proches.

Dans les algorithmes numériques

La soustraction de nombres proches en arithmétique à virgule flottante ne provoque pas toujours une annulation catastrophique, ni même une erreur — d'après le lemme de Sterbenz, si les nombres sont suffisamment proches, la différence en virgule flottante est exacte. Mais l’annulation peut amplifier les erreurs dans les entrées résultant de l’arrondi d’autres calculs arithmétiques à virgule flottante.

Exemple : Différence de carrés

Etant donnés deux nombres x et y, la tentative naïve de calculer la fonction mathématique x2y2 par l'arithmétique à virgule flottante fl(fl(x2)fl(y2)) est sujette à une annulation catastrophique lorsque x et y sont proches en amplitude, car la soustraction peut exposer les erreurs d'arrondi dans la mise au carré. La factorisation alternative (x+y)(xy), évaluée par l'arithmétique à virgule flottante fl(fl(x+y)fl(xy)), évite une annulation catastrophique car elle évite d'introduire une erreur d'arrondi conduisant à la soustraction[2].

Par exemple, si x=1+2291.0000000018626451 et y=1+2301.0000000009313226, alors la vraie valeur de la différence x2y2 est 229(1+230+231)1.8626451518330422×109. En arithmétique IEEE 754 binary64, évaluer la factorisation alternative (x+y)(xy) donne exactement le résultat correct (sans arrondi), mais en évaluant l'expression naïve x2y2, on a le nombre à virgule flottante 229=1.86264514923095703125_×109, dont moins de la moitié des chiffres sont corrects et les autres chiffres (soulignés) reflètent les termes manquants 259+260, perdus en raison de l'arrondi lors du calcul des valeurs élevées au carré intermédiaires.

Exemple : arc sinus complexe

Lors du calcul de la fonction arc sinus complexe, on peut être tenté d'utiliser directement la formule logarithmique :arcsin(z)=ilog(1z2iz).Cependant, supposons z=iy pour y0. Alors 1z2y et iz=y ; on note la différence entre ces deux valeurs ε — qui est donc une très petite différence, presque nulle. Si 1z2 est évalué en arithmétique à virgule flottante donnantfl(fl(1fl(z2)))=1z2(1+δ)avec une erreur quelconque δ0, où fl() désigne un arrondi à virgule flottante, puis avec le calcul de la différence1z2(1+δ)izde deux nombres proches, tous deux très proches de y, peut amplifier l'erreur δ en une entrée par un facteur de 1/ε — un facteur très important parce que ε était presque nul. Par exemple, si z=1234567i, la valeur exacte de arcsin(z) est d'environ 14.71937803983977i, mais l'utilisation de la formule logarithmique naïve dans l'arithmétique binary64 IEEE 754 peut donner 14.719644263563968_i, avec seulement cinq chiffres sur seize corrects et le reste (souligné) tous incorrects.

Dans le cas où z=iy pour y<0, en utilisant l'identité arcsin(z)=arcsin(z) évite l'annulation parce que 1(z)2=1z2y mais i(z)=iz=y, donc la soustraction est effectivement une addition avec le même signe qui ne s'annule pas.

Exemple : conversion de base

Les constantes numériques dans les logiciels sont souvent écrites en décimal, comme dans le fragment C double x = 1.000000000000001; pour déclarer et initialiser une variable binaire64 IEEE 754 nommée x. Cependant,

1.000000000000001

n'est pas un nombre binaire64 à virgule flottante ; le plus proche, auquel x sera initialisé dans ce fragment, est

1.0000000000000011102230246251565404236316680908203125=1+5252

. Bien que la conversion de base de la virgule flottante décimale à la virgule flottante binaire n'entraîne qu'une petite erreur relative, une annulation catastrophique peut l'amplifier en une erreur beaucoup plus importante :

double x = 1.000000000000001; // arrondi à 1 + 5*2^{-52}
double y = 1.000000000000002; // arrondi à  1 + 9*2^{-52}
double z = y - x;       // la difference vaut exactement 4*2^{-52}

La différence

1.0000000000000021.000000000000001

est

0.000000000000001=1.0×1015

. Les erreurs relatives de x de

1.000000000000001

et de y de

1.000000000000002

sont tous les deux ci-dessous

1015=0.0000000000001%

, et la soustraction à virgule flottante y - x est calculée exactement par le lemme de Sterbenz.

Mais même si les entrées sont de bonnes approximations, et même si la soustraction est calculée exactement, la différence des approximations y~x~=(1+9252)(1+5252)=42528.88×1016 a une erreur relative de plus de 11% de la différence 1.0×1015 des valeurs originales écrites en décimal : une annulation catastrophique a amplifié une petite erreur dans la conversion de base en une grande erreur dans la sortie.

Annulation bénigne

L'annulation est parfois utile et souhaitable dans les algorithmes numériques. Par exemple, les algorithmes 2Sum et Fast2Sum s'appuient tous deux sur une telle annulation après une erreur d'arrondi afin de calculer exactement quelle était l'erreur dans une opération d'addition à virgule flottante en tant que nombre à virgule flottante lui-même.

La fonction log(1+x), si elle est évaluée naïvement pour des valeurs 0<x1, perdra la plupart des chiffres de x en arrondi fl(1+x). Cependant, la fonction log(1+x) elle-même est bien conditionné aux entrées proches de 0. La réécrire commelog(1+x)=xlog(1+x)(1+x)1exploite l'annulation dans x^:=fl(1+x)1 pour éviter l'erreur de log(1+x) évalué directement[2]. Cela fonctionne car l'annulation au numérateur log(fl(1+x))=x^+O(x^2) et l'annulation au dénominateur x^=fl(1+x)1 se contrecarrer; la fonction μ(ξ)=log(1+ξ)/ξ est suffisamment bien conditionnée près de zéro pour que μ(x^) donne une bonne approximation de μ(x), Et ainsi xμ(x^) donne une bonne approximation de xμ(x)=log(1+x).

Références

Modèle:Traduction/Référence Modèle:Références

Modèle:Portail