Estimación del valor de π

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:

  1. 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).

  2. Genere 1000 coordenadas y: Y1,…,Yn, utilizando nuevamente la distribución uniforme con valor mínimo de 0 y valor máximo de 1.

  3. 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.

  4. ¿Cuántos de los puntos están dentro del círculo? ¿Cuál es su estimación de π?

1. Se generan 1.000 coordenadas

1.1 Cantidad de coordenadas a generar

# Número de coordenadas a generar
n <- 1000

1.2 Establecemos semilla

set.seed(125)

1.3 Generar coordenadas (Xi, Yi) con distribución uniforme (0,1)

x <- runif(n)
y <- runif(n)

1.4 Contador de puntos dentro del círculo

puntos_dentro <- 0

1.5 Calcular los puntos dentro de la circunferencia

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.

1.6 Estimar el valor de π

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.

1.7 Gráfica de los puntos generados

# 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")

2. Se generan 10.000 coordenadas

2.1 Cantidad de coordenadas (Xi, Yi) con distribución uniforme (0,1)

n <- 10000
x <- runif(n)
y <- runif(n)

2.2 Calculamos los puntos dentro de la circunferencia

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.

2.3 Estimar el valor de π

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.

2.4 Gráfica de los 10.000 puntos generados

# 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")

3. Se generan 100.000 coordenadas

3.1 Cantidad de coordenadas (Xi, Yi) con distribución uniforme (0,1)

n <- 100000
x <- runif(n)
y <- runif(n)

3.2 Calculamos los puntos dentro de la circunferencia

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

3.3 Estimar el valor de π

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.

4. Conclusión

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.