Ich habe eine Simulation in C++ mit dem Newtonschen Gesetz gemacht und sie getestet, indem ich die Planetenpositionen mit der Position aus dem Sonnensystemrechner Don Cross (den ich von JavaScript in C++ konvertiert habe) http://cosinekitty.com/solar_system.html
vergleicht
Was ich mache, ist jeder Zeitschritt (normalerweise 1 Sekunde, aber Schritt 0,2 Sekunden ist dem 10-Sekunden-Schritt sehr ähnlich):
Wie Sie sehen, haben einige Planeten kleine Abweichungen und einige größere, also ist meine Frage: Kann Newtons genau sein? oder Don Cross Sonnensystem-Rechner nicht? Oder gibt es in dieser Region schwarze Materie? Oder was sonst?
void CGravitator::CalcAceleration(double timeseconds){
unsigned int i,j,iend;
if (sunStatic)iend=m_np-1;
else iend=m_np;
for (i = 0; i < iend; i++) {
m_planetas[i].aceleration.set(0,0,0);
CVector3 totalGravitationalForce;
// Loop through all bodies in the universe to calculate their gravitational pull on the object (TODO: Ignore very far away objects for better performance)
for (j = 0; j < m_np; j++) {
if (i == j) continue; // No need to calculate the gravitational pull of a body on itself as it will always be 0.
double distancia =CVector3::Distancia(m_planetas[i].pos,m_planetas[j].pos);
double force = KGNEWTON * m_planetas[i].masa * m_planetas[j].masa / pow(distancia, 2);
CVector3 forceDirection = CVector3::Normalize(m_planetas[j].pos - m_planetas[i].pos);
totalGravitationalForce += forceDirection * force;
}
CVector3 incspeed = totalGravitationalForce / m_planetas[i].masa ;
m_planetas[i].aceleration += incspeed * timeseconds;
}
Sie müssen eine bessere numerische Methode verwenden. Eulers Methode ist notorisch schlecht für die Orbitalmechanik, da sich die numerischen Fehler immer kumulieren. Insbesondere spart Eulers Methode keine Energie, sodass Sie Umlaufbahnen erhalten, die auf magische Weise Energie gewinnen und außer Kontrolle geraten.
Sie müssen so etwas wie die Verlet-Methode oder einen anderen symplektischen Integrator verwenden.
Neben den in der anderen Antwort aufgezeigten Mängeln in der numerischen Methode müssen bei der Simulation der Merkurbahn die Gravitation des Jupiter sowie relativistische Effekte berücksichtigt werden. Dies erklärt nur einen winzigen Bruchteil der Abweichung, sollte aber berücksichtigt werden, wenn die numerische Methode besser wird.
Anscheinend beträgt die Perihelpräzession von Merkur aufgrund von Jupiters Anziehungskraft und relativistischen Effekten etwa 574 Bogensekunden in einem Jahrhundert oder 1,57E-2 Bogensekunden/Tag. Bei einem Umlaufumfang von etwa 3,6E8 km und einer Bogensekunde von 1,296E-6 Umdrehungen sind das etwa 4,3 km oder 43 km in 10 Tagen.
Während der Unterschied in der Position des Perihels nicht direkt in einen Ortsunterschied übersetzt wird, sollte er eine Vorstellung von dem Effekt vermitteln.
Der Fehler kam von den Datenquellen. Jetzt habe ich zu NAIF cspice.lib gewechselt und eine allgemeine SPK-Datei nur für die Planeten heruntergeladen, und der Fehler ist ohne andere Schwerkraftkörper wie Asteoriden und Kometen wirklich gering. Es ist wirklich einfach, nur 2 Funktionen (furnsh_c und spkezr_c), ein Include und eine Lib zu verwenden.
Codiert mit vc6 ++ pure win 32. Ich habe makeall.bat von Spice entpackt ausgeführt (konnte es nicht in MFC zum Laufen bringen).
Außerdem kann der Zeitschritt ein beliebiger Sekundenbruchteil sein, sodass Spice und Newton synchronisiert sind. Also sagte mir Newton, dass es keine schwarze Materie gibt.
Hier sind die Ergebnisse ohne Asteroiden- und Kometengravitation für 10 Tage und ohne Korrekturen in cpsice spkezr_c
Entfernungsfehler in KM Newton (Verlet) von der Gewürzzeit
= 864000,250
MERCURY BARYCENTER = 5,511496277969209e+002
SATURN BARYCENTER = 8.535731413118873e+001
VENUS BARYCENTER = 2.701394194074592e+002
URANUS BARYCENTER = 8.651056255887706e+001
EARTH = 9.664941717935676e+001
NEPTUNE BARYCENTER = 8.654038466254323e+001
MOON = 1.208560265740111e+002
MARS BARYCENTER = 5.954829440293592e+001
PLUTO BARYCENTER = 8.661640570487361e+001
JUPITER BARYCENTER = 8.256645190275238e+001
TOTAL ERROR DISTANCE = 1.525933904320919e+003
Time Ini GREGORIAN = 2000 JAN 01 12:00:00.000
Time End GREGORIAN = 20.01.05 02:00
PM 2Ring
PM 2Ring
jkej
Nick T
Luis Alberto
Luis Alberto
Arthur
Ilmari Karonen
m_planetas[i].masa
. Heben Sie diese auf. (Und ändern Sie "Kraft" in Ihren Variablennamen in "Beschleunigung".) #2 Sie ziehen zuerst (vermutlich) eine Quadratwurzel nach innenCVector3::Distancia
und quadrieren dann den Abstand. Stornieren Sie diese auch. Und Nr. 3 ja, vermeide die Euler-Integration. Und Nr. 4, bitte fügen Sie Ihren tatsächlichen Geschwindigkeits- und Positionsaktualisierungscode in Ihre Frage ein – es könnte Fehler oder numerische Ungenauigkeiten geben, die Ihre Ergebnisse beeinflussen.David Weiß
Mattschwarz
RBarryYoung
PM 2Ring
PM 2Ring
David Hammen
Ilmari Karonen
m_planetas[i].aceleration
, da sie den Rest nicht gepostet haben, aber der Wert, den sie in diesem Vektor speichern, ist keine Beschleunigung. (incspeed
ist eine Beschleunigung, zumindest unter der Annahme, dass estotalGravitationalForce
sich tatsächlich um eine Kraft handelt, die dann aber mit einem Zeitintervall multipliziert wird.)QMechaniker
Luis Alberto
Luis Alberto