Método de Monte Carlo · Tema 18

Integración Monte Carlo

Integrar es promediar: la integral es el área de un rectángulo de altura media.

01 · Punto de partida

El área bajo la curva es un promedio

Contar puntos (tema 17) funciona, pero desperdicia: solo usa 0/1. Si evaluamos f(xᵢ) directamente, cada réplica aporta su altura y el promedio estima la altura media. Por el ancho sale la integral.

Es más eficiente que contar y vale para cualquier f integrable, tenga o no primitiva.

  • ¿En qué intervalo integro (a, b)?
  • ¿Cómo sorteo xᵢ uniforme en (a, b)?
  • ¿Qué promedio calculo?
  • ¿Con qué error?

02 · Definición

De contar a promediar

📏

Ancho

(b−a): la base del rectángulo. Escala el promedio a integral.

📊

Altura media

promedio(f(xᵢ)): la altura del rectángulo equivalente. El corazón del método.

±

Error

(b−a)·s/√N con s el desvío de f(xᵢ). Funciones planas ⇒ poco error.

Contar frente a promediar para ∫₀¹ x² (real = 1/3).
MétodoPor réplicaEficiencia
Conteo (área)1 si y ≤ x² else 0Usa 0/1, σ ≈ 0,47
Promedio (integral)xᵢ² directamenteUsa la altura, σ ≈ 0,30: ~2,5× menos N

03 · Algoritmo

Integrar en 3 pasos

Sortear x→Evaluar f→×(b−a)
  1. 1
    Sortear.

    xᵢ = a + (b−a)·U con U ~ U(0,1). Uniformes en el intervalo.

  2. 2
    Evaluar y promediar.

    m = Σf(xᵢ)/N, s = desvío de f(xᵢ).

  3. 3
    Escalar y dar IC.

    Î = (b−a)·m ± (b−a)·1,96·s/√N.

Sin primitiva
Vale igual para e^(−x²), sin(x)/x o datos tabulados: solo pide evaluar f.
Función plana
Si f varía poco, s es chico y converge rápido. Lo rugoso pide más N.
Dimensión
El error sigue 1/√N en 1D o 10D: por eso Monte Carlo gana en dimensión alta.

04 · Ejemplos

Tres integrales de juguete

  1. 1
    ∫₀¹ x² = 1/3.

    El laboratorio: altura media 1/3, ancho 1.

  2. 2
    ∫₀^π sin = 2.

    Ancho π, altura media 2/π ≈ 0,64.

  3. 3
    ∫₀¹ e^(−x²) ≈ 0,747.

    Sin primitiva elemental: Monte Carlo la estima igual.

05 · Representación en Python

Integrador genérico en 8 líneas

Python en tu navegador. Pasale cualquier f, a, b y N.

import random
import statistics
import math

def integrar(f, a, b, N):
    xs = [a + (b - a) * random.random() for _ in range(N)]
    vals = [f(x) for x in xs]
    m = sum(vals) / N
    s = statistics.pstdev(vals)
    I = (b - a) * m
    se = (b - a) * s / math.sqrt(N)
    return I, se

I, se = integrar(lambda x: x**2, 0, 1, 20000)
print(f"{I:.4f} ± {se:.4f} (real 0.3333)")
import random
import math

N = 20000
m = sum(math.sin(random.uniform(0, math.pi)) for _ in range(N)) / N
print(f"{math.pi * m:.4f} (real 2.0000)")

06 · Exploración

Laboratorio: altura media de x²

Puntos (xᵢ, xᵢ²) sobre la parábola en [0,1]. La línea amarilla es tu altura media; la gris es 1/3. El área sombreada es tu integral.

EXPERIMENTO 18

Promediar alturas

∫₀¹ x² ≈ promedio(xᵢ²)

Los resultados numéricos aparecen debajo.
Integral estimada—
Error ±—
Altura media—
Lectura—

Tocá «Integrar» para promediar alturas.

Cada punto aporta su altura xᵢ². Con N chico la media salta; con N grande se pega a 1/3.

Preguntas para explorar

  1. Con N = 200, ¿la altura media puede dar 0,28 o 0,39?
  2. ¿Por qué promediar xᵢ² es mejor que contar puntos bajo la curva?
  3. Si f fuera constante 5, ¿qué error habría?
Ver respuestas sugeridas
  1. Sí: SE ≈ 0,021. Ruido normal.
  2. Contar usa 0/1 (σ ≈ 0,47); promediar usa alturas (σ ≈ 0,30): menos varianza, menos N.
  3. Cero: s = 0 ⇒ SE = 0. Lo constante se integra exacto con N = 1.

07 · Comprensión

Confusiones frecuentes

«Integral = promedio, sin ×(b−a)»

El promedio es la altura media; por el ancho se vuelve integral. En [0,1] coinciden, en [a,b] no.

«Vale solo si hay primitiva»

Al revés: brilla cuando NO hay primitiva. Solo pide evaluar f.

«Contar y promediar dan igual error»

No: promediar aprovecha la altura y suele pedir ~2× menos N que contar.

«xᵢ puede ser cualquiera»

Debe ser U(a,b). Muestrear donde conviene es importance sampling (tema 24).

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: x² en [0,1]

Estimá con N = 10 000 y compará con 1/3.

import random
import math

N = 10000
m = sum((random.random()**2) for _ in range(N)) / N
print(m, 1/3)
Ver solución razonada

~0,333 ± 0,003. Altura media = integral porque el ancho es 1.

Ejercicio 2: seno en [0,π]

Estimá ∫₀^π sin (real = 2).

import random
import math

N = 20000
m = sum(math.sin(random.uniform(0, math.pi)) for _ in range(N)) / N
print(math.pi * m)
Ver solución

~2,00 ± 0,01. El ×π convierte la altura media en integral.

Ejercicio 3: sin primitiva

Estimá ∫₀¹ e^(−x²) y verificá ~0,747.

Ver una posible respuesta
import random
import math

N = 20000
m = sum(math.exp(-random.random()**2) for _ in range(N)) / N
print(m)

~0,747 ± 0,001. Sin primitiva elemental, Monte Carlo no se entera.

09 · Síntesis

Ideas para recordar

  • ∫ₐᵇ f = (b−a)·E[f(U)]: integrar es promediar alturas.
  • Promediar es más eficiente que contar puntos.
  • Error (b−a)·s/√N: funciones planas convergen rápido.
  • Vale sin primitiva y en dimensión alta con igual 1/√N.
  • En Python: integrador genérico f, a, b, N → (I, se).

En el próximo tema aplicaremos el caso base: integración en el intervalo (0,1).