Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

No14 - Programación Diferencial Pt4

Programación Diferenciable: Métodos Reverse Pt2

Fecha: 08/06/2026

Autores: Felipe Cignoli (@fcignoli), Martin Sinnona @martinsinnona, Noé Hsueh @noehsueh

Repaso de la clase anterior: Método del adjunto discreto

Supongamos que la solución discreta del problema se escribe como

U=(u1,,uM)RnM.U=(u_1,\ldots,u_M)\in \mathbb{R}^{nM}.

La trayectoria discreta no es una variable libre. Está determinada por un conjunto de ecuaciones algebraicas que escribimos como

G(U,θ)=0.G(U,\theta)=0.

Aquí θ\theta representa los parámetros del modelo. La función de costo que queremos derivar es

L=L(U,θ).L=L(U,\theta).

Como UU depende implícitamente de θ\theta, la derivada total de LL es

dLdθ=LUUθ+Lθ.\frac{dL}{d\theta} = \frac{\partial L}{\partial U}\frac{\partial U}{\partial \theta} + \frac{\partial L}{\partial \theta}.

El término difícil es U/θ\partial U/\partial\theta. Ese término mide cómo cambia toda la trayectoria numérica cuando cambiamos el parámetro θ\theta.

Para eliminarlo, derivamos la restricción G(U,θ)=0G(U,\theta)=0 respecto de θ\theta. Se obtiene

0=dGdθ=GUUθ+Gθ.0= \frac{dG}{d\theta} = \frac{\partial G}{\partial U}\frac{\partial U}{\partial \theta} + \frac{\partial G}{\partial \theta}.

Si G/U\partial G/\partial U es invertible, entonces

Uθ=(GU)1Gθ.\frac{\partial U}{\partial \theta} = - \left(\frac{\partial G}{\partial U}\right)^{-1} \frac{\partial G}{\partial \theta}.

Reemplazando en la derivada de LL, queda

dLdθ=LU(GU)1Gθ+Lθ.\frac{dL}{d\theta} = - \frac{\partial L}{\partial U} \left(\frac{\partial G}{\partial U}\right)^{-1} \frac{\partial G}{\partial \theta} + \frac{\partial L}{\partial \theta}.

El método del adjunto consiste en definir una variable auxiliar λ\lambda tal que

(GU)Tλ=(LU)T.\left(\frac{\partial G}{\partial U}\right)^T\lambda = \left(\frac{\partial L}{\partial U}\right)^T.

Con esta definición, la derivada total queda

dLdθ=λTGθ+Lθ\boxed{ \frac{dL}{d\theta} = - \lambda^T\frac{\partial G}{\partial \theta} + \frac{\partial L}{\partial \theta} }

Esta expresión permite calcular el gradiente sin construir explícitamente U/θ\partial U/\partial\theta.

Ejemplo: solver lineal explícito

Consideremos una ecuación diferencial de la forma

dudt=f(u,θ,t).\frac{du}{dt}=f(u,\theta,t).

En el caso lineal, podemos escribir

f(u,θ,t)=A(θ,t)u.f(u,\theta,t)=A(\theta,t)u.

Usando Euler explícito,

uj+1ujΔtj=f(uj,θ,tj).\frac{u_{j+1}-u_j}{\Delta t_j}=f(u_j,\theta,t_j).

Por lo tanto,

uj+1=uj+Δtjf(uj,θ,tj).u_{j+1}=u_j+\Delta t_j f(u_j,\theta,t_j).

En un problema lineal, esto puede escribirse como

uj+1=Aj(θ)uj+bj(θ).u_{j+1}=A_j(\theta)u_j+b_j(\theta).

En esta notación, AjA_j representa la matriz de avance del paso temporal jj. Si no hay término inhomogéneo, entonces bj=0b_j=0.

El residuo discreto de cada paso es

gj(U,θ)=uj+1Aj(θ)ujbj(θ)=0.g_j(U,\theta)=u_{j+1}-A_j(\theta)u_j-b_j(\theta)=0.

Apilando todos los pasos temporales, el sistema completo puede escribirse como

G(U,θ)A(θ)UB(θ)=0.G(U,\theta)\equiv \mathcal{A}(\theta)U-B(\theta)=0.

La matriz A\mathcal{A} tiene estructura triangular por bloques. Esquemáticamente,

(I000A0I000A1I0000AM1I)(u0u1u2uM)=(u0inib0b1bM1).\begin{pmatrix} I & 0 & 0 & \cdots & 0 \\ -A_0 & I & 0 & \cdots & 0 \\ 0 & -A_1 & I & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & -A_{M-1} & I \end{pmatrix} \begin{pmatrix} u_0 \\ u_1 \\ u_2 \\ \vdots \\ u_M \end{pmatrix} = \begin{pmatrix} u_0^{\mathrm{ini}} \\ b_0 \\ b_1 \\ \vdots \\ b_{M-1} \end{pmatrix}.

Con esta notación,

Gθ=AθUBθ.\frac{\partial G}{\partial \theta} = \frac{\partial \mathcal{A}}{\partial\theta}U - \frac{\partial B}{\partial\theta}.

Entonces el gradiente se calcula como

dLdθ=λT(AθUBθ)+Lθ.\frac{dL}{d\theta} = - \lambda^T \left( \frac{\partial \mathcal{A}}{\partial\theta}U - \frac{\partial B}{\partial\theta} \right) + \frac{\partial L}{\partial\theta}.

La matriz que aparece en la ecuación adjunta es AT\mathcal{A}^T. Por eso, aunque el problema directo se resuelve hacia adelante en el tiempo, el problema adjunto se resuelve hacia atrás.

Ejemplo de función de costo

Una función de costo típica para comparar la simulación con datos observados es

L(U,θ)=j=1Mwjujujobs22.L(U,\theta)= \sum_{j=1}^{M} w_j \left\|u_j-u_j^{\mathrm{obs}}\right\|_2^2.

Si se usa un factor 1/21/2 delante de la norma cuadrática, la derivada queda sin el factor 2. Equivalentemente, ese factor puede absorberse en los pesos wjw_j.

Con esa convención, el término fuente de la ecuación adjunta es

Luj=wj(ujujobs).\frac{\partial L}{\partial u_j} = w_j\left(u_j-u_j^{\mathrm{obs}}\right).

La condición final para el adjunto es

λM=wM(uMuMobs).\lambda_M = w_M\left(u_M-u_M^{\mathrm{obs}}\right).

La recurrencia hacia atrás es

λj=AjTλj+1+wj(ujujobs),j=M1,,1.\lambda_j = A_j^T\lambda_{j+1} + w_j\left(u_j-u_j^{\mathrm{obs}}\right), \qquad j=M-1,\ldots,1.

Esta ecuación se resuelve en modo reverso. Primero se calcula y se guarda la trayectoria directa u0,u1,,uMu_0,u_1,\ldots,u_M. Luego se calcula λM\lambda_M. Finalmente se propaga λj\lambda_j hacia atrás.

Algoritmo práctico

El procedimiento práctico es el siguiente.

  1. Resolver el problema directo hacia adelante en el tiempo.

  2. Guardar la trayectoria uju_j.

  3. Calcular la condición final del adjunto a partir de la función de costo.

  4. Resolver la ecuación adjunta hacia atrás en el tiempo.

  5. Usar λ\lambda para calcular el gradiente respecto de los parámetros.

Comentarios conceptuales

El adjunto discreto evita calcular una sensibilidad distinta para cada parámetro. Esto es especialmente útil cuando hay muchos parámetros y una única función de costo escalar.

Aunque la ecuación diferencial original sea no lineal, la ecuación para λ\lambda es lineal en λ\lambda. La linealidad aparece porque el adjunto se obtiene al linearizar alrededor de la trayectoria directa ya calculada.

En muchos casos, el método del adjunto discreto es equivalente a hacer backpropagation sobre el solver numérico. Por eso se dice que el adjunto se resuelve en modo reverso.

Método del Adjunto Continuo

Consideremos una ODE de primer orden dada por

dudt=f(u,θ,t)\frac{du}{dt} = f(u,\theta,t)

sujeta a la condición inicial u(t0)=u0u(t_0)=u_0, donde uRnu \in \mathbb{R}^n es el vector solución desconocido de la ODE, f:Rn×Rp×RRnf:\mathbb{R}^n \times \mathbb{R}^p \times \mathbb{R} \to \mathbb{R}^n es una función que depende de: el estado uu, θRp\theta \in \mathbb{R}^p es un vector de parámetros, y t[t0,t1]t \in [t_0,t_1] se refiere al tiempo. Aquí, nn denota el tamaño de la ODE y pp el número de parámetros. Resolver la ODE implica obtener u(t)u(t), que depende de θ\theta. En general no es posible obtener una solución explícita de uu (salvo en casos lineales o muy particulares), por lo que debemos resolverla numéricamente.

Recordemos que queremos obtener θ\theta (donde θ\theta pueden ser los parámetros de una red o, en problemas inversos, coeficientes de ecuaciones diferenciales). De esta forma, nos interesa generalmente dLdθ\frac{dL}{d\theta}.

Para ello, veamos qué es LL. Podemos escribir el término de la loss de forma general como una integral[1]:

L(u(,θ);θ)=t0t1h(u(τ;θ),θ,τ)dτL(u(\cdot, \theta);\theta)=\int_{t_0}^{t_1} h(u(\tau;\theta),\theta,\tau)\,d\tau

donde hh es una función de costo puntual (evaluada en cada instante τ\tau).

Ahora, derivemos (25) con respecto de θ\theta usando la regla de la cadena (notar que hh depende de θ\theta tanto de forma directa como a través de u(τ;θ)u(\tau;\theta)):

dLdθ=t0t1(hθ+huuθs(t))dt.\frac{dL}{d\theta} = \int_{t_0}^{t_1} \left( \frac{\partial h}{\partial \theta} + \frac{\partial h}{\partial u} \underbrace{{\color{red}\frac{\partial u}{\partial\theta}}}_{{\color{red}s(t)}} \right) dt.

En (26) notamos que aparece un VJP[2] hus(t)\frac{\partial h}{\partial u}\,{\color{red}s(t)}, con sensibilidad s(t)=uθRn×p{\color{red}s(t)} = \frac{\partial u}{\partial \theta} \in \mathbb{R}^{n\times p}[3]. Como en el método discreto, la idea del método adjunto consiste en aprovechar esta estructura para introducir una nueva variable (adjunto λ{\color{blue}\lambda}) que nos permita evitar calcular el jacobiano s(t){\color{red}s(t)}.

¿Por qué es costoso s(t){\color{red}s(t)}? Es una matriz de n×pn\times p y, como veremos, satisface su propia ODE. Cuando pp es grande (por ejemplo, los parámetros de una red), esto se vuelve prohibitivo, y de ahí la motivación del método adjunto.

Notemos que la sensibilidad tiene su ecuación diferencial asociada:

dsdt=fus+fθ\frac{ds}{dt} = \frac{\partial f}{\partial u} s + \frac{\partial f}{\partial \theta}

Reordenamos los términos para dejarla igualada a cero:

[dsdt=fus+fθ]dsdtfusfθ=0\left[ \frac{ds}{dt} = \frac{\partial f}{\partial u} s + \frac{\partial f}{\partial \theta} \right] \Rightarrow \frac{ds}{dt} - \frac{\partial f}{\partial u} s - \frac{\partial f}{\partial \theta} = 0

Esta expresión es cero para cualquier instante de tiempo, así que podemos multiplicarla por λ(t){\color{blue}\lambda(t)^\top} e integrarla, y va a seguir siendo cero:

t0t1λ(τ)[dsdtfusfθ]dτ=0λ(t):[t0,t1]Rn\begin{align*} \Rightarrow \int_{t_0}^{t_1} {\color{blue}\lambda(\tau)^\top} \left[ \frac{d{\color{red}s}}{dt} - \frac{\partial f}{\partial u} {\color{red}s} - \frac{\partial f}{\partial \theta} \right] d\tau &= 0\quad \forall\, {\color{blue}\lambda(t)}:[t_0, t_1] \mapsto \mathbb{R}^n \end{align*}

Recordemos que el objetivo ahora es eliminar la sensibilidad s(t){\color{red}s(t)}. Primero vamos a usar integración por partes sobre λdsdt{\color{blue}\lambda^\top} \frac{d{\color{red}s}}{dt} para trasladar la derivada temporal de s{\color{red}s} hacia λ{\color{blue}\lambda}, y luego reemplazamos en (29).

0=t0t1[  λdsdtaplicamos partes    λfus    λfθ  ]dτ=λst0t1  t0t1dλdtsdτpartes    t0t1λfusdτ    t0t1λfθdτ=λ(t1)s(t1)frontera con s(t0)=0  +  t0t1dλdtλfucoeficiente de s  sdτ    t0t1λfθdτλ(t)\begin{align*} 0 &= \int_{t_0}^{t_1}\Bigg[\; \overbrace{{\color{olive}\lambda^\top\,\frac{d{s}}{dt}}}^{\textstyle\text{aplicamos partes}} \;-\;{\color{black}\lambda^\top}\,\frac{\partial f}{\partial u}\,{\color{black}s} \;-\;{\color{black}\lambda^\top}\,\frac{\partial f}{\partial \theta}\;\Bigg]\,d\tau \\[1.4em] &= \underbrace{{\color{olive}\left.{\color{black}\lambda^\top}{s}\,\right|_{t_0}^{t_1} \;-\int_{t_0}^{t_1}\frac{d{\lambda^\top}}{dt}\,{s}\,d\tau}}_{\text{partes}} \;-\;\int_{t_0}^{t_1}{\lambda^\top}\,\frac{\partial f}{\partial u}\,{s}\,d\tau \;-\;\int_{t_0}^{t_1}{\lambda^\top}\,\frac{\partial f}{\partial \theta}\,d\tau \\[1.4em] &= \underbrace{{\lambda(t_1)^\top}\,{s(t_1)}}_{\substack{\text{frontera con }{s(t_0)}=0}} \;+\;\int_{t_0}^{t_1}\underbrace{{\color{orange}\boxed{-\dfrac{d{\lambda^\top}}{dt}-{\lambda^\top}\,\dfrac{\partial f}{\partial u}}}}_{\text{coeficiente de }{\color{red}s}}\;{\color{red}s}\,d\tau \;-\;\int_{t_0}^{t_1}{\lambda^\top}\,\frac{\partial f}{\partial \theta}\,d\tau \qquad \forall\,{\color{blue}\lambda(t)} \end{align*}

Notar que λst0t1=λ(t1)s(t1)λ(t0)s(t0)\left. {\lambda^\top}{s} \right|_{t_0}^{t_1} = {\lambda(t_1)^\top}{s(t_1)}-{\lambda(t_0)^\top}{s(t_0)}. En general, la condición inicial no depende de θ\theta, por lo que du0dθ=0\frac{du_0}{d\theta}=0. Luego, s(t0)=du0dθ=0λst0t1=λ(t1)s(t1){s(t_0)}=\frac{d u_0}{d \theta} = 0 \Rightarrow \left. {\lambda^\top}{s} \right|_{t_0}^{t_1} = {\lambda(t_1)^\top}{s(t_1)}.

Y recordemos que en la ecuación (26) teníamos:

dLdθ=t0t1hus+hθdτ\frac{dL}{d\theta}= \int_{t_0}^{t_1} {\color{orange} \frac{\partial h}{\partial u}{\color{red}s} }+ \frac{\partial h}{\partial \theta} \, d\tau

Como (31) vale λ(t)\forall\, {\color{blue}\lambda(t)}, podemos elegir λ(t){\color{blue}\lambda(t)} de forma inteligente. Seleccionamos λ(t){\color{blue}\lambda(t)} tal que el coeficiente de s{\color{red}s} coincida con hu\frac{\partial h}{\partial u}:

dλdtλfu=hu{ -\frac{d \lambda^\top}{dt} -\lambda ^\top \frac{\partial f}{\partial u} } = \frac{\partial h}{\partial u}

Notemos que (33) es una ecuación diferencial para λ(τ){\color{blue}\lambda(\tau)}; necesitamos una condición para resolverla. Tomemos λ(t1)=0{\color{blue}\lambda(t_1)=0} como condición final. Sustituyendo ambas elecciones en (31):

0=λ(t1)=0s(t1)+t0t1husdτt0t1λfθdτt0t1husdτ=t0t1λfθdτ\begin{align*} 0 &= {\color{blue}\underbrace{\lambda(t_1)^\top}_{=\,0}}\, {\color{red}s(t_1)} + \int_{t_0}^{t_1} \frac{\partial h}{\partial u}{\color{red}s} \, d\tau - \int_{t_0}^{t_1} {\color{blue}\lambda^\top} \frac{\partial f}{\partial \theta} \, d\tau \\ &\Rightarrow \int_{t_0}^{t_1} \frac{\partial h}{\partial u}{\color{red}s} \, d\tau = \int_{t_0}^{t_1} {\color{blue}\lambda^\top} \frac{\partial f}{\partial \theta} \, d\tau \end{align*}

Luego, reemplazamos en (32) y obtenemos el gradiente, ya sin la sensibilidad s{\color{red}s}:

dLdθ=t0t1λfθ+hθdτ\frac{dL}{d\theta}= \int_{t_0}^{t_1} {\color{blue}\lambda^\top} \frac{\partial f}{\partial \theta} + \frac{\partial h}{\partial \theta} \,\, d\tau

Finalmente, transponiendo (33) obtenemos la forma estándar de la ecuación adjunta

dλdt=(fu)λ(hu),λ(t1)=0.\frac{d{\color{blue}\lambda}}{dt} = - \left(\frac{\partial f}{\partial u}\right)^\top {\color{blue}\lambda} - \left(\frac{\partial h}{\partial u}\right)^\top, \qquad {\color{blue}\lambda(t_1)=0}.
Observación: otra forma de verlo (operadores adjuntos)

Consideremos el producto interno entre funciones f,g=t0t1f(t)g(t)dt\langle f, g \rangle = \int_{t_0}^{t_1} f(t)^\top g(t)\, dt.

Definamos el residuo de la ecuación de sensibilidad:

r(t)=dsdtfusfθr(t) = \frac{ds}{dt} - \frac{\partial f}{\partial u}s - \frac{\partial f}{\partial\theta}

Luego (29) es simplemente un producto interno nulo:

λ,r=0λ.\langle \lambda, r\rangle = 0 \quad \forall\lambda.

Podemos ver todo esto como una manipulación de productos internos: queremos evitar calcular hus(t)\int \frac{\partial h}{\partial u}\, s(t), que también es un producto interno:

g,s=t0t1husdτ.\langle g, s\rangle = \int_{t_0}^{t_1}\frac{\partial h}{\partial u}\,s \,d\tau.

Definamos primero:

  • g=(hu)g=\left(\frac{\partial h}{ \partial u}\right)^\top

  • A=ddtfu\mathcal{A} = \tfrac{d}{dt} - \tfrac{\partial f}{\partial u}, un operador lineal (dada una función devuelve una función, y además es lineal). Por la ecuación de sensibilidad, As=b\mathcal{A}s = b, con b=f/θb=\partial f/\partial\theta.

  • Se puede derivar que el operador adjunto es Aλ=dλdτ(fu)λ\mathcal{A}^*\lambda = -\tfrac{d\lambda}{d\tau} - \big(\tfrac{\partial f}{\partial u}\big)^\top\lambda. El operador adjunto A\mathcal{A}^* se define como aquel que cumple t0t1(Av)wdt=t0t1v(Aw)dt\int_{t_0}^{t_1} (\mathcal{A}v)^\top w \, dt = \int_{t_0}^{t_1} v^\top (\mathcal{A}^*w) \, dt; puede verse como una generalización de la transpuesta, Au,v=u,Av\langle Au, v \rangle = \langle u, A^\top v \rangle, con AA matriz y u,vu,v vectores.

Por definición de operador adjunto:

Aλ,s=λ,As.\langle \mathcal{A}^*\lambda, s\rangle = \langle \lambda, \mathcal{A}s\rangle.

Ahora, si consideramos λ\lambda como solución de Aλ=g\mathcal{A}^*\lambda = g,

g,s=Aλ,s.\langle g, s\rangle = \langle \mathcal{A}^*\lambda, s\rangle.

Usamos que As=b\mathcal{A}s = b, con b=f/θb = \partial f/\partial\theta:

λ,As=λ,b.\langle \lambda, \mathcal{A}s\rangle = \langle \lambda, b\rangle.

Luego, solo basta computar este producto interno:

λ,b=t0t1λfθdτ.\langle \lambda, b\rangle = \int_{t_0}^{t_1}\lambda^\top\frac{\partial f}{\partial\theta}\,d\tau.

Pasos del método del Adjunto Continuo

De esta forma, obtenemos el siguiente método para computar el gradiente dL/dθdL/d\theta:

  1. Resolver la ODE original (forward): dudt=f(u,θ,t),u(t0)=u0\dfrac{du}{dt} = f(u, \theta, t), \quad u(t_0) = u_0. Se guardan los valores de u(t)u(t) o se usan técnicas como checkpointing.

  2. Resolver la ecuación adjunta (backward): dλdt=(fu)λ(hu),λ(t1)=0\dfrac{d\lambda}{dt} = - \left(\dfrac{\partial f}{\partial u}\right)^\top \lambda - \left(\dfrac{\partial h}{\partial u}\right)^\top, \quad \lambda(t_1) = 0. La condición final λ(t1)=0\lambda(t_1)=0 significa que la ODE adjunta se resuelve hacia atrás en el tiempo (de t1t_1 a t0t_0).

  3. Calcular el gradiente: dLdθ=t0t1(λfθ+hθ)dt\dfrac{dL}{d\theta} = \displaystyle\int_{t_0}^{t_1} \left( \lambda^\top \dfrac{\partial f}{\partial \theta} + \dfrac{\partial h}{\partial \theta} \right) dt.

Checkpointing

Es una técnica para balancear el uso de memoria y el tiempo de cómputo en métodos que requieren almacenar activaciones intermedias (como Reverse AD y el método del adjunto). Consiste en guardar solo algunos puntos intermedios en memoria y recomputar los demás según sea necesario, intercambiando memoria por cómputo.

Backsolve

Una alternativa al checkpointing es no almacenar la trayectoria u(t)u(t), sino reconstruirla resolviendo la ODE hacia atrás junto con la del adjunto. Primero invertimos la variable temporal y definimos un estado final, en vez de un estado inicial:

dudt=f(u,θ,t)ttdudt=f(u,θ,t)u(t1)=u1\begin{align*} \frac{du}{dt} &= f(u,\theta,t) \\ \overset{t\to-t}{\Rightarrow}\quad \frac{du}{dt} &= -f(u,\theta,t) \quad \quad u(t_1) = u_1 \end{align*}

Bajo el cambio ttt\to -t, todo lado derecho cambia de signo. Aplicándolo también a la ecuación adjunta (cuya forma estándar es dλdt=(f/u)λ(h/u)\frac{d\lambda}{dt} = -(\partial f/\partial u)^\top \lambda - (\partial h/\partial u)^\top), podemos resolver el sistema acoplado hacia atrás, en modo reverse:

{dudt=f(u,θ,t),u(t1)=u1dλdt=(fu)λ+(hu),λ(t1)=0\left\{ \begin{aligned} \frac{du}{dt} &= -f(u,\theta,t), \qquad u(t_1)=u_1 \\[0.8em] \frac{d\lambda}{dt} &= \left(\frac{\partial f}{\partial u}\right)^\top \lambda + \left(\frac{\partial h}{\partial u}\right)^\top, \qquad \lambda(t_1)=0 \end{aligned} \right.

Esto se denomina backsolve. Su ventaja es que evita almacenar la trayectoria completa (poca memoria); su desventaja es que, en ciertos casos, reconstruir uu hacia atrás puede acumular error numérico. Por eso puede combinarse con checkpointing para reanclar la solución en puntos guardados e ir corrigiendo dichos errores.

Footnotes
  1. ¿Por qué podemos escribirlo como una integral?

    Veamos el ejemplo del caso discreto, donde la loss es una suma ponderada iwiu(ti,θ)uiobs22\sum_i w_i \|u(t_i, \theta)-u^{\text{obs}}_i\|_2^2 sobre instantes de observación tit_i. Podemos escribir el integrando como

    h(u,θ,t)=iwiu(t;θ)uiobs2δ(tti),h(u, \theta, t) = \sum_{i} w_i\,\|u(t; \theta) - u_i^{\text{obs}}\|^2 \,\delta(t - t_i),

    donde δ\delta es la función delta de Dirac. Si tomamos la integral de hh de t0t_0 a t1t_1, recupera exactamente la suma.

  2. Notar que h/u\partial h/\partial u es de tamaño 1×n1\times n (ya que hh es una función escalar y uRnu\in\mathbb{R}^n, su gradiente es un vector fila de nn componentes), de modo que el producto hus(t)\frac{\partial h}{\partial u}\,{\color{red}s(t)} es un vector de 1×p1\times p.

  3. s(t){\color{red}s(t)} define qué tanto cambia mi solución u(t)Rnu(t)\in\mathbb{R}^n con respecto de θ\theta: uθ\frac{\partial u }{\partial \theta}. Notemos que tiene su ecuación diferencial asociada. Diferenciemos (24) con respecto de θ\theta:

    ddθ[ddtu(t;θ)]=ddθ[f(u(t;θ),θ,t)](i)\frac{d}{d\theta} \left[ \frac{d}{dt}u(t; \theta) \right] = \frac{d}{d\theta} \left[ f(u(t; \theta), \theta, t) \right] \tag{i}

    Ahora intercambiamos el orden de las derivadas parciales (asumimos que vale: solución suave, etc.):

    ddt[dudθ]=ddθf(u(t;θ),θ,t)(ii)\frac{d}{dt} \left[ \frac{du}{d\theta} \right] = \frac{d}{d\theta} f(u(t; \theta), \theta, t) \tag{ii}

    En el lado derecho desarrollamos la derivada con la regla de la cadena (ff depende de θ\theta directamente y vía uu):

    ddt[dudθ]=fuuθ+fθ(iii)\frac{d}{dt} \left[ \frac{du}{d\theta} \right] = \frac{\partial f}{\partial u} \frac{\partial u}{\partial \theta} + \frac{\partial f}{\partial \theta} \tag{iii}

    Definamos ahora la matriz de sensibilidad como s(t)=uθs(t) = \frac{\partial u}{\partial \theta} y reemplazamos, obteniendo así la ecuación de sensibilidad:

    dsdt=fus+fθ(iv)\frac{ds}{dt} = \frac{\partial f}{\partial u} s + \frac{\partial f}{\partial \theta} \tag{iv}

    Su condición inicial está dada por la derivada de u0u_0:

    s(t0)=du(t0)dθ(v)s(t_0) = \frac{du(t_0)}{d\theta} \tag{v}

    y si u0u_0 no depende de θ\theta, entonces s(t0)=0s(t_0)=0. De esta forma, la ecuación de sensibilidad me dice cómo un cambio de los parámetros afecta a mi solución del sistema en el tiempo.