01 · Punto de partida
La maldición que Monte Carlo rompe
Integrar en 5 dimensiones con cuadrícula de 10 puntos por eje pide 10⁵ = 100 000 evaluaciones. En 10 dimensiones, 10¹⁰: imposible. Monte Carlo pide lo mismo en cualquier dimensión: N puntos al azar, un promedio, por el volumen.
El precio es el mismo 1/√N de siempre; la recompensa es que la dimensión deja de importar.
- ¿Cuál es el volumen de mi dominio?
- ¿Cómo sorteo uniforme en ese dominio?
- ¿Qué promedio calculo?
- ¿Por qué la cuadrícula pierde y el azar gana?
02 · Definición
Volumen por promedio
Volumen
Área en 2D, volumen en 3D: en [0,1]ᵈ vale 1. Escala el promedio a integral.
Punto uniforme
Un U por coordenada: (U₁, U₂) en el cuadrado, (U₁,…,U_d) en el hipercubo.
Promedio
f(Xᵢ) por punto: la «altura media» del dominio. Por el volumen es la integral.
| Método | Costo para e | En d = 8 |
|---|---|---|
| Cuadrícula (orden 2) | ~e^(−d/2) | Imposible: pide miles de millones |
| Monte Carlo | ~1/√N siempre | N = 10 000 da ±1% igual que en 1D |
03 · Algoritmo
Integrar en d dimensiones en 3 pasos
- 1Sortear el punto.
Una uniforme por coordenada. En [0,1]²:
(random(), random()). - 2Evaluar y promediar.
m = Σf(Xᵢ)/N, s = desvío de las alturas.
- 3Multiplicar por Vol.
En el cubo unitario Vol = 1: el promedio YA es la integral.
- Hipercubo [0,1]ᵈ
- El caso base: Vol = 1, sorteo trivial. Todo rectángulo se estira desde aquí.
- Dominio raro
- Se encierra en caja y se multiplica por dentro/fuera, o se parametriza. El test decide.
- Dimensión alta
- Finanzas (decenas de activos) y física (cientos de partículas): solo Monte Carlo llega.
04 · Ejemplos
Tres integrales 2D exactas
- 1x·y en [0,1]² → 1/4.
Separable: 1/2 × 1/2. Test de tu código.
- 2x²+y² → 2/3.
Suma de marginales: 1/3 + 1/3.
- 3e^(−x−y) → (1−1/e)² ≈ 0,40.
Sin primitiva mixta a mano: Monte Carlo igual.
05 · Representación en Python
El mismo bucle, un U más por dimensión
Python en tu navegador. Agregar dimensión es agregar un random().
import random
def integrar2(f, N):
return sum(f(random.random(), random.random()) for _ in range(N)) / N
N = 30000
print("x*y:", integrar2(lambda x, y: x*y, N), "(1/4)")
print("x2+y2:", integrar2(lambda x, y: x**2 + y**2, N), "(2/3)")
import random
def integrar_d(f, d, N):
tot = 0
for _ in range(N):
xs = [random.random() for _ in range(d)]
tot += f(xs)
return tot / N
print(integrar_d(lambda xs: sum(x**2 for x in xs), 5, 20000), "(5/3)")
06 · Exploración
Laboratorio: pintar el cuadrado por altura
Cada punto (x,y) se pinta según f: claro = alto. El promedio de esos tonos es la integral. Cambiá f y N.
El volumen se promedia
Î = promedio(f) en [0,1]²
Tocá «Integrar» para promediar el cuadrado.
x·y crece hacia arriba-derecha; x²+y² hacia los bordes. El color muestra dónde aporta cada punto.
Preguntas para explorar
- ¿Qué función tiembla más a igual N? ¿Por qué?
- ¿El error en 2D cae más lento que en 1D?
- ¿Qué pasaría con 10 puntos por eje en 6D?
Ver respuestas sugeridas
- x²+y² (σ ≈ 0,42 vs 0,22): más dispersión de alturas, más error.
- No: 1/√N en ambas. Esa es la victoria de Monte Carlo.
- 10⁶ puntos para una malla gruesa. Monte Carlo con 10 000 ya da ±1%.
07 · Comprensión
Confusiones frecuentes
«En 2D hay que multiplicar por algo»
En [0,1]² el volumen es 1: el promedio ya es la integral. En [a,b]×[c,d] se multiplica por el área.
«Más dimensión pide exponencialmente más N»
Eso vale para cuadrículas. Monte Carlo pide igual N para igual σ: la dimensión no entra.
«Sortear (x,y) es sortear dos veces lo mismo»
Son dos U independientes. Reutilizar una ata x = y y sesga.
«Visualizar en 5D es igual»
Integrar sí; visualizar no. En alta dimensión se confía en números, no en dibujos.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: x·y con N = 20 000
Verificá 1/4.
import random
N = 20000
print(sum(random.random()*random.random() for _ in range(N)) / N)
Ver solución razonada
~0,25 ± 0,002. Cada producto es una altura; el promedio, la integral.
Ejercicio 2: volumen de la esfera
Fracción de puntos en x²+y²+z² ≤ 1 dentro de [−1,1]³ (Vol = 8) → 4,19.
import random
N = 30000
d = sum(1 for _ in range(N)
if (2*random.random()-1)**2 + (2*random.random()-1)**2 + (2*random.random()-1)**2 <= 1)
print(8*d/N)
Ver solución
~4,19 ± 0,03. Integración 3D por conteo: el mismo patrón de áreas.
Ejercicio 3: 5D de juguete
∫ Σxᵢ² en [0,1]⁵ = 5/3 ≈ 1,667 con un integrador genérico.
Ver una posible respuesta
import random
def f(xs):
return sum(x*x for x in xs)
N, d = 20000, 5
print(sum(f([random.random() for _ in range(d)]) for _ in range(N)) / N)
~1,667. Cinco dimensiones con el mismo bucle de 1D.
09 · Síntesis
Ideas para recordar
- ∫_D f = Vol·promedio: un U por coordenada, una f por punto.
- Error Vol·s/√N: la dimensión no aparece.
- Cuadrícula colapsa en alta dimensión; Monte Carlo no.
- En [0,1]ᵈ el promedio YA es la integral.
- En Python: agregar dimensión = agregar un random().
En el próximo tema domaremos lo infinito: integración en intervalos infinitos.