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 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 (~ ) 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 .
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
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()
Ich habe es gerade laufen lassen, und meine sehen ziemlich genau so aus wie die in der Zeitung.
Siehe einige Koordinaten unten.
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.
NDSolve
mit verwendet InterpolationOrder -> All, WorkingPrecision -> 30, MaxSteps -> 10^5
.SymplecticPartitionedRungeKutta
Option, 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.
Russell Borogove
äh
Russell Borogove
äh
tol
groß eingestelltäh
Russell Borogove