01 · Punto de partida
Manso el sistema, loco el método
El decaimiento dM/dt = −λ·M es lo más manso que hay: cae suave a cero. Pero Euler con dt grande oscila (salta arriba y abajo) y con dt mayor diverge (cada salto más grande). El sistema no cambió: el método se volvió inestable.
La estabilidad numérica no es precisión: es no-explosión. Un dt preciso pero inestable no existe.
- ¿λ·dt está bajo el límite del método?
- ¿La solución oscila donde la exacta es monótona?
- ¿El error se achica o explota al avanzar?
- ¿Achicar dt o cambiar de método lo arregla?
02 · Definición
¿Qué es la estabilidad numérica?
Que el error no se amplifique paso a paso:
Estable
λ·dt < 1: Euler decae monótono como la exacta. El error se comporta.
Oscilante
1 < λ·dt < 2: salta arriba y abajo decayendo. Signo falso, magnitud viva.
Inestable
λ·dt > 2: cada salto más grande. Explosión numérica pura.
El factor (1 − λ·dt) decide: positivo converge, negativo alterna, mayor que 1 en módulo explota.
| dt | Factor 1 − λdt | Historia |
|---|---|---|
| 0,5 | +0,5 (positivo) | Decae suave a cero. |
| 1,5 | −0,5 (alterna) | Oscila decayendo: signo falso. |
| 2,5 | −1,5 (|·| > 1) | Diverge alternando: explosión. |
| RK4 dt = 2,5 | región mayor | Aguanta más: implícitos aún más. |
03 · Anatomía
Factor, límite y remedio
La inestabilidad en tres líneas:
- Factor de amplificación
- Lo que multiplica cada paso: (1 − λ·dt) en Euler. Su módulo debe ser < 1.
- Límite del método
- Euler explícito: λ·dt < 2. RK4 aguanta más; implícitos casi todo.
- Síntoma
- Oscilación donde la exacta es monótona: el primer aviso. Después viene la explosión.
- Remedio
- Achicar dt bajo el límite o cambiar de método (RK, implícito). Afinar el error no sirve si diverge.
Estabilidad del sistema
El destino atrae (Tema 26)
f' < 0: la física vuelve. Propiedad del modelo con dt = 0.
Estabilidad numérica
El método no explota
λ·dt < 2: el programa vuelve. Propiedad del método con dt > 0.
04 · Inestabilidad en el curso
Dónde puede explotar
Cada rigidez esconde un límite:
- 1Decaimiento rápido.
λ grande con dt ingenuo: el caso de manual. Achicar dt.
- 2Resorte rígido.
k grande oscila con Euler explícito: semi-implícito o RK.
- 3SIR con β alto.
Contagio veloz pide dt chico en días: si I oscila, es numérico.
- 4Reacciones rápidas.
Química con escalas separadas (rígida): implícitos.
- 5Difusión fina.
Malla espacial + temporal: el límite ata dt a dx².
05 · Representación en Python
Factor y régimen en dos funciones
En Python, el factor predice y la simulación confirma: si λ·dt > 2, ni hace falta correr.
Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Probá dt = 2,5 con λ = 1 y observá la explosión alternada.
def factor(lam=1.0, dt=0.5):
return 1 - lam * dt
def regimen(lam=1.0, dt=0.5):
f = factor(lam, dt)
if abs(f) >= 1:
return f"inestable ({f:+.2f})"
if f < 0:
return f"oscila decayendo ({f:+.2f})"
return f"estable suave ({f:+.2f})"
for dt in [0.5, 1.5, 2.5]:
print(dt, regimen(1.0, dt))
+0,5 estable · −0,5 oscila · −1,5 inestable: el factor firma antes de simular.
Euler que explota
La historia confirma al factor:
def euler_decae(m0=100.0, lam=1.0, t_final=6.0, dt=0.5):
m, t, hist = m0, 0.0, [(0.0, m0)]
while t < t_final - 1e-9:
m, t = m * (1 - lam * min(dt, t_final - t)), t + min(dt, t_final - t)
hist.append((round(t, 1), round(m, 1)))
return hist
print(euler_decae(dt=2.5)[-3:])
06 · Exploración
Laboratorio: del decaimiento a la explosión
Decaimiento λ con tu dt hasta T = 10 desde M₀ = 100. Dorada: exacta que cae suave. Teal con nodos: Euler. El medidor λ·dt dice el régimen: verde estable, ámbar oscila, rojo diverge. Cruzá el 2 y observá la explosión alternada.
El límite en vivo
dM/dt = −λ·M · Euler(dt) · límite λ·dt = 2
Con λ·dt = 1,50 Euler alterna decayendo: signo falso, magnitud viva.
La exacta nunca oscila: si Euler alterna, el culpable es dt, no el sistema. En divergencia el eje se autoescala y la exacta se aplasta abajo.
Preguntas para explorar
- Con λ = 1 y dt = 0,5, ¿Euler oscila? ¿Qué factor hay?
- Con λ = 2 y dt = 1,5, ¿qué régimen hay? ¿Y con dt = 0,5?
- Si λ·dt = 1,9 estable pero feo, ¿lo aceptás? ¿Qué harías?
Ver respuestas sugeridas
- No: factor +0,5, decae suave. Estable y presentable.
- λ·dt = 3 → diverge; con dt = 0,5 es 1 → borde (alterna sin crecer). Achicar salva.
- No para decidir: oscila decayendo y miente el signo. Bajar dt o pasar a RK.
07 · Comprensión
Confusiones frecuentes
«Si diverge, el sistema es inestable»
No: el decaimiento es estable (f' = −λ). La que diverge es la cuenta con dt pasado. Cambiá dt, no el modelo.
«Oscilar es precisión baja»
Es inestabilidad parcial: el signo alternado es cualitativamente falso aunque la magnitud decaiga. No se promedia: se corrige.
«RK4 no tiene límite»
Sí, más generoso pero existe. Ningún explícito es incondicional: solo los implícitos aguantan casi todo.
«Con dt chico ya estoy»
Falta verificar: rígido con dos escalas pide dt para la rápida aunque te interese la lenta. El límite lo pone λ mayor.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: predecir con el factor
Con λ = 2, clasificá dt = 0,5, 1 y 1,5 sin simular. Después verificá el primero.
for dt in [0.5, 1.0, 1.5]:
f = 1 - 2 * dt
print(dt, round(f, 2))
Ver solución
0,0 · −1,0 · −2,0: estable justo, borde oscilante, divergencia. El factor lo dice todo.
Ejercicio 2: dt máximo estable
¿Cuál es el mayor dt estable con λ = 0,5? ¿Y con λ = 4 (reacción rápida)?
for lam in [0.5, 4.0]:
print(lam, "→ dt <", round(2 / lam, 3))
Ver solución
4,0 y 0,5: la reacción rápida ata el paso. El rígido manda con su λ mayor.
Ejercicio 3: assert que salva
Escribí un Euler que se niegue a correr si λ·dt ≥ 2. Probalo con λ = 1 y dt = 2,5.
Ver una posible respuesta
def euler_seguro(m0, lam, t_final, dt):
assert lam * dt < 2, f"inestable: λ·dt = {lam * dt}"
m, t = m0, 0.0
while t < t_final - 1e-9:
h = min(dt, t_final - t)
m, t = m * (1 - lam * h), t + h
return round(m, 2)
try:
print(euler_seguro(100, 1.0, 6, 2.5))
except AssertionError as e:
print("frenado:", e)
Frena con inestable: λ·dt = 2,5: mejor un assert que una explosión silenciosa.
09 · Síntesis
Ideas para recordar
- Estabilidad numérica = el error no se amplifica: |1 − λ·dt| < 1 en Euler.
- λ·dt < 1 suave, 1–2 oscila decayendo, > 2 diverge alternando.
- Oscilar donde la exacta es monótona es síntoma: corregir dt o método.
- En Python: factor() predice, assert frena, simulación confirma.
- Preciso ≠ estable: el límite se cumple primero, el error después.
En el próximo tema compararemos soluciones: analítica frente a numérica.