Modellazione ellittica dell'orbita


8

Sto giocando con le orbite in un semplice gioco 2D in cui una nave vola nello spazio ed è attratta da cose enormi. La velocità della nave è immagazzinata in un vettore e l'accelerazione viene applicata su di essa in ogni fotogramma secondo la legge di gravitazione universale di Newton. Le masse punti non si muovono (al momento ce n'è solo 1) quindi mi aspetto un'orbita ellittica.

Invece, vedo questo:

Questo è quello che vedo

Ho provato con orbite quasi circolari e ho provato a rendere le masse molto diverse (un fattore di un milione) ma ottengo sempre questa orbita ruotata.

Ecco un po 'di codice (D), per il contesto:

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);
}

corteggiare. yeaaaah. D. Unit test quel codice matematico rispetto a risultati noti; e tutto andrà bene.
deceleratedcaviar

Risposte:


7

Il bug è nella fallfunzione. abbiamo

  1. delta: un vettore dal pozzo alla nave
  2. force: l'entità della gravità tra questi due corpi.

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

ma |delta|è già r! quindi stai accelerando troppo velocemente. È necessario dividere rnuovamente (sostanzialmente normalizzando il vettore delta) prima di chiamare accelerare.

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

4

Nota che anche con i bug matematici corretti, stai usando l' integrazione di Eulero (cioè velocity += deltae presumibilmente position += velocity), quindi probabilmente otterrai alcuni effetti strani come la rotazione dell'ellisse orbitale nel tempo, e forse l'ellisse sta diventando più grande / minore poiché l'integrazione di Euler non garantisce il risparmio energetico.

Potresti voler passare all'integrazione leapfrog , che è a risparmio energetico e dovrebbe funzionare meglio per la meccanica orbitale. Inoltre, dovresti includere il tempo dei fotogrammi nelle equazioni in modo che la velocità della tua simulazione sia indipendente dal framerate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.