#install.packages("kableExtra")
#install.packages("moments")
#install.packages("gganimate")
#install.packages("gifski")
#install.packages("ggplot2")
#install.packages("magick")
#install.packages("reshape2")
#install.packages("plotly")

Problema 1: Estimación del valor de \(\pi\)

Se plantea como figura un círcuito con un área igual a π/4, el cual 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 éste, la cual es π/4.

Por tanto, se estimará el valor de π/4 al contar el número de puntos dentro del círculo, y con ello encontrar una aproximación para el valor de π.

Generacion de grafico

set.seed(999)
library(ggplot2)
library(magick)

# Función para estimar pi
est <- function(n){
  # Se generan n coordenadas (x, y) en el intervalo (0,1)
  x <- runif(n, 0, 1)
  y <- runif(n, 0, 1)
  
  # Se calcula la distancia desde el centro (0.5, 0.5)
  distancia <- (x - 0.5)^2 + (y - 0.5)^2
  
  # Se verifica si el punto está dentro del círculo
  dentro_circulo <- distancia <= 0.25
  
  # Se crear un df para almacenar las coordenadas y el estado (dentro o fuera del círculo)
  coord <- data.frame(x, y, dentro_circulo)
  
  # Se calcula el pi estimado
  pi_estimado <- (sum(dentro_circulo) / n) * 4
  
  # Se calcula la cantidad de puntos dentro del circulo
  puntos_dentro <- sum(dentro_circulo)
  porcentaje_dentro <- (puntos_dentro / n) * 100
  
  n_formateado <- format(n, big.mark = ",", scientific = FALSE)
  
  # Se generar la gráfica
  p <- ggplot(coord, aes(x = x, y = y, color = dentro_circulo)) +
    geom_point(size = 0.5) +
    scale_color_manual(values = c("red", "blue"), labels = c("Fuera", "Dentro")) +
    labs(title = paste("Estimación de π para n =", n_formateado, "\nAproximación de π =", round(pi_estimado, 5)),
         x = "Eje X", y = "Eje Y") +
    theme_minimal() +
    coord_fixed(ratio = 1) +
    theme(legend.position = "none") +
    annotate("path", 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)),
             color = "black", size = 1)
  
  ggsave(paste0("pi_estimacion_", n, ".png"), p, width = 5, height = 5, units = "in")
  
  return(list(n = n_formateado, puntos_dentro = puntos_dentro, porcentaje_dentro = porcentaje_dentro))
}

# Se genera la gráfica con distintos tamaños de muestra
ns <- c(1000, 10000, 100000)
resultados <- lapply(ns, est)
# Creacion del GIF con las tres imágenes
imagenes <- c("pi_estimacion_1000.png", "pi_estimacion_10000.png", "pi_estimacion_100000.png")
imagenes_cargadas <- image_read(imagenes)
gif <- image_animate(imagenes_cargadas, fps = 1)
image_write(gif, "estimacion_pi.gif")
Fig. 1 Estimación de $\pi$ para distintos tamaños de muestra.
Fig. 1 Estimación de \(\pi\) para distintos tamaños de muestra.
cat("<h4><strong>Cantidad de puntos dentro del círculo y su porcentaje:</strong></h4><ul>")

Cantidad de puntos dentro del círculo y su porcentaje:

    for (i in 1:length(resultados)) {
      cat(paste("<li>Para n =", resultados[[i]]$n, ":",
                format(resultados[[i]]$puntos_dentro, big.mark = ","), 
                "puntos dentro del círculo",
                "(", round(resultados[[i]]$porcentaje_dentro, 2), "% )</li>"))
    }
  • Para n = 1,000 : 785 puntos dentro del círculo ( 78.5 % )
  • Para n = 10,000 : 7,885 puntos dentro del círculo ( 78.85 % )
  • Para n = 100,000 : 78,556 puntos dentro del círculo ( 78.56 % )
  • cat("</ul>")

Interpretacion

Para los tres tamaños de muestra simulados \(n=1.000, 10.000, 100.000\), al alrededor del \(80\%\) de los puntos están dentro del círculo. Sin embargo, a mayor tamaño de muestra, el \(\pi\) estimado se acerca más al valor de \(\pi\).