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.
| Método | Por réplica | Eficiencia |
|---|---|---|
| Conteo (área) | 1 si y ≤ x² else 0 | Usa 0/1, σ ≈ 0,47 |
| Promedio (integral) | xᵢ² directamente | Usa la altura, σ ≈ 0,30: ~2,5× menos N |
03 · Algoritmo
Integrar en 3 pasos
- 1Sortear.
xᵢ = a + (b−a)·U con U ~ U(0,1). Uniformes en el intervalo.
- 2Evaluar y promediar.
m = Σf(xᵢ)/N, s = desvío de f(xᵢ).
- 3Escalar 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∫₀¹ x² = 1/3.
El laboratorio: altura media 1/3, ancho 1.
- 2∫₀^π sin = 2.
Ancho π, altura media 2/π ≈ 0,64.
- 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.
Promediar alturas
∫₀¹ x² ≈ promedio(xᵢ²)
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
- Con N = 200, ¿la altura media puede dar 0,28 o 0,39?
- ¿Por qué promediar xᵢ² es mejor que contar puntos bajo la curva?
- Si f fuera constante 5, ¿qué error habría?
Ver respuestas sugeridas
- Sí: SE ≈ 0,021. Ruido normal.
- Contar usa 0/1 (σ ≈ 0,47); promediar usa alturas (σ ≈ 0,30): menos varianza, menos N.
- 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).