Integración numérica y diferenciación automática

J3.5 · Nivel J3 · Computación científica

Objetivos

  • Integrar con quadgk (también con límites infinitos) y leer su estimación de error.
  • Integrar datos tabulados con el trapecio y comprobarlo con Parseval.
  • Entender por qué una diferencia finita tiene un paso óptimo y un error que no baja de ahí.
  • Derivar con ForwardDiff y saber cuándo falla.
  • Obtener y validar una matriz de sensibilidades para ajustar un modelo.

Integrar con QuadGK

using QuadGK
I, err = quadgk(f, a, b)        # valor y estimación del error
I, err = quadgk(f, -Inf, Inf)   # límites infinitos
  • La varianza de la respuesta de un modo es el área bajo su densidad espectral.
  • Con datos tabulados: sum de trapecios, y paso menor que la anchura del pico.
  • Se comprueba con un caso de respuesta conocida (Parseval).

Diferencias finitas: el dilema del paso

\[f'(x)\approx\frac{f(x+h)-f(x)}{h}\]

  • \(h\) grande: error de truncamiento.
  • \(h\) pequeño: error de redondeo.
  • Óptimo: \(h\sim\sqrt\varepsilon\) (adelantadas) y \(h\sim\varepsilon^{1/3}\) (centradas), en relativo.
  • Hay un error mínimo que ningún paso baja.

Diferenciación automática

using ForwardDiff
ForwardDiff.derivative(f, x)
ForwardDiff.gradient(g, x)
ForwardDiff.jacobian(h, x)
  • Derivadas exactas hasta el redondeo, sin elegir paso.
  • El código debe ser genérico: no forzar Float64.
  • No se pueden derivar eigen ni funciones que conviertan los duales a reales.

Sensibilidades de un edificio

\[\frac{\partial(\omega_i^2)}{\partial\theta}=\boldsymbol\varphi_i^{\mathsf T}\Big(\frac{\partial\mathbf K}{\partial\theta}-\omega_i^2\frac{\partial\mathbf M}{\partial\theta}\Big)\boldsymbol\varphi_i\]

  • Tres vías: fórmula, diferencias finitas y diferenciación automática.
  • Sensibilidades relativas \(\frac{k_j}{f_i}\frac{\partial f_i}{\partial k_j}\): cada fila suma 0,5.
  • Es una comprobación gratuita.

Del modelo a las medidas

\[\mathbf S\,\Delta\boldsymbol\theta=\hat{\mathbf f}-\mathbf f(\boldsymbol\theta)\]

  • Gauss–Newton: resolver y repetir.
  • La derivada es una aproximación lineal: no vale para cambios grandes.
  • Un parámetro estimado sin su error típico no es un resultado.
  • El ajuste completo con LsqFit y Optim está en J3.7.

Errores frecuentes

  • Diferencia finita con un paso cualquiera.
  • quadgk sobre un interpolador sin comprobar.
  • ForwardDiff sobre código que fuerza Float64.
  • Confundir sensibilidad local con efecto de un cambio grande.

Idea clave

Integrar y derivar son operaciones con error, y se ha de saber de dónde viene.

Cuando Claude te dé una derivada, pídele con qué método la ha calculado y contra qué caso conocido la ha comprobado.