Berechnung der Planeten und Monde nach Newtons Gravitationskraft

Ich versuche zu verstehen, wie man die Umlaufbahnen von Körpern des Sonnensystems in einem n-Körper-Rahmen berechnet, basierend auf der paarweisen Gravitationswechselwirkung zwischen den Objekten. Derzeit betrachte ich 44 Objekte (Sonne, Planeten, große Monde und große Asteroiden).

Ich beginne mit den Zustandsvektoren (Position und Geschwindigkeit) jedes der Objekte mit Sonne als Zentrum, erhalten von telnet ssd.jpl.nasa.gov 6775(JPL Horizons) 01. Januar 2017 um 00:00 UTC und möchte das System für 4344h, 01- entwickeln lassen. Juli 2017 um 00:00 Uhr.

Ich habe ein Programm geschrieben, um dies in Java zu tun, und bisher scheinen die Ergebnisse nicht einmal annähernd dem zu entsprechen, was sie sein sollten, verglichen mit den von Horizons erhaltenen Zustandsvektoren. Nach jedem 2-Sekunden-Zeitschritt werden die Netto-Gravitationskräfte auf jeden Körper von allen anderen berechnet, und dann werden auf einen Schlag alle Geschwindigkeiten und Positionen basierend auf den Beschleunigungen dieser Nettokräfte aktualisiert. Dann vergleiche ich die endgültig aktualisierten Positionsvektoren aus der Anwendung mit Daten, die ich von Horizons erhalten habe, nachdem ich die aktualisierte Position der Sonne korrigiert habe.

Der Vergleich zeigt, dass die Positionen der Erde und der äußeren Planeten einen Positionsfehler von weniger als 50 km haben (tatsächlich sind die entfernteren Planeten weniger als 10 km). Wobei bei Merkur der Fehler 250 km beträgt. Und die Monde von Jupiter und Saturn sind um 50.000 bis 300.000 km entfernt!

In meiner Anwendung unterscheide ich nicht zwischen Sonne, Planeten und Monden, daher bin ich mir nicht sicher, warum es bei den Monden so viel mehr Fehler geben sollte. Ich habe versucht, die Schrittweite von 2 Sekunden auf 0,25 Sekunden zu verringern, aber es gibt keine signifikante Verbesserung.

Was könnten die Probleme sein, die ich hier untersuchen sollte? Gibt es Dinge, die eindeutig sofort verbessert werden müssen? Oder vielleicht gibt es Tests, die ich durchführen kann, um die primären Fehlerquellen zu diagnostizieren?


BEARBEITEN: Hier ist der Kern der Berechnungsmethode, wie in den Kommentaren angefordert:

while (nowT < endT) {
    doOneStep(step, nowT)
    nowT += stepT
}

allItemLinksist Sammlungen von ItemLink- Verknüpfungen zwischen Objekten. in diesem Fall Schwerkraftverbindung zwischen allen Objektpaaren. Für nObjekte wird es n.(n+1)/2Links geben

doOneStep(double deltaT, double nowT){
    initForces fo all items to 0,0,0
    for each ItemLink **allItemLinks**)
        inf.evalForce(deltaT, false)
    updatePosAndVel(deltaT, nowT, true)
}

In ItemLink:

evalForce(double deltaT, boolean bFinal) {
    addGravityEffect(deltaT);
}

boolean addGravityEffect(double deltaT) {
    rVector = item2.pos - item1.pos
    double gF = G.mq.m2/r2
    fVector = gF in rVector direction
    item1.addForce(fVector)
    similarly for item2 to item1
}

allItemsist eine Sammlung von Item-Objekten (Sonne, Planeten und Monde)

void updatePosAndVel(double deltaT, double nowT) {
    for each Item of **allItems** updatePandV(deltaT, nowT);
}

Im Artikel:

netForce, nowAcc, effectiveAcc, deltaV, newPos etc.sind alle Vector3d

updatePAndV(double deltaT, double nowT, boolean bFinal){
        nowAcc = netForce / mass
        effectiveAcc = mean of lastAcc and nowAcc
        deltaV = effectiveAcc * deltaT
        meanV ...
        newPos = oldPos + meanV * deltaT
}

Nicht auf Gravitationsfeldern arbeiten, sondern mit direkten Kräften aufgrund der Schwerkraft zwischen Objekten.

Mit dem obigen Code kann ich stabile Umlaufbahnen bekommen. Auch die Umlaufzeiten der Monde sind gut. Holen Sie sich ein schönes Saturn-Set mit den Zykloidenbewegungen der Monde und das Uranus-Set mit der spiralförmigen Bewegung der Monde um Uranus. Ich weiß nicht, wie ich Dateien oder Bilder für diese Diskussion senden soll

Der Versatz von Merkur wäre aufgrund relativistischer Effekte ungefähr richtig. Ich würde die Ungenauigkeit der Mondpositionen auf numerische Genauigkeitsfehler zurückführen, insbesondere darauf, dass sie stark miteinander interagieren.
Wenn Sie außerdem ihre Position relativ zur Sonne berechnen, haben Sie für Io eine große Halbachse mit einem Orbitalradius von 0,003 AE in einem Abstand von 5,2 AE von der Sonne. Dies funktioniert schlecht mit Gleitkommawerten, da der feste, große Versatz vom Mittelpunkt des Koordinatensystems verhindert, dass sie die Genauigkeit durch Ändern der Mantisse erhöhen, und Änderungen am äußersten Ende der Basis auftreten, wobei viel Präzision hinter ihrem Ende verloren geht.
Das ist eher ein CS-Problem. Welche Präzision verwendest du? Haben Sie Runge-Kutta und/oder symplektische Integratoren in Betracht gezogen? Was Sie hier haben, ist das n-Körper-Problem. Der Fehler für Quecksilber ist wahrscheinlich auf relativistische Effekte zurückzuführen.
Ich glaube nicht, dass Merkur, der in sieben Tagen um 250 km abweicht, etwas mit der Relativitätstheorie zu tun hat, oder die Jupitermonde um 100.000 km. Die Monde haben den größten Fehler, weil sie die kürzeste Periode haben und sich daher am meisten ändern. Ich vermute, Sie verwenden nur v ich + 1 = v ich + Δ t   F / m ; x ich + 1 = x ich + Δ t   v ich und nicht mehr, aber wir werden es nicht wissen, bis Sie mehr teilen. Wenn Sie es selbst schreiben und keinen Bibliothekslöser verwenden möchten, sind RK4 oder RK4(5) nur etwa zwei Dutzend Zeilen oder so.
Berechnungsdauer in 6 Monaten (01.01.2017 bis 01.07.2017).
Ich codiere in Java mit Vector3d ('doppelte' Variablen). Vermutung eines Genauigkeitsproblems, versucht mit Big Decimal (32 signifikante Ziffern) für Positionen von Europa von Jupiter (nur ein Objekt mit BigDecimal, da die Berechnung zu lange dauert). Dennoch war der Fehler für Europa sehr groß, ähnlich wie bei früheren Berechnungen mit 'doppelt'. Ich verwende keine Integrationsmethoden - nur numerische Additionen, die alle 2 Sekunden Positionen und Geschwindigkeit aktualisieren.
Welche Zahlen verwenden Sie für die Masse (oder Masseparameter)? Vielleicht möchten Sie auch astronomy.stackexchange.com/questions/2416/… lesen.
Wenn Sie nicht mindestens einen einfachen RK4-Integrator verwenden, erhalten Sie immer völlig falsche Antworten. Es ist keine Präzision, es ist keine Relativität, Sie verwenden nur die Euler-Methode , die nur 1. Ordnung ist und Ihnen nicht einmal annähernd eine physikalisch korrekte Umlaufbahn liefert. Schauen Sie sich einfach das erste Bild im Wikipedia-Artikel i.stack.imgur.com/hfAv5.png an. Bis Sie einige Gleichungen oder Codezeilen in den Hauptteil Ihrer Frage einfügen , kann ich nicht wirklich eine vollständige Antwort posten, aber 1. Bestellung ist hier wertlos.
Oder schauen Sie sich einfach an , wie man ODEs mit Java löst? . Dies zeigt die Verwendung des Dopri853-Algorithmus (eine interpolierende, adaptive Schrittweite RK höherer Ordnung) aus dem Apache Commons ODE-Solver für Planeten in Java. Achten Sie auch auf die Antwort!
@uhoh Danke, dass du meine zusätzlichen Daten in die Hauptfrage verschoben hast.
@uhoh Entschuldigung, da gibt es ein Missverständnis. Was ich meinte, war, dass ich Umlaufbahnen bekomme, da Sie erwähnt haben, dass sich die Umlaufbahnen möglicherweise nicht schließen. Ehrlich gesagt war ich begeistert, als ich die Zykloiden- und Schraubenbewegungen sah, und ich habe mich übertrieben. Es scheint, dass der grundlegende Ansatz für die Planeten richtig sein kann, aber Probleme beim Umgang mit den Monden hat und prüft, ob in der Nähe von massiven Objekten eine besondere Handhabung erforderlich ist. Ich schätze Ihre sehr aktive und nützliche Antwort. Dafür brauche ich Hilfe.
Ok, kein Problem! Ich habe angefangen, einige der alten Kommentare zu löschen. Ich finde das ist eine sehr schöne Frage! Ich werde versuchen, in ein oder zwei Tagen eine Antwort zu posten, und wahrscheinlich werden andere dies auch tun. Sie müssen eine Integration höherer Ordnung als die von Ihnen beschriebene Euler-Methode 1. Ordnung verwenden. Ich werde versuchen, Ihnen mindestens zwei Optionen zu geben.
@SF. sieht aus als hättest du recht! Das Einschalten der Allgemeinen Relativitätstheorie ist notwendig, um Merkur zu reparieren. Es gibt einen zyklischen Runout während jeder Umlaufbahn von einigen hundert Kilometern. Ich habe die Integrationszeit falsch verstanden (dachte, es wären sieben Tage), aber über Monate ist es notwendig. Ich werde die GR-Ergebnisse posten, sobald ich einen hübschen Plan erstellen und die Mathematik in MathJax bringen kann.
@uhoh ich bin wieder da. Ich habe meinen Code für RK4 geändert. dh für jedes Objekt wird mit der RK4-Methode neu positioniert. Während des RK4-Verfahrens für ein bestimmtes Objekt werden alle anderen Objekte an den Positionen des vorherigen Schritts beibehalten. Beim Vergleich der Ergebnisse (nach 6 Monaten ab 20170101) mit Horizons finde ich, dass der Fehler im 100er-Schritt sehr hoch ist, im 10er-Schritt geringer. Selbst mit 2s-Schritten sind die Fehler Erde 30 km, Jupiter 17 km, äußere Pflanzen weniger als 3 km. Aber Venus 50, Merkur 240, Europa 120000, Io 330000 usw. Alle Kommentare. Ist es mit relativistischem Effekt oder Gravitationseffekt mit Zeitverzögerung bei Lichtgeschwindigkeit
@vishu Der richtige Weg zur Mehrkörperausbreitung besteht darin, einen einzigen Vektor mit allen Positions- und Geschwindigkeitsvariablen zu konstruieren . Also (wie ich in meiner Antwort erwähnt habe), wenn es zwei Körper gäbe, würden Sie verwenden j = ( x 1 , j 1 , z 1 , x 2 , j 2 , z 2 , v x 1 , v j 1 , v z 1 , v x 2 , v j 2 , v z 2 ) das ist Xin meinem Python-Skript, z n Körper wird der Vektor Länge haben 6 n . Alle Variablen werden in jedem der vier Teilschritte jeder Iteration der RK-Integration parallel fortgeführt. Außerdem würde ich auf Jupiters Monden warten, bis Sie Gravitationsvielfache höherer Ordnung hinzufügen (z J 2 ) aufgrund von Oblateness.
Ich habe 'Gravitationsvielfache höherer Ordnung (z. B. J2)' nicht verstanden.
@uhoh wieder zurück, wobei alle Variablen für jeden Unterschritt von RK4 parallel vorgerückt werden. Jetzt finde ich nach 6 Monaten ab 01.01.2017 00:0 einen konsistenten Fehler zu Horizon. Was ich meine ist, dass der Fehler für Planeten und große Monde immer noch existiert, aber mit 10er, 100er, 600er oder sogar mit 1800er Berechnungsschritten nahezu gleich bleibt. Aber mit 1800 beginnt Phobos-Mars, vom Mars wegzulaufen. Es scheint 1800 ein zu großer Schritt für Phobos mit sehr kurzer Umlaufzeit zu sein. Meine Schlussfolgerung, RK4 hat eine längere Schrittzeit zugelassen (z. B. 600 Sekunden), aber aus anderen Gründen als dem Berechnungsschritt bleiben Fehler bestehen.
@vishu ok das sind tolle Neuigkeiten! Überprüfen Sie, ob Sie die besten Werte für Standard-Gravitationsparameter verwenden ( G mal M ), JPLs neueste Zahlen finden Sie in dieser Frage . Danach gibt es zwei große Korrekturen der einfachen Newtonschen Schwerkraft von Punktmasse zu Punktmasse, die mir einfallen; 1. Allgemeine Relativitätstheorie (GR) und 2. Gravitationsmultipole höherer Ordnung (zB J 2 und darüber hinaus) und Gezeitenkräfte. Merkur wird eine große Verbesserung mit GR zeigen, und der Erde-Mond und die Monde von Riesenplaneten werden eine Verbesserung mit Nicht-Punkt-Schwerkraft zeigen.
@vishu überprüfe deine Massen, und ich werde eine Antwort für den GR-Teil aktualisieren / hinzufügen und etwas ansprechen J 2 . Geben Sie mir einen Tag oder so.
Die GM-Werte stammen alle aus sd.jpl.nasa.gov/pub/xfr/gm_Horizons.pck. Vielen Dank. Ich werde warten, keine Eile.
Fehler von meiner Seite, es ist ftp zu 'ssd.jpl.nasa.gov/pub/xfr/gm_Horizons.pck'

Antworten (2)

Abgesehen von numerischen Problemen kann "Mit Sonne als Zentrum" Teil Ihres Problems sein. Holen Sie sich alle Daten von Horizons relativ zum Baryzentrum des Sonnensystems, nicht zur Sonne, die sich relativ zum Baryzentrum bewegt. Dieses Baryzentrum ist ein Trägheitsbezugssystem, das Zentrum der Sonne hingegen nicht. Stellen Sie außerdem sicher, dass Sie die anfängliche Position und Geschwindigkeit der Sonne eingeben und sie sich bewegen lassen, wenn Sie dies nicht bereits tun.

Guter Punkt! Das ist mir gar nicht aufgefallen.
Ich nehme Daten von Horizonten mit Sonnenzentrum bei 20170101 und lasse die Objekte reagieren und sich bewegen. Anfangsposition und -geschwindigkeit der Sonne sind beide 000. Während der Berechnung bewegt sich die Sonne. Nach Abschluss der Berechnungen bis 01.07.2017 werden alle resultierenden Daten in Bezug auf die neue Position und Geschwindigkeit der Sonne als Basis zurück modifiziert. Dies wird dann mit Daten von Horizons für 20170701 wieder mit Sun-Center verglichen.
Was ich empfehle, ist, dass Sie alle Ihre Daten relativ zum Baryzentrum des Sonnensystems (@0) erhalten. Nicht die Sonne (@10). Wenn Sie es richtig machen, hat die Sonne keine Anfangsposition und -geschwindigkeit von Null. Dann müssen Sie am Ende nicht auf die neue Sonnenposition und -geschwindigkeit umbasieren.
Aber ist es nicht so, dass das Baryzentrum selbst von den relativen Positionen des Planeten abhängig ist? Ich kann verstehen, dass das Erde-Mond-Baryzentrum relativ zu Erde und Mond fixiert ist. Aber bei mehreren Planeten ändert es sich nicht mit den Positionen der Planeten.
Nein. Das ist der springende Punkt beim Finden und Verwenden des Baryzentrums. Es ist das Massenzentrum aller Körper des Sonnensystems und bewegt sich daher aufgrund der Impulserhaltung nicht im Trägheitssystem eines geschlossenen Sonnensystems, unabhängig davon, wie sich die Körper im Sonnensystem bewegen.
@mark Danke. Lassen Sie mich das zuerst verdauen (Erhaltung des Impulses und daher bewegt sich das Zentrum nicht - natürlich unter Berücksichtigung eines isolierten Sonnensystems). Ich werde es mit Daten mit Barycenter des Sonnensystems versuchen. Es wird (könnte) die Genauigkeit der Planeten verbessern, aber der große Fehler für die kleineren Monde ... Ich habe anscheinend ein anderes Problem. Werde zurück kommen
@mark Ich habe die Berechnungen mit g@0-Daten von Horizons durchgeführt und die Endergebnisse mit g@0-Daten am Enddatum verglichen. Die Fehlerwerte sind genau die gleichen wie zuvor. Ein Hauptvorteil ist, dass ich die Endpositionen und Geschwindigkeiten nicht anpassen muss, um mit dem neuen Sonnenstand für den Ergebnisvergleich mit g@10-Daten am Enddatum neu zu zentrieren. Für Fehler bei kleinen Monden spiele ich mit meinem Verständnis der Ausbreitungszeit der Schwerkraft und der Zeitdilatation :) . Lassen Sie mich sehen ..
Sie haben wahrscheinlich numerische Probleme oder Parameterprobleme mit den Monden. Die Bewegung der Monde sollte relativ zu den Körpern, die sie umkreisen, integriert werden, wobei andere Körper als Störungen behandelt werden. Relativ zu ihrer Entfernung von der Sonne bewegen sich die Monde um winzige Beträge um ihren Mutterkörper. Außerdem müssen Sie genaue GMs für alle Körper haben. (Sie finden diese Art von Daten normalerweise in den Ausgabeheadern von Horizons.)
Die GM-Werte stammen alle aus ssd.jpl.nasa.gov/pub/xfr/gm_Horizons.pck.
@MarkAdler Wie simuliert man die Bewegung der Sonne? Newtonsche Gravitation durch andere Planeten?

Ich werde die numerischen Methoden in dieser Antwort und die vollständige Berechnung des Sonnensystems (einschließlich Relativitätstheorie und möglicher Auswirkungen der abgeflachten Form der Sonne) als zweite Antwort veröffentlichen. Es ist einfach zu viel, um alles in einer Antwort zusammenzufassen.

Die Methode, die Sie beschreiben, sieht aus wie die Euler-Methode oder die so genannte Euler-Forward-Methode . Bei jedem Zeitschritt d t Sie berechnen alle Kräfte und ihre resultierenden Nettobeschleunigungen a , und erhöhen Sie dann einfach die Geschwindigkeiten v von a d t und alle Positionen x von v d t . Sie brauchen absurd kleine Zeitschritte, um dem auch nur nahe zu kommen. Sie haben 2 Sekunden und 250 Millisekunden erwähnt, ein bisschen kurz für die Zeitskalen des Sonnensystems.

Im folgenden Skript habe ich die Euler-Forward-Methode und zwei weitere Runge-Kutta- Methoden niedriger Ordnung geschrieben, die normalerweise RK2 und RK4 genannt werden. Für jede Methode wird eine vereinfachte (falsche) Merkurumlaufbahn um eine feste Sonne für 100 Tage berechnet, wobei die Anzahl der Iterationen zwischen 10 und 10.000 variiert. Außerdem verwende ich für jeden den SciPy - Bibliothekslöser odeint()mit einer relativen Genauigkeitstoleranz von 1E-12 pro Schritt. odint ist ein Python-Wrapper für lsodadie FORTRAN-Bibliothek odepack.

Sie können sehen, dass sogar RK4 odeint nach 100 Tagen mit dem Pegel von Metern übereinstimmt, wenn Sie einen Zeitschritt von etwa 15 Minuten verwenden, und die Euler-Forward-Methode (die Sie verwenden) eine absurde Anzahl von Schritten benötigt, um sich diesem überhaupt anzunähern.

Numerische Techniken sind hier nicht das einzige Problem, ich werde in ein paar Tagen eine zweite Antwort mit dem Rest veröffentlichen, was Sie brauchen. Ich kann dies unter einer separaten Frage tun, anstatt zwei Antworten auf dieselbe Frage zu posten .

Aber das sollte Sie dazu bringen, entweder RK4 in Java zu programmieren oder nach einer numerischen Java-Bibliothek wie der in den Kommentaren erwähnten Apache zu suchen.

Der einfachste Standardweg zum Lösen eines Orbitalproblems mit einem ODE-Löser besteht darin, alle kartesischen Koordinaten und Geschwindigkeiten in einen langen Vektor zu packen, nennen Sie ihn j , und schreiben Sie eine einzelne Funktion für die Zeitableitung:

j ˙ = f ( t , j )

Wenn Sie also zwei Körper und drei Dimensionen hätten, der Vektor j wäre:

j = ( x 1 , j 1 , z 1 , x 2 , j 2 , z 2 , v x 1 , v j 1 , v z 1 , v x 2 , v j 2 , v z 2 )

mit sechs Elementen pro Körper. Die Ableitung von x 1 ist v x 1 , und die Ableitung von v x 1 ist die Beschleunigung a x 1 wegen all der anderen Körper.

Angenommen, Sie haben einen Körper in einer zentralen Kraft mit einem Standard-Gravitationsparameter G M . Die Änderungsrate der Position ist nur die Geschwindigkeit,

d x d t = v

und die Geschwindigkeitsänderungsrate ist die Beschleunigung aufgrund der Kraft;

d v d t = a = G M r r 3

Wenn Sie mehrere Körper hatten, die r wäre der Abstand zwischen Körperpaaren und für jeden Körper würden Sie alle anderen summieren, wie Sie bereits beschrieben haben.

Also, wenn Sie ausgeschrieben haben f , es wäre:

f = ( v x , v j , v z , G M x / r 3 , G M j / r 3 , G M z / r 3 ) .

Die Euler-Forward-Methode , von der ich glaube, dass Sie sie verwenden, wird nur iteriert

j ich + 1 = h   f ( t , j ich )

mit Zeitschritten von h . Die verbesserte RK2-Methode (unten gezeigt) würde geschrieben werden:

k 1 = f ( t , j ich )
k 2 = f ( t + h 2 , j ich + h 2 k 1 )
j ich + 1 = j n + h k 2

und die allgegenwärtige RK4-Methode wird geschrieben als

k 1 = f ( t , j ich )
k 2 = f ( t + h 2 , j ich + h 2 k 1 )
k 3 = f ( t + h 2 , j ich + h 2 k 2 )
k 4 = f ( t + h , j ich + k 3 )

j ich + 1 = j n + h ( k 1 + 2 k 2 + 2 k 3 + k 4 ) / 6

Hier ist der Abschnitt, der die Ähnlichkeiten und Unterschiede zwischen der Euler-Forward-Methode (der einfachsten Runge-Kutta-Methode) und zwei RK-Methoden höherer Ordnung zeigt. Dies wurde aus Gründen der Klarheit geschrieben, offensichtlich nicht der Geschwindigkeit.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

def deriv(t, X):

    x, v = X.reshape(2, -1)
    acc  = -GMs * x * ((x**2).sum())**-1.5

    return np.hstack((v, acc))

def derivv(X, t):
    return deriv(t, X) # historical reasons

def RK_all(F, t0, X0, n, h, method=None):

    hov2, hov6   = h/2.0, h/6.0
    t, X         = t0, X0
    answer, time = [], []

    answer.append(X)
    time.append(t)

    for i in range(n):
        k1 = F(t,        X            )
        k2 = F(t + hov2, X + hov2 * k1)
        k3 = F(t + hov2, X + hov2 * k2)
        k4 = F(t + h,    X + h    * k3)

        if   method == 'EulerFwd':
            X = X + h*k1        # X + h*F(t, X)

        elif method == 'RK2':
            X = X + h*k2

        elif method == 'RK4':
            X = X + hov6*(k1 + 2.*(k2+k3) + k4)

        else:
            pass

        t += h

        answer.append(X)
        time.append(t)

    return np.array(time), np.array(answer)

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

GMs = 1.327E+20 # approx

X0 = np.array([-2.094E+10,  4.303E+10,  5.412E+09,
               -5.328E+04, -2.011E+04,  3.243E+03]) # approx

methodnames = ['RK4', 'RK2', 'EulerFwd']
niterations = [10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000]

Time = 100*24*3600.  # total time

methdict = dict()

for methodname in methodnames:

    times, answers, ODEanswers, posdevs = [], [], [], []

    for n in niterations:

        h  = Time/float(n)
        t0 = 0.0

        time, answer    = RK_all(deriv, t0, X0, n, h, method=methodname)
        # recalculate using library ODE solver for same times, to compare
        ODEanswer, info = ODEint(derivv, X0, time,
                                 rtol=1E-12, full_output=True)
        posdev = np.sqrt((((answer - ODEanswer)[:,:3])**2).sum(axis=1))


        times.append(time)
        answers.append(answer)
        ODEanswers.append(ODEanswer)
        posdevs.append(posdev)

    methdict[methodname] = (times, answers, ODEanswers, posdevs)

if 1 == 1:
    plt.figure()
    for i, meth in enumerate(methodnames):
        plt.subplot(1, 3, i+1)
        for time, answer, ODEanswer, posdev in zip(*methdict[meth]):
            x, y, z = answer.T[:3]
            plt.plot(x, y)
        plt.ylim(-2.8E+11, 0.8E+11)
        plt.xlim(-1.2E+11, 0.8E+11)
        plt.title(meth, fontsize=16)
        plt.plot([0],[0], 'ok')
    plt.show()

if 1 == 1:
    plt.figure()
    for i, meth in enumerate(methodnames):
        plt.subplot(1, 3, i+1)
        for time, answer, ODEanswer, posdev in zip(*methdict[meth]):
            plt.plot(time/(24*3600.), posdev)
        plt.yscale('log')
        plt.ylim(1E-01, 1E+12)
        plt.title(meth+' vs odeint', fontsize=16)
    plt.suptitle('RKmethod - odeint (meters) vs time (days)', fontsize=18)
    plt.xticks([0, 20, 40, 60, 80, 100])
    plt.show()
@vishu Ich werde das weiter ergänzen, wenn etwas nicht klar ist, hinterlassen Sie bitte eine Nachricht. Es ist eine gute Übung für mich, das alles aufzuschreiben – manchmal kann es eine Herausforderung sein , es klar zu erklären . Alle anderen bitte Kommentare und Verbesserungsvorschläge zur Klarheit sind willkommen!
@vishu sieht das überhaupt hilfreich aus? Hinzufügen der Allgemeinen Relativitätstheorie zu f wird das Problem mit Mercury beheben und es sind eigentlich nur ein paar Zeilen mehr Code - ich werde versuchen, es am nächsten Tag oder so irgendwie hinzuzufügen. Aber damit alles funktioniert, müssen Sie entweder so etwas implementieren oder einen Standard-ODE-Solver in Java verwenden. Bitte zögern Sie nicht, Kommentare hinzuzufügen, oder bitten Sie mich, dies neu zu schreiben oder weitere hinzuzufügen, wenn es hilft.
Jetzt habe ich ziemlich gut verstanden, was Sie sagen (Python als Nebeneffekt lernen :)). Ich werde es nach dem 25. September mit RK4 versuchen, da ich meinen Laptop die nächsten 10 Tage nicht benutzen werde.
@vishu OK das ist wirklich toll! Das Ausführen von Python, wie ich es hier zeige, ist sehr, sehr langsam, Sie würden es normalerweise nicht so machen, aber es ist eine einfache Möglichkeit, "Prototypen" zu erstellen. Wenn Sie eine Integrationsbibliothek wie scipy.odeintoder 'scipy.ode' verwenden, ist es besser.
Ich habe mit dem vorherigen Schritt eine durchschnittliche Beschleunigung genommen, stattdessen wäre der nächste zukünftige Schritt Modified Euler ähnlich gewesen. Mit der kleinen Inkrementzeit (2s und 250 ms) sollte die Ungenauigkeit teilweise kompensiert werden, scheint aber für die Umlaufbahnen mit stärkerer Krümmung der Monde nicht ausreichend zu sein, was ich aus Ihren Erklärungen verstanden habe. Dank dafür. Ich werde es nach dem 25. September mit RK4 versuchen
@vishu Nehmen Sie sich Zeit; mit etwas Glück gibt es das Sonnensystem dann noch :-)
@vishu, also habe ich darüber nachgedacht und entschieden, dass meine vorhandene Antwort die von Ihnen gestellte Frage wirklich beantwortet. Ich habe erklärt, wie man "die Planeten und Monde basierend auf Newtons Gravitationskraft" berechnet. Das Hinzufügen von Begriffen der allgemeinen Relativitätstheorie und der Schwerkraft höherer Ordnung über den Monopol hinaus wird von Ihrer Frage nicht abgedeckt. Ich habe dies als neue Antwort auf eine neue Frage geschrieben und hierher zurückverlinkt. Wenn Sie damit einverstanden sind, dass diese Antwort (hier) diese Frage beantwortet, können Sie sie akzeptieren.
@vishu, aber wenn Sie Fragen zu GR oder anderen Begriffen haben, ist es meiner Meinung nach an der Zeit, dass Sie eine neue Frage stellen. Wir sollten auch etwas Hausarbeit machen und Informationen sammeln, die in all diesen Kommentaren in der Frage und Antwort enthalten sind, und dann die Kommentare bereinigen. Die Moderatoren haben uns freundlicherweise erlaubt, so zu arbeiten, aber wir sollten ein bisschen aufräumen.