01 · Punto de partida
La exacta es el juez, no el rival
Antes de soltar el integrador sobre el SIR (sin exacta), hay que probarlo donde sí la hay: logístico, tanque, exponencial. Si con dt = 1 no reproduce la exacta con error ≤ tolerancia, el bug está en el paso, no en el modelo. Comparar es validar.
El protocolo tiene tres pasos: exacta testigo, barrido de dt y veredicto con costo. Este tema lo deja instalado para todo el resto del curso.
- ¿Contra qué exacta comparo (testigo)?
- ¿Qué error y qué costo tiene cada método?
- ¿El error converge con el orden esperado?
- ¿El elegido cumple la tolerancia siendo estable?
02 · Definición
¿Qué es comparar soluciones?
El ritual de validación en tres actos:
Testigo
Exacta conocida del mismo palo: logístico para curvas S, tanque para convergencias.
Error
|numérica − exacta| en T y en curva: final para el número, banda para la forma.
Veredicto
Cumple tol + converge con su orden + estable + costo aceptado: recién ahí se usa.
Las cuatro condiciones son conjuntas: precisa pero inestable no vale; estable pero fuera de tol no vale; sin costo no se decide.
| Método (dt) | Error | Veredicto |
|---|---|---|
| Euler dt = 1 | ≈ 1,42 | No cumple tol. |
| Euler dt = 0,07 | ≈ 0,1 | Cumple, caro (140 f). |
| RK2 dt = 1 | ≈ 0,1 | Cumple, barato (20 f). |
| RK4 dt = 1 | ≈ 0,001 | Sobra (40 f). |
03 · Anatomía
Testigo, banda y convergencia
Comparar bien pide tres miradas:
- Testigo del mismo palo
- Curva S → logístico; convergencia → tanque; joroba → SIR no tiene: usar logístico igual.
- Banda error(t)
- Dónde duele, no solo cuánto al final: la subida miente, el techo perdona.
- Convergencia del cociente
- Partir dt y verificar 2/4/16: si no converge, hay bug o evento.
- Costo en f
- Pasos × etapas: el veredicto incluye la factura.
Comparación honesta
Mismo testigo, mismo T, costo visible
Euler, RK2 y RK4 contra la misma exacta con sus f contadas: el podio es reproducible.
Comparación trucha
Distinto T, sin costo, solo final
El final puede cancelar errores y el dt grande esconde la banda. Veredicto de cartón.
04 · Comparar en el curso
El ritual antes de cada estreno
Cada método nuevo debutó contra una exacta:
- 1Euler (Tema 30).
Contra exponencial: overshoot medido y orden 1 firmado.
- 2RK (Tema 31).
Podio 1,42/0,10/0,00 con costo 10/20/40 f.
- 3Paso (Tema 32).
dt* por método para tol 0,1: el borde óptimo.
- 4Error (Tema 33).
Curva error(t) + cociente: convergencia, no suerte.
- 5Sistemas (Tema 36).
Sin exacta: convergencia entre dts + conservación como testigo.
05 · Representación en Python
Validador en una función
En Python, validar es una función que devuelve error, cociente y veredicto: el ritual automatizado para cada método nuevo.
Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Cambiá la tolerancia y observá qué métodos pasan.
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:
h = min(dt, t_final - t)
x, t = x + f(x, t) * h, t + h
return x
def rk2(f, x0, t_final, dt):
x, t = x0, 0.0
while t < t_final - 1e-9:
h = min(dt, t_final - t)
x, t = x + f(x + f(x, t) * h / 2, t + h / 2) * h, t + h
return x
f = lambda p, t: 0.5 * p * (1 - p / 100)
ex = exacta(10)
for nombre, m in [("euler", euler), ("rk2", rk2)]:
print(nombre, round(abs(ex - m(f, 10, 10, 1.0)), 3))
euler ≈ 1,42 · rk2 ≈ 0,10: con tol 0,1 pasa RK2 y Euler queda afuera.
Veredicto automático
La tolerancia decide sin discusiones:
def veredicto(metodo, tol=0.1):
e = abs(ex - metodo(f, 10, 10, 1.0))
return f"error {e:.3f} → {'✓ cumple' if e <= tol else '✗ no cumple'}"
print("euler:", veredicto(euler))
print("rk2:", veredicto(rk2))
06 · Exploración
Laboratorio: elegir con números
Logístico con tu método (Euler/RK2/RK4), tu dt y tu r (P₀ = 10, K = 100, T = 10). Dorada: exacta. Color: tu método con nodos. La banda sombreada es el error. La línea de tolerancia dice si pasás: movela y observá quién queda adentro.
Validación en vivo
Logístico · exacta vs tu método · tol 0,10
RK2 con dt 1 erra 0,10 con 20 f: cumple justo.
La banda entre exacta y método es el error en cada t: si se ensancha en la subida y se cierra en el techo, es convergencia sana.
Preguntas para explorar
- Con Euler y dt = 1, ¿pasás tol 0,10? ¿Y tol 1?
- Con tol 0,01, ¿qué combinaciones (método, dt) cumplen? ¿La más barata?
- Si la banda es gruesa al final pero fina en el pico, ¿el método sirve para alertas?
Ver respuestas sugeridas
- No (1,42); sí con tol 1: la tolerancia la pone la pregunta, no el método.
- RK2 dt ≤ 0,25 (~80 f) o RK4 dt = 1 (40 f): gana RK4. El orden paga.
- No: para picos se valida en el pico, no en T. La banda dice dónde duele.
07 · Comprensión
Confusiones frecuentes
«Validé una vez, vale siempre»
Vale para ese testigo y ese rango: cambiar r, T o la forma reabre el ritual. La validación tiene fecha de vencimiento.
«Error final chico es suficiente»
Solo si la banda es sana: cancelaciones pueden regalar un final. Mirar error(t) es obligatorio.
«Sin exacta no se valida»
Se valida por convergencia (dt vs dt/2) y conservación (S + I + R): dos testigos sustitutos.
«El más preciso siempre gana»
Gana el que cumple tol con menos f siendo estable: RK4 sobrado puede perder contra RK2 justo.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: veredicto a mano
Con errores Euler 1,42, RK2 0,10 y RK4 0,001, ¿quiénes cumplen tol 0,1? ¿Y tol 0,01?
errores = {"euler": 1.42, "rk2": 0.10, "rk4": 0.001}
for tol in [0.1, 0.01]:
print(tol, [m for m, e in errores.items() if e <= tol])
Ver solución
tol 0,1: rk2 y rk4; tol 0,01: solo rk4. La tolerancia arma el podio.
Ejercicio 2: rival más barato
Con costos Euler-140 (dt 0,07), RK2-20 (dt 1) y RK4-40 (dt 1) para tol 0,1, ¿quién gana?
costos = {"euler": 140, "rk2": 20, "rk4": 40}
print(min(costos, key=costos.get))
Ver solución
rk2 con 20 f: cumple justo y barato. RK4 sobra, Euler derrocha.
Ejercicio 3: validador completo
Escribí validar(metodo, tol) que devuelva error, costo y veredicto. Probalo con Euler y RK2.
Ver una posible respuesta
def validar(metodo, etapas, tol=0.1, dt=1.0, t_final=10.0):
e = abs(ex - metodo(f, 10, t_final, dt))
costo = int(t_final / dt) * etapas
return round(e, 4), costo, "cumple" if e <= tol else "no cumple"
print(validar(euler, 1))
print(validar(rk2, 2))
Euler (1,42, 10, no cumple); RK2 (0,10, 20, cumple): el ritual en una línea por método.
09 · Síntesis
Ideas para recordar
- Validar = testigo + error + convergencia + costo + estabilidad: las cinco o nada.
- La tolerancia la pone la pregunta; el método más barato que cumple gana.
- En Python: validador(metodo, tol) como test de regresión en cada cambio.
- Sin exacta: convergencia dt/dt/2 + conservación como testigos.
- La banda error(t) dice dónde duele: validar el final solo no alcanza.
En el próximo tema acoplaremos todo: simulación de sistemas con varios estados juntos.