En este caso, vamos a generar un cuadrado de lado 1, usando puntos aleatorios de una distribución uniforme con valor mínimo 0 y valor máximo 1. En el caso del círculo, recordemos que la ecuación canónica de la circunferencia con centro \(c(h, k)\) y radio r está dada por:
\[ (x-h)^2 + (y - k)^2 = r^2 \] En nuestro caso, la circunferencia tiene centro en el punto \(c \left( \frac{1}{2}, \frac{1}{2} \right)\) y radio \(r= 0.5\). Luego, su ecuación canónica será:
\[ \left( x- \frac{1}{2} \right)^2 + \left(y - \frac{1}{2} \right)^2 = \left(\frac{1}{2} \right)^2 \]
Una vez definido el espacio donde vamos a trabajar, procederemos creando una función teniendo en cuenta las siguientes consideraciones:
la función tendrá como entrada el número de iteraciones y el valor del parámetro \(\theta\).
En esta función, se deben generar dos muestras aleatorias con distribución uniforme tomando un valor mínimo de 0 y valor máximo de 1.
Queremos que nos clasifique los puntos de acuerdo a si están o no dentro de la circunferencia. Para esto, se debe tener en cuenta que un punto (x,y) está en la circunferencia si se cumple que
\[ \left( x- \frac{1}{2} \right)^2 + \left(y - \frac{1}{2} \right)^2 \leq \left(\frac{1}{2} \right)^2 \].
La siguienete función retorna el valor estimado de pi, de acuerdo con el número de iteraciones.
pi_estimacion1 <- function(n){
set.seed(1645) # semilla para que los datos no cambien
x <- runif(n,
min = 0, # Coordenadas en x
max = 1)
y <- runif(n,
min = 0, # coordenadas en y
max = 1)
puntos_circ1 <- which(sqrt((x-0.5)^2+(y- 0.5)^2) <= 0.5)
pi_estimado1 <- 4*length(puntos_circ1)/n
return(pi_estimado1)
}
Veamos algunas estimaciones usando: 10, 100, 1000, 10000, 1000000 y 10000000 puntos aleatorios.
| n | Estimación de \(\pi\) |
|---|---|
| 10 | 3.2 |
| 100 | 3.04 |
| 1000 | 3.148 |
| 10000 | 3.176 |
| 100000 | 3.13284 |
| 1000000 | 3.137124 |
| 10000000 | 3.140863 |
Para una muestra de tamaño 1000, tenemos que 775 puntos se encuentran dentro de la circunferencia, con lo cual se obtiene una aproximaxion de \(\pi= 3.148\).
pi_estimacion2 <- function(iteraciones){
set.seed(1645)
x <- runif(iteraciones, # Coordenadas en x
min = 0,
max = 1)
y <- runif(iteraciones, # coordenadas en y
min = 0,
max = 1)
df <- data.frame(x, y) # Data frame con los puntos aleatorios uniformes (x, y)
df$iteraciones <- 1:iteraciones # Añadir columna con el número de iteraciones
df$puntos_circ <- ifelse( sqrt((x-0.5)^2+(y- 0.5)^2) <= 0.5, 1, 0) #Añadir columnas para identificar puntos en el círculo
df$pi_estimado <- 4*cumsum(df$puntos_circ)/ df$iteraciones # Cálcular el valor de pi
return(df)
}
Esta función, nos permite ver las estimaciones de \(\pi\) de acuerdo al número de iteraciones. A continuación, haremos una visualización de dicho comportamiento.
pi_valores <- pi_estimacion2(5000)
ggplot(pi_valores, aes(x = iteraciones, y = pi_estimado))+
geom_line(col = "blue")+
geom_hline(yintercept = pi, col = "red")+
labs(title = expression(paste("Aproximación de ", pi)),
x = "Número de puntos",
y = "Valor estimado")
En este caso podemos observar que las primeras aproximaciones muestran valores cercanos o iguales a 4. Sin embargo, cuando hacemos n lo sufcientemente grande, es decir \(n \to \infty\), la precisión de las estimaciones mejora cada vez más.
En la última gráfica se observa que a medida que aumenta el número de puntos la aproximación mejora. Sin embargo, se siguen observando picos y valles en la gráfica. Esto es debido a que los métodos de Monte Carlo son un proceso estocástico numerico, es decir, una secuencia de estados cuya evolucion viene determinada por los sucesos aleatorios, los cuales pueden ser irregulares en muchos casos.