Derivación e integración · Tema 29

Integración adaptativa

Cómo concentrar evaluaciones donde la función es difícil, repartir una tolerancia global y comunicar cuándo el algoritmo no puede garantizar la precisión solicitada.

01 · No todas las regiones cuestan igual

Refinar solamente donde hace falta

Una regla compuesta uniforme asigna el mismo ancho a zonas planas, picos estrechos y cambios rápidos. Para alcanzar precisión en la región más difícil puede desperdiciar muchas evaluaciones en el resto del intervalo.

La integración adaptativa comienza con una partición gruesa, estima el error local y subdivide solo los intervalos cuya aproximación todavía no es aceptable.

02 · Dos escalas sobre un intervalo

Una aproximación gruesa y otra refinada

Sobre [a,b] calculamos Simpson simple con los extremos y el punto medio:

S₁=(b−a)[f(a)+4f(m)+f(b)]/6

Luego dividimos en [a,m] y [m,b], evaluamos los dos nuevos puntos medios y sumamos:

S₂=S[a,m]+S[m,b]

Si S₁ y S₂ son suficientemente próximos, aceptamos la región. Si no, repetimos el procedimiento en cada mitad.

calcular S₁→calcular S₂→estimar error→aceptar o dividir

03 · El factor quince

Estimar y corregir el error

Simpson tiene error principal proporcional a la cuarta potencia del ancho. Al dividir el intervalo por dos, ese término se reduce aproximadamente por 2⁴=16.

La diferencia entre las dos escalas permite estimar el error de la aproximación refinada:

E₂≈(S₂−S₁)/15

Además podemos aplicar la corrección de Richardson:

Scorregida=S₂+(S₂−S₁)/15

El criterio local habitual es |S₂−S₁|/15≤tol. Este estimador es asintótico: supone suficiente suavidad y que domina el término de cuarto orden.

04 · Árbol de subdivisiones

La estructura recursiva

Cada intervalo se convierte en una hoja aceptada o en un nodo con dos hijos. Las regiones suaves terminan cerca de la raíz; las difíciles forman ramas más profundas.

  1. Evaluar extremos, centro y Simpson grueso.
  2. Evaluar los centros de las dos mitades.
  3. Comparar Simpson refinado con el grueso.
  4. Aceptar con corrección o subdividir ambas mitades.
  5. Sumar los valores y errores de las hojas aceptadas.

La recursión expresa el algoritmo con claridad, aunque una pila explícita puede ser preferible cuando el entorno limita la profundidad de llamadas.

05 · Presupuesto de error

Repartir la tolerancia global

Si pedimos un error absoluto global ε, no debemos permitir error ε en cada hoja: muchas hojas podrían acumular un error mucho mayor.

Al dividir un intervalo, asignamos la mitad de su presupuesto a cada hijo:

tolizq=tol/2,    tolder=tol/2

Entonces la suma de presupuestos de todas las hojas no supera la tolerancia original. Otras estrategias distribuyen según longitud o dificultad estimada.

06 · Evitar trabajo duplicado

Cinco valores bastan para decidir

El panel inicial conoce f(a), f(m) y f(b). Para dividirlo solo necesitamos dos muestras nuevas, en los puntos medios de cada mitad.

Si continuamos subdividiendo, los valores ya calculados se pasan a las llamadas hijas. Volver a evaluar extremos compartidos desperdicia tiempo y puede ser problemático si f representa una simulación costosa o no perfectamente determinista.

a  —  (a+m)/2  —  m  —  (m+b)/2  —  b

Con reutilización, cada división aceptada o rechazada agrega solamente dos evaluaciones.

07 · Pico localizado

Por qué una malla no uniforme ayuda

Consideremos:

f(x)=1/[1+100(x−0.2)²],   −1≤x≤1

La función es casi plana lejos de x=0.2 y cambia rápidamente cerca del pico. Una malla uniforme debe ser fina en todo [−1,1] para resolver esa región estrecha.

El método adaptativo observa diferencias grandes entre escalas cerca del pico y subdivide allí. En los extremos, los paneles amplios ya cumplen la tolerancia.

El valor exacto, útil para comprobar el algoritmo, es:

[atan(10(x−0.2))/10]−11
=[atan(8)+atan(12)]/10≈0.293410

08 · Implementación completa

Simpson adaptativo con diagnósticos

function simpsonAdaptativo(f, a, b, opciones = {}) {
  const tolerancia = opciones.tolerancia ?? 1e-8;
  const profundidadMaxima = opciones.profundidadMaxima ?? 20;
  const evaluacionesMaximas = opciones.evaluacionesMaximas ?? 100000;
  if (!(tolerancia > 0) || profundidadMaxima < 1) {
    throw new Error("Opciones inválidas");
  }

  let evaluaciones = 0;
  let profundidadAlcanzada = 0;
  function evaluar(x) {
    if (++evaluaciones > evaluacionesMaximas) {
      throw new Error("Se superó el máximo de evaluaciones");
    }
    const y = f(x);
    if (!Number.isFinite(y)) throw new Error(`f(${x}) no es finita`);
    return y;
  }
  function simpson(izq, der, fIzq, fMedio, fDer) {
    return (der - izq) * (fIzq + 4 * fMedio + fDer) / 6;
  }

  const medio = (a + b) / 2;
  const fa = evaluar(a);
  const fm = evaluar(medio);
  const fb = evaluar(b);
  const inicial = simpson(a, b, fa, fm, fb);

  function integrar(izq, der, fIzq, fMedio, fDer, gruesa, tol, nivel) {
    profundidadAlcanzada = Math.max(profundidadAlcanzada, nivel);
    const centro = (izq + der) / 2;
    const cuartoIzq = (izq + centro) / 2;
    const cuartoDer = (centro + der) / 2;
    const fCuartoIzq = evaluar(cuartoIzq);
    const fCuartoDer = evaluar(cuartoDer);
    const izquierda = simpson(izq, centro, fIzq, fCuartoIzq, fMedio);
    const derecha = simpson(centro, der, fMedio, fCuartoDer, fDer);
    const refinada = izquierda + derecha;
    const correccion = (refinada - gruesa) / 15;
    const error = Math.abs(correccion);

    if (error <= tol) {
      return { valor: refinada + correccion, error, paneles: 2, converge: true };
    }
    if (nivel >= profundidadMaxima || centro === izq || centro === der) {
      return { valor: refinada + correccion, error, paneles: 2, converge: false };
    }

    const resultadoIzq = integrar(
      izq, centro, fIzq, fCuartoIzq, fMedio,
      izquierda, tol / 2, nivel + 1
    );
    const resultadoDer = integrar(
      centro, der, fMedio, fCuartoDer, fDer,
      derecha, tol / 2, nivel + 1
    );
    return {
      valor: resultadoIzq.valor + resultadoDer.valor,
      error: resultadoIzq.error + resultadoDer.error,
      paneles: resultadoIzq.paneles + resultadoDer.paneles,
      converge: resultadoIzq.converge && resultadoDer.converge
    };
  }

  const resultado = integrar(a, b, fa, fm, fb, inicial, tolerancia, 0);
  return { ...resultado, evaluaciones, profundidadAlcanzada };
}

const resultado = simpsonAdaptativo(
  x => 1 / (1 + 100 * (x - 0.2) ** 2), -1, 1
);
console.log(resultado);

Si se alcanza la profundidad máxima, la función devuelve una aproximación pero marca converge:false. Ocultar ese estado daría una falsa sensación de garantía.

09 · Detener con responsabilidad

Salvaguardas necesarias

Además del estimador, una implementación necesita límites operativos:

  • profundidad máxima: evita desbordar la recursión;
  • evaluaciones máximas: limita el costo total;
  • ancho representable: detecta cuando el punto medio coincide con un extremo;
  • valores finitos: detiene el proceso ante NaN o infinito;
  • estancamiento: identifica cuando subdividir ya no cambia el resultado.

Alcanzar un límite no implica que el valor sea inútil, pero sí que la tolerancia solicitada no quedó confirmada.

10 · Escalas diferentes

Tolerancia absoluta y relativa

Una tolerancia absoluta de 10⁻⁸ puede ser excesiva para una integral de magnitud 10⁻¹² e insuficiente para otra de magnitud 10⁹.

Una condición mixta es:

error estimado ≤ atol + rtol·|valor estimado|
function toleranciaMixta(valor, absoluta = 1e-10, relativa = 1e-8) {
  if (absoluta < 0 || relativa < 0 || absoluta + relativa === 0) {
    throw new Error("Las tolerancias no pueden ser ambas cero");
  }
  return absoluta + relativa * Math.abs(valor);
}

for (const valor of [1e-12, 1, 1e9]) {
  console.log(valor, toleranciaMixta(valor));
}

En un algoritmo adaptativo se actualiza la escala con una aproximación disponible y se mantiene una tolerancia absoluta mínima para valores cercanos a cero.

11 · Cuando dos respuestas coinciden por accidente

El estimador también puede equivocarse

Comparar dos mallas no descubre necesariamente una característica que ninguna de ellas muestrea. Un pico extremadamente estrecho entre nodos puede producir S₁≈S₂ aunque ambas aproximaciones sean malas.

Otros casos difíciles son:

  • funciones discontinuas o no suaves;
  • oscilaciones alineadas desfavorablemente con los nodos;
  • cancelación entre grandes contribuciones positivas y negativas;
  • singularidades integrables cerca de un extremo;
  • evaluaciones con ruido comparable a la tolerancia.

12 · Información que debemos aprovechar

Dividir en puntos conocidos

Si conocemos una discontinuidad, una cúspide o un cambio de fórmula en c, conviene integrar [a,c] y [c,b] por separado. Así el estimador no intenta representar con un único polinomio una región no suave.

∫abf(x)dx = ∫acf(x)dx + ∫cbf(x)dx

Para una lista de puntos especiales, repartimos también el presupuesto de error entre los segmentos. Una asignación proporcional a sus longitudes es un comienzo razonable.

13 · Recursión local o prioridad global

Dos formas de administrar la malla

Estrategias comunes de adaptación.
EstrategiaVentajaLimitación
Recursiva localSimple; cada intervalo maneja su tolerancia.El reparto anticipado puede ser conservador.
Cola de prioridadRefina siempre el panel con mayor error estimado.Requiere más estructura y contabilidad global.

Una estrategia global mantiene la suma de errores estimados y subdivide la peor hoja hasta cumplir la tolerancia o agotar recursos. Suele utilizar mejor el presupuesto, especialmente cuando la dificultad está muy localizada.

14 · Exploración interactiva

Laboratorio: observar la malla emergente

Las bandas inferiores representan paneles aceptados; las más oscuras alcanzaron mayor profundidad. Reducí la tolerancia y observá dónde aparecen nuevas subdivisiones.

EXPERIMENTO 29

Evaluaciones donde importan

pico localizado

Los resultados numéricos aparecen debajo.
Aproximación—
Error real—
Evaluaciones—
Paneles aceptados—

La malla se concentra alrededor del pico.

Preguntas para explorar

  1. Reducí la tolerancia del pico y observá dónde crece la profundidad.
  2. Compará la distribución de paneles del exponencial y la función oscilatoria.
  3. Limitá la profundidad a cuatro: comprobá el estado de convergencia.
  4. En la cúspide, observá cómo las subdivisiones localizan el punto no suave.

15 · Comprensión

Confusiones frecuentes

«Adaptativo significa usar pasos aleatorios»

No. Los pasos se eligen de forma determinista según estimaciones locales del error.

«Cada subintervalo puede usar la tolerancia global»

Los errores de las hojas se acumulan. El presupuesto debe repartirse o administrarse globalmente.

«S₁≈S₂ garantiza que la integral es correcta»

Ambas mallas pueden omitir la misma característica estrecha u oscilatoria.

«Llegar a profundidad máxima equivale a converger»

Es un límite de seguridad. Si el criterio no se cumple, el resultado debe marcarse como no convergente.

«La tolerancia es el error real»

Es un objetivo aplicado a un estimador. El error real solo se conoce si disponemos de referencia o de una cota demostrada.

16 · Práctica guiada

Ejercicios

Ejercicio 1: estimador local

Si S₁=1.2 y S₂=1.17, estimá el error de S₂.

Ver solución

|1.17−1.2|/15=0.03/15=0.002.

Ejercicio 2: corrección

Con los mismos valores, calculá la aproximación corregida.

Ver solución

1.17+(1.17−1.2)/15=1.168.

Ejercicio 3: reparto

Un intervalo recibe tolerancia 10⁻⁶ y se divide en dos. ¿Qué presupuesto simple recibe cada hijo?

Ver solución

5·10⁻⁷ para cada mitad.

Ejercicio 4: evaluaciones nuevas

Después de conocer extremos y centro, ¿cuántas evaluaciones nuevas necesita una subdivisión?

Ver solución razonada

Dos: los centros de las mitades izquierda y derecha. Los otros tres valores se reutilizan.

Ejercicio 5: punto conocido

¿Cómo integrarías una función cuya fórmula cambia en x=0?

Ver solución

Dividiría explícitamente el dominio en cero, integraría cada lado con su propio presupuesto de error y sumaría los resultados.

17 · Síntesis

Ideas para recordar

  • La integración adaptativa construye la malla durante el cálculo.
  • Simpson grueso y refinado proporcionan un estimador local dividido por quince.
  • La corrección de Richardson mejora el valor aceptado.
  • La tolerancia global debe repartirse entre las hojas.
  • Las evaluaciones existentes deben reutilizarse.
  • Profundidad, evaluaciones y valores finitos necesitan límites explícitos.
  • Un estado no convergente debe comunicarse junto con la aproximación.
  • Los estimadores pueden omitir picos u oscilaciones no muestreados.
  • Los puntos problemáticos conocidos deben dividir el dominio.

En el próximo tema cambiaremos de estrategia y estudiaremos la integración por Monte Carlo, especialmente útil cuando la dimensión hace costosas las mallas deterministas.