1 Estimación del valor de π

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


n = 1000
Cantidad de puntos dentro del círculo: 797
Estimación de π con 1000 puntos: 3.188


Frecuencia


n = 100000
Cantidad de puntos dentro del círculo: 78358
Estimación de π con 1000 puntos: 3.13432

1.0.2 Comparación entre la estimación de π y el valor real de π, junto con los errores.

Variable Valor
Estimación de π 3.134320
π Real 3.141593
Error Absoluto 0.007300
Error Relativo (%) 0.232400

Frecuencia

1.1 Codigo Fuente:

##### Problema 1 ####
## Estimación del valor de π

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

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

# Definir el número de puntos a generar
n <- 1000

# Generar n coordenadas x e y uniformemente distribuidas entre 0 y 1.
x <- runif(n)
y <- runif(n)

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

# Variable dentro del circulo = 0 inicilamente
dentro_circulo <- 0

# Iterar sobre los puntos para determinar si están dentro del círculo
for (i in 1:n) {
  distancia_al_centro_cuadrado <- (x[i] - 0.5)^2 + (y[i] - 0.5)^2
  if (distancia_al_centro_cuadrado < 0.25) {
    dentro_circulo <- dentro_circulo + 1
  }
}

# Estimar pi
estimacion_pi <- 4 * dentro_circulo / n

cat("Estimación de pi con", n, "puntos:", estimacion_pi, "\n")

######################################
##### Ejercicio 1 Con funcion y Grafica ####

# Definir función para estimar π y graficar
estimar_pi_y_graficar <- function(n) {
  set.seed(1234)  # Fijar semilla para reproducibilidad
  
  # Generar n coordenadas X e Y de forma aleatoria entre 0 y 1
  X <- runif(n, min = 0, max = 1)
  Y <- runif(n, min = 0, max = 1)
  
  # Contador para puntos dentro del círculo
  puntos_dentro <- 0
  
  # Crear vector para almacenar color de puntos (rojo para dentro del círculo, azul para fuera)
  colores <- ifelse((X - 0.5)^2 + (Y - 0.5)^2 < 0.25, "red", "blue")
  
  # Crear plot con relación de aspecto igual
  plot(X, Y, col = colores, pch = 16, xlab = "X", ylab = "Y", main = paste("Simulación de Estimación de Pi para n = ",n), asp = 1)
  
  # Dibujar círculo inscrito
  # Tomado del codigo https://www.stat.auckland.ac.nz/~ihaka/courses/787/lectures-r-graphics.pdf pag 64
  theta <- seq(0, 2 * pi, length.out = 100)
  circle_x <- 0.5 + 0.5 * cos(theta)
  circle_y <- 0.5 + 0.5 * sin(theta)
  lines(circle_x, circle_y, col = "green", lwd = 2)
  
  # Contar puntos dentro del círculo
  for (i in 1:n) {
    distancia_cuadrada <- (X[i] - 0.5)^2 + (Y[i] - 0.5)^2
    if (distancia_cuadrada < 0.25) {  # Si la distancia al cuadrado es menor que 0.25 (radio^2)
      puntos_dentro <- puntos_dentro + 1
    }
  }
  
  # Calcular estimación de π
  estimacion_pi <- 4 * puntos_dentro / n
  
  # Retornar cantidad de puntos dentro del círculo y estimación de π
  return(list(puntos_dentro = puntos_dentro, estimacion_pi = estimacion_pi))
}

# Definir número de puntos a generar
n <- 100000. #1000

# Estimar π y graficar
resultado <- estimar_pi_y_graficar(n)
puntos_dentro <- resultado$puntos_dentro
pi_estimado <- resultado$estimacion_pi
pi_real <- pi

# Imprimir resultados
cat("Cantidad de puntos dentro del círculo:", puntos_dentro, "\n")
cat("Estimación de π con", n, "puntos:", pi_estimado, "\n")

error_absoluto <- round(abs(pi_real - pi_estimado),4)
error_relativo <- round(error_absoluto * 100/ pi_real,4)

# Creación de tabla para la visualización de los resultados
tabla <- data.frame(Variable = c("Estimación de π", "π Real", "Error Absoluto", "Error Relativo (%)"),Valor = c(pi_estimado, pi_real, error_absoluto, error_relativo))
# Muestra de la tabla
knitr::kable(tabla, caption = "Comparación entre la estimación de π y el valor real de π, junto con los errores.")