La simulación de la órbita terrestre tiene una velocidad incorrecta

8

Soy muy nuevo en programación y obtuve una tarea escolar para la que tengo que crear una simulación de la órbita de la Tierra alrededor del Sol en p5.js. Se nos ofreció una forma simplificada de calcular la atracción gravitacional, pero quería usar la fórmula real (Fg = G M m / r ^ 2). En mi código, un píxel equivale a 10 ^ 9 metros o un millón de km. Si uso las masas reales tanto del sol como de la tierra, así como la distancia real entre ellas, tengo que poner la velocidad a la que viaja la tierra en alrededor de 1 píxel por segundo o un millón de km / s, que es alrededor 30,000 veces la velocidad real de la tierra en órbita. Mi código:

x = 550;
y = 400;
vy = -1;
vx = 0;
dt = 1;
sunSize = 80;
planetSize = 10;
// 1 pixel equals 1 million km
canvasSize = 800;
starAmount = 600;

function setup() {
  frameRate(60);
  noStroke()
  solarXY = 0.5 * canvasSize;
  xSun = solarXY;
  ySun = solarXY;
  createCanvas(canvasSize, canvasSize);
  M = 1.989 * pow(10, 30);
  m = 5.972 * pow(10, 24);
  background(0);
  for (i = 0; i < starAmount; i++) {
    starX = Math.random() * canvasSize;
    starY = Math.random() * canvasSize;
    starSize = Math.random() * 3 + 1
    ellipse(starX, starY, starSize, starSize);
  }
  fill(255, 192, 0);
  ellipse(xSun, ySun, sunSize, sunSize);
}

function draw() {
  r = sqrt(sq(xSun - x) + sq(ySun - y)) * pow(10, 9);
  Fg = 6.67 * pow(10, -11) * m * M / sq(r);
  if (x >= xSun) {
    angle = atan((ySun - y) / (x - xSun));
  } else {
    angle = PI + atan((ySun - y) / (x - xSun));
  }
  xOld = x;
  yOld = y;
  Fgx = cos(angle) * Fg
  Fgy = sin(angle) * Fg
  ay = Fgy / m;
  ax = -Fgx / m;
  vy += ay * dt;
  vx += ax * dt;
  y += vy * dt;
  x += vx * dt;
  fill(30);
  ellipse(xOld, yOld, planetSize, planetSize);
  fill(0, 0, 192);
  ellipse(x, y, planetSize, planetSize);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>

¿Sabes cuál podría ser la causa? Gracias por adelantado.

Gijsfwb
fuente
2
Todavía no he entendido completamente el código, pero parece que estás mezclando dos modelos de cálculo de la posición de la tierra. El modelo de Kepler supone que la órbita es una elipse y calcula la posición a partir de los parámetros orbitales, mientras que el modelo de Newton trata solo de fuerzas y la órbita elíptica es el resultado de eso. En particular, calcula la fuerza gravitacional entre dos cuerpos pero luego "redirige" la fuerza a lo largo de la elipse. Puede cambiar solo al modelo de Newton, pero eso traerá algunos problemas por sí solo. Tenga cuidado con los problemas de precisión con números grandes / pequeños.
Etienne Ott
Etienne Ott, realmente no entiendo lo que quieres decir con esto. Hasta donde yo sé, la fuerza gravitacional se puede dividir en un componente xey basado en el ángulo que tiene con el centro de masa. No estoy seguro de si esto es lo que quisiste decir, ya que no estoy seguro de cuál es la diferencia entre el modelo Kepler y el modelo Newton, entonces, ¿podrías ser un poco más descriptivo?
Gijsfwb
Parece que he entendido mal su código. Cuando trabajo con fuerzas, generalmente no me molesto con los ángulos para dividir las fuerzas en sus componentes. Es más fácil calcular el vector unitario (de longitud 1) a lo largo de la dirección de la fuerza, luego multiplicar con el escalar que determina la fuerza de la fuerza. De todos modos, el código parece hacer lo correcto allí, así que ignoremos eso. Lo que me pregunto ahora son las unidades de las variables. Por ejemplo, su paso de tiempo es 1, pero el movimiento parece más rápido que avanzar la simulación en 1 segundo por llamada. Presumiblemente 1 no significa 1 segundo.
Etienne Ott
Lo siguiente que quiero hacer es escribir las unidades y llevarlas a través de los diversos cálculos, así que vea cuáles son las unidades reales de, digamos, la velocidad. Otra cosa es que el paso de tiempo es fijo, pero no está claro con qué frecuencia se llama un paso de tiempo por segundo en tiempo real, por lo que tampoco está claro cuánto tiempo (es decir, cuántas llamadas) debería tomar la simulación para completar un año en el marco de tiempo deseado. Podrías hacer la simulación en tiempo real, pero no creo que ver una revolución por año sea muy interesante. ;)
Etienne Ott
dt está en segundos por cuadro, y estoy bastante seguro de que es correcto, ya que todas las unidades en mis cálculos usan segundos. Trataré de ver qué hace la velocidad y cuándo, pero para mí parece que mantiene más o menos la misma velocidad en toda la órbita
Gijsfwb

Respuestas:

4

Parece que tienes aceleración en metros por segundo 2 y velocidad en píxeles por segundo. Luego los combinas:

vy += ay * dt;
vx += ax * dt;

Sus aceleraciones gravitacionales son mil millones de veces demasiado fuertes. Por lo tanto, su planeta debe moverse aproximadamente 31,623 veces más rápido de lo normal para mantener una órbita circular.

Beta
fuente
Esto funcionó! ¡Muchas gracias!
Gijsfwb