28. Integrar las leyes de Newton en un bucle de simulación

El bucle físico transforma fuerzas instantáneas en una evolución: evalúa la dinámica, calcula la aceleración y actualiza velocidad y posición mediante pasos temporales discretos.

28.1 De una instantánea a una evolución

Los temas anteriores permiten calcular la aceleración correspondiente a un estado. Una simulación debe repetir ese cálculo y avanzar el estado a lo largo del tiempo.

estado actual → fuerzas → aceleración → nuevo estado

Cada repetición representa un intervalo pequeño Δt. El método numérico aproxima cómo evolucionaría el sistema continuo durante ese intervalo.

El bucle no reemplaza las leyes de Newton: organiza cuándo se evalúan y cómo se aproxima su efecto temporal.

28.2 Ecuaciones que debemos integrar

Para una partícula en dos dimensiones:

dr/dt = v
dv/dt = a = ΣF(r, v, t)/m

La posición cambia según la velocidad y la velocidad cambia según la aceleración. Si las fuerzas dependen del estado, cada actualización modifica los datos usados en la evaluación siguiente.

Integrar numéricamente significa construir aproximaciones discretas de estas relaciones.

28.3 Orden de un paso físico

1Reiniciar fuerzas
2Evaluar interacciones
3Calcular aceleración
4Actualizar estado
5Avanzar tiempo

Todas las fuerzas deben leer el mismo estado inicial del paso. Solo después de obtener la resultante se modifican velocidad y posición.

Las colisiones, contactos o cambios de estado pueden requerir etapas adicionales, pero este orden constituye la base.

28.4 Euler explícito

El método de Euler explícito usa velocidad y aceleración al comienzo del paso:

rn+1 = rn + vnΔt
vn+1 = vn + anΔt

Es sencillo y útil para comprender el algoritmo. Sin embargo, puede acumular errores importantes o volverse inestable en sistemas sensibles.

La aceleración an debe haberse calculado con las fuerzas del estado n.

28.5 Euler semimplícito

Euler semimplícito actualiza primero la velocidad y usa esa velocidad nueva para mover la posición:

vn+1 = vn + anΔt
rn+1 = rn + vn+1Δt

El cambio de una sola línea puede mejorar el comportamiento de muchos sistemas mecánicos. Sigue siendo un método aproximado de primer orden y no elimina la necesidad de elegir un paso adecuado.

28.6 Por qué importa el orden

Con aceleración constante, ambos métodos producen la misma actualización de velocidad, pero posiciones diferentes:

Euler explícito usa vn.
Euler semimplícito usa vn+1.

Mezclar fórmulas sin declarar el método dificulta reproducir y verificar los resultados. La función de paso debe indicar con claridad qué estado utiliza cada operación.

Nunca deben actualizarse primero algunos cuerpos y luego evaluar fuerzas de otros con los valores ya modificados.

28.7 Paso temporal fijo

Un paso físico fijo, por ejemplo Δt = 1/120 s, hace que la evolución no dependa directamente de la frecuencia de dibujo.

ReproducibleMismos datos y pasos producen resultados comparables.
PredecibleLa estabilidad no cambia con cada fotograma.
VerificableEs fácil repetir exactamente una cantidad de pasos.

Un paso más pequeño suele reducir el error, pero exige más evaluaciones por segundo. Debe elegirse según las escalas temporales del sistema.

28.8 Renderizado y física no son lo mismo

requestAnimationFrame informa cuándo conviene dibujar, pero el intervalo entre fotogramas varía. Usarlo directamente como paso físico hace que la simulación cambie con la carga del dispositivo.

Una estrategia robusta acumula el tiempo real transcurrido y ejecuta tantos pasos físicos fijos como correspondan:

acumuladorTiempo += tiempoReal
mientras acumuladorTiempo ≥ Δt: simular(Δt)

Después se dibuja una vez. La física puede ejecutar cero, uno o varios pasos antes de cada renderizado.

28.9 Limitar pausas excesivas

Si la pestaña queda inactiva o el proceso se detiene, el siguiente fotograma puede informar un intervalo enorme. Intentar recuperar todo ese tiempo mediante cientos de pasos bloquea la aplicación.

Conviene limitar el tiempo aceptado por fotograma y también la cantidad máxima de subpasos:

tiempoAceptado = min(tiempoReal, 0,1 s)
subpasos ≤ máximo configurado

Esto sacrifica tiempo simulado durante una pausa extrema, pero conserva la capacidad de respuesta. La política debe documentarse.

28.10 Reevaluar fuerzas en cada subpaso

Una fuerza constante puede producir el mismo vector repetidamente, pero una fuerza dependiente de posición, velocidad, tiempo o contacto debe reevaluarse en cada subpaso físico.

No conservar ΣFn como si fuera ΣFn+1.

El acumulador de fuerzas se reinicia, todas las reglas leen el estado del comienzo del subpaso y luego se calcula la aceleración.

Si el usuario modifica un parámetro durante la ejecución, conviene aplicar el nuevo valor en un límite claro entre pasos, no a mitad de una evaluación.

28.11 Condiciones iniciales y reinicio

Una simulación necesita un estado inicial completo:

Tiempot0
Posiciónr0
Velocidadv0
ParámetrosMasa, fuerzas y paso temporal.

Reiniciar debe restaurar una copia de esos datos, vaciar acumuladores, borrar el tiempo pendiente y reiniciar contadores. Reutilizar objetos anidados sin copiarlos puede hacer que el “estado inicial” haya sido modificado por la ejecución anterior.

28.12 Eventos y cambios de etapa

Algunas fórmulas solo son válidas hasta que ocurre un evento: una cuerda se afloja, se pierde contacto, una velocidad relativa llega a cero o el cuerpo cruza un límite.

Un paso discreto puede atravesar el evento. Existen varias respuestas posibles:

  • Reducir el paso temporal.
  • Detectar el cruce y aproximar el instante del evento.
  • Corregir el estado y comenzar una nueva etapa.
  • Detener la simulación si el modelo no define qué ocurre después.

No conviene prolongar silenciosamente una ecuación fuera de su dominio físico.

28.13 Pausar, avanzar y reproducir

Una interfaz útil separa tres acciones:

  • Reproducir: consume tiempo real y ejecuta pasos físicos fijos.
  • Pausar: conserva el estado, pero deja de consumir tiempo.
  • Avanzar un paso: ejecuta exactamente un Δt, ideal para depuración.

Al reanudar no debe incluirse el tiempo que la simulación estuvo pausada. Se reinicia la marca temporal del renderizado.

28.14 Actividad interactiva: bucle con paso fijo

Compará ambos métodos y distintos tamaños de paso. El cuerpo parte de (2; 2) m con velocidad (8; 11) m/s, recibe gravedad y una fuerza horizontal configurable.

Laboratorio del bucle dinámico

La ejecución se detiene al cruzar el suelo; Reiniciar restaura exactamente las condiciones iniciales.

a = (0,00; −9,81) m/s²
Posición(2,00; 2,00) m
Velocidad(8,00; 11,00) m/s
Tiempo simulado0,000 s
Pasos ejecutados0

28.15 Implementar un paso dinámico con JavaScript

La función siguiente recibe una fuerza ya evaluada y aplica el método seleccionado:

function integrarPaso(cuerpo, fuerzaN, dt, metodo = 'semi') {
  const ax = fuerzaN.x / cuerpo.masaKg;
  const ay = fuerzaN.y / cuerpo.masaKg;

  if (metodo === 'explicit') {
    cuerpo.posicionM.x += cuerpo.velocidadMps.x * dt;
    cuerpo.posicionM.y += cuerpo.velocidadMps.y * dt;
  }

  cuerpo.velocidadMps.x += ax * dt;
  cuerpo.velocidadMps.y += ay * dt;

  if (metodo === 'semi') {
    cuerpo.posicionM.x += cuerpo.velocidadMps.x * dt;
    cuerpo.posicionM.y += cuerpo.velocidadMps.y * dt;
  }
}

const cuerpo = {
  masaKg: 2,
  posicionM: { x: 0, y: 0 },
  velocidadMps: { x: 3, y: 0 }
};
integrarPaso(cuerpo, { x: 4, y: 0 }, 0.5, 'semi');
console.log(cuerpo);

Para una prueba reproducible conviene ejecutar una cantidad finita de pasos, sin depender del reloj de la pantalla:

function simularPasos(cuerpo, cantidad, dt, calcularFuerza) {
  for (let paso = 0; paso < cantidad; paso++) {
    const fuerza = calcularFuerza(cuerpo, paso * dt);
    const ax = fuerza.x / cuerpo.masaKg;
    const ay = fuerza.y / cuerpo.masaKg;
    cuerpo.velocidadMps.x += ax * dt;
    cuerpo.velocidadMps.y += ay * dt;
    cuerpo.posicionM.x += cuerpo.velocidadMps.x * dt;
    cuerpo.posicionM.y += cuerpo.velocidadMps.y * dt;
  }
  return cuerpo;
}

const particula = {
  masaKg: 1,
  posicionM: { x: 0, y: 0 },
  velocidadMps: { x: 0, y: 0 }
};
const final = simularPasos(particula, 10, 0.1, () => ({ x: 2, y: 0 }));
console.log(final.posicionM, final.velocidadMps);

Este ejemplo incluye directamente el orden semimplícito para que sea autocontenido. En un proyecto conviene reutilizar una única función de integración bien probada.

28.16 Estabilidad, costo y reproducibilidad

DecisiónEfecto
Reducir ΔtSuele disminuir el error, pero aumenta el costo.
Aumentar ΔtReduce evaluaciones, pero puede perder eventos o desestabilizar el sistema.
Usar paso fijoFacilita repetición, pruebas y comparación entre dispositivos.
Limitar subpasosEvita bloqueos ante pausas largas, a costa de perder tiempo simulado.
Registrar semilla y entradasPermite reproducir simulaciones con componentes aleatorios.

Un método más sofisticado no compensa un modelo de fuerzas incorrecto ni un paso demasiado grande para los eventos relevantes.

28.17 Errores frecuentes y ejercicios

Errores frecuentes

  • Usar el tiempo variable del fotograma directamente como paso físico.
  • No reiniciar el acumulador de fuerzas en cada subpaso.
  • Actualizar un cuerpo antes de terminar de evaluar los demás.
  • Mezclar el orden de Euler explícito y semimplícito sin declararlo.
  • Reanudar incorporando todo el tiempo que la simulación estuvo pausada.
  • Continuar una fórmula después de cruzar el evento que limita su validez.

Ejercicios propuestos

  1. Una partícula tiene x = 0 m, v = 4 m/s, a = 2 m/s² y Δt = 0,5 s. Ejecutá un paso de Euler explícito.
  2. Repetí usando Euler semimplícito.
  3. Una simulación usa Δt = 0,01 s. ¿Cuántos subpasos necesita para avanzar 0,075 s y cuánto tiempo queda acumulado?
  4. Explicá por qué una fuerza dependiente de la velocidad debe reevaluarse después de cada actualización.
  5. Indicá qué datos deben restaurarse al reiniciar el laboratorio.
  6. Un paso lleva la altura de 0,03 m a −0,02 m. ¿Qué información física revela ese cambio?
Ver soluciones
  1. x1 = 0 + 4·0,5 = 2 m; v1 = 4 + 2·0,5 = 5 m/s.
  2. v1 = 5 m/s; x1 = 0 + 5·0,5 = 2,5 m.
  3. Ejecuta 7 pasos y avanza 0,07 s; quedan 0,005 s en el acumulador.
  4. La actualización cambia la velocidad y, por lo tanto, cambia el vector que devuelve esa regla.
  5. Tiempo, posición, velocidad, acumulador temporal, fuerzas temporales, contador de pasos y cualquier estado de eventos.
  6. El paso atravesó la frontera y = 0. Debe detectarse el evento y decidir si aproximar el instante, corregir el estado o detener el modelo.

28.18 Ideas para recordar

  • Un paso dinámico evalúa fuerzas, calcula aceleración y luego actualiza el estado.
  • Euler explícito y semimplícito difieren en qué velocidad usan para mover la posición.
  • La física debe usar un paso fijo independiente del renderizado.
  • Las fuerzas dependientes del estado se reevalúan en cada subpaso.
  • Las pausas largas y los eventos requieren políticas explícitas.
  • Reiniciar significa restaurar copias completas de las condiciones iniciales.

En el próximo tema aprenderemos a verificar diagramas, unidades, resultados numéricos y casos límite mediante pruebas sistemáticas.