Elliptische Umlaufbahnmodellierung

8

Ich spiele mit Umlaufbahnen in einem einfachen 2-D-Spiel, in dem ein Schiff im Weltraum herumfliegt und sich von massiven Dingen angezogen fühlt. Die Schiffsgeschwindigkeit wird in einem Vektor gespeichert, und die Beschleunigung wird in jedem Frame entsprechend dem Newtonschen Gesetz der universellen Gravitation auf ihn angewendet. Die Punktmassen bewegen sich nicht (es gibt momentan nur eine), daher würde ich eine elliptische Umlaufbahn erwarten.

Stattdessen sehe ich Folgendes:

Das sehe ich

Ich habe es mit fast kreisförmigen Umlaufbahnen versucht, und ich habe versucht, die Massen stark zu verändern (ein Faktor von einer Million), aber ich bekomme immer diese gedrehte Umlaufbahn.

Hier ist ein (D) Code für den Kontext:

void accelerate(Vector delta)
{
    velocity = velocity + delta; // Velocity is a member of the ship class.
}

// This function is called every frame with the fixed mass. It's a
// method of the ship's.
void fall(Well well)
{
    // f=(m1 * m2)/(r**2)
    // a=f/m
    // Ship mass is 1, so a = f.
    float mass = 1;
    Vector delta = well.position - loc;
    float rSquared = delta.magSquared;
    float force = well.mass/rSquared;
    accelerate(delta * force * mass);
}
Nathon
quelle
umwerben. yeaaaah. D. Unit-Test dieses mathematischen Codes gegen bekannte Ergebnisse; und alles wird gut.
Verlangsamte

Antworten:

7

Der Fehler liegt in der fallFunktion. Wir haben

  1. delta: ein Vektor vom Brunnen zum Schiff
  2. force: die Größe der Schwerkraft zwischen diesen beiden Körpern.

|force| ist G * m1 * m2 / r ^ 2

ist aber |delta|schon r! Sie beschleunigen also tatsächlich zu schnell. Sie müssen rerneut dividieren (im Grunde den Delta-Vektor normalisieren), bevor Sie beschleunigen aufrufen.

accelerate(delta * well.mass * mass / rSquared / Math.sqrt(rSquared))
Jimmy
quelle
4

Beachten Sie, dass Sie selbst mit den behobenen mathematischen Fehlern die Euler-Integration verwenden (dh velocity += deltaund vermutlich position += velocity), sodass Sie wahrscheinlich einige seltsame Effekte wie die Drehung der Orbitalellipse im Laufe der Zeit und möglicherweise die Vergrößerung der Ellipse erzielen / kleiner, da die Euler-Integration nicht garantiert Energie spart.

Möglicherweise möchten Sie zur Sprungintegration wechseln , die energiesparend ist und für die Orbitalmechanik besser funktionieren sollte. Außerdem sollten Sie die Frame-Zeit in Ihre Gleichungen aufnehmen, damit die Geschwindigkeit Ihrer Simulation unabhängig von der Framerate ist.

Nathan Reed
quelle