La siguiente figura sugiere como estimar el valor de π con una simulación. En la figura, un circuito con un área igual a π/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 π/4. Por tanto, se puede estimar el valor de π/4 al contar el número de puntos dentro del círculo, para obtener la estimación de π/4. De este último resultado se encontrar una aproximación para el valor de π.
Pasos sugeridos:
a. Genere n coordenadas x: X1, . . . , Xn. 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).
b. Genere 1000 coordenadas y: Y1,…,Yn, utilizando nuevamente la distribución uniforme con valor mínimo de 0 y valor máximo de 1.
c. Cada punto (Xi,Yi) se encuentra dentro del círculo si su distancia desde el centro (0.5,0.5) es menor a 0.5. Para cada par (Xi,Yi) determine si la distancia desde el centro es menor a 0.5. Esto último se puede realizar al calcular el valor (Xi−0.5)2+(Yi−0.5)2, que es el cuadrado de la distancia, y al determinar si es menor que 0.25.
d. ¿Cuántos de los puntos están dentro del círculo? ¿Cuál es su estimación de π?
Genero una función que me guarde las fórmulas para calcular el número de tiros adentro y el estimado del valor de Pi:
set.seed(123)
simulacionPi <- function(lanzamientos) {
tirosdentro <- 0 #Número de tiros que caer,an dentro
x <- runif(n = lanzamientos, min = 0, max = 1) #Genero coordenadas de X con valor mínimo 0 y máximo 1
y <- runif(n = lanzamientos, min = 0, max = 1)#Genero coordenadas de X con valor mínimo 0 y máximo 1
sumcuadrados <- ((x - 0.5)^2) + ((y - 0.5)^2) #Calculo el cuadrado de la distancia y lo guardo en una variable
dentro <- which(sumcuadrados <= 0.25) # Identifico si el cuadrado de la distancia es menor o igual a 0.25 para determinar los que caen dentro.
tirosdentro <- length(dentro) #Número de tiros que caen dentro del círculo. La función length mide la longitud de un vector.
resultado <- list(pi_estimado = 4 * tirosdentro / lanzamientos, tirosdentro = tirosdentro, x=x, y=y, dentro=dentro) # Guardo en un vector los datos de estimación de Pi y del número de tiros que caen dentro de la circunferencia
return(resultado) # Genero los resultados.
}resultado <- simulacionPi(1000) #Simulo 1.000 lanzamientos
cat (" Con 1.000 lanzamientos, el numero de tiros que caen dentro del circulo es de ", resultado$tirosdentro, "\n") ## Con 1.000 lanzamientos, el numero de tiros que caen dentro del circulo es de 800
## y el valor estimado de pi es de 3.2
## El error absoluto para calcular pi con 1000 puntos es de 0.05840735
resultado <- simulacionPi(10000) #Simulo 10.000 lanzamientos
cat (" Con 10.000 lanzamientos, el úumero de tiros que caen dentro del círculo es de ", resultado$tirosdentro, "\n") ## Con 10.000 lanzamientos, el úumero de tiros que caen dentro del círculo es de 7882
## y el valor estimado de pi es de 3.1528
## El error absoluto para calcular pi con 10.000 puntos es de 0.01120735
resultado <- simulacionPi(100000) #Simulo 100.000 lanzamientos
cat (" Con 100.000 lanzamientos, el número de tiros que caen dentro del círculo es de ", resultado$tirosdentro, "\n") ## Con 100.000 lanzamientos, el número de tiros que caen dentro del círculo es de 78600
## y el valor estimado de pi es de 3.144
## El error absoluto para calcular pi con 100.000 puntos es de 0.002407346
Podemos observar que a mayor número de lanzamientos o simulaciones, nos aproximamos mas al valor verdadero de Pi.