27. Actualización de posición y velocidad: primer paso con el método de Euler

El método de Euler transforma tasas de cambio en pequeñas actualizaciones. Es sencillo, útil para aprender y revela por qué el tamaño del paso influye en una simulación.

27.1 Por qué necesitamos integración numérica

Las fuerzas determinan aceleración, la aceleración cambia velocidad y la velocidad cambia posición. Cuando las fuerzas varían con el estado, no siempre contamos con una fórmula directa para cualquier instante.

La integración numérica aproxima la evolución mediante pasos pequeños. En cada paso suponemos que una tasa conocida representa razonablemente lo que sucede durante dt.

Euler es el punto de partida más simple. Comprender sus decisiones prepara el camino para métodos más precisos.

27.2 De una tasa a un cambio

Si una cantidad q cambia con tasa r, durante un intervalo pequeño aproximamos Δq ≈ r·dt. Para movimiento:

Δv ≈ a·dt
Δx ≈ v·dt

Las unidades ayudan: (m/s²)·s = m/s y (m/s)·s = m. Después sumamos cada cambio al estado anterior.

La aproximación mejora cuando la tasa varía poco dentro del paso.

27.3 Euler explícito

Euler explícito actualiza la posición con la velocidad anterior y luego la velocidad con la aceleración anterior:

xn+1 = xn + vndt
vn+1 = vn + andt

Todos los cambios usan información al comienzo del intervalo. Es fácil de implementar, pero puede acumular energía y volverse inestable en resortes u órbitas.

27.4 Euler semiexplícito

Una variante actualiza primero la velocidad y utiliza esa velocidad nueva para la posición:

vn+1 = vn + andt
xn+1 = xn + vn+1dt

También se llama Euler simpléctico. Cuesta casi lo mismo y suele comportarse mejor en simulaciones mecánicas. No es exacto: cambia la dirección del error.

27.5 Un paso calculado a mano

Tomemos x = 0 m, v = 2 m/s, a = 4 m/s² y dt = 0,5 s. Euler explícito calcula x = 1 m y v = 4 m/s. El semiexplícito calcula primero v = 4 m/s y luego x = 2 m.

La solución exacta para aceleración constante es x = 1,5 m. Un método queda por debajo y el otro por encima. Ambos obtienen la velocidad exacta porque la aceleración es constante.

Esta comparación muestra que el orden de dos líneas de código modifica el modelo numérico.

27.6 Implementación de ambas variantes

function eulerExplicito(x, v, a, dt) {
  return { x: x + v * dt, v: v + a * dt };
}

function eulerSemiexplicito(x, v, a, dt) {
  const nuevaV = v + a * dt;
  return { x: x + nuevaV * dt, v: nuevaV };
}

console.log(eulerExplicito(0, 2, 4, 0.5).x + ' m');
console.log(eulerSemiexplicito(0, 2, 4, 0.5).x + ' m');

Las funciones devuelven estados nuevos. Esto permite comparar métodos usando exactamente las mismas condiciones iniciales.

27.7 El error acumulado

El error local de un paso puede parecer pequeño, pero se acumula durante muchos pasos. Con aceleración constante, Euler obtiene bien la velocidad y aproxima la posición por una suma de rectángulos.

Reducir dt aumenta la cantidad de pasos y normalmente disminuye el error global. Dividir dt por dos no vuelve gratuito el cálculo: aproximadamente duplica el trabajo.

La precisión necesaria depende de la escala visible, la duración y las interacciones del programa.

27.8 Laboratorio: exacto, explícito y semiexplícito

Avanzá hasta cinco segundos y compará las tres posiciones. Cambiá dt para observar cómo se reduce el error.

Los resultados aparecen debajo.
Celeste: exacta. Rosa: Euler explícito. Amarillo: Euler semiexplícito.
Tiempo0,00 s
Posición exacta0,00 m
Euler explícito0,00 m
Euler semiexplícito0,00 m

Simulación preparada.

27.9 Aceleración que depende del estado

Cuando a depende de posición o velocidad, debe recalcularse en cada paso. Para un resorte ideal, a = −kx/m; para resistencia lineal, aparece un término proporcional a −v.

function pasoConFuerza(cuerpo, calcularFuerza, dt) {
  const fuerza = calcularFuerza(cuerpo);
  const aceleracion = fuerza / cuerpo.masa;
  cuerpo.velocidad += aceleracion * dt;
  cuerpo.posicion += cuerpo.velocidad * dt;
}

const cuerpo = { masa: 2, posicion: 1, velocidad: 0 };
pasoConFuerza(cuerpo, () => 6, 0.5);
console.log(cuerpo.velocidad + ' m/s');
console.log(cuerpo.posicion + ' m');

El resultado es 1,5 m/s y 1,75 m. La función de fuerza queda separada del integrador.

27.10 Estabilidad, límites y pruebas

Un método puede ser correcto en casos lentos y fallar cuando las fuerzas cambian rápidamente. Si el resultado explota, oscila artificialmente o atraviesa límites, probá reducir dt antes de culpar a la ecuación física.

Comprobaciones útiles incluyen a = 0, dt = 0, movimiento con aceleración constante y comparación con una solución conocida. La simulación también debe rechazar dt negativo o no finito.

Los choques requieren detectar eventos y corregir el estado; Euler no los incorpora automáticamente.

27.11 Ejercicio integrador

Usá Euler semiexplícito con x = 1 m, v = 3 m/s, a = −2 m/s² y dt = 0,5 s. Calculá el estado después de dos pasos.

Ver solución y código

Paso 1: v = 2 m/s, x = 2 m. Paso 2: v = 1 m/s, x = 2,5 m. El tiempo total es 1 s.

let x = 1, v = 3;
const a = -2, dt = 0.5;
for (let paso = 0; paso < 2; paso++) {
  v += a * dt;
  x += v * dt;
}
console.log(v + ' m/s');
console.log(x + ' m');

27.12 Ideas para recordar

  • Euler aproxima cambios mediante tasa × dt.
  • Euler explícito usa la velocidad anterior para actualizar posición.
  • Euler semiexplícito usa primero la velocidad nueva.
  • El orden de actualización cambia el error.
  • Pasos pequeños suelen mejorar precisión y aumentan el costo.
  • La aceleración debe recalcularse cuando depende del estado.
  • Comparar con casos exactos permite validar el integrador.

En el próximo tema estudiaremos colisiones simples, detección y respuesta.