Por favor, vea la respuesta de Charles Hudgins más abajo para una hermosa solución.
Me he encontrado con un problema que no sé si podré resolver por mí mismo. He pasado innumerables horas dándole vueltas a esto y he empezado a preguntarme si es posible (o lógico) lo que estoy intentando hacer.
La naturaleza del problema es que tengo una simulación de un objeto en movimiento que se está desacelerando y experimentando una fuerza de arrastre que está sujeta a la velocidad del objeto en cualquier punto del tiempo. Quiero encontrar el tiempo necesario para que el objeto se detenga completamente (TTS). La ecuación para calcular la velocidad de un objeto de fotograma a fotograma es
$$ V_f = (V_i + at)(1 - rt) $$ $V_f$ es la velocidad del siguiente paso de la simulación, $V_i$ es la velocidad de paso de la simulación actual, $a$ es una aceleración constante en el objeto (frenado), $r$ es el coeficiente de arrastre (entre $0$ y $1$ ), y $t$ es el paso de tiempo de la simulación (generalmente $0.02$ segundos). Siempre que el coeficiente de arrastre sea $0$ este modelo se reduce a la primera ley del movimiento de Newton $V_f = V_i + at$ . Soy capaz de utilizar de forma fiable todas las ecuaciones de movimiento de Newton para resolver el tiempo de parada con facilidad.
Ahora bien, cuando el coeficiente de arrastre no es $0$ obviamente, muchas cosas cambian. El principal cambio es que el coeficiente de arrastre modifica la velocidad en cada momento. En un momento dado sé $V_i$ , $a$ y $r$ . Me pareció obvio que enchufar $0$ para $V_f$ y luego resolver para $t$ obtendría el resultado correcto pero es muy erróneo.
¿Puede alguien indicarme la dirección correcta para derivar el tiempo de parada dada esta ecuación? Y / o la cordura me comprobar si esto es factible dado el tipo de paso de tiempo de la simulación. Dado que las leyes de Newton funcionan sin arrastre, soy optimista de que hay una solución continua que incluye el arrastre. He intentado integrar para poder resolver en un rango determinado, pero se hace raro por el hecho de que el coeficiente de arrastre está sujeto a la velocidad instantánea.
Nota - He implementado un solucionador iterativo que simplemente proyecta esta ecuación, pero para la mayoría de mis casos de uso, esto no es ideal debido a la gran cantidad de simulaciones que están sucediendo en un momento dado. He incluido la simulación (que funciona) a continuación como referencia. Yo preferiría tener una integral o algo para resolver de manera absoluta. La cúbica y/o la cuártica no son un problema.
private float SimulateTimeToStop(float vi, float a, float r, float timeStep)
{
var tts = 0f;
while(vi > 0)
{
vi = (vi + a * timeStep) * (1 - r * timeStep);
tts += timeStep;
}
return tts;
}
Aquí hay algunos resultados de muestra (simulados).
Escenario 1: Vi = 15, r = 0.5, a = -6
TTS = 1,64 segundos
Escenario 2: Vi = 45, r = 1, a = -15
TTS = 1,4 segundos
Escenario 3: Vi = 28, r = 0.75 a = -3;
TTS = 2,78 segundos
Escenario 4: Vi = 35, r = 0.85, a = -5
¿TTS?