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:
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).
Genere 1000 coordenadas y: Y1,…,Yn, utilizando nuevamente la distribución uniforme con valor mínimo de 0 y valor máximo de 1.
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.
¿Cuántos de los puntos están dentro del círculo? ¿Cuál es su estimación de π?
# Número de coordenadas a generar
n <- 1000
set.seed(125)
x <- runif(n)
y <- runif(n)
puntos_dentro <- 0
for (i in 1:n) {
distancia_cuadrada <- (x[i] - 0.5)^2 + (y[i] - 0.5)^2
if (distancia_cuadrada < 0.25) {
puntos_dentro <- puntos_dentro + 1
}
}
puntos_dentro
## [1] 794
Calculamos 794 puntos dentro de la circunferencia de 1.000 generados de forma aleatoria.
Valor_pi <- 4 * puntos_dentro / n
Valor_pi
## [1] 3.176
pi-Valor_pi
## [1] -0.03440735
Obtenemos un valor π estimado de 3.176. Con respecto al valor de π, hay un error de 0.03440735 negativos.
# Generamos dataframe con los puntos x e y
data <- data.frame(x, y, dentro = (x - 0.5)^2 + (y - 0.5)^2 < 0.25)
library(ggplot2)
# Gráficación dataframe
ggplot(data, aes(x, y)) +
geom_point(aes(color = dentro), size = 1.5) +
scale_color_manual(values = c("red", "black")) +
geom_path(data = data.frame(x = 0.5 + 0.5 * cos(seq(0, 2 * pi, length.out = 100)),
y = 0.5 + 0.5 * sin(seq(0, 2 * pi, length.out = 100))),
aes(x, y), color = "blue") +
coord_equal() +
theme_minimal() +
labs(x = "X", y = "Y") +
theme(legend.position = "none")
n <- 10000
x <- runif(n)
y <- runif(n)
puntos_dentro <- 0
for (i in 1:n) {
distancia_cuadrada <- (x[i] - 0.5)^2 + (y[i] - 0.5)^2
if (distancia_cuadrada < 0.25) {
puntos_dentro <- puntos_dentro + 1
}
}
puntos_dentro
## [1] 7877
Calculamos 7877 puntos dentro de la circunferencia de 10.000 generados de forma aleatoria.
Valor_pi_2 <- 4 * puntos_dentro / n
Valor_pi_2
## [1] 3.1508
pi-Valor_pi_2
## [1] -0.009207346
Obtenemos un valor π estimado de 3.1508. Con respecto al valor de π, hay un error de 0.009207346 negativos.
# Generamos dataframe con los puntos x e y
data2 <- data.frame(x, y, dentro = (x - 0.5)^2 + (y - 0.5)^2 < 0.25)
ggplot(data2, aes(x, y)) +
geom_point(aes(color = dentro), size = 1.0) +
scale_color_manual(values = c("red", "black")) +
geom_path(data = data.frame(x = 0.5 + 0.5 * cos(seq(0, 2 * pi, length.out = 100)),
y = 0.5 + 0.5 * sin(seq(0, 2 * pi, length.out = 100))),
aes(x, y), color = "blue") +
coord_equal() +
theme_minimal() +
labs(x = "X", y = "Y") +
theme(legend.position = "none")
n <- 100000
x <- runif(n)
y <- runif(n)
puntos_dentro <- 0
for (i in 1:n) {
distancia_cuadrada <- (x[i] - 0.5)^2 + (y[i] - 0.5)^2
if (distancia_cuadrada < 0.25) {
puntos_dentro <- puntos_dentro + 1
}
}
puntos_dentro
## [1] 78477
Valor_pi_3 <- 4 * puntos_dentro / n
Valor_pi_3
## [1] 3.13908
pi-Valor_pi_3
## [1] 0.002512654
Obtenemos un valor π estimado de 3.13908. Con respecto al valor de π, hay un error de 0.002512654.
A medida que incrementamos la cantidad de coordenadas generadas de forma aleatoria (Xi, Yi) con distribución uniforme (0,1), más se acerca el valor pi estimado al valor pi real. En ese mismo sentido, va disminuyendo el error absoluto.