#install.packages("kableExtra")
#install.packages("moments")
#install.packages("gganimate")
#install.packages("gifski")
#install.packages("ggplot2")
#install.packages("magick")
#install.packages("reshape2")
#install.packages("plotly")
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 π.
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")
cat("<h4><strong>Cantidad de puntos dentro del círculo y su porcentaje:</strong></h4><ul>")
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>"))
}
cat("</ul>")
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\).