"Pythagoräisches Dreikörperproblem" - brauche einige Punkte aus einer genauen Lösung zum Vergleich

Hinweis: Wenn Sie positiv abstimmen (oder auch nicht), vergessen Sie nicht, nach unten zu scrollen und sich auch die hervorragende Antwort anzusehen - es ist wunderschön!

Das pythagoräische Drei-Körper-Problem , auch bekannt als Burraus Problem, ist ein Sonderfall des allgemeinen Drei-Körper-Problems, bei dem die drei Körper Massen von 3, 4 und 5 haben und die Anfangsbedingungen so sind, dass sie im Ruhezustand beginnen Eckpunkte eines rechtwinkligen 3-4-5-Dreiecks.

Ich habe einige Screenshots aus den hier verlinkten Papieren eingefügt .

In diesem Beitrag können Sie mehr sehen und lesen

Und sehen Sie sich dieses Video an - es sieht so aus, als ob die Zeit in der Handlung im Video angezeigt wird 40 × Zeit in der Zeitung.

Die Idee war ursprünglich, dass es eine besondere Bedeutung haben könnte, aber es scheint nicht so zu sein. Es stellt jedoch eine große Herausforderung für numerische Integratoren dar, da es zu mehreren sehr nahen (~ 10 4 ) zwischen Paaren durchläuft, und viele gängige Integratoren reagieren nicht schnell genug mit einer Reduzierung der Schrittgröße, um die numerische Genauigkeit aufrechtzuerhalten.

Dies ist mir mit dem Standard-ODE-Integrator in SciPy passiert.

Es gibt einige Tricks, die Sie in SciPy ausprobieren können, und natürlich andere Integratoren, die in Python verfügbar sind, und tatsächlich kann ich einfach einige Runge-Kutta-Methoden höherer Ordnung implementieren und meinen eigenen hyper-wachsamen Step-Size-Handler schreiben . Es muss nicht schnell sein, denn ziemlich bald wird einer der drei ausgeworfen und die anderen beiden beruhigen sich auf eine Zwei-Körper-Rotation. Dies ist ziemlich üblich in Drei-Körper-Situationen, in Computern und in ternären Sternensystemen, die nicht ausreichend hierarchisch sind.

Was ich jetzt brauche, ist, die Ergebnisse mit der richtigen numerischen Lösung zu vergleichen - eine Tabelle mit einer Auswahl einiger genauer Koordinaten gegenüber der Zeit. Der Vergleich mit YouTube ist nicht so genau, und es gibt auch keine Garantie dafür, dass diese richtig sind!

Weiß jemand wo ich solche Nummern finden kann ?

Hinweis: Der Kommentar weist darauf hin, dass ich mit dem Wort "richtig" vorsichtig sein sollte. Ich suche nach Ergebnissen mit einem ODE-Löser, der gut mit steifen Gleichungen funktioniert (siehe auch hier ), die möglicherweise numerisch instabil sind und in diesem Fall voraussichtlich eine Genauigkeit von - sagen wir - sechs Stellen haben t = 70 .

Hier ist eine Beispielausgabe und ein Skript. Das ist falsch. Sie können nette Lösungen finden, die in YouTube und anderen Orten angezeigt werden, aber ich kann die numerischen Ergebnisse nicht finden, um mein Debugging zu unterstützen.

Wenn Sie Python-Verbesserungen vorschlagen möchten, können Sie eine Antwort oder einen Kommentar zu meiner Frage in Stackoverflow hinterlassen

Falsche Antwort

def deriv(X, t):

    Y[:6] = X[6:]

    r34, r35, r45 = X[2:4]-X[0:2], X[4:6]-X[0:2], X[4:6]-X[2:4]
    thing34 = ((r34**2).sum())**-1.5
    thing35 = ((r35**2).sum())**-1.5
    thing45 = ((r45**2).sum())**-1.5

    Y[6:8]   =  r34*thing34*m4 + r35*thing35*m5
    Y[8:10]  =  r45*thing45*m5 - r34*thing34*m3
    Y[10:12] = -r35*thing35*m3 - r45*thing45*m4

    return Y


import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint as ODEint

# Pythagorean Three Body Problem
# This script WILL NOT solve it yet, just for illustration of the problem

m3, m4, m5 = 3.0, 4.0, 5.0

x0 = [1.0, 3.0] + [-2.0, -1.0] + [1.0, -1.0]
v0 = [0.0, 0.0] + [ 0.0,  0.0] + [0.0,  0.0] 
X0 = np.array(x0 + v0)

t = np.linspace(0, 60,  50001)

Y = np.zeros_like(X0)

tol  = 1E-9 # with default method higher precision causes failure
hmax = 1E-04
answer, info = ODEint(deriv, X0, t, rtol=tol, atol=tol,
                      hmax=hmax, full_output=True)

xy3, xy4, xy5 = answer.T[:6].reshape(3,2,-1)
paths         = [xy3, xy4, xy5]

plt.figure()
plt.subplot(2, 1, 1)
for x, y in paths:
    plt.plot(x, y)
for x, y in paths:
    plt.plot(x[:1], y[:1], 'ok')
plt.xlim(-6, 6)
plt.ylim(-4, 4)
plt.title("This result is WRONG!", fontsize=16)
plt.subplot(4,1,3)
for x, y in paths:
    plt.plot(t, x)
plt.ylim(-6, 4)
plt.subplot(4,1,4)
for x, y in paths:
    plt.plot(t, y)
plt.ylim(-6, 4)
plt.show()

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Wenn ich nicht ganz falsch liege, wird jede 3-Körper-Simulation mit engen Annäherungen chaotisch, dh empfindlich abhängig von Anfangsbedingungen. Sie sind nicht nur der Zeitquantisierung, sondern auch numerischen Fließkommaartefakten ausgeliefert; Es gibt keine "richtige Antwort" in einem endlichen/diskreten System zum Vergleichen.
@RussellBorogove Danke, ich werde etwas über das Wort "c" hinzufügen ( richtig ). Es stimmt, dass chaotische Systeme sehr empfindlich auf Anfangsbedingungen reagieren und numerische Artefakte die Genauigkeit einschränken, aber das bedeutet nicht, dass das Problem stochastisch oder nicht deterministisch ist. Zwei Programmierer mit zwei unterschiedlichen Bibliotheken auf zwei unterschiedlichen Rechnern mit doppelter Genauigkeit (8 Bytes) sollten dieses Problem sicherlich auf - sagen wir - sechsstellige Genauigkeit - auf den Punkt lösen können ( t > 60 ) bei dem die m = 3 Objekt wird ausgeworfen. Hier gibt es keine Unschärferelation oder Zeitquantisierung, sondern nur das Lösen einer Reihe von 4 ODEs.
Gleitkommaoperationen auf Standard-CPUs können unterschiedliche Ergebnisse für Operationen liefern, die so ähnlich sind wie das Addieren von drei Zahlen in unterschiedlichen Reihenfolgen. Rundungseffekte können zu unterschiedlichen Ergebnissen für (3 Schritte von Delta-t = 2) im Vergleich zu (2 Schritte von Delta-t = 3) führen. Sobald Sie eine Divergenz erhalten, beginnt sich die Divergenz zu verstärken.
@ das stimmt. Ich beginne mit 16-stelligen Zahlen und hoffe auf etwa 6-stellige Genauigkeit am Ende ( t = 70 ). Im Moment habe ich tolgroß eingestellt 10 10 da die Standardroutine das Problem nicht lösen kann. Weitere Beispiele finden Sie in dieser Frage - insbesondere Problem D5 . Natürlich können verschiedene Computer Antworten geben, die leicht unterschiedlich sein können, und Rundungsfehler können bei dieser Art von Problem zu viel größeren Fehlern führen (chaotisch).
@RussellBorogove Ich suche nach einer Lösung, bei der jemand "numerischen Overkill" (viele Schritte, steife Methode, vielleicht Quad-Präzision) verwendet hat, um eine gute Antwort zu erhalten, mit der ich vergleichen kann.
Ahh, okay, sie gehen nicht sehr weit auseinander, bevor es effektiv zu einem Zwei-Körper-Problem wird. Ich gehe immer noch davon aus, dass z. B. die Periode der binären Komponente sehr leicht unterschiedlich sein kann, wenn Sie eine andere Schrittweite wählen, sodass das genaue Positionsergebnis nach langer Zeit unterschiedlich sein wird, selbst wenn der Charakter der Umlaufbahn gleich ist.

Antworten (1)

Ich habe es gerade laufen lassen, und meine sehen ziemlich genau so aus wie die in der Zeitung.

Siehe einige Koordinaten unten.

0-10 10-20 20-30 30-40 40-50 50-60 60-70

Hier sind einige {x,y}-Koordinaten zu den Zeiten in der linken Spalte:

0.      {1.,3.}                 {-2.,-1.}               {1.,-1.}
5.      {2.46917,-1.22782}      {-2.2782,-0.20545}      {0.34106,0.901049}
10.     {0.77848,0.141392}      {-2.02509,0.0972194}    {1.15299,-0.162611}
15.     {1.41845,0.686214}      {-2.00654,0.0599408}    {0.754159,-0.459681}
20.     {3.00429,0.511925}      {-1.38863,-0.470476}    {-0.691674,0.0692257}
25.     {2.2699,-0.0832}        {-2.63692,-0.426417}    {0.747596,0.391054}
30.     {0.85634,2.28709}       {-0.877984,-0.865964}   {0.188583,-0.679485}
35.     {0.0273748,0.895529}    {0.942553,-1.60223}     {-0.770468,0.744467}
40.     {-0.622004,1.85832}     {0.173545,-2.36841}     {0.234367,0.779737}
45.     {-0.657058,2.53557}     {1.61355,-1.23947}      {-0.896608,-0.529771}
50.     {-2.70146,-3.79723}     {1.50595,0.960811}      {0.416122,1.50969}
55.     {-2.75171,-4.29907}     {1.72673,0.97731}       {0.269648,1.7976}
60.     {0.743681,1.93961}      {0.263967,-0.731477}    {-0.657382,-0.578586}
65.     {4.05348,11.7131}       {-1.0722,-3.92197}      {-1.57432,-3.8903}
70.     {6.93108,20.2566}       {-1.99418,-6.87252}     {-2.5633,-6.65594}

Das alles mit 30-stelliger Arbeitsgenauigkeit. Vergleicht man die endgültige Gesamtenergie und den Gesamtdrehimpuls mit den Anfangsbedingungen, sind die Ergebnisse bei 30 Arbeitsziffern gut bis 10 Ziffern. Bei 50 Arbeitsziffern sind die Ergebnisse gut bis 20 Ziffern. Bei Maschinenpräzision (ca. 15 Arbeitsziffern) sind die Ergebnisse gut bis fünf- bis sechsstellig, was angesichts der engen Annäherungen immer noch ziemlich gut ist.

Wow, wunderschön! Ich hatte das Gefühl, Sie würden durchkommen :) Wie wäre es mit einer 17x6-Zahlentabelle - 3 Paare von (x, y) für t = 0, 5, 10 ... 70 - ungleichmäßige Zeitabstände sind in Ordnung. Vielleicht auch eine schnelle Überprüfung, ob Ihre Lösung stabil gegen Änderungen der Toleranzparameter erscheint, die Sie möglicherweise haben. Es ist kein "Beweis der Genauigkeit", aber es ist gut genug für mich. Vielen Dank!!
Ich habe es mit einer höheren Arbeitsgenauigkeit (30 Dezimalstellen) ausgeführt und die gleichen Ergebnisse erhalten.
Mathematica, richtig? Ich bin neugierig, hast du die Standardeinstellungen verwendet oder einige benutzerdefinierte?
Ja. Die Plotfarben sollten ein sicheres Zeichen sein. Ich habe NDSolvemit verwendet InterpolationOrder -> All, WorkingPrecision -> 30, MaxSteps -> 10^5.
Die Prüfung der Erhaltungsgrößen ist eine ausgezeichnete Idee und eine großartige Möglichkeit, die Qualität der Lösung weiter anzuzeigen. Meine frühere Frage war nicht sehr beliebt, aber ein Kommentar empfahl einen "symplektischen Integrator", um ein "Auslaufen" von Energie zu vermeiden. Sieht so aus, als hättest du hier einen verwendet.
Es gibt eine SymplecticPartitionedRungeKuttaOption, die ich aber nicht genutzt habe. Ich habe die Standardmethoden verwendet, die je nach Steifigkeit eine Prädiktor-Korrektor- und eine Rückwärtsdifferenzierungsmethode wählen. Dann ist die endgültige Gesamtenergie wirklich ein gutes Maß für die Ergebnisqualität, da es nichts Explizites in der Integrationsmethode gibt, außer den Bewegungsgleichungen, die ihre Erhaltung gewährleisten würde.