videos que puedes poner película para how hashtags google como adulto math 2d physics

math - que - youtube google videos



Movimiento simple basado en la física (6)

Advertencia: solución parcial

Si seguimos la física como se establece, no hay velocidad máxima. Desde un punto de vista puramente físico, has fijado la aceleración en un valor constante, lo que significa que la velocidad siempre está aumentando.

Como alternativa, considere las dos fuerzas que actúan sobre su objeto:

  • La fuerza externa constante, F , que tiende a acelerarla, y
  • La fuerza de arrastre, d , que es proporcional a la velocidad y tiende a ralentizarla.

Entonces la velocidad en la iteración n convierte en: v n = v 0 + n F - d v n-1

Has solicitado elegir la velocidad máxima, v nmax , que ocurre en la iteración nmax .

Tenga en cuenta que el problema está bajo restricciones ; es decir, F y D están relacionados, por lo que puede elegir arbitrariamente un valor para uno de ellos y luego calcular el otro.

Ahora que la pelota está rodando, ¿hay alguien dispuesto a retomar las matemáticas?

Advertencia: ¡ es feo e involucra series de poder !

Editar: ¿Por qué la secuencia n**F** en la primera ecuación aparece literalmente a menos que haya un espacio después de la n ?

Estoy trabajando en un juego en 2D donde estoy tratando de acelerar un objeto a una velocidad máxima usando un código de física básico.

Aquí está el pseudocódigo para ello:

const float acceleration = 0.02f; const float friction = 0.8f; // value is always 0.0..1.0 float velocity = 0; float position = 0; move() { velocity += acceleration; velocity *= friction; position += velocity; }

Este es un enfoque muy simplificado que no se basa en la fricción masiva o real (la fricción dentro del código es solo una fuerza genérica que actúa contra el movimiento). Funciona bien como la "velocidad * = fricción"; parte evita que la velocidad pase cierto punto. Sin embargo, es esta velocidad máxima y su relación con la aceleración y la fricción en la que estoy un poco perdido.

Lo que me gustaría hacer es establecer una velocidad máxima, y ​​la cantidad de tiempo que se tarda en alcanzarla, y luego usarla para derivar los valores de aceleración y fricción.

es decir,

const float max_velocity = 2.0; const int ticks; = 120; // If my game runs at 60 FPS, I''d like a // moving object to reach max_velocity in // exactly 2 seconds. const float acceleration = ? const float friction = ?


Encontré esta pregunta muy interesante ya que recientemente había hecho un trabajo de modelado del movimiento del proyectil con arrastre.

Punto 1: básicamente estás actualizando la posición y la velocidad usando una iteración de Euler explícita / hacia adelante donde cada nuevo valor para los estados debería ser una función de los valores anteriores. En tal caso, debe actualizar primero la posición y luego actualizar la velocidad.

Punto 2: hay modelos de física más realistas para el efecto de fricción de arrastre . Un modelo (sugerido por Adam Liss ) involucra una fuerza de arrastre que es proporcional a la velocidad (conocida como arrastre de Stokes, que generalmente se aplica a situaciones de baja velocidad). El que sugerí previamente implica una fuerza de arrastre que es proporcional al cuadrado de la velocidad (conocido como arrastre cuadrático, que generalmente se aplica a situaciones de alta velocidad). Me referiré a cada uno con respecto a cómo deduciría fórmulas para la velocidad máxima y el tiempo requerido para alcanzar efectivamente la velocidad máxima. Voy a renunciar a las derivaciones completas, ya que están bastante involucrados.

La resistencia de Stokes:

La ecuación para actualizar la velocidad sería:

velocity += acceleration - friction*velocity

que representa la siguiente ecuación diferencial:

dv/dt = a - f*v

Usando la primera entrada en esta tabla integral , podemos encontrar la solución (suponiendo que v = 0 en t = 0):

v = (a/f) - (a/f)*exp(-f*t)

La velocidad máxima (es decir, terminal) ocurre cuando t >> 0, de modo que el segundo término en la ecuación es muy cercano a cero y:

v_max = a/f

En cuanto al tiempo necesario para alcanzar la velocidad máxima, tenga en cuenta que la ecuación nunca llega realmente a ella, sino que la hace así. Sin embargo, cuando el argumento del exponencial es igual a -5, la velocidad es alrededor del 98% de la velocidad máxima, probablemente lo suficientemente cerca como para considerarla igual. A continuación, puede aproximar el tiempo a la velocidad máxima como:

t_max = 5/f

A continuación, puede utilizar estas dos ecuaciones para resolver fy dado un vmax y tmax deseados.

Arrastre cuadrático:

La ecuación para actualizar la velocidad sería:

velocity += acceleration - friction*velocity*velocity

que representa la siguiente ecuación diferencial:

dv/dt = a - f*v^2

Usando la primera entrada en esta tabla integral , podemos encontrar la solución (suponiendo que v = 0 en t = 0):

v = sqrt(a/f)*(exp(2*sqrt(a*f)*t) - 1)/(exp(2*sqrt(a*f)*t) + 1)

La velocidad máxima (es decir, terminal) ocurre cuando t >> 0, de modo que los términos exponenciales son mucho mayores que 1 y la ecuación se aproxima:

v_max = sqrt(a/f)

En cuanto al tiempo necesario para alcanzar la velocidad máxima, tenga en cuenta que la ecuación nunca llega realmente a ella, sino que la hace así. Sin embargo, cuando el argumento del exponencial es igual a 5, la velocidad es alrededor del 99% de la velocidad máxima, probablemente lo suficientemente cerca como para considerarla igual. A continuación, puede aproximar el tiempo a la velocidad máxima como:

t_max = 2.5/sqrt(a*f)

que también es equivalente a:

t_max = 2.5/(f*v_max)

Para un vmax y tmax deseados, la segunda ecuación para tmax le dirá qué f debería ser, y luego puede conectar eso a la ecuación de vmax para obtener el valor de a .

Esto parece un poco exagerado, ¡pero estas son en realidad algunas de las formas más simples de modelar el arrastre! Cualquiera que realmente quiera ver los pasos de integración puede enviarme un correo electrónico y se los enviaré. Están demasiado involucrados para escribir aquí.

Otro punto: no me di cuenta de esto inmediatamente, pero la actualización de la velocidad ya no es necesaria si, en su lugar, utilizas las fórmulas que obtuve para v (t) . Si simplemente está modelando la aceleración desde el reposo y está haciendo un seguimiento del tiempo desde que comenzó la aceleración, el código sería algo así como:

position += velocity_function(timeSinceStart)

donde "velocity_function" es una de las dos fórmulas para v (t) y ya no necesitarías una variable de velocidad. En general, aquí hay una compensación: calcular v (t) puede ser más costoso desde el punto de vista informático que simplemente actualizar la velocidad con un esquema iterativo (debido a los términos exponenciales), pero se garantiza que se mantendrá estable y limitado. Bajo ciertas condiciones (como tratar de obtener un tmax muy corto), la iteración puede volverse inestable y explotar, un problema común con el método progresivo de Euler. Sin embargo, mantener límites en las variables (como 0 < f <1) debería evitar estas inestabilidades.

Además, si te sientes algo masoquista, puedes integrar la fórmula para v (t) para obtener una solución de forma cerrada para p (t) , renunciando así a la necesidad de una iteración de Newton. Dejaré esto para que otros lo intenten. =)


Esto no responde a tu pregunta, pero una cosa que no debes hacer en simulaciones como esta es depender de una velocidad de fotogramas fija. Calcule el tiempo desde la última actualización y use el delta-T en sus ecuaciones. Algo como:

static double lastUpdate=0; if (lastUpdate!=0) { deltaT = time() - lastUpdate; velocity += acceleration * deltaT; position += velocity * deltaT; } lastUpdate = time();

También es bueno comprobar si pierde el foco y deja de actualizar, y cuando obtiene el foco, configure lastUpdate en 0. De esta forma, no obtendrá un gran deltaT para procesar cuando regrese.


Esto probablemente no sea lo que está buscando, pero dependiendo del motor en el que esté trabajando, podría ser mejor usar un motor construido por otra persona, como farseer (para C #). Nota Codeplex está fuera de servicio por mantenimiento.


Si desea ver lo que se puede hacer con modelos de física muy simples que usan matemáticas muy simples, eche un vistazo a algunos de los proyectos de Scratch en http://scratch.mit.edu/ - puede obtener algunas ideas útiles y lo hará sin duda, diviértete.


velocity *= friction;

Esto no evita que la velocidad pase alrededor de un cierto punto ...

La fricción aumenta exponencialmente (no me cites sobre eso) a medida que la velocidad aumenta, y estará 0 en reposo. Eventualmente, llegarás a un punto donde la fricción = aceleración.

Entonces quieres algo como esto:

velocity += (acceleration - friction); position += velocity; friction = a*exp(b*velocity);

Donde eliges valores para a y b. b controlará cuánto tiempo se tarda en alcanzar la velocidad máxima, y ​​a controlará qué tan bruscamente aumenta la fricción. (Una vez más, no hagas tu propia investigación sobre esto, voy por lo que recuerdo de la física del 12º grado).