Estou criando um simulador simples de astronomia que deve usar a física newtoniana para simular o movimento de planetas em um sistema (ou qualquer objeto, por sinal). Todos os corpos são círculos em um plano euclidiano, que possuem propriedades como posição, velocidade, massa, raio e a força resultante.
Quero atualizar o universo em pequenos intervalos de tempo, geralmente alguns milissegundos, mas não sei como calcular corretamente as alterações de posição.
A força é simples: fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2)
.
Mas como eu continuo a partir daí?
Eu poderia fazer isso:
a = Fr/body.m
v += a*dt
position += v*dt
Mas isso seria, obviamente, falso. Talvez se eu adicionasse 0,5 como um fator no cálculo da posição?
time-integration
jcora
fonte
fonte
Respostas:
Você basicamente tem a resposta - não é necessário o fator 0,5.
Essencialmente, você possui um sistema bidimensional de EDOs de primeira ordem: onde tudo é função do tempo, exceto presumivelmentem, e pontos indicam derivadas do tempo. Se você fizer uma diferenciação simples de primeira ordem no estilo Euler avançado, encontrará x n + 1 -xn
O único problema é como obterv1 / 2 , já que provavelmente você começa com v0 0 . Lá, você deve usar um esquema tão preciso quanto você está escrevendo, sendo o Runge-Kutta de quarta ordem uma escolha popular. Pode ser instável a longo prazo, mas há tantos erros que você introduzirá em meio intervalo de tempo, e esse erro será mantido pequeno posteriormente pelo esquema de salto.
Finalmente, essa resposta se aplica a qualquer sim geral de gravidade newtoniana. Se você realmente deseja círculos perfeitos , como mencionado na passagem da pergunta, não os conseguirá, exceto em um sistema idealizado no qual os planetas não interagem entre si e as condições iniciais são escolhidas da maneira certa. Se for esse o caso, você não precisa se integrar, pois a velocidade angular (radianos por unidade de tempo) de um objeto é simplesmente
fonte
0.5
fator? Parece estar fazendo a mesma coisa que tomar a velocidaden-1/2dt
segundos atrás, o que parece estar sugerindo.