Gafferon Games tiene un gran artículo sobre la integración RK4 para construir simulaciones físicas que se puede encontrar aquí: Conceptos básicos de integración
Personalmente, mis conocimientos de matemáticas y física podrían mejorar. Me siento cómodo en el ámbito de las matemáticas vectoriales, trigonométricas, algunas estadísticas (he tenido que usar fórmulas de regresión de líneas lineales para software, etc.), y básicamente la mayoría de las cosas desde el nivel secundario hasta la universidad de primer año.
Ahora a la pregunta, leí este artículo, descargué la fuente asociada y depuré línea por línea para tratar de comprender lo que está sucediendo y todavía siento que claramente no entiendo lo que estoy viendo. He buscado en Internet tratando de encontrar las versiones "Para Dummies", francamente aprendo un poco diferente y mirando las fórmulas todo el día con el énfasis en la memorización no va a ser suficiente, ya que necesito entender lo que está sucediendo, así que puede ser flexible aplicándolo.
Así que esto es lo que creo que entiendo hasta ahora, pero espero que alguien más pueda aclararme o corregirme por completo. El RK4 usa un paso de Euler, luego basa eso para avanzar en el tiempo para calcular varios pasos más esencialmente de Euler (?) Y determina, utilizando una suma ponderada, ¿cuál es la mejor posición y velocidad para el siguiente cuadro?
Además, ese método de aceleración (convertido en AS3):
private function acceleration(state:State, time:Number):Number
{
const k:int = 10;
const b:int = 1;
return - k*state.x - b*state.v;
}
toma una masa constante (10) y una fuerza (1)? y devuelve un cálculo extraño No tengo idea de por qué ...- masa * posición - fuerza * velocidad? ¿Qué?
Luego, para mi último poco de confusión, en los métodos de evaluación que se parecen a (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;
}
Almacenamos un nuevo estado con el paso de tiempo, luego configuramos una derivada para que regrese ... Entiendo esto como se usa en el proceso de aproximación, ¡pero qué es esto !:
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.
Establecemos el cambio de salida derivada en la posición a la nueva velocidad de los estados? ¿Eh?
Por último, esta simulación de prueba se ejecuta haciendo esto:
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;
}
Entonces, ¿estamos estableciendo un nuevo estado con un valor posicional de 100 y una velocidad de 0? ¿Cuál es el punto de esta simulación si no tenemos velocidad ...
De todos modos, no hace falta decir que estoy bastante confundido y me he alejado del planeta Tierra. Esperando que alguien pueda aclarar esto para mí.
fuente
Respuestas:
RK4 es un ejemplo de integrador numérico . La integración de Euler es un concepto similar, pero es mucho menos preciso. La integración numérica no es exacta, pero es mucho mejor para una computadora en una situación en tiempo real como un juego. La razón por la que usa RK4 en lugar de Euler es que RK4 tiene en cuenta la integración de la segunda y la tercera derivada (aceleración y tirón) y, por lo tanto, se adapta mucho mejor a la solución analítica.
RK4 es esencialmente una expansión de la serie Taylor de la ecuación diferencial que define la aceleración con respecto al desplazamiento y la velocidad. Esto le permite integrar fuerzas que dependen de estas cantidades, como restricciones e incluso gravitación universal. Las expansiones de la serie Taylor son útiles en la programación ya que las computadoras pueden evaluarlas de manera muy eficiente.
La
acceleration
función utilizada es un ejemplo es un sistema de resorte amortiguado simple, no gravitacional.k
es la constante de resorte de Hooke yb
se usa para humedecer el sistema (eliminar energía). Para casi todas las restricciones relacionadas con los resortes en su motor, querrá humedecerlas ya que los errores numéricos pueden causar una gran acumulación de energía, haciendo que la simulación explote. Si estuviera utilizando la integración de Euler, esto sería mucho peor.Con respecto a
acceleration()
, un motor de física más completo calculará las aceleraciones lineales y angulares en función de las fuerzas (pares). Las fuerzas para sumar podrían incluir la gravedad (constante o basada en la Gravitación Universal), la flotabilidad y los resortes (la mayoría de las restricciones se pueden modelar usando resortes rígidos).Su tercera pregunta es fácil de responder. En cinemática, hay tres cantidades básicas: desplazamiento (posición), velocidad y aceleración. La aceleración es la derivada de la velocidad, que es la derivada del desplazamiento (ambos con respecto al tiempo). Una derivada es solo la velocidad a la que algo cambia.
Derivative.dx
significa "la derivada deState.x
".Debido a que la simulación supone que el resorte está anclado en el origen y tiene una longitud de descanso de cero, un desplazamiento de 100 significa que la partícula comenzará a oscilar. La simulación de prueba finaliza cuando la partícula no se mueve y está cerca del origen.
fuente