Modelado de órbita elíptica


8

Estoy jugando con las órbitas en un simple juego 2-d donde un barco vuela por el espacio y se siente atraído por cosas masivas. La velocidad de la nave se almacena en un vector y la aceleración se aplica a cada cuadro según corresponda, dada la ley de gravitación universal de Newton. Las masas de puntos no se mueven (solo hay 1 en este momento), por lo que esperaría una órbita elíptica.

En cambio, veo esto:

Esto es lo que veo

He intentado con órbitas casi circulares, y he intentado hacer que las masas sean muy diferentes (un factor de un millón) pero siempre obtengo esta órbita rotada.

Aquí hay un código (D), para el contexto:

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

cortejar. siaaah D. Unidad de prueba de ese código matemático contra resultados conocidos; y todo estará bien
desaceleratedcaviar

Respuestas:


7

El error está en la fallfunción. Tenemos

  1. delta: un vector desde el pozo hasta el barco
  2. force: la magnitud de la gravedad entre estos dos cuerpos.

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

pero |delta|ya es r! así que en realidad estás acelerando demasiado rápido. Debe dividir rnuevamente (básicamente normalizando el vector delta) antes de llamar a acelerar.

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

4

Tenga en cuenta que incluso con los errores matemáticos corregidos, está utilizando la integración de Euler (es decir, velocity += deltay presumiblemente position += velocity), por lo que probablemente obtendrá algunos efectos extraños como la rotación de la elipse orbital con el tiempo, y tal vez la elipse se agrande / menor ya que no se garantiza que la integración de Euler conserve energía.

Es posible que desee cambiar a la integración de salto de rana , que ahorra energía y debería funcionar mejor para la mecánica orbital. Además, debe incluir el tiempo de cuadro en sus ecuaciones para que la velocidad de su simulación sea independiente de la tasa de cuadros.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.