Como posso substituir o método de Euler pela 4ª ordem de Runge-Kutta para determinar o movimento de queda livre em magnitude gravimétrica não constante (por exemplo, queda livre de 10.000 km acima do solo)?
Até agora escrevi uma integração simples pelo método Euler:
while()
{
v += getMagnitude(x) * dt;
x += v * dt;
time += dt;
}
variável x significa posição atual, v significa velocidade, getMagnitude (x) retorna a aceleração na posição x.
Eu tentei implementar o RK4:
while()
{
v += rk4(x, dt) * dt; // rk4() instead of getMagintude()
x += v * dt;
time += dt;
}
onde o corpo da função rk4 () é:
inline double rk4(double tx, double tdt)
{
double k1 = getMagnitude(tx);
double k2 = getMagnitude(tx + 0.5 * tdt * k1);
double k3 = getMagnitude(tx + 0.5 * tdt * k2);
double k4 = getMagnitude(tx + tdt * k3);
return (k1 + 2*k2 + 2*k3 + k4)/6.0;
}
Mas algo está errado, porque estou integrando apenas uma vez usando o RK4 (aceleração). A integração da velocidade usando o RK4 não faz sentido porque é o mesmo que v * dt.
Você poderia me dizer como resolver equações diferenciais de segunda ordem usando a integração Runge-Kutta? Devo implementar o RK4 calculando os coeficientes k1, l1, k2, l2 ... l4? Como eu posso fazer isso?