1. Definición del problema


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


2. Definición de los objetivos


Estimar el valor de π por medio de simulaciones de números aleatorios.


3. Definición de las variables de interés


La variable de interés para estimar el valor de π será el numero de puntos dentro del area del circulo, a partir del numero de objetos dentro del circulo se estimara el valor de π


4. Diseño del experimento


  1. Generar n coordenadas x: X1,. . . , Xn, con una distribución uniforme con valor mínimo de 0 y valor máximo de 1.

  2. Generar n coordenadas y: Y1,. . . , Yn, con una distribución uniforme con valor mínimo de 0 y valor máximo de 1.

  3. Clasificar puntos que se encuentren dentro del círculo, esta condición se cumple si:

    Ri^2 = (Xi - 0.5)^2 + (Yi - 0.5)^2 < 0.25

  4. Contar numero de puntos dentro del area del circulo y estimar π teniendo en cuenta que el area del circulo es igual a π/4


5. Recolección de la información


Se realizará 3 escenarios de simulación:

Escenario 1 con n = 1,000

Escenario 2 con n = 10,000

Escenario 3 con n = 100,000

Los datos generados son presentados en las siguientes figuras.

#Definición de tamaños de muestra

nmil   =1000
n10mil =10000
n100mil=100000

#Generación de puntos aleatorios (x, y)

set.seed(123)

milPuntos = data.frame(x = runif(nmil, 0, 1), y = runif(nmil, 0, 1))

diezmilPuntos = data.frame(x = runif(n10mil, 0, 1), y = runif(n10mil, 0, 1))

cienmilPuntos = data.frame(x = runif(n100mil, 0, 1), y = runif(n100mil, 0, 1))

#Graficando coordenadas

plotMilPuntos = ggplot(milPuntos, aes(x = x, y = y)) +
  geom_point(alpha = 0.5) +
  theme_minimal() +
  labs(title = "Figura 1: 1,000 Puntos Aleatorios") +
  coord_fixed() # Mismo aspecto para x e y
  

plotDiezMilPuntos = ggplot(diezmilPuntos, aes(x = x, y = y)) +
  geom_point(alpha = 0.5) +
  theme_minimal() +
  labs(title = "Figura 2: 10,000 Puntos Aleatorios") +
  coord_fixed() # Mismo aspecto para x e y
  
plotCienMilPuntos = ggplot(cienmilPuntos, aes(x = x, y = y)) +
  geom_point(alpha = 0.5) +
  theme_minimal() +
  labs(title = "Figura 3: 100,000 Puntos Aleatorios") +
  coord_fixed() # Mismo aspecto para x e y
plotMilPuntos

plotDiezMilPuntos

plotCienMilPuntos


6. Procesamiento de los datos

Para el procesamiento de los datos se realizó una clasificación de los puntos teniendo en cuenta si se encontraban dentro del área del círculo con el cual se estimará el valor de π.

Para esto se verifico la distancia cuadrada entre las coordenadas del punto y el centro del círculo, si la distancia cuadrada es menor a 0.25 el punto se encuentra dentro del círculo.

#Clasificación de datos dentro del circulo
milPuntos$dentro = with(milPuntos, (x-0.5)^2 + (y-0.5)^2 <= 0.25)
diezmilPuntos$dentro = with(diezmilPuntos, (x-0.5)^2 + (y-0.5)^2 <= 0.25)
cienmilPuntos$dentro = with(cienmilPuntos, (x-0.5)^2 + (y-0.5)^2 <= 0.25)

#Definiendo circulo
t = seq(0, 2*pi, length.out = 100) # Crear 100 puntos para formar un círculo
circulo = data.frame(x = 0.5 + 0.5 * cos(t), y = 0.5 + 0.5 * sin(t))

#Graficando clasificacion
plotMilPuntos = ggplot(milPuntos, aes(x = x, y = y, color = dentro)) +
  geom_point(alpha = 0.5) +
  scale_color_manual(values = c("TRUE" = "blue", "FALSE" = "red")) + 
  geom_polygon(data = circulo, aes(x = x, y = y), color = "gray", fill = NA, linewidth= 1) +
  theme_minimal() +
  labs(title = "Figura 4: 1,000 Puntos Aleatorios Clasificados") +
  coord_fixed() + # Mismo aspecto para x e y
  theme(legend.title = element_blank()) # Sin título en la leyenda

plotDiezMilPuntos = ggplot(diezmilPuntos, aes(x = x, y = y, color = dentro)) +
  geom_point(alpha = 0.5) +
  scale_color_manual(values = c("TRUE" = "blue", "FALSE" = "red")) + 
  geom_polygon(data = circulo, aes(x = x, y = y), color = "gray", fill = NA, linewidth= 1) +
  theme_minimal() +
  labs(title = "Figura 5: 10,000 Puntos Aleatorios Clasificados") +
  coord_fixed() + # Mismo aspecto para x e y
  theme(legend.title = element_blank()) # Sin título en la leyenda

plotCienMilPuntos = ggplot(cienmilPuntos, aes(x = x, y = y, color = dentro)) +
  geom_point(alpha = 0.5) +
  scale_color_manual(values = c("TRUE" = "blue", "FALSE" = "red")) + 
  geom_polygon(data = circulo, aes(x = x, y = y), color = "gray", fill = NA, linewidth= 1) +
  theme_minimal() +
  labs(title = "Figura 6: 100,000 Puntos Aleatorios Clasificados") +
  coord_fixed() + # Mismo aspecto para x e y
  theme(legend.title = element_blank()) # Sin título en la leyenda


Estimación de Pi Escenario 1


Para el escenario 1 se determinó que dentro del círculo se encuentran 800 puntos.


Número de Puntos dentro del Círculo Escenario 1

milPuntosDentro = sum(milPuntos$dentro)
milPuntosDentro
## [1] 800
plotMilPuntos


La estimación de π para el Escenario 1 es de 3.2, esta estimación tiene un error de un 1.86%.


Valor Estimado de Pi Escenario 1

valor_pi_nmil = (milPuntosDentro/nmil)*4
valor_pi_nmil
## [1] 3.2

Error de la Estimación de Pi Escenario 1

error_nmil = (valor_pi_nmil - pi)*100/pi
error_nmil
## [1] 1.859164


Estimación de Pi Escenario 2


Para el escenario 2 se determinó que dentro del círculo se encuentran 7,882 puntos.

Número de Puntos dentro del Círculo Escenario 2

diezmilPuntosDentro = sum(diezmilPuntos$dentro)
diezmilPuntosDentro
## [1] 7882
plotDiezMilPuntos


La estimación de π para el Escenario 2 es de 3.15, esta estimación tiene un error de un 0.36%


Valor Estimado de Pi Escenario 2

valor_pi_n10mil = (diezmilPuntosDentro/n10mil)*4
valor_pi_n10mil
## [1] 3.1528

Error de la Estimación de Pi Escenario 2

error_n10mil = (valor_pi_n10mil - pi)*100/pi
error_n10mil
## [1] 0.3567409


Estimación de Pi Escenario 3


Para el escenario 3 se determinó que dentro del círculo se encuentran 78,600 puntos.

Número de Puntos dentro del Círculo Escenario 3

cienmilPuntosDentro = sum(cienmilPuntos$dentro)
cienmilPuntosDentro
## [1] 78600
plotCienMilPuntos


La estimación de π para el Escenario 3 es de 3.144, esta estimación tiene un error de un 0.077%


Valor Estimado de Pi Escenario 3

valor_pi_n100mil = (cienmilPuntosDentro/n100mil)*4
valor_pi_n100mil
## [1] 3.144

Error de la Estimación de Pi Escenario 3

error_n100mil = (valor_pi_n100mil - pi)*100/pi
error_n100mil
## [1] 0.07662822


7. Conclusiones


Los métodos de simulación estadística utilizados en este ejercicio demuestran su eficacia para realizar estimaciones de valores que de otra manera serían desconocidos, siempre que exista una comprensión profunda del problema a tratar. En este contexto específico, se ha logrado estimar el valor de π aprovechando la proporción geométrica entre un círculo inscrito y un cuadrado de área 1x1. Los puntos generados aleatoriamente siguiendo una distribución uniforme reflejan esta proporción, asegurando que cada punto dentro del cuadrado tenga igual probabilidad de ser elegido. Este enfoque destaca la importancia de fundamentar la simulación en sólidos principios teóricos, facilitando estimaciones precisas en situaciones donde los métodos de cálculo directo resultan complejos o inviables.

También es importante destacar que, a medida que el número de muestras aumenta, el valor estimado de π converge hacia su valor real. Este fenómeno respalda la ley de los grandes números, subrayando cómo el incremento en el tamaño de la muestra mejora la precisión de las estimaciones estadísticas.