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.