Modelos Continuos · Tema 08

Ecuaciones de primer orden

La variación más simple: dx/dt = f(x, t), su solución analítica y su aproximación con Euler.

01 · Punto de partida

Una derivada, una historia

Las ecuaciones de primer orden solo piden la primera derivada: dx/dt = f(x, t). Con eso alcanza para tanques, enfriamientos, crecimientos y decaimientos: la velocidad depende del nivel y quizás del tiempo, pero no de aceleraciones.

Son el caballo de batalla del curso: se entienden con pendientes, se resuelven a mano en los casos lineales y se integran siempre con Euler y Runge-Kutta.

  • ¿La regla usa x, t, ambos o ninguno?
  • ¿Tiene solución cerrada o pedimos ayuda numérica?
  • ¿Qué error comete Euler con mi dt?
  • ¿El equilibrio es atractor o repulsor?

02 · Definición

¿Qué es una EDO de primer orden?

Solo aparece la primera derivada. Tres sabores según qué usa f:

=

Autónoma

f(x): la regla no mira el reloj. Ejemplo: dN/dt = 3 − 0,2·N. El campo de pendientes es fijo.

◷

No autónoma

f(x, t): la regla cambia con el tiempo. Ejemplo: dN/dt = lluvia(t) − k·N. El campo respira.

〜

Lineal

f = a(t)·x + b(t): recta en x. Ejemplo: dN/dt = −k·N + q. Tiene solución con fórmula.

Lineal no significa recta en el tiempo: significa recta en el plano (x, f). La solución N(t) del tanque lineal es una curva que se suaviza, no una recta.

Catálogo mínimo de primer orden.
EDOTipoSolución
dN/dt = qAutónoma linealRecta: N₀ + q·t.
dN/dt = −k·N + qAutónoma linealAcercamiento a q/k.
dP/dt = r·PAutónoma linealExponencial: P₀·e^(r·t).
dN/dt = lluvia(t) − k·NNo autónoma linealIntegral con factor e^(k·t).

03 · Anatomía

Solución analítica y campo de pendientes

La solución tiene dos partes: el régimen que impone la entrada y el transitorio que olvida el inicio:

Solución lineal
N(t) = N* + (N₀ − N*)·e^(−k·t): equilibrio más desvío que decae.
Campo de pendientes
En cada (t, x) un segmentito con pendiente f: las curvas lo siguen como vías.
Equilibrio
f(x*) = 0: horizontal que atrae (k > 0) o repele (r > 0 en P = 0).
Euler
x ← x + f(x, t)·dt: congela la pendiente en cada nodo y salta.

Analítica

La curva exacta

Vale en todo t sin pasos: sirve de referencia para medir el error de cualquier método.

Numérica

La poligonal de Euler

Solo conoce los nodos: entre ellos supone pendiente congelada. Con dt chico casi coincide.

04 · Primer orden en el curso

Casi todo el curso vive aquí

Cada modelo clásico es un caso de primer orden:

dx/dt = f→Exacta o Euler→Curva
  1. 1
    Tanque lineal.

    dN/dt = q − k·N. Exacta conocida: referencia de error.

  2. 2
    Enfriamiento.

    dT/dt = −k·(T − T_amb). Misma forma, otro cero.

  3. 3
    Exponencial.

    dP/dt = r·P. Exacta P₀·e^(r·t): Euler siempre por debajo o por arriba.

  4. 4
    Logístico.

    dP/dt = r·P·(1 − P/K). Primer orden no lineal: sin fórmula simple a mano.

  5. 5
    Con entrada variable.

    dN/dt = q(t) − k·N. Primer orden no autónomo: solo numérico en general.

05 · Representación en Python

Exacta y Euler lado a lado

En Python conviven la fórmula cerrada (cuando existe) y el bucle de Euler (siempre). Compararlas mide el error del método.

Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Achicá dt y mirá cómo el error se achica.

import math


def exacta(q, k, n0, t):
    neq = q / k
    return neq + (n0 - neq) * math.exp(-k * t)


def euler(q, k, n0, t_final, dt):
    n, t = n0, 0.0
    while t < t_final - 1e-9:
        n = n + (q - k * n) * dt
        t += dt
    return n


print("exacta:", round(exacta(3, 0.2, 2, 10), 3))
print("euler :", round(euler(3, 0.2, 2, 10, dt=1.0), 3))

Con dt = 1 el error ronda 0,1: visible pero pequeño. Con dt = 2 crece; con dt = 0,1 casi desaparece.

Medir el error

El error absoluto en el horizonte es la vara del método:

def error(q, k, n0, t_final, dt):
    return abs(exacta(q, k, n0, t_final) - euler(q, k, n0, t_final, dt))


for dt in [2, 1, 0.5, 0.25]:
    print(dt, "→", round(error(3, 0.2, 2, 10, dt), 4))

06 · Exploración

Laboratorio: exacta frente a Euler con tu dt

Tanque lineal con tu q, tu k y tu dt. La dorada es la exacta continua; la teal es Euler con nodos marcados. La banda es el error en cada instante: angostala achicando dt.

EXPERIMENTO 08

El error se ve

dN/dt = q − k · N · exacta vs Euler(dt)

Los resultados numéricos aparecen debajo.
Exacta en T=2014,76
Euler en T=2014,85
Error |exact − Euler|0,09
Nodos21

Con k 0,2 y dt 1 hay 21 nodos y error 0,09.

La poligonal teal corta a la exacta: Euler subestima o sobrestima según el lado del equilibrio. Con dt grande los nodos se separan y el error crece.

Preguntas para explorar

  1. Con dt = 4, ¿Euler queda por arriba o por debajo de la exacta partiendo de N₀ = 2?
  2. Subí k a 0,6 con el mismo dt. ¿El error crece o se mantiene? ¿Por qué?
  3. ¿Qué dt elegirías para error menor que 0,01 con k = 0,2?
Ver respuestas sugeridas
  1. Por arriba al inicio (la pendiente congelada exagera) y converge con escalones: el error se nota en el transitorio.
  2. Crece: más k es más curvatura y la pendiente congelada miente más entre nodos.
  3. dt ≈ 0,25 o menor: el error de Euler es proporcional a dt en este modelo.

07 · Comprensión

Confusiones frecuentes

«Primer orden significa recta»

Orden 1 habla de la derivada mayor, no de la forma: dN/dt = q − k·N da una curva que se suaviza.

«Si hay fórmula, no hace falta Euler»

La fórmula es el patrón de prueba: la necesitamos para validar el integrador que usaremos donde no hay fórmula (logístico, SIR).

«Error chico en T significa dt bueno»

El error puede cancelarse al final y haber mentido en el medio. Mirá la banda completa, no solo el último punto.

«Autónoma significa constante»

Autónoma significa que f no mira el reloj, no que sea fija: 3 − 0,2·N varía con N aunque ignore t.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: clasificar el orden

¿Cuál es de primer orden? Pensalo por la derivada mayor y después verificá con la lista.

casos = {
    "dN/dt = 3 - 0.2*N": 1,
    "d2x/dt2 = -k*x": 2,
    "dP/dt = r*P*(1 - P/K)": 1,
}
for edo, orden in casos.items():
    print(edo, "→ orden", orden)
Ver solución

Primera y tercera son orden 1 (solo primera derivada); la del medio es orden 2 (aceleración). El orden lo manda la derivada mayor, no la cantidad de letras.

Ejercicio 2: exacta a mano

Con q = 4, k = 0,5 y N₀ = 0, ¿cuánto vale N(2)? Calculalo a mano y comprobalo.

import math


def exacta(q, k, n0, t):
    return q / k + (n0 - q / k) * math.exp(-k * t)


print(round(exacta(4, 0.5, 0, 2), 3))
Ver solución

5,057: N* = 8 y en t = 2 recorrió el 63 % del camino. La fórmula evita simular.

Ejercicio 3: barrido de dt

Escribí un barrido que muestre cómo cae el error al achicar dt. Probalo con q = 3, k = 0,2, N₀ = 2, T = 10.

Ver una posible respuesta
import math


def exacta(q, k, n0, t):
    return q / k + (n0 - q / k) * math.exp(-k * t)


def euler(q, k, n0, t_final, dt):
    n, t = n0, 0.0
    while t < t_final - 1e-9:
        n = n + (q - k * n) * dt
        t += dt
    return n


for dt in [2, 1, 0.5, 0.25, 0.1]:
    e = abs(exacta(3, 0.2, 2, 10) - euler(3, 0.2, 2, 10, dt))
    print(dt, "→", round(e, 4))

El error cae casi a la mitad al partir dt a la mitad: Euler es de orden 1. Esa tabla anticipa el Tema 33.

09 · Síntesis

Ideas para recordar

  • Primer orden: dx/dt = f(x, t) + x(0); autónoma, no autónoma, lineal.
  • Lineal con coeficientes fijos tiene exacta N* + (N₀ − N*)·e^(−k·t).
  • Euler congela f en cada nodo: el error crece con dt y con la curvatura k.
  • En Python: exacta() como test y euler() como integrador; error() como vara.
  • La exacta valida el método que luego usaremos donde no hay fórmula.

En el próximo tema subiremos a orden superior: cuando aparecen aceleraciones y oscilaciones.