Modélisation de l'orbite elliptique

8

Je joue avec des orbites dans un simple jeu en 2-D où un navire vole dans l'espace et est attiré par des choses massives. La vitesse du navire est stockée dans un vecteur et une accélération lui est appliquée à chaque image, selon la loi de Newton de la gravitation universelle. Les masses ponctuelles ne bougent pas (il n'y en a qu'une en ce moment), je m'attends donc à une orbite elliptique.

Au lieu de cela, je vois ceci:

Voilà ce que je vois

J'ai essayé avec des orbites presque circulaires, et j'ai essayé de rendre les masses très différentes (un facteur d'un million) mais j'ai toujours cette orbite tournante.

Voici un code (D), pour le contexte:

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
la source
courtiser. oui. D. Test unitaire de ce code mathématique par rapport aux résultats connus; et tout ira bien.
deceleratedcaviar

Réponses:

7

Le bug est dans la fallfonction. On a

  1. delta: un vecteur du puits au navire
  2. force: l'ampleur de la gravité entre ces deux corps.

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

mais |delta|c'est déjà r! vous accélérez donc trop vite. Vous devez diviser à rnouveau (normaliser fondamentalement le vecteur delta) avant d'appeler accelerate.

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

Notez que même avec le (s) bogue (s) mathématique (s) corrigé (s), vous utilisez l' intégration d'Euler (c'est-à velocity += delta- dire et probablement position += velocity), donc vous allez probablement obtenir des effets étranges comme la rotation de l'ellipse orbitale au fil du temps, et peut-être que l'ellipse s'agrandit / plus petit car l'intégration d'Euler n'est pas garantie pour économiser l'énergie.

Vous voudrez peut-être passer à l' intégration de saute-mouton , qui économise l'énergie et devrait mieux fonctionner pour la mécanique orbitale. En outre, vous devez inclure le temps de trame dans vos équations afin que la vitesse de votre simulation soit indépendante de la fréquence d'images.

Nathan Reed
la source