En arithmétique à virgule flottante, pourquoi l'imprécision numérique résulte-t-elle de l'ajout d'un petit terme à une différence de grands termes?

13

J'ai lu le livre Computer Simulation of Liquids d'Allen et Tildesley. À partir de la page 71, les auteurs discutent des divers algorithmes utilisés pour intégrer les équations de mouvement de Newton dans les simulations de dynamique moléculaire (MD). À partir de la page 78, les auteurs discutent de l'algorithme de Verlet, qui est peut-être l'algorithme canonique d'intégration dans MD. Ils déclarent:

La méthode d'intégration des équations du mouvement la plus utilisée est peut-être celle initialement adoptée par Verlet (1967) et attribuée à Stormer (Gear 1971). Cette méthode est une solution directe de l'équation du second ordre . La méthode est basée sur les positions r ( t ) , les accélérations a ( t ) et les positions r ( t - δ t ) de l'étape précédente. L'équation pour faire avancer les positions se lit comme suit:mir¨i=fir(t)a(t)r(tδt)

(3.14)r(t+δt)=2r(t)r(tδt)+δt2a(t).

Il y a plusieurs points à noter à propos de l'équation (3.14). On verra que les vitesses n'apparaissent pas du tout. Ils ont été éliminés par addition des équations obtenues par expansion de Taylor sur :r(t)

r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...

(3.15)r(tδt)=r(t)δtv(t)+(1/2)δt2a(t)....

Plus tard (à la page 80), les auteurs déclarent:

Contre l'algorithme de Verlet, ... la forme de l'algorithme peut inutilement introduire une certaine imprécision numérique. Cela vient du fait que, dans l'équation (3.14), un petit terme ( ) s'ajoute à une différence de grands termes ( O ( δ t 0 ) ), afin de générer la trajectoire. O(δt2)O(δt0)

Je suppose que le "petit terme" est , et la "différence des grands termes" est 2 r ( t ) - r ( t - δ t ) .δt2a(t)2r(t)r(tδt)

Ma question est la suivante: pourquoi l'imprécision numérique résulte-t-elle de l'ajout d'un petit terme à une différence de grands termes?

Je m'intéresse à une raison conceptuelle plutôt basique, car je ne connais pas du tout les détails de l'arithmétique à virgule flottante. Connaissez-vous également des références de type «aperçu» (livres, articles ou sites Web) qui pourraient me présenter des idées de base de l'arithmétique à virgule flottante liées à cette question? Merci pour votre temps.

Andrew
la source

Réponses:

9

Leur observation «la forme de l'algorithme peut inutilement introduire une imprécision numérique» est correcte. Mais leur explication '' Cela se produit parce que, dans l'équation (3.14), un petit terme ( ) s'ajoute à une différence de grands termes ( O ( δ t 0 ) ), afin de générer la trajectoire. '' est faux.O(δt2)O(δt0)

La vraie raison de la légère instabilité numérique de l'algorithme de Verlet est qu'il n'est que marginalement stable, car l'équation de différence (essentiellement le cas où vous négligez un dans Verlet) a un parasite solution proportionnelle à k , ce qui fait que les erreurs introduites croissent linéairement en k alors que pour une méthode multi-étapes entièrement stable appliquée à une équation différentielle dissipative, la croissance des erreurs est bornée.xk+1=2xkxk1akk

Edit: Notez que le livre est sur la simulation numérique de la dynamique moléculaire, et pour obtenir une précision raisonnable des attentes résultant d' un besoin d' un grand nombre d'étapes, comme la balance de précision avec O ( N - 1 / 2 ) seulement. (Souvent, le pas de temps se situe en picosecondes pour suivre l'échelle d'oscillation intrinsèque. Mais les échelles de temps biologiquement pertinentes sont en millisecondes ou plus ( N 10 9 ), bien que généralement on ne calcule pas aussi loin.)NO(N1/2)N109

Pour plus de détails, voir http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence

Arnold Neumaier
la source
10

Si vous cherchez une bonne introduction, je suggère ce que tout informaticien de David Goldberg devrait savoir sur l'arithmétique à virgule flottante . C'est peut-être un peu trop détaillé, mais il est disponible en ligne gratuitement.

Si vous avez une bonne bibliothèque, je vous suggère le calcul numérique de Michael Overton avec l'arithmétique à virgule flottante IEEE , ou les premiers chapitres de l' exactitude et de la stabilité des algorithmes numériques de Nick Higham .

Ce à quoi Allen et Tildesley font référence spécifiquement, c'est l' annulation numérique . Le court est que si vous avez, disons, trois chiffres et vous soustraire 100de 101, vous obtenez 1.00(en trois chiffres). Le nombre semble être précis à trois chiffres, mais en réalité, seul le premier chiffre est vrai et les .00derniers sont des ordures. Pourquoi? Eh bien, 100et 101ne sont que des représentations inexactes de, disons 100.12345et 101.4321, mais vous ne pouvez les stocker que sous forme de nombres à trois chiffres.

Pedro
la source
δtr(\tδt)r(t)r(t)=1
@ArnoldNeumaier: Oui, l'exemple d'Allen et Tildesley ne semble pas avoir beaucoup de sens, je voulais seulement fournir une référence pour les problèmes qui surviennent quand "un petit terme [..] est ajouté à une différence de grands termes", ce qui est ce que le PO a demandé, non pas s'il s'agissait d'un problème dans le cas d'espèce.
Pedro
Mais ajouter un petit terme à un grand terme n'est qu'une erreur d'arrondi, rien de dangereux du tout. L'annulation est lorsque deux termes importants presque égaux sont soustraits pour obtenir un terme minuscule. Cela ne devient un problème que lorsque les intermédiaires soustraits sont beaucoup plus grands que le résultat final d'un calcul, ou lorsque le petit résultat intermédiaire affecté par l'annulation est divisé par un autre petit élément.
Arnold Neumaier
@ArnoldNeumaier: Comme je pense que cela ressort assez clairement de ma réponse, je parlais du problème du calcul de la différence, pas de la somme.
Pedro
1
@ArnoldNeumaier: Point pris, mais j'espère que vous comprenez que je considère cela assez mesquin pour un "-1".
Pedro
5

(3.14)

r(t)=101
r(tδt)=100
δt2a(t)=1.49

De (3.14) il devrait en découler

r(t+δt)=103,49

mais, comme nous ne pouvons utiliser que trois chiffres, le résultat devient tronqué à

r(t+δt)=103

Cette erreur se propagera, de sorte qu'après 20 étapes, en supposant une(t) reste inchangé, vous obtenez r(t+20δt)=331 au lieu de 433,90,

Igor F.
la source
Mais l'effet est si grand que dans l'arithmétique décimale à 3 chiffres.
Arnold Neumaier le
3

Pedro donne déjà le fait important, à savoir l'annulation. Le fait est que chaque nombre avec lequel vous calculez a une précision associée; par exemple, un nombre à virgule flottante simple précision ne peut représenter que des choses jusqu'à environ 8 chiffres de précision. Si vous avez deux nombres qui sont presque exactement les mêmes mais qui diffèrent au 7e chiffre, alors la différence sera à nouveau un nombre à virgule flottante à 8 chiffres et il semble qu'il soit précis à 8 chiffres, mais en réalité seulement le premier 1 ou 2 chiffres sont exacts car les quantités à partir desquelles vous l'avez calculé ne sont pas précises au-delà de ces 1 ou 2 premiers chiffres de la différence.

Maintenant, le livre que vous citez date de 1989. À l'époque, les calculs étaient le plus souvent effectués en simple précision et l'arrondi et l'annulation étaient de graves problèmes. Aujourd'hui, la plupart des calculs sont effectués en double précision avec 16 chiffres de précision, et c'est beaucoup moins un problème aujourd'hui qu'il ne l'était auparavant. Je pense qu'il vaut la peine de lire les paragraphes que vous citez avec un grain de sel et de les prendre dans le contexte de leur époque.

Wolfgang Bangerth
la source
l'annulation en arithmétique double précision peut être un problème aussi important qu'en simple précision. Un exemple en est l'élimination gaussienne sans pivotement, qui donne souvent de très mauvais résultats en raison de l'annulation, même en double précision.
Arnold Neumaier
-1: La formule de Verlet conserve généralement tous les chiffres de précision, pas seulement 1 ou 2 sur 8 en simple précision.
Arnold Neumaier
@ArnoldNeumaier: Bien sûr, vous pouvez obtenir le même genre de problèmes en double précision. Tout ce que j'ai dit, c'est qu'on ne les rencontre pas aussi souvent.
Wolfgang Bangerth
Si vous perdez 6 chiffres trois fois dans une chaîne de calculs, vous avez perdu tous les chiffres, même en double précision. Les algorithmes annulés seront généralement médiocres même en double précision. L'algorithme de Verlet est différent car il n'y a pas d' annulation mais une légère croissance linéaire des erreurs. Ainsi, la perte de précision ne peut pas se multiplier, ce qui la rend adaptée à des temps d'intégration beaucoup plus longs. Cela était sûrement connu d'Allen & Tildesley.
Arnold Neumaier
Droite. Mais ce que je veux dire, c'est que si vous avez un algorithme sans annulation, vous encourez toujours une erreur de l'ordre de 1e-8 en simple précision, et si vous effectuez 1e8 pas de temps, vous pouvez avoir un problème même si tout le reste est exact. 1e8 pas de temps est un ordre de grandeur que vous pouvez avoir pour ODE. En revanche, en double précision, votre imprécision à chaque étape est de 1e-16 et il faudrait 1e16 pas de temps pour obtenir une perte totale de précision. C'est un certain nombre d'étapes que vous ne rencontrerez pas dans la pratique.
Wolfgang Bangerth