A simulação da órbita terrestre tem velocidade incorreta

8

Eu sou muito novo em programação e recebi um trabalho escolar para o qual tenho que criar uma simulação da órbita da Terra em torno do sol no p5.js. Nos ofereceram uma maneira simplificada de calcular a força gravitacional, mas eu queria usar a fórmula real (Fg = G M m / r ^ 2). No meu código, um pixel é igual a 10 ^ 9 metros ou um milhão de km. Se eu usar as massas reais do sol e da terra, bem como a distância real entre elas, tenho que colocar a velocidade na qual a Terra viaja a cerca de 1 pixel por segundo ou um milhão de km / s, que é de cerca de 30.000 vezes a velocidade real da Terra em órbita. Meu 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>

Você sabe qual poderia ser a causa? Desde já, obrigado.

Gijsfwb
fonte
2
Ainda não compreendi completamente o código, mas parece que você está misturando dois modelos de cálculo da posição da Terra. O modelo de Kepler assume que a órbita é uma elipse e calcula a posição dos parâmetros orbitais, enquanto o modelo de Newton lida apenas com forças e a órbita elíptica é o resultado disso. Em particular, você calcula a força gravítica entre dois corpos, mas depois "redireciona" a força ao longo da elipse. Você pode mudar para o modelo de Newton sozinho, mas isso trará alguns problemas por conta própria. Cuidado ao encontrar problemas de precisão com números grandes / pequenos.
Etienne Ott
Etienne Ott, eu realmente não entendo o que você quer dizer com isso. Até onde eu sei, a força gravitacional pode ser dividida em um componente xey, com base no ângulo que ela tem para o centro de massa. Não tenho certeza se é isso que você quis dizer, como não tenho certeza de qual é a diferença entre o modelo Kepler e o modelo de Newton, então você poderia ser um pouco mais descritivo?
Gijsfwb 4/03
Parece que eu não entendi o seu código. Ao trabalhar com forças, geralmente não me preocupo com ângulos para dividir as forças em seus componentes. É mais fácil calcular o vetor unitário (de comprimento 1) ao longo da direção da força e depois multiplicar com o escalar que determina a força da força. De qualquer forma, o código parece fazer a coisa certa, então vamos ignorar isso. O que eu quero saber agora é as unidades das variáveis. Por exemplo, seu timestep é 1, mas o movimento parece mais rápido do que avançar a simulação em 1 segundo por chamada. Presumivelmente 1 não significa 1 segundo.
Etienne Ott
A próxima coisa que eu gostaria é escrever as unidades e levá-las através dos vários cálculos, para ver quais são as unidades reais da velocidade, digamos. Outra coisa é que o timestep é fixo, mas não está claro com que freqüência um timestep é chamado por segundo em tempo real, também não está claro quanto tempo (ou seja, quantas chamadas) a simulação deve levar para concluir um ano no período de tempo desejado. Você poderia fazer a simulação em tempo real, mas não acho que ver uma revolução por ano seja muito interessante. ;)
Etienne Ott
dt está em segundos por quadro e tenho certeza de que está correto, pois todas as unidades nos meus cálculos usam segundos. Vou tentar ver o que a velocidade faz e quando, mas para mim parece que ela mantém mais ou menos a mesma velocidade em toda a órbita
Gijsfwb

Respostas:

4

Você parece ter aceleração em metros por segundo 2 e velocidade em pixels por segundo. Então você os combina:

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

Suas acelerações gravitacionais são bilhões de vezes mais fortes. Portanto, seu planeta deve se mover 31.623 vezes mais rápido que o normal para manter uma órbita circular.

Beta
fonte
Isso funcionou! Muito obrigado!
Gijsfwb 9/03