import numpy as npimport matplotlib.pyplot as pltSEMILLA =2026N_PUNTOS =200_000LADO =3# Lanzamos puntos en el cuadrado [-3, 3] × [-3, 3]AREA_EXACTA =2* np.pi # πab con a = 2, b = 1rng = np.random.default_rng(SEMILLA)
Estimación
Un punto \((x, y)\) está dentro de la elipse si \(5x^2 - 6xy + 5y^2 - 8 < 0\). El área es la fracción de puntos dentro, multiplicada por el área del cuadrado:
Figure 1: Los primeros 5000 puntos: en azul los que caen dentro de la elipse.
Convergencia
Code
tamanos = np.logspace(2, 6, 9).astype(int)errores = []for n in tamanos: qx = rng.uniform(-LADO, LADO, n) qy = rng.uniform(-LADO, LADO, n) estimacion = (2* LADO)**2* np.mean(5*qx**2-6*qx*qy +5*qy**2-8<0) errores.append(abs(estimacion - AREA_EXACTA))fig, ax = plt.subplots(figsize=(7, 4))ax.loglog(tamanos, errores, "o-", label="Error de la estimación")ax.loglog(tamanos, 10/ np.sqrt(tamanos), "r--", label="Referencia $1/\\sqrt{n}$")ax.set_xlabel("Número de puntos $n$")ax.set_ylabel("Error absoluto")ax.legend()plt.show()
Figure 2: El error de la estimación disminuye como \(1/\sqrt{n}\).
Como muestra la Figure 2, para reducir el error 10 veces se necesitan aproximadamente 100 veces más puntos.
Note
La rotación no cambia el área: la matriz de rotación tiene determinante 1. Por eso el área de la elipse rotada es igual a la de su forma canónica, \(\pi a b\).