01 · Punto de partida
La mayoría no tiene fórmula
El tanque lineal y el logístico tienen exacta bonita. El SIR, el resorte forzado, la lluvia real por horas: no. Ahí no se despeja: se integra por pasos. Partir de x₀, evaluar f, avanzar dt, repetir hasta T.
Este tema abre el bloque numérico (28–36): cuándo basta Euler, cuándo conviene Runge-Kutta y cómo medir el error contra una exacta conocida.
- ¿Hay exacta o integro desde el inicio?
- ¿Qué método: Euler simple o RK con etapas?
- ¿Qué dt equilibra error y costo?
- ¿Cómo valido el integrador antes de usarlo?
02 · Definición
¿Qué es resolver numéricamente?
Convertir la EDO en una receta de pasos:
Euler
x ← x + f(x, t)·dt: una evaluación por paso. Simple, orden 1, error ∝ dt.
Runge-Kutta
Prueba f al inicio, al medio y al final y promedia: RK4, orden 4, error ∝ dt⁴.
Exacta testigo
Logístico o tanque como patrón: el error se mide contra ella antes de creer.
El método no cambia la EDO: cambia cómo se recorre. Con el mismo dt, RK4 hace 4 evaluaciones y error muchísimo menor.
| Método (dt = 1) | Evaluaciones | Error |
|---|---|---|
| Euler | 10 | ≈ 1,4 (visible). |
| Punto medio (RK2) | 20 | ≈ 0,1 (chico). |
| RK4 | 40 | ≈ 0,001 (despreciable). |
| Euler dt = 0,1 | 100 | ≈ 0,15 (caro e igual peor). |
03 · Anatomía
Pasos, etapas y costo
El presupuesto numérico tiene tres monedas:
- Paso dt
- Resolución del recorrido: partirlo a la mitad duplica los nodos y parte el error de Euler a la mitad.
- Etapas por paso
- Evaluaciones de f: 1 en Euler, 2 en punto medio, 4 en RK4. Más etapas, mejor pendiente media.
- Costo total
- Pasos × etapas: Euler dt = 0,1 cuesta 100 f; RK4 dt = 1 cuesta 40 f y gana.
- Orden del método
- Exponente del error: 1 en Euler, 2 en punto medio, 4 en RK4. Anticipa el Tema 33.
Euler
Barato por paso, caro por precisión
Para error 0,01 necesita dt ≈ 0,07: 140 pasos. Simple de escribir, costoso de afinar.
RK4
Caro por paso, barato por precisión
Con dt = 1 ya da 0,001: 10 pasos × 4 = 40 f. Más código, menos cómputo.
04 · Cuándo usar cada uno
La escalera del bloque numérico
Este tema abre; los siguientes detallan:
- 1Discretizar (Tema 29).
Malla, nodos y recorte del último paso: el andamio.
- 2Euler (Tema 30).
El integrador mínimo: programarlo dormido.
- 3Runge-Kutta (Tema 31).
Etapas y promedio: precisión sin achicar dt.
- 4Paso, error y estabilidad (32–34).
Elegir dt que equilibre costo, error y no-explosión.
- 5Comparar y acoplar (35–36).
Exacta vs numérica; sistemas juntos.
05 · Representación en Python
Euler y RK4 en veinte líneas
En Python, ambos reciben f, x0, T, dt: la misma firma, distinto interior. La exacta logística los juzga.
Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Achicá dt a 0,5 y mirá cómo Euler se acerca y RK4 ya ni se mueve.
import math
def exacta(t, p0=10.0, r=0.5, k=100.0):
return k / (1 + (k - p0) / p0 * math.exp(-r * t))
def euler(f, x0, t_final, dt):
x, t = x0, 0.0
while t < t_final - 1e-9:
x = x + f(x, t) * dt
t += dt
return x
def rk4(f, x0, t_final, dt):
x, t = x0, 0.0
while t < t_final - 1e-9:
h = min(dt, t_final - t)
k1 = f(x, t)
k2 = f(x + k1 * h / 2, t + h / 2)
k3 = f(x + k2 * h / 2, t + h / 2)
k4 = f(x + k3 * h, t + h)
x = x + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6
t += h
return x
f = lambda p, t: 0.5 * p * (1 - p / 100)
print(round(exacta(10), 2), round(euler(f, 10, 10, 1.0), 2), round(rk4(f, 10, 10, 1.0), 4))
Exacta ≈ 94,3 · Euler ≈ 95,7 (pasa de largo) · RK4 ≈ 94,28 (clava). Mismo dt, otra liga.
Errores que hablan
El error final decide con números, no con fe:
e_euler = abs(exacta(10) - euler(f, 10, 10, 1.0))
e_rk4 = abs(exacta(10) - rk4(f, 10, 10, 1.0))
print(round(e_euler, 3), round(e_rk4, 4))
06 · Exploración
Laboratorio: Euler se pasa, RK4 clava
Logístico r = 0,5, K = 100, P₀ = 10 hasta T = 10 con tu dt. Dorada: exacta. Teal con nodos: Euler (se pasa en la subida). Naranja: RK4 (pegada). Achicá dt y observá que Euler gatea hacia la exacta mientras RK4 ya estaba.
Duelo de integradores
Logístico · exacta vs Euler vs RK4
Con dt 1 Euler erra 1,42 y RK4 0,00 con 4 veces más f por paso.
Euler usa la pendiente del inicio del paso y se pasa en la curva; RK4 promedia cuatro pendientes y dobla con ella.
Preguntas para explorar
- Con dt = 2, ¿Euler se pasa más o menos? ¿RK4 sigue pegada?
- Con r = 1,0 (más curvatura), ¿el error de Euler crece? ¿Y el de RK4?
- ¿Qué dt necesita Euler para el error de RK4 con dt = 1?
Ver respuestas sugeridas
- Más: dt grande exagera la pendiente congelada. RK4 aguanta mucho mejor.
- Sí, notable; RK4 apenas se mueve: la curvatura castiga al que no promedia.
- dt ≈ 0,05–0,1 (100–200 pasos): 10–20 veces más f que RK4. Precisión cara vs barata.
07 · Comprensión
Confusiones frecuentes
«Numérico es aproximado, analítico es verdad»
La exacta también redondea en flotante; y donde no hay exacta, lo numérico es la única verdad disponible. La vara es el error, no el apellido.
«Más pasos siempre mejor»
Hasta el ruido de redondeo y el costo: dt absurdo acumula errores flotantes y tarda. Hay dt óptimo, no mínimo.
«RK4 siempre conviene»
En f barata y suave, sí. Con f ruidosa, con eventos o con código discontinuo, Euler corto y robusto puede ganar.
«Comparo con igual dt»
Igual dt favorece a RK4 en costo (4 f por paso). Lo honesto es igual error o igual cantidad de f.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: un paso a mano
Desde P = 10 con f = 0,5·P·(1 − P/100) y dt = 1, ¿qué dan Euler y el primer k1 de RK4?
f = lambda p: 0.5 * p * (1 - p / 100)
print("euler:", round(10 + f(10) * 1, 2))
print("k1:", round(f(10), 2))
Ver solución
Euler salta a 14,5 con k1 = 4,5: la pendiente del inicio llevada todo el paso. RK4 la matizaría con k2–k4.
Ejercicio 2: costo honesto
Con T = 10 y dt = 1, ¿cuántas f hace Euler y cuántas RK4? ¿Y Euler con dt = 0,1?
print("euler dt=1:", 10, "· rk4 dt=1:", 40, "· euler dt=0.1:", 100)
Ver solución
10 / 40 / 100: RK4 dt = 1 cuesta 4 Euler, pero erra 1000 veces menos. El costo se mide en f, no en pasos.
Ejercicio 3: barrido de dt
Barré dt en Euler y RK4 sobre el logístico y compará errores finales. ¿Quién converge más rápido?
Ver una posible respuesta
import math
def exacta(t, p0=10.0, r=0.5, k=100.0):
return k / (1 + (k - p0) / p0 * math.exp(-r * t))
def euler(f, x0, t_final, dt):
x, t = x0, 0.0
while t < t_final - 1e-9:
x += f(x) * dt
t += dt
return x
def rk4(f, x0, t_final, dt):
x, t = x0, 0.0
while t < t_final - 1e-9:
h = min(dt, t_final - t)
k1 = f(x)
k2 = f(x + k1 * h / 2)
k3 = f(x + k2 * h / 2)
k4 = f(x + k3 * h)
x += h * (k1 + 2 * k2 + 2 * k3 + k4) / 6
t += h
return x
f = lambda p: 0.5 * p * (1 - p / 100)
for dt in [1.0, 0.5, 0.25]:
print(dt, round(abs(exacta(10) - euler(f, 10, 10, dt)), 3), round(abs(exacta(10) - rk4(f, 10, 10, dt)), 5))
Euler parte su error a la mitad; RK4 lo divide por ≈ 16: orden 1 frente a orden 4 en vivo.
09 · Síntesis
Ideas para recordar
- Sin exacta se integra: Euler (1 f, orden 1) o RK (varias f, orden mayor).
- La exacta testigo mide el error antes de creerle al integrador.
- El costo se cuenta en evaluaciones de f, no en pasos.
- En Python: misma firma integrar(f, x0, T, dt) para todos los métodos.
- RK4 con dt = 1 supera a Euler con dt = 0,1 costando menos.
En el próximo tema armaremos el andamio: discretización del tiempo.