Dado que el área del cuadrado circunscrito es \(\frac{\pi}{4}\), y tambien sabemos que la probabilidad de que un punto este dentro del circulo es igual \(\frac{\pi}{4}\) si generamos suficientes puntos aleatorios podemos a partir de esta relación entre el area del circulo y la probabilidad de que un punto este dentro de la circunferencia calcular o determinar el valor de \(\pi\) de manera aproximada. De manera que generando una cantidad de puntos aleatorios dentro del cuadrado y contando cuantos de ellos caen dentro de la circunferencia, podremos con la siguiente expresion determinar el valor aproximado de \(\pi\).
\(\frac{num\_puntos\_circ}{num\_total\_puntos}*4 \approx \pi\)
Donde num_puntos_circ es igual numero de puntos dentro de la circunferencia, num_total_puntos es igual a la cantidad total de puntos aleatorios generados. A continuacion para la implementación, solo seguimos los pasos propuestos, y lo hacemos para 4 valores diferentes \(n=[1000,10000,100000,1000000]\)
library(knitr)
set.seed(0) #fijamos una semilla para a medida que aumentamos la cantidad de puntos se mantenga con la misma la distribucion
#num_darts es el numero de puntos en el cuadrado
num_darts_in_circle<-0 #Se inicializa la variable de numero de puntos en el circulo
#Simulacion
pi<-function(num_darts){
x<-runif(n=num_darts,min=0,max=1) # generamos coordenadas de aleatorias de 0 a 1 para 'x' y 'y'
y<- runif(n=num_darts,min=0,max=1)
for(i in 1:num_darts){
if((x[i]-0.5)^2+(y[i]-0.5)^2<=0.25){#sumamos 1 a num_darts_in_circle
#si un punto cae dentro de la circunferencia
num_darts_in_circle=num_darts_in_circle+1
}
}
return(num_darts_in_circle) #retorna el numero total de puntos dentro de la circunferencia
}
df1<-data.frame("num_darts_in_circle"=c(pi(1000),pi(10000),pi(100000),pi(1000000)),
"pi estimation"=c(4*pi(1000)/1000,4*pi(10000)/10000,4*pi(100000)/100000,4*pi(1000000)/1000000),check.names = FALSE)
rownames(df1)<-c("1000", "10000", "100000", "1000000")
kable(df1)
| num_darts_in_circle | pi estimation | |
|---|---|---|
| 1000 | 770 | 3.176000 |
| 10000 | 7850 | 3.157600 |
| 100000 | 78589 | 3.139800 |
| 1000000 | 785166 | 3.140956 |
Como se esperaba, la estimación de \(\pi\) mejora si se aumenta el número de puntos dentro del cuadrado. Sin embargo, es bueno tener en cuenta que no es una estimación muy precisa y es costoso computacionalmente para tamaños de muestra grandes.