25.1 Cuando no evaluamos una solución exacta
Si conocemos x(t) y v(t), podemos consultar directamente cualquier instante. Sin embargo, muchas simulaciones conocen el estado actual y las reglas que indican cómo cambia, pero no disponen de una fórmula sencilla para el estado futuro.
Un método de integración numérica construye una secuencia aproximada de estados. Partiendo de un estado inicial, calcula el siguiente durante un pequeño intervalo Δt y repite el procedimiento.
25.2 Derivadas como tasas de cambio
La velocidad es la derivada de la posición y la aceleración es la derivada de la velocidad:
a(t) = dv/dt
Durante un intervalo pequeño podemos aproximar una derivada mediante un cociente de cambios:
a(t) ≈ [v(t+Δt) − v(t)] / Δt
Estas aproximaciones usan la pendiente conocida al comienzo del intervalo para estimar el extremo siguiente.
25.3 Despejar el estado siguiente
Al despejar la posición y la velocidad futuras aparecen las reglas del Euler explícito:
vₙ₊₁ = vₙ + aₙΔt
tₙ₊₁ = tₙ + Δt
El subíndice n identifica el estado actual y n+1 el siguiente. Todos los términos del lado derecho pertenecen al estado n: la posición se actualiza con la velocidad anterior y la velocidad con la aceleración anterior.
25.4 Interpretación geométrica
En una gráfica posición-tiempo, la velocidad es la pendiente de la curva. Euler reemplaza durante cada paso un tramo curvo por la recta tangente al comienzo. Avanza sobre esa recta una duración Δt y vuelve a calcular la pendiente.
Si la pendiente permanece constante, como en MRU, el avance es exacto. Si cambia dentro del paso, la recta se separa de la curva y aparece error local. Cuanto mayor sea la curvatura o el paso, mayor puede ser la separación.
25.5 Un paso calculado a mano
Consideremos x₀=0 m, v₀=2 m/s, a₀=3 m/s² y Δt=0,5 s. Euler produce:
v₁ = 2 + 3·0,5 = 3,5 m/s
t₁ = 0 + 0,5 = 0,5 s
La solución analítica de aceleración constante daría x(0,5)=1,375 m. Euler no incorpora en la posición el aumento de velocidad que ocurre dentro de este paso; por eso queda 0,375 m por debajo.
25.6 Repetir varios pasos
El resultado de un paso se convierte en la entrada del siguiente. Con los mismos datos:
| n | tₙ (s) | xₙ (m) | vₙ (m/s) |
|---|---|---|---|
| 0 | 0 | 0 | 2 |
| 1 | 0,5 | 1 | 3,5 |
| 2 | 1 | 2,75 | 5 |
| 3 | 1,5 | 5,25 | 6,5 |
| 4 | 2 | 8,5 | 8 |
La velocidad es exacta en estos instantes porque la aceleración es constante. La posición exacta a 2 s es 10 m, de modo que el error acumulado de posición es −1,5 m.
25.7 Implementar un paso en una dimensión
function pasoEuler1D(estado, aceleracionMps2, deltaTiempoS) {
return {
tiempoS: estado.tiempoS + deltaTiempoS,
posicionM: estado.posicionM
+ estado.velocidadMps * deltaTiempoS,
velocidadMps: estado.velocidadMps
+ aceleracionMps2 * deltaTiempoS
};
}
const siguiente = pasoEuler1D(
{ tiempoS: 0, posicionM: 0, velocidadMps: 2 },
3,
0.5
);
console.log(siguiente);La función devuelve un objeto nuevo. El estado anterior permanece disponible para depuración, comparación o interpolación.
25.8 El orden de actualización importa
Esta escritura parece similar, pero no implementa Euler explícito:
let posicionM = 0;
let velocidadMps = 2;
const aceleracionMps2 = 3;
const deltaTiempoS = 0.5;
velocidadMps += aceleracionMps2 * deltaTiempoS;
posicionM += velocidadMps * deltaTiempoS;
console.log({ posicionM, velocidadMps });La posición utiliza la velocidad ya actualizada y resulta 1,75 m. Ese orden corresponde a otro método, Euler semimplícito, que estudiaremos después. Para Euler explícito debemos calcular ambas magnitudes desde los valores anteriores o guardar copias antes de mutar.
25.9 Una actualización simultánea
Una forma segura de conservar el esquema consiste en calcular primero los nuevos valores y asignarlos al final:
let posicionM = 0;
let velocidadMps = 2;
const aceleracionMps2 = 3;
const deltaTiempoS = 0.5;
const nuevaPosicionM = posicionM + velocidadMps * deltaTiempoS;
const nuevaVelocidadMps = velocidadMps
+ aceleracionMps2 * deltaTiempoS;
posicionM = nuevaPosicionM;
velocidadMps = nuevaVelocidadMps;
console.log({ posicionM, velocidadMps });El resultado es x=1 m y v=3,5 m/s, como en el cálculo manual.
25.10 Euler en dos dimensiones
El método se aplica componente a componente. Un mismo Δt debe utilizarse para posición, velocidad y tiempo:
vₓₙ₊₁ = vₓₙ + aₓₙΔt vᵧₙ₊₁ = vᵧₙ + aᵧₙΔt
function pasoEuler2D(estado, deltaTiempoS) {
const { posicionM: r, velocidadMps: v, aceleracionMps2: a } = estado;
return {
...estado,
tiempoS: estado.tiempoS + deltaTiempoS,
posicionM: {
x: r.x + v.x * deltaTiempoS,
y: r.y + v.y * deltaTiempoS
},
velocidadMps: {
x: v.x + a.x * deltaTiempoS,
y: v.y + a.y * deltaTiempoS
},
aceleracionMps2: { ...a }
};
}
console.log(pasoEuler2D({
tiempoS: 0,
posicionM: { x: 0, y: 2 },
velocidadMps: { x: 6, y: 8 },
aceleracionMps2: { x: 0, y: -9.8 },
referencia: "suelo"
}, 0.1));25.11 Aceleración que depende del estado
La aceleración puede ser constante o calcularse desde el tiempo, la posición o la velocidad actuales. Euler explícito evalúa esa función en el estado n:
function pasoEuler(estado, calcularAceleracion, deltaTiempoS) {
const aceleracionMps2 = calcularAceleracion(estado);
return {
tiempoS: estado.tiempoS + deltaTiempoS,
posicionM: estado.posicionM
+ estado.velocidadMps * deltaTiempoS,
velocidadMps: estado.velocidadMps
+ aceleracionMps2 * deltaTiempoS
};
}
const aceleracionResorte = estado => -4 * estado.posicionM;
const resultado = pasoEuler(
{ tiempoS: 0, posicionM: 1, velocidadMps: 0 },
aceleracionResorte,
0.1
);
console.log(resultado);En el ejemplo, la aceleración vale −4 m/s² en el estado inicial. El método conserva x=1 m durante el primer paso porque la velocidad inicial es cero, pero actualiza la velocidad a −0,4 m/s.
25.12 Simular hasta una duración
Un bucle aplica repetidamente el paso y puede guardar la historia. El último paso se acorta para no superar la duración pedida:
function simularEuler(inicial, aceleracionMps2, duracionS, pasoMaximoS) {
let estado = { ...inicial };
const historia = [estado];
while (estado.tiempoS < duracionS) {
const dt = Math.min(pasoMaximoS, duracionS - estado.tiempoS);
estado = {
tiempoS: estado.tiempoS + dt,
posicionM: estado.posicionM + estado.velocidadMps * dt,
velocidadMps: estado.velocidadMps + aceleracionMps2 * dt
};
historia.push(estado);
}
return historia;
}
const historia = simularEuler(
{ tiempoS: 0, posicionM: 0, velocidadMps: 2 },
3, 2, 0.5
);
console.log(historia);Guardar todos los estados ayuda a graficar y verificar, pero consume memoria proporcional a la cantidad de pasos. Una animación puede conservar solo el estado anterior y el actual.
25.13 Actividad interactiva: Euler frente a la solución exacta
Modificá la aceleración, la velocidad inicial, la duración y Δt. La curva azul es la posición exacta con aceleración constante; la línea naranja une los estados construidos por Euler explícito.
Laboratorio del método de Euler
Cada punto naranja utiliza la velocidad que había al comienzo de su intervalo.
25.14 Comparar con una solución analítica
Cuando existe una solución exacta, funciona como referencia para medir el error del integrador:
vexacta(t)=v₀+at
error de posición=xEuler−xexacta
Para aceleración constante, Euler explícito reproduce exactamente la velocidad en los instantes discretos, pero no la posición acelerada. Con n pasos iguales, el error final de posición es −½a·T·Δt: disminuye linealmente al reducir el paso.
25.15 Error local y error global
Euler explícito posee error local proporcional a Δt² y error global proporcional a Δt bajo condiciones adecuadas. Por eso se denomina método de primer orden: reducir el paso a la mitad tiende a reducir aproximadamente a la mitad el error global.
Esta regla es asintótica y no garantiza estabilidad para cualquier sistema o cualquier paso. El tema 27 profundizará estas limitaciones.
25.16 Unidades en las actualizaciones
El análisis dimensional permite comprobar las fórmulas:
(m/s²)·s = m/s
Así, vΔt puede sumarse a una posición y aΔt puede sumarse a una velocidad. En cambio, sumar directamente aceleración a velocidad o usar Δt en milisegundos con unidades SI produce magnitudes incoherentes.
25.17 Validar el paso y el estado
function pasoEulerSeguro(estado, aceleracionMps2, deltaTiempoS) {
const valores = [
estado?.tiempoS,
estado?.posicionM,
estado?.velocidadMps,
aceleracionMps2,
deltaTiempoS
];
if (!valores.every(Number.isFinite)) {
throw new TypeError("Todos los valores deben ser finitos");
}
if (deltaTiempoS <= 0) {
throw new RangeError("deltaTiempoS debe ser positivo");
}
return {
tiempoS: estado.tiempoS + deltaTiempoS,
posicionM: estado.posicionM + estado.velocidadMps * deltaTiempoS,
velocidadMps: estado.velocidadMps + aceleracionMps2 * deltaTiempoS
};
}
console.log(pasoEulerSeguro(
{ tiempoS: 0, posicionM: 1, velocidadMps: 4 },
-2, 0.1
));La validación evita que un NaN se propague por todos los estados o que un paso nulo produzca un bucle que nunca avanza.
25.18 Verificaciones útiles
- Con
Δt=0en una función puramente matemática, el estado no debería cambiar, aunque el bucle de simulación debe rechazar ese paso. - Con velocidad y aceleración nulas, la posición permanece fija.
- Con aceleración nula, Euler debe coincidir con el MRU exacto.
- Después de n pasos fijos, el tiempo debe ser
t₀+nΔtdentro de la tolerancia numérica. - Reducir Δt debe acercar el resultado a la solución conocida en un problema de prueba.
- El estado de entrada no debe cambiar si la interfaz promete inmutabilidad.
- Las componentes independientes deben evolucionar sin interferirse.
25.19 Límites del Euler explícito
Su simplicidad lo vuelve excelente para aprender, crear prototipos y resolver sistemas suficientemente suaves con pasos pequeños. Sin embargo, puede acumular error rápidamente y comportarse mal en oscilaciones, órbitas o sistemas rígidos.
Usar un Δt diminuto puede mejorar la aproximación, pero aumenta el costo y no convierte a Euler en la mejor herramienta para todo problema. La elección del integrador forma parte del diseño de la simulación.
25.20 Errores frecuentes
- Actualizar velocidad antes que posición: eso cambia el método; Euler explícito usa vₙ para calcular xₙ₊₁.
- Olvidar multiplicar por Δt: velocidad y aceleración son tasas, no incrementos por paso.
- Usar milisegundos como segundos: dividir el intervalo del navegador por 1000.
- Mezclar valores nuevos y anteriores: calcular todo el siguiente estado a partir del mismo estado n.
- Esperar exactitud con aceleración constante: la velocidad es exacta, pero la posición no incluye el cambio interno del paso.
- Suponer que un paso pequeño siempre es suficiente: comprobar convergencia y estabilidad.
- Mutar objetos compartidos: copiar los vectores anidados al crear el estado siguiente.
- Avanzar más allá del final: acortar el último paso o declarar la política elegida.
25.21 Ejercicios propuestos
- Aplicá un paso de Euler a x=3 m, v=4 m/s, a=−2 m/s² con Δt=0,25 s.
- Repetí dos pasos del ejercicio anterior y escribí ambos estados.
- Calculá con Euler la posición a 2 s para x₀=0, v₀=0, a=4 m/s² y Δt=1 s. Comparala con la solución exacta.
- Explicá por qué Euler es exacto para la posición de un MRU.
- En dos dimensiones, r=(1,2) m, v=(3,4) m/s y a=(0,−10) m/s². Hallá el estado luego de un paso de 0,1 s.
- Corregí un programa que primero modifica v y luego utiliza esa v para actualizar x, si debe implementar Euler explícito.
- Proponé una prueba que verifique que reducir Δt mejora un lanzamiento con aceleración constante.
- ¿Por qué conviene que
calcularAceleracionreciba el estado completo?
Ver soluciones y explicaciones
x₁=3+4·0,25=4 m,v₁=4−2·0,25=3,5 m/syt₁=t₀+0,25 s.- Primer estado: x=4 m, v=3,5 m/s. Segundo:
x=4,875 m,v=3 m/s. - Euler: luego de dos pasos, x=4 m y v=8 m/s. Exacta:
x=½·4·2²=8 m. El error de posición es −4 m. - En MRU la velocidad y la pendiente de x(t) son constantes; la recta tangente coincide con toda la trayectoria.
- Aplicando Euler:
r₁=(1,3; 2,4) myv₁=(3; 3) m/s. - Guardar
nuevaPosicion=x+v·ΔtynuevaVelocidad=v+a·Δtantes de asignar ambas variables. - Simular la misma duración con Δt, Δt/2 y Δt/4; comparar cada posición final con la analítica y comprobar que el error absoluto disminuye aproximadamente a la mitad.
- Porque la aceleración puede depender del tiempo, posición, velocidad u otras propiedades del estado.
25.22 Ideas para recordar
- Euler aproxima una evolución continua mediante estados separados por Δt.
- Euler explícito usa
xₙ₊₁=xₙ+vₙΔtyvₙ₊₁=vₙ+aₙΔt. - Todos los valores del lado derecho pertenecen al estado anterior.
- El método se aplica componente a componente en varias dimensiones.
- La aceleración se evalúa en el estado actual.
- El error global disminuye aproximadamente en proporción a Δt.
- Comparar con soluciones analíticas y reducir el paso permite verificar resultados.
- Un método sencillo no es necesariamente estable o adecuado para todos los sistemas.
En el próximo tema compararemos Euler semimplícito y Verlet como alternativas de integración.