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

A. 1000 Coordenadas de X.

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

x = runif(1000,0,1)
head(x)
## [1] 0.1250339 0.7472528 0.2637373 0.5134308 0.6597293 0.5475768

B. 1000 Coordenadas de Y.

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

y = runif(1000,0,1)
head(y)
## [1] 0.827579401 0.859766356 0.002189903 0.118105086 0.658325599 0.300624992

C. Determinación de la distancia.

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.

valor_x_y <- numeric() # Variable para almacenar la distancia
posicion_x_y <- numeric() # Variable de posición: 1 = adentro, 0 = afuera

for(i in 1:length(x)){ # Recorre los datos de x
  valor <- (x[i]-0.5)^2 + (y[i]-0.5)^2  # Calcula la distancia
  valor_x_y[i] <- valor # Asigna el valor de la distancia
  if(valor < 0.25){ # Si la distancia es menor que 0.25, el punto está adentro 
    posicion_x_y[i] <- 1 #adentro
  } else {
    posicion_x_y[i] <- 0 #afuera
  }
}

head(valor_x_y)
## [1] 0.24790786 0.19056579 0.30363496 0.14602411 0.05058043 0.04201395
head(posicion_x_y)
## [1] 1 1 0 1 1 1

D. Puntos dentro del circulo.

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

Se inicia graficando los puntos, en la grafica.

# Definir el radio del círculo
radio <- 0.5
# Crear datos para dibujar el círculo
theta <- seq(0, 2*pi, length.out = 100)
x_circle <- 0.5 + radio * cos(theta)
y_circle <- 0.5 + radio * sin(theta)

# Graficar los puntos y el círculo
plot(0, 0, asp = 1, type = "n",
     xlim = c(0, 1), ylim = c(0, 1),
     xlab = "", ylab = "", main = "Puntos junto al círculo inscrito")

lines(x_circle, y_circle, col = "black")
points(x,y,pch = 20, col="red")

Se continua contabilizando el total de puntos que estan dentro del círculo

dentro <- 0
for(i in 1:length(posicion_x_y)){ 
  if(posicion_x_y[i]==1){
    dentro = dentro +1
  }
}
dentro
## [1] 786

Estimación de π con 1000

pi <- ((4*sum(dentro))/length(x))
(pi)
## [1] 3.144

Estimación de π para n puntos

calcular_pi <- function(num_puntos) {
  # Generar puntos aleatorios dentro del cuadrado
  x <- runif(num_puntos, 0, 1)
  y <- runif(num_puntos, 0, 1)
  
  # Variable para almacenar la distancia
  valor_x_y <- numeric(num_puntos)
  # Variable de posición: 1 = adentro, 0 = afuera
  posicion_x_y <- numeric(num_puntos)
  
  for(i in 1:num_puntos) { # Recorre los datos de x
    # Calcula la distancia
    valor <- (x[i]-0.5)^2 + (y[i]-0.5)^2
    # Asigna el valor de la distancia
    valor_x_y[i] <- valor
    # Si la distancia es menor que 0.25, el punto está adentro
    if(valor < 0.25) {
      posicion_x_y[i] <- 1 #adentro
    } else {
      posicion_x_y[i] <- 0 #afuera
    }
  }
  
  # Contar cuántos puntos están dentro del círculo
  dentro <- sum(posicion_x_y)
  
  # Calcular pi
  pi_estimado <- 4 * dentro / num_puntos
  cat("VALOR DE π PARA", num_puntos, "PUNTOS:", pi_estimado, "\n")
  return(pi_estimado)
}


valor_pi <- calcular_pi(100)
## VALOR DE π PARA 100 PUNTOS: 3.36
valor_pi <- calcular_pi(1000)
## VALOR DE π PARA 1000 PUNTOS: 3.172
valor_pi <- calcular_pi(10000)
## VALOR DE π PARA 10000 PUNTOS: 3.1168
valor_pi <- calcular_pi(100000)
## VALOR DE π PARA 1e+05 PUNTOS: 3.14948
valor_pi <- calcular_pi(1000000)
## VALOR DE π PARA 1e+06 PUNTOS: 3.140788

Conclusión

La simulación propuesta demuestra cómo el valor de π puede ser estimado mediante el uso de puntos aleatorios generados dentro de un cuadrado y determinando cuántos de estos puntos caen dentro de un círculo inscrito. Esta metodología proporciona una forma práctica y eficiente de calcular una aproximación de π, mostrando cómo el número de puntos utilizados en la simulación afecta la precisión de la estimación. Cuantos más puntos se utilicen, mayor será la precisión de la estimación, lo que ilustra la versatilidad y la escalabilidad de este método computacional para obtener valores cercanos a π.