A Gafferon Games tem um ótimo artigo sobre integração RK4 para criar simulações de física, que pode ser encontrado aqui: Noções básicas sobre integração
Pessoalmente, meus conhecimentos de matemática e física poderiam melhorar. Sinto-me à vontade no campo da matemática vetorial, trigonométricas, algumas estatísticas (eu tive que usar fórmulas de regressão linear de linha para software etc.) e basicamente a maioria das coisas no ensino médio até a faculdade do primeiro ano.
Agora, para a pergunta, li este artigo, baixei a fonte associada e depurei linha por linha para tentar entender o que está acontecendo e ainda sinto que claramente não estou entendendo o que estou vendo. Eu pesquisei na internet tentando encontrar as versões "For Dummies", francamente eu aprendo um pouco diferente e olhando as fórmulas o dia todo com ênfase na memorização não é suficiente, pois preciso entender o que está acontecendo, então pode ser flexível aplicando-o.
Então, aqui está o que acho que entendi até agora, mas espero que outra pessoa possa me esclarecer ou me corrigir completamente. O RK4 usa uma etapa de Euler, depois baseia isso para avançar no tempo para calcular várias etapas mais essencialmente de Euler (?) E determina, usando uma soma ponderada, qual a melhor posição e velocidade para o próximo quadro?
Além disso, esse método de aceleração (convertido em AS3):
private function acceleration(state:State, time:Number):Number
{
const k:int = 10;
const b:int = 1;
return - k*state.x - b*state.v;
}
leva uma massa constante (10) e força (1)? e retorna um cálculo estranho. Não faço idéia do porquê ... - massa * posição - força * velocidade? que?
Então, para minha última confusão, nos métodos de avaliação que se parecem com (AS3):
private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
var state:State = new State();
state.x = initial.x + d.dx*dtime;
state.v = initial.v + d.dv*dtime;
var output:Derivative = new Derivative();
output.dx = state.v;
output.dv = acceleration(state, time+dtime);
return output;
}
Armazenamos um novo estado com a etapa do tempo e depois definimos uma derivada para retornar ... Eu meio que entendo isso porque é usado no processo de aproximação, mas o que é isso !:
output.dx = state.v;
output.dv = acceleration(state, time+dtime);
// ok I get we are getting the new velocity since v = a * t, obviously I
// don't what acceleration() is returning though.
Definimos a mudança de saída derivativa na posição para a nova velocidade dos estados? Hã?
Por fim, esta simulação de teste é executada fazendo o seguinte:
var state:State = new State();
state.x = 100;
state.v = 0;
t = 0;
dt = 0.1;
while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
trace(state.x, state.v);
integrate(state, t, dt);
t += dt;
}
Então, estamos definindo um novo estado com um valor posicional de 100 e uma velocidade de 0? Qual é o objetivo desta simulação se não tivermos velocidade ...
De qualquer forma, escusado será dizer que estou bastante confuso e saí do planeta Terra. Esperar que alguém lá fora possa esclarecer isso para mim.
fonte
Respostas:
RK4 é um exemplo de um integrador numérico . A integração de Euler é um conceito semelhante, mas é muito menos preciso. A integração numérica não é exata, mas é muito melhor para um computador lidar em uma situação em tempo real, como um jogo. O motivo pelo qual você usa o RK4 em vez do Euler é que o RK4 leva em consideração a integração das segunda e terceira derivadas (aceleração e empurrão) e, portanto, se adapta muito melhor à solução analítica.
RK4 é essencialmente uma expansão da série de Taylor da equação diferencial que define aceleração em relação ao deslocamento e velocidade. Isso permite integrar forças que dependem dessas quantidades, como restrições e até gravitação universal. As expansões da série Taylor são úteis na programação, pois os computadores podem avaliá-las com muita eficiência.
A
acceleration
função usada é um exemplo: um sistema simples de mola amortecida, não gravitacional.k
é a mola constante de Hooke eb
é usada para amortecer o sistema (remover energia). Para praticamente todas as restrições relacionadas à mola em seu mecanismo, você deve amortecê-las, pois erros numéricos podem causar um enorme acúmulo de energia, causando a explosão da simulação. Se você estivesse usando a integração do Euler, isso seria muito pior.Com relação a
acceleration()
, um mecanismo de física mais completo calculará acelerações lineares e angulares com base em forças (torques). As forças a serem somadas podem incluir gravidade (constante ou baseada na Gravitação Universal), flutuabilidade e molas (a maioria das restrições pode ser modelada usando molas rígidas).Sua terceira pergunta é fácil de responder. Na cinemática, existem três quantidades básicas: deslocamento (posição), velocidade e aceleração. Aceleração é a derivada da velocidade, que é a derivada do deslocamento (ambos em relação ao tempo). Um derivado é apenas a taxa na qual algo muda.
Derivative.dx
significa "a derivada deState.x
".Como a simulação assume que a mola está ancorada na origem e tem um comprimento de descanso igual a zero, um deslocamento de 100 significa que a partícula começará a oscilar. A simulação de teste termina quando a partícula não está se movendo e está próxima da origem.
fonte