Modelos Continuos · Tema 31

Runge-Kutta

Precisión con pasos intermedios: probar la pendiente y promediar.

01 · Punto de partida

Euler mira una vez, RK mira varias

Euler congela f del inicio y salta: si la pendiente cambia en el camino, se pasa. Runge-Kutta prueba f al inicio (k₁), a la mitad (k₂, k₃) y al final (k₄) y promedia: el paso dobla con la curva en vez de seguir la tangente vieja.

El precio son más evaluaciones por paso; el premio es error muchísimo menor con el mismo dt.

  • ¿Cuántas etapas pruebo por paso (1, 2, 4)?
  • ¿Cómo promedio k₁–k₄ (pesos)?
  • ¿Qué orden gano (1, 2, 4)?
  • ¿El costo extra se paga con menos pasos?

02 · Definición

¿Qué son los métodos de Runge-Kutta?

La escalera de promedios:

1

Euler = RK1

Una etapa k₁: x + k₁·dt. Orden 1, error ∝ dt.

2

Punto medio = RK2

k₁ al inicio, k₂ al medio con k₁: x + k₂·dt. Orden 2, error ∝ dt².

4

Clásico = RK4

k₁, k₂, k₃, k₄ promediados 1-2-2-1: orden 4, error ∝ dt⁴.

Orden 4 significa: partir dt a la mitad divide el error por 16. Por eso RK4 con dt = 1 supera a Euler con dt = 0,1.

Logístico r = 0,5, K = 100, P₀ = 10, T = 10, dt = 1.
Métodof por pasoError
Euler (RK1)1 (10 total)≈ 1,4.
Punto medio (RK2)2 (20 total)≈ 0,1.
RK44 (40 total)≈ 0,001.
Euler dt = 0,11 (100 total)≈ 0,15 (peor y más caro).

03 · Anatomía

Etapas, pesos y orden

Cómo se construye el promedio:

Etapa kᵢ
Una evaluación de f en un punto de prueba: inicio, medio con k₁, medio con k₂, final con k₃.
Pesos 1-2-2-1
RK4 pondera el medio doble: k₁ + 2k₂ + 2k₃ + k₄ sobre 6. El medio manda.
Orden p
Error ∝ dt^p: partir dt divide el error por 2^p (2, 4, 16). Anticipa el Tema 33.
Costo honesto
Pasos × etapas: comparar a igual f totales, no a igual dt.

RK2 (punto medio)

Barato y bueno

2 f por paso, orden 2: con dt = 0,5 ya da 0,03. El caballo de batalla diario.

RK4 (clásico)

Precisión de referencia

4 f por paso, orden 4: con dt = 1 da 0,001. El patrón contra el que se mide todo.

04 · RK en el curso

Dónde el promedio paga

Cada curva sensible agradece etapas:

k₁…k₄→Promedio→Error ∝ dt⁴
  1. 1
    Logístico.

    Curva que se dobla: RK2/RK4 la siguen, Euler se pasa.

  2. 2
    Resorte.

    Oscilación: RK conserva amplitud y fase mucho mejor.

  3. 3
    SIR.

    Pico agudo: RK ubica altura y día con menos pasos.

  4. 4
    Exponencial.

    Despegue: RK4 casi clava con dt = 1.

  5. 5
    Sistemas.

    Todas las etapas avanzan el vector junto: kᵢ son vectores.

05 · Representación en Python

RK2 y RK4 genéricos

En Python, los tres comparten firma metodo(f, x0, T, dt): solo cambia el interior del paso.

Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Cambiá dt a 0,5 y observá que RK4 ya no 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 rk2(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)
        x, t = x + k2 * h, t + h
    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, t = 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(rk2(f, 10, 10, 1.0), 2), round(rk4(f, 10, 10, 1.0), 4))

Exacta ≈ 94,28 · RK2 ≈ 94,18 · RK4 ≈ 94,277: el promedio paga.

Errores comparados

Los tres errores en una línea deciden:

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


ex = exacta(10)
for nombre, m in [("euler", euler), ("rk2", rk2), ("rk4", rk4)]:
    print(nombre, round(abs(ex - m(f, 10, 10, 1.0)), 4))

06 · Exploración

Laboratorio: el podio Euler / RK2 / RK4

Logístico con tu dt y tu r (P₀ = 10, K = 100, T = 10). Dorada: exacta. Teal: Euler (se pasa). Naranja: RK2 (casi). Blanca fina: RK4 (pegada). Bajá dt y mirá el podio colapsar: con dt = 0,25 hasta Euler se porta.

EXPERIMENTO 31

Tres métodos, un dt

Logístico · exacta vs Euler vs RK2 vs RK4

Los resultados numéricos aparecen debajo.
Error Euler1,42
Error RK20,10
Error RK40,00
Costo f10 / 20 / 40

Con dt 1: Euler 1,42 · RK2 0,10 · RK4 0,00.

El resaltado engrosa un método para seguirlo entre los demás. RK2 ya gana por 14× con solo el doble de f.

Preguntas para explorar

  1. Con dt = 2, ¿RK2 sigue cerca? ¿Euler se dispara?
  2. Con r = 1,0, ¿los errores crecen parejo o Euler sufre más?
  3. ¿Qué método elegirías con f cara (1 s por evaluación) y error 0,1?
Ver respuestas sugeridas
  1. RK2 aguanta, Euler se dispara: el promedio protege del paso grande.
  2. Euler sufre más: la curvatura castiga al que no promedia.
  3. RK2 con dt = 1 (20 f): Euler necesitaría ~100 f para ese error. Lo barato sale caro.

07 · Comprensión

Confusiones frecuentes

«RK4 es exacto»

No: es preciso (error ∝ dt⁴), no exacto. Con dt = 2 también se nota; con dt = 1 casi no.

«Más etapas siempre ganan»

Solo con f suave: con saltos o ruido, las etapas prueban realidades distintas y el promedio confunde.

«RK2 es la mitad de RK4»

Es orden 2 vs 4: partir dt divide por 4 vs por 16. En dt chico la brecha se agranda, no se achica.

«Comparo errores con igual dt»

Igual dt es desigual costo (1/2/4 f). Lo honesto: igual f totales o igual error pedido.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: un paso RK2 a mano

Desde P = 10 con f = 0,5·P·(1 − P/100) y dt = 1, calculá k₁, k₂ y el salto RK2.

f = lambda p: 0.5 * p * (1 - p / 100)
k1 = f(10)
k2 = f(10 + k1 / 2)
print(round(k1, 2), round(k2, 2), round(10 + k2, 2))
Ver solución

k₁ = 4,5, k₂ ≈ 5,49, salto a 15,49: el promedio ya huele la subida (Euler iba a 14,5).

Ejercicio 2: podio con números

Calculá los tres errores finales con dt = 1 en el logístico (r = 0,5, T = 10). ¿El podio cierra?

import math


def exacta(t):
    return 100 / (1 + 9 * math.exp(-0.5 * t))
Ver solución

Usá las funciones del bloque Python (euler, rk2, rk4): errores ≈ 1,42 · 0,10 · 0,00. Podio: Euler lejos, RK2 cerca, RK4 pegada.

Ejercicio 3: orden en vivo

Partí dt de 1 a 0,5 en los tres y medí por cuánto se divide cada error. ¿Da 2, 4 y 16?

Ver una posible respuesta
f2 = lambda p, t: 0.5 * p * (1 - p / 100)
for dt in [1.0, 0.5]:
    ee = abs(exacta(10) - euler(f2, 10, 10, dt))
    e2 = abs(exacta(10) - rk2(f2, 10, 10, dt))
    e4 = abs(exacta(10) - rk4(f2, 10, 10, dt))
    print(dt, round(ee, 3), round(e2, 4), round(e4, 6))

Con f2 de dos argumentos: Euler ÷2, RK2 ÷4, RK4 ÷16. Los órdenes firman en vivo.

09 · Síntesis

Ideas para recordar

  • RK2 promedia inicio y medio (orden 2); RK4 promedia 1-2-2-1 (orden 4).
  • Partir dt divide el error por 2 (Euler), 4 (RK2) o 16 (RK4).
  • El costo se cuenta en f: 1/2/4 por paso. Comparar a igual f.
  • En Python: misma firma para los tres; kᵢ vectoriales en sistemas.
  • Con f suave RK gana lejos; con saltos, Euler corto es más robusto.

En el próximo tema negociaremos el tamaño del paso: error contra costo.