Modelos Continuos · Tema 35

Comparación de soluciones

Analítica frente a numérica: el protocolo que valida el integrador antes de creerle.

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.

Validación del logístico r = 0,5, T = 10, tol = 0,1.
Método (dt)ErrorVeredicto
Euler dt = 1≈ 1,42No cumple tol.
Euler dt = 0,07≈ 0,1Cumple, caro (140 f).
RK2 dt = 1≈ 0,1Cumple, barato (20 f).
RK4 dt = 1≈ 0,001Sobra (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:

Exacta→Error + costo→Veredicto
  1. 1
    Euler (Tema 30).

    Contra exponencial: overshoot medido y orden 1 firmado.

  2. 2
    RK (Tema 31).

    Podio 1,42/0,10/0,00 con costo 10/20/40 f.

  3. 3
    Paso (Tema 32).

    dt* por método para tol 0,1: el borde óptimo.

  4. 4
    Error (Tema 33).

    Curva error(t) + cociente: convergencia, no suerte.

  5. 5
    Sistemas (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.

EXPERIMENTO 35

Validación en vivo

Logístico · exacta vs tu método · tol 0,10

Los resultados numéricos aparecen debajo.
Error del método0,10
Costo en f20
Veredicto✓ cumple
Rival más baratoRK4 igual

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

  1. Con Euler y dt = 1, ¿pasás tol 0,10? ¿Y tol 1?
  2. Con tol 0,01, ¿qué combinaciones (método, dt) cumplen? ¿La más barata?
  3. Si la banda es gruesa al final pero fina en el pico, ¿el método sirve para alertas?
Ver respuestas sugeridas
  1. No (1,42); sí con tol 1: la tolerancia la pone la pregunta, no el método.
  2. RK2 dt ≤ 0,25 (~80 f) o RK4 dt = 1 (40 f): gana RK4. El orden paga.
  3. 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.