La siguiente figura sugiere como estimar el valor de \(\pi\) con una simulación. En la figura, un circuito con un área igual a \(\pi/4\), está inscrito en un cuadrado cuya área es igual a \(1\). Se elige de forma aleatoria \(n\) puntos dentro del cuadrado. La probabilidad de que un punto esté dentro del círculo es igual a la fracción del área del cuadrado que abarca a este, la cual es \(\pi/4\). Por tanto, se puede estimar el valor de \(\pi/4\) al contar el número de puntos dentro del círculo, para obtener la estimación de \(\pi/4\). De este último resultado se encontrar una aproximación para el valor de \(\pi\).
Genere \(n\) coordenadas \(x: X_{1},...,X_{n}\). Utilice la distribución uniforme con valor mínimo de \(0\) y valor máximo de \(1\). La distribución uniforme genera variables aleatorias que tienen la misma probabilidad de venir de cualquier parte del intervalo \((0,1)\).
x <- runif(n = 1000, min = 0, max = 1)
Genere \(1000\) coordenadas \(y: Y_{1},...,Y_{n}\), utilizando nuevamente la distribución uniforme con valor mínimo de \(0\) y valor máximo de \(1\).
y <- runif(n = 1000, min = 0, max = 1)
Cada punto \((X_{i}, Y_{i})\) se encuentra dentro de círculo si su distancia desde el centro \((0.5,0.5)\) es menor a \(0.5\). Esto último se puede realizar al calcular el valor \((X_{i}-0.5)^2 + (Y_{i}-0.5)^2\), que es el cuadrado de la distancia, y al determinar si es menor que \(0.25\)
estimar_pi <- function(x, y) {
n <- length(x)
puntos_dentro <- 0
for (i in 1:n) {
distancia <- (x[i]-0.5)^2 + (y[i]-0.5)^2
if (distancia < 0.25) {
puntos_dentro <- puntos_dentro + 1
}
}
pi <- (puntos_dentro/n)*4
return(c(puntos_dentro, pi))
}
resultado <- estimar_pi(x, y)
puntos_dentro <- resultado[1]
pi_estimado1 <- resultado[2]
puntos_dentro
## [1] 779
pi_estimado1
## [1] 3.116
Con solo \(1000\) puntos es probable que la estimación presente un error de \(0.05\) o más. Una simulación de \(10000\) y \(100000\) puntos tiene mayores probabilidades de dar como resultado una estimación muy cercana al valor verdadero.
pi_estimado1
## [1] 3.116
error1 <- abs(pi - pi_estimado1)
error1
## [1] 0.02559265
#Crear coordenadas x
x2 <- runif(n = 10000, min = 0, max = 1)
#Crear coordenadas y
y2 <- runif(n = 10000, min = 0, max = 1)
#Estimar pi con las nuevas coordenadas
resultado2 <- estimar_pi(x2, y2)
puntos_dentro2 <- resultado2[1]
pi_estimado2 <- resultado2[2]
puntos_dentro2
## [1] 7828
pi_estimado2
## [1] 3.1312
error2 <- abs(pi - pi_estimado2)
error2
## [1] 0.01039265
#Crear coordenadas x
x3 <- runif(n = 100000, min = 0, max = 1)
#Crear coordenadas y
y3 <- runif(n = 100000, min = 0, max = 1)
#Estimar pi con las nuevas coordenadas
resultado3 <- estimar_pi(x3, y3)
puntos_dentro3 <- resultado3[1]
pi_estimado3 <- resultado3[2]
puntos_dentro3
## [1] 78566
pi_estimado3
## [1] 3.14264
erro3 <- abs(pi - pi_estimado3)
erro3
## [1] 0.001047346
Problema tomado de Navidi(2006)