Dies könnte als Anfängerfrage zum millionsten Mal preisgekrönt herauskommen, aber da ich weder mit den richtigen Begriffen noch mit den Bezeichnungen vertraut bin, stelle ich diese Frage in meiner eigenen Sprache, da ich nicht wirklich sicher bin, wonach ich suchen soll in zuvor beantworteten Fragen.
Ich baue ein Spiel, in dem ich Planetenbahnen simuliere. Diese Umlaufbahnen sind statisch und werden sich wie erwartet nicht ändern. Bisher habe ich diese Umlaufbahnen mit schrittweiser Iteration mit Gravitationsvektoren berechnet, aber der Maßstab ist über das hinausgewachsen, was in Echtzeit möglich ist.
Bekannte Variablen:
Was ich wissen möchte:
Ich habe wahrscheinlich einige ausgefallene Antworten auf diese Fragen gesehen, aber sie sind nicht sehr intuitiv für jemanden mit begrenzten Kenntnissen in Astrophysik wie mir. Danke für deine Geduld mit mir!
Das Problem, das Sie lösen wollen, heißt Kepler-Problem . In Ihrer Formulierung des Problems gehen Sie von den kartesischen Bahnzustandsvektoren (auch kartesische Elemente genannt ) aus, also der Anfangsposition und -geschwindigkeit.
Wie Sie festgestellt haben, ist die einzige Möglichkeit, die kartesischen Elemente zeitlich vorwärts zu propagieren, die numerische Integration. Dies funktioniert in Ordnung, kann jedoch langsam sein, wenn Sie eine hohe Genauigkeit wünschen, und es gibt einige numerische Probleme (durch Rundung verursachte Fehler [sammeln sich langsam und viele Integratoren verursachen eine Energiedrift ). Sie können einige dieser Probleme umgehen, indem Sie einen Integrator höherer Ordnung verwenden ( Runge-Kutta ist ein beliebter), der es Ihnen ermöglicht, größere Schritte für die gleiche Genauigkeit zu machen oder eine bessere Genauigkeit für die gleiche Schrittgröße zu erhalten. Dies ist jedoch für eine einfache Simulation etwas übertrieben.
Wenn Ihre Simulation als Zwei-Körper-Problem behandelt werden kann , vereinfachen sich die Dinge dramatisch. Das Zwei-Körper-Problem ist eine gute Vereinfachung, wenn die Simulationsobjekte hauptsächlich von einem einzigen, großen Objekt beeinflusst werden. Zum Beispiel werden die Erde, die um die Sonne wandert, oder ein Raumschiff, das sich in einer niedrigen Erdumlaufbahn bewegt, gut als Zwei-Körper-Problem modelliert; Ein Raumschiff, das von der Erde zum Mond reist, ist es jedoch nicht (dazu später mehr).
Da Sie versuchen, die Positionen der Planeten mit mittlerer Genauigkeit zu modellieren, sollte die Reduktion auf das Zwei-Körper-Problem für Sie funktionieren.
Die traditionelle Lösung des Zwei-Körper-Problems beinhaltet eine andere Art, die Position des umlaufenden Körpers darzustellen, die sogenannten Kepler-Orbitalelemente (auch nur Orbitalelemente genannt ). Anstatt Position und Geschwindigkeit anzugeben, geben sie sechs verschiedene Parameter der Umlaufbahn an (wenn Sie nur zum Code gelangen möchten, können Sie diesen Teil überspringen):
Große Halbachse, : Halber maximaler Durchmesser der Ellipsenbahn, ( = Kreisradius bei kreisförmiger Bahn). Die Energie und Periode der Umlaufbahn hängen nur davon ab . Das Semi-Latus-Rektum , die "Breite" der Umlaufbahn, kann eine bessere Wahl für Umlaufbahnen sein, die nahezu parabolisch sind (wie bei Asteroiden) oder die von elliptisch zu hyperbolisch wechseln (wie bei interplanetaren Raumfahrzeugen). Die beiden sind verwandt durch .
Exzentrizität, : Die "Spitzigkeit* der Umlaufbahn. Reicht von für eine perfekt kreisförmige Umlaufbahn, zu für eine parabolische Umlaufbahn, zu für hyperbolische Bahnen. Merkur ist der exzentrischste Planet mit . Erdumkreisende Raumfahrzeuge haben normalerweise .
Abgesehen von und wir können den am weitesten entfernten und den nächsten Punkt in der Umlaufbahn bestimmen, die Apoapsis und Periapsis (zusammen Apsiden ):
Die beiden Parameter
und
reichen aus, um die Form der Umlaufbahn zu bestimmen. Die nächsten drei Parameter definieren die Orientierung der Umlaufbahn relativ zu einem Koordinatensystem, das aus einer Referenzebene und einer Referenzrichtung (parallel zur Ebene) besteht.
Für fast alle Umlaufbahnen im Sonnensystem ist das verwendete Koordinatensystem das Ekliptik-Koordinatensystem . Die Bezugsebene ist die Ekliptikebene , die Ebene der Umlaufbahn der Erde um die Sonne. Die Bezugsrichtung ist der Frühlingsäquinoktiumspunkt , die Richtung von der Erde zur Sonne im Moment des Frühlingsäquinoktiums. Da diese beiden Referenzen im Laufe der Zeit langsam driften, müssen wir eine bestimmte Zeit angeben, zu der diese Referenzen definiert werden, die als Epoche bezeichnet wird . Die häufigste ist J2000 , Mittag am 1. Januar 2000 (UTC).
Erdzentrierte Umlaufbahnen verwenden oft das äquatoriale Koordinatensystem , dessen Bezugsebene der Äquator der Erde ist. Die Situation mit der Epoche ist etwas kompliziert, deshalb gehe ich hier nicht darauf ein.
Folgende Parameter lokalisieren die Umlaufbahn bezüglich der Erdumlaufbahn:
Neigung, : der Winkel zwischen der Bahnebene und der Bezugsebene. Eine Neigung zwischen 90 und 180 Grad bezieht sich auf eine rückläufige Umlaufbahn, die von der üblichen Richtung "rückwärts" umkreist.
Längengrad des aufsteigenden Knotens, : Der aufsteigende Knoten ist der Ort, an dem die Umlaufbahn von unterhalb der Referenzebene nach oben kreuzt. (Es ist am Schnittpunkt zwischen der Orbitalebene und der Referenzebene) ist der Winkel zwischen diesem Punkt und der Bezugsrichtung, gemessen gegen den Uhrzeigersinn.
Argument der Periapsis, : der Winkel zwischen dem aufsteigenden Knoten und der Periapsis (dem tiefsten Punkt der Umlaufbahn). Für Umlaufbahnen mit sehr geringer Neigung, bei denen die Position des aufsteigenden Knotens schwer zu bestimmen ist (da es sich um den Schnittpunkt zwischen zwei fast parallelen Ebenen handelt), verwenden wir stattdessen die Länge der Periapsis .
Der sechste Parameter definiert die Position des Objekts in seiner Umlaufbahn. Es gibt ein paar verschiedene Möglichkeiten, aber die häufigste ist:
Der Kurs, zu dem Änderungen wird die mittlere Bewegung genannt , , gleicht . Normalerweise haben Sie eine Messung von zu einer bestimmten Epoche , genannt (nicht überraschend) die mittlere Anomalie in Epoche , .
Genau wie beim Argument der Periapsis verwenden wir für Umlaufbahnen mit geringer Neigung einen verwandten Wert, den mittleren Längengrad , .
Der tatsächliche Winkel zwischen dem umlaufenden Körper und der Periapsis wird als wahre Anomalie bezeichnet. . Das ist der Winkel, den wir brauchen, um die Position des Körpers zu berechnen. Eine direkte Berechnung ist leider nicht möglich aus . Stattdessen lösen wir zuerst nach der exzentrischen Anomalie :
Dies wird als Kepler-Gleichung bezeichnet und kann nicht analytisch gelöst werden. Sobald wir haben Es gibt jedoch einen relativ einfachen Ausdruck für .
Wir führen diese Berechnung in drei Schritten durch: Zuerst lösen wir die Kepler-Gleichung. Zweitens berechnen wir die 2. Position des Körpers in der Orbitalebene. Zuletzt drehen wir unsere 2D-Position in 3D-Koordinaten. Ich werde für die meisten dieser Aufgaben etwas "Pseudocode" in Javascript geben.
Ich gehe davon aus, dass Sie eine Reihe von Elementen wie diese von der JPL-Website verwenden . Diese verwenden und Anstatt von und . Die Tabelle gibt zwei Werte für jedes der Elemente an; die zweite ist die zeitliche Ableitung. Wenn Sie die Werte in dieser Tabelle verwenden, sollten Sie auch die Derivate verwenden.
Berechne die Zeit in Jahrhunderten ab J2000:
// month is zero-indexed, so 0 is January
var tMillisFromJ2000 = Date.now() - Date.UTC(2000, 0, 1, 12, 0, 0);
var tCenturiesFromJ2000 = tMillisFromJ2000 / (1000*60*60*24*365.25*100);
Jetzt berechnen wir die aktuellen Werte jedes Orbitalparameters. Zum Beispiel die große Halbachse der Erde mit den Werten aus Tabelle 1 (gültig von 1800–2500):
// a0 = 1.00000261; adot = 0.00000562
var a = a0 + adot * tCenturiesFromJ2000;
(Beachten Sie, dass die Werte tatsächlich für "EM Barycenter " angegeben sind, den Schwerpunkt des Erde-Mond-Systems. Die Erde befindet sich etwa 4600 Kilometer vom Barycenter entfernt in der entgegengesetzten Richtung zum Mond. Wenn Sie dies korrigieren möchten Ungenauigkeit müssen Sie auch die Bewegung des Mondes simulieren, aber das ist wahrscheinlich übertrieben.)
Tabelle 2a enthält Elemente, die von 3000 v. Chr. bis 3000 n. Chr. Genau sind; wenn Sie jedoch die Elemente aus Tabelle 2a verwenden, müssen Sie diese um Korrekturen ergänzen aus Tabelle 2b! Hier wird zum Beispiel der Längengrad von Saturn berechnet:
// L0 = 34.33479152; Ldot = 3034.90371757
// b = -0.00012452
// c = 0.06064060
// s = -0.35635438
// f = 38.35125000
var L = L0 + Ldot * tCenturiesFromJ2000
+ b * Math.pow(tCenturiesFromJ2000, 2)
+ c * Math.cos(f * tCenturiesFromJ2000)
+ s * Math.sin(f * tCenturiesFromJ2000);
Wir müssen die mittlere Bewegung nicht explizit berechnen und hinzufügen , da es in beiden Tabellen enthalten ist .
Jetzt sind wir bereit zu berechnen
und
( w
):
var M = L - p \\ p is the longitude of periapsis
var w = p - W \\ W is the longitude of the ascending node
Weiter zu Schritt 2: Wir müssen die Kepler-Gleichung lösen:
Wir können dies numerisch mit dem Newton-Verfahren lösen . Das Lösen der Kepler-Gleichung entspricht dem Finden der Wurzeln von . Gegeben , eine Schätzung von , können wir die Newton-Methode verwenden, um eine bessere Schätzung zu finden:
Da der nichtlineare Teil sehr klein ist, können wir mit der Schätzung beginnen . Unser Code sieht in etwa so aus:
E = M;
while(true) {
var dE = (E - e * Math.sin(E) - M)/(1 - e * Math.cos(E));
E -= dE;
if( Math.abs(dE) < 1e-6 ) break;
}
Nun gibt es zwei Möglichkeiten, die Position aus der exzentrischen Anomalie zu berechnen. Wir können zuerst die wahre Anomalie und den Radius (die Position des Objekts in Polarkoordinaten) berechnen und dann in rechtwinklige Koordinaten umwandeln; Wenn wir jedoch ein wenig Geometrie anwenden, können wir stattdessen die Koordinaten direkt daraus berechnen :
var P = a * (Math.cos(E) - e);
var Q = a * Math.sin(E) * Math.sqrt(1 - Math.pow(e, 2));
( P
und Q
bilden ein 2D-Koordinatensystem in der Ebene der Umlaufbahn, +P
das in Richtung Periapsis zeigt.)
Schließlich können wir diese Koordinaten in das vollständige 3D-Koordinatensystem drehen:
// rotate by argument of periapsis
var x = Math.cos(w) * P - Math.sin(w) * Q;
var y = Math.sin(w) * P + Math.cos(w) * Q;
// rotate by inclination
var z = Math.sin(i) * y;
y = Math.cos(i) * y;
// rotate by longitude of ascending node
var xtemp = x;
x = Math.cos(W) * xtemp - Math.sin(W) * y;
y = Math.sin(W) * xtemp + Math.cos(W) * y;
( x
, y
, und z
werden in Einheiten von AE angegeben.)
Und du bist fertig!
Einige Tipps:
Wenn Sie auch die Geschwindigkeit berechnen möchten, können Sie dies gleichzeitig mit der Berechnung tun und , dann drehen Sie es auf die gleiche Weise.
var vP = - a * Math.sin(E) * Ldot / (1 - e * Math.cos(E));
var vQ = a * Math.cos(E) * Math.sqrt(1 - e*e) * Ldot / (1 - e * Math.cos(E));
Beachten Sie, dass die Geschwindigkeiten in AE pro Jahrhundert angegeben werden.
Wenn Sie die Positionen sehr häufig aktualisieren, können Sie den vorherigen Wert von verwenden um Newtons Methode zu impfen und eine feste Anzahl von Iterationen durchzuführen (wahrscheinlich würde nur eine ausreichen). Beachten Sie jedoch, dass Sie diesen Wert beibehalten müssen lokal für jedes Objekt!
Sie können auch einfach eine feste Anzahl von Iterationen für die anfängliche Lösung verwenden. Sogar für , nach drei Iterationen der Fehler in geht es nur um , und nach vier Iterationen ist der Fehler kleiner als der Rundungsfehler einer IEEE-Verdopplung .
Wenn Sie weitere Informationen wünschen, können Sie online suchen, aber wenn Sie wirklich interessiert sind, sollten Sie einen Einführungstext zur Orbitalmechanik lesen. Ich persönlich empfehle Fundamentals of Astrodynamics von Bate, Mueller und White (pdf) . Mein Vater benutzte dieses Buch, als er auf dem College war, und ich fand es besser lesbar als mein College-Lehrbuch. Sie interessieren sich für Kapitel 4, Position und Geschwindigkeit als Funktion der Zeit.
Da es nur ein Spiel ist, wären Sie mit kreisförmigen Umlaufbahnen und den Umlaufbahnen der Planeten zufrieden, die nur vom Zentralkörper beeinflusst werden? In diesem Fall ist die Vermehrung recht einfach. In der Bahnebene mit dem Zentralkörper bei (0,0) ist die Position als Funktion der Zeit:
wo ist die große Halbachse oder in diesem Fall wirklich nur der Umlaufbahnradius, ist die Umlaufzeit, und bestimmt die Phasenlage der Umlaufbahn, wo an , der Planet ist auf der x-Achse auf der positiven Seite.
Um die Umlaufbahnen der verschiedenen Planeten miteinander in Einklang zu bringen, müssen Sie nur die definieren des zentralen Organs, das wir anrufen werden . Dann für jeden Bahnradius , auf die die Umlaufzeit bezogen ist durch:
Während es bereits seit Jahren eine qualitativ hochwertige akzeptierte Antwort gibt, finden Sie hier einige zusätzliche Hintergrundinformationen, einige besonders hilfreiche Ressourcen und zusätzliche Tipps für die erstmalige Ausbreitung der Umlaufbahn.
Wenn Sie keine N-Körper-Physik betreiben, also die Planeten nicht interagieren, können Sie analytische Lösungen für das Kepler-Problem verwenden. Irgendwann werden Sie feststellen, dass Sie irgendwann auch hyperbolische Bahnen lösen müssen. Das führt Sie zu universellen Variablenformulierungen zur Lösung des Kepler-Problems.
Die besten Lösungen dafür werden wahrscheinlich die Methode von Goodyear sein:
W. Goodyear, „Vollständig allgemeine Lösung in geschlossener Form für Koordinaten und partielle Ableitungen des Zweikörperproblems“, The Astronomical Journal, Vol. 3, No. 70, Nr. 3, 1965, S. 189–192 (oder das NASA NTRS TD-Dokument zum gleichen Material )
Shepherds Methode:
Shepperd, SW Celestial Mechanics (1985) 35: 129. https://doi.org/10.1007/BF01227666
Oder Danby-Stumpff:
Danby, JMA Celestial Mechanics (1987) 40: 303. https://doi.org/10.1007/BF01235847
Es gibt hier einigen MATLAB-Code, der nützlich (und weitaus zugänglicher) sein könnte, obwohl zufällige Code-Schnipsel auf matlabcentral bei weitem nicht garantiert fehlerfrei sind und es so aussieht, als ob diesem Code eine nützliche Normalisierung seiner Eingaben fehlt (im Allgemeinen gehen Sie auf die Skala Ihres Problems normalisieren wollen, so dass Sie in Einheiten rechnen, in denen r0-bar = 1,0 und mu-bar = 1,0 und wobei v-bar = 1 die Geschwindigkeit in einer kreisförmigen Umlaufbahn bei r0 oder so ähnlich ist) .
Wenn Sie eine N-Körper-Integration der Planetenbewegung durchführen, müssen Sie meiner Meinung nach die numerische Integration verwenden. Runge-Kutta verstößt gegen die Energieerhaltung, sodass Sie wahrscheinlich Symplektische Integration verwenden möchten . Der symplektische Integrator 4. Ordnung in diesem Artikel ist nicht so schwer zu codieren - obwohl Sie dadurch die Schwierigkeit haben, den richtigen Zeitschritt zu erraten (wiederum hilft die Normalisierung, da eine kreisförmige Planetenbahn und ein kreisförmiger LEO dasselbe Problem sind, nur mit unterschiedlichen Entfernungsskalen ) und mit Interpolation der inneren Punkte (und Sie müssen auf das Runge-Phänomen achten , aber damit habe ich nicht gerungen, also weiß ich nicht, welchen Ansatz ich da nehmen soll).
Wenn Sie Runge-Kutta verwenden, dann ist Dormand-Prince mit dynamischer Schrittseite und seinem Interpolanten 3. Ordnung sehr praktisch und wird von Matlab in seinem ode45-Solver verwendet.
Ich würde wahrscheinlich raten, mit der einfachsten Runge-Kutta-Implementierung zu beginnen, basierend auf der einfachen Codierung, aber wenn Sie Runge-Kutta bei jedem Physik-Tick machen, um einen Schritt vorwärts zu kommen, dann ist das ziemlich brutal und die Fehler summieren sich schließlich. aber man könnte es so prototypisieren. Irgendwann möchten Sie zu einem System gehen, in dem Sie das Problem für viele Zeitschritte in die Zukunft lösen, und dann verwenden Sie eine Interpolationsfunktion, um die Lösung in dazwischenliegenden Zeitschritten abzugreifen (was der Punkt ist, an dem ich Dormand erwähne). Prince und seine interpolierende Funktion).
Benutzer2822
Innovativ