Warum ergibt sich in der Gleitkomma-Arithmetik eine numerische Ungenauigkeit, wenn ein kleiner Term zu einer Differenz großer Terme hinzugefügt wird?


13

Ich habe das Buch Computersimulation von Flüssigkeiten von Allen und Tildesley gelesen . Ab Seite 71 diskutieren die Autoren die verschiedenen Algorithmen, mit denen Newtons Bewegungsgleichungen in Simulationen der Molekulardynamik (MD) integriert werden. Ab Seite 78 diskutieren die Autoren den Verlet-Algorithmus, bei dem es sich möglicherweise um den kanonischen Integrationsalgorithmus in MD handelt. Sie stellen fest:

Die wahrscheinlich am weitesten verbreitete Methode zur Integration der Bewegungsgleichungen ist die von Verlet (1967) eingeführte und Stormer (Gear 1971) zugeschriebene. Diese Methode ist eine direkte Lösung der Gleichung zweiter Ordnung mir¨i=fi . Das Verfahren basiert auf Positionen r(t) , Beschleunigungen a(t) und den Positionen r(tδt) aus dem vorherigen Schritt. Die Gleichung zum Vorrücken der Positionen lautet wie folgt:

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

In Bezug auf Gleichung (3.14) sind mehrere Punkte zu beachten. Es ist zu sehen, dass die Geschwindigkeiten überhaupt nicht auftreten. Sie wurden durch Addition der durch Taylor-Expansion um erhaltenen Gleichungen eliminiert 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)....

Später (auf Seite 80) geben die Autoren Folgendes an:

Gegenüber dem Verlet-Algorithmus kann die Form des Algorithmus unnötigerweise eine gewisse numerische Ungenauigkeit einführen. Dies entsteht, weil in Gleichung (3.14) ein kleiner Term ( O(δt2) ) zu einer Differenz von großen Terms ( O(δt0) ) addiert wird , um die Trajektorie zu erzeugen.

Ich vermute, dass der "kleine Term" δt2a(t) ist und die "Differenz der großen Terme" 2r(t)r(tδt) .

Meine Frage ist, warum numerische Ungenauigkeit durch Hinzufügen eines kleinen Terms zu einem Unterschied von großen Terms entsteht.

Ich interessiere mich für einen eher grundsätzlichen, begrifflichen Grund, da mir Einzelheiten der Gleitkomma-Arithmetik überhaupt nicht bekannt sind. Kennen Sie auch Referenzen vom Typ "Überblick" (Bücher, Artikel oder Websites), die mich mit den Grundgedanken der Gleitkomma-Arithmetik in Verbindung mit dieser Frage bekannt machen? Vielen Dank für Ihre Zeit.

Antworten:


9

Ihre Beobachtung, dass die Form des Algorithmus unnötigerweise eine gewisse numerische Ungenauigkeit hervorruft, ist richtig. Ihre Erklärung ergibt sich jedoch, weil in Gleichung (3.14) ein kleiner Term ( ) zu einer Differenz großer Terme ( O ( δ t 0 ) ) addiert wird , um die Trajektorie zu erzeugen. '' ist falsch.O(δt2)O(δt0)

Der wahre Grund für die geringe numerische Instabilität von Verlets Algorithmus ist, dass er nur marginal stabil ist, da die Differenzgleichung (im Wesentlichen der Fall, in dem Sie a in Verlet vernachlässigen ) parasitär ist Lösung proportional zu k , wodurch die eingeführten Fehler in k linear anwachsen, wohingegen für ein vollständig stabiles Mehrschrittverfahren, das auf eine dissipative Differentialgleichung angewendet wird, das Fehlerwachstum begrenzt ist.xk+1=2xkxk1akk

Edit: Beachten Sie, dass das Buch über die numerische Simulation der Molekulardynamik ist, und für eine angemessene Genauigkeit der resultierenden Erwartungen immer braucht man eine große Anzahl von Schritten, wie die Genauigkeit Waage mit O ( N - 1 / 2 ) nur. (Oft liegt der Zeitschritt in Pikosekunden, um der intrinsischen Oszillationsskala zu folgen. Biologisch relevante Zeitskalen liegen jedoch in Millisekunden oder darüber ( N 10 9 ), obwohl normalerweise nicht so weit gerechnet wird.)NO(N1/2)N109

Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence


10

Wenn Sie nach einer guten Einführung suchen, würde ich David Goldbergs Was jeder Informatiker über Fließkommaarithmetik wissen sollte empfehlen . Es ist vielleicht ein bisschen zu detailliert, aber es ist kostenlos online verfügbar.

Wenn Sie eine gute Bibliothek haben, empfehle ich Michael Overtons Numerical Computing mit IEEE Floating Point Arithmetic oder die ersten Kapitel von Nick Highams Genauigkeit und Stabilität numerischer Algorithmen .

Was Allen und Tildesley speziell ansprechen, ist die numerische Löschung . Die kurze davon ist , dass , wenn Sie, sagen wir, nur drei Ziffern und Sie subtrahieren 100aus 101, erhalten Sie 1.00(in drei Ziffern). Die Zahl scheint auf drei Ziffern genau zu sein, aber tatsächlich ist nur die erste Ziffer wahr und das Ende .00ist Müll. Warum? Nun, 100und 101sind nur ungenaue Darstellungen von, sagen wir, 100.12345und 101.4321, aber Sie konnten sie nur als dreistellige Zahlen speichern.


-1: Wo ist der Abbruch, den Sie der Verlet-Formel zuordnen? Typischerweise klein ist , macht die R ( \ t - δ t ) r ( t ) , wobei keine Löschung führt. Versuchen Sie es mit r ( t ) = 1 ! δtr(\tδt)r(t)r(t)=1
Arnold Neumaier

@ArnoldNeumaier: Ja, das Beispiel von Allen und Tildesley scheint nicht sehr sinnvoll zu sein. Ich wollte nur einen Hinweis auf Probleme geben, die auftreten, wenn "ein kleiner Begriff [..] zu einem Unterschied von großen Begriffen hinzugefügt wird" das OP fragte nicht, ob es im gegebenen Fall ein Problem sei.
Pedro

Das Hinzufügen eines kleinen Terms zu einem großen Term ist jedoch nur ein Rundungsfehler, überhaupt nichts Gefährliches. Stornierung ist, wenn zwei nahezu gleich große Terme subtrahiert werden, um einen winzigen Term zu erhalten. Dies wird nur dann zu einem Problem, wenn entweder die subtrahierten Zwischenprodukte viel größer sind als das Endergebnis einer Berechnung, oder wenn das von der Löschung betroffene kleine Zwischenergebnis durch ein anderes kleines Element geteilt wird.
Arnold Neumaier

@ArnoldNeumaier: Wie aus meiner Antwort ersichtlich, bezog ich mich auf das Problem der Differenzberechnung, nicht auf die Summe.
Pedro

1
@ArnoldNeumaier: Punkt genommen, aber ich hoffe du verstehst, dass ich das für ein "-1" ziemlich kleinlich halte.
Pedro

5

Um das Beispiel von Pedro auf die Gleichung anzuwenden , nehmen Sie an, dass Ihre Variablen mit den folgenden Werten gespeichert sind:(3.14)

r ( t - & dgr ; t ) = 100 & dgr; t 2 a ( t ) = 1,49

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

Aus sollte das folgen(3.14)

r(t+δt)=103.49

Da wir jedoch nur drei Ziffern verwenden können, wird das Ergebnis auf abgeschnitten

r(t+δt)=103

Dieser Fehler breitet sich aus, so dass Sie nach 20 Schritten unter der Annahme, dass unverändert bleibt, r ( t + 20 δ t ) = 331 anstelle von 433,90 erhalten .a(t)r(t+20δt)=331433.90


Aber der Effekt ist nur bei 3-stelliger Dezimalarithmetik so groß.
Arnold Neumaier

3

Pedro gibt bereits die wichtige Tatsache, nämlich Stornierung. Der Punkt ist, dass jede Zahl, mit der Sie rechnen, eine zugehörige Genauigkeit hat; Beispielsweise kann eine Gleitkommazahl mit einfacher Genauigkeit nur Dinge mit einer Genauigkeit von bis zu 8 Stellen darstellen. Wenn Sie zwei Zahlen haben, die fast genau gleich sind, sich aber in der 7. Ziffer unterscheiden, ist der Unterschied wieder eine 8-stellige Gleitkommazahl mit einfacher Genauigkeit, und es sieht so aus, als ob sie auf 8 Ziffern genau ist, in Wirklichkeit jedoch nur die erste 1 oder 2 Ziffern sind genau, da die Mengen, aus denen Sie sie berechnet haben, über diese ersten 1 oder 2 Ziffern der Differenz hinaus nicht genau sind.

Das Buch, das Sie zitieren, stammt aus dem Jahr 1989. Damals wurden Berechnungen meist in einfacher Genauigkeit durchgeführt, und Abrundung und Löschung waren schwerwiegende Probleme. Heutzutage werden die meisten Berechnungen mit doppelter Genauigkeit und einer Genauigkeit von 16 Stellen durchgeführt, und dies ist heute weitaus weniger ein Problem als früher. Ich denke, es lohnt sich, die von Ihnen zitierten Absätze mit einem Körnchen Salz zu lesen und sie im Kontext ihrer Zeit zu betrachten.


Das Löschen mit doppelter Genauigkeit kann ein ebenso großes Problem sein wie mit einfacher Genauigkeit. Ein typisches Beispiel ist die Gaußsche Eliminierung ohne Drehung, die aufgrund der Aufhebung oftmals sehr schlechte Ergebnisse liefert, selbst bei doppelter Genauigkeit.
Arnold Neumaier

-1: Die Verlet-Formel behält normalerweise alle Stellen der Genauigkeit bei, nicht nur 1 oder 2 von 8 mit einfacher Genauigkeit.
Arnold Neumaier

@ArnoldNeumaier: Sicher, Sie können die gleichen Probleme mit doppelter Präzision bekommen. Ich sagte nur, dass man ihnen nicht so häufig begegnet.
Wolfgang Bangerth

Wenn Sie in einer Kette von Berechnungen dreimal 6 Stellen verlieren, haben Sie alle Stellen sogar mit doppelter Genauigkeit verloren. Algorithmen, die unter Auslöschung leiden, sind normalerweise selbst bei doppelter Genauigkeit schlecht. Verlets Algorithmus ist anders, da es keine Auslöschung gibt, sondern ein leicht lineares Fehlerwachstum. Somit kann sich der Genauigkeitsverlust nicht vervielfachen, was ihn für viel längere Integrationszeiten geeignet macht. Allen & Tildesley war das sicherlich bekannt.
Arnold Neumaier

Richtig. Aber was ich meine ist, dass wenn Sie einen Algorithmus ohne Abbruch haben, immer noch ein Fehler in der Größenordnung von 1e-8 in einfacher Genauigkeit auftritt und wenn Sie 1e8 Zeitschritte machen, dann können Sie ein Problem haben, auch wenn alles andere genau ist. 1e8 Zeitschritte ist eine Größenordnung, die Sie für ODE haben können. Andererseits beträgt Ihre Ungenauigkeit bei doppelter Genauigkeit in jedem Schritt 1e-16, und es würde 1e16 Zeitschritte erfordern, um einen vollständigen Genauigkeitsverlust zu erzielen. Das ist eine Reihe von Schritten, denen Sie in der Praxis nicht begegnen werden.
Wolfgang Bangerth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.