Christian David Vera Mendivelso
Paula
Vidal Godoy
Métodos y Simulación estadística
Maestría en Ciencia de Datos
Pontificia Universidad Javeriana de
Cali
Este texto tiene como propósito estimar el valor de \(\pi\) mediante la generación de puntos aleatorios en un cuadrado de area 1 y un circulo inscrito de área \(\pi\)/4 ,al contar los puntos dispuestos dentro del área del circulo, se puede estimar el valor del area y de este hallar el valor de \(\pi\).
Para dar solución a este problema se siguen los siguientes pasos:
1.Se generan valores aleatorios con una distribución uniforme usando “runif” para las coordenadas \((x,y)\)
inicial = 1000
x = runif(inicial,0,1)
y = runif(inicial,0,1)
2.Posteriormente se determina si los puntos generados se encuentran dentro del circulo, teniendo en cuenta que cada punto (x,y) se encuentra en el circulo si la distancia desde el centro es menor a 0.5 que es el radio.Mediante la siguiente expresión se puede calcular la distancia al cuadrado al centro del circulo:
\[(x - 0.5)^2 + (y - 0.5)^2 \]
#Función que determina si los puntos están dentro del circulo
Circulo <- function(x, y) {
distancia_2 <- (x - 0.5)^2 + (y - 0.5)^2
condicion <- distancia_2 < 0.25
return(data.frame(X = x, Y = y, Distancia = distancia_2, Condicion = condicion))
}
resultados1 <- Circulo(x, y)
3.Seguidamente se resalta la cantidad de puntos que cumplen esta condición en color verde (figura 1) con una cantidad de 1.000 valores generados para facilitar su visualización, esto con el motivo de verificar de manera sencilla que la clasificación de las coordenadas es correcta.\
library(ggplot2)
t <- seq(0, 2*pi, length.out = 100)
circulo <- data.frame(
X = 0.5 + 0.5 * cos(t),
Y = 0.5 + 0.5 * sin(t)
)
ggplot(resultados1, aes(x = X, y = Y)) +
geom_point(aes(color = Condicion), size = 2) +
geom_path(data = circulo, aes(x = X, y = Y), color = "black", linewidth = 0.8) + # Círculo de referencia
scale_color_manual(values = c("red", "#4baf32"), labels = c("Fuera", "Dentro")) +
labs(x = "Coordenada X",y = "Coordenada Y", color = "Posición") + #Colores
coord_fixed(ratio = 1) + theme_minimal() + theme(legend.position = "bottom")
Seguidamente, se realiza esta clasificación para mayor cantidad
de puntos aleatorios (Tabla 1), mostrando como a medida que se aumenta
la muestra se disminuye el error respecto al valor real de \(\pi\) (figura 2)
# Cargar librerías necesarias
library(ggplot2)
library(knitr)
library(kableExtra)
# Define los tamaños de muestra a evaluar
tamanos_muestra <- c(100, 1000, 10000, 100000, 1000000, 10000000, 20000000)
pi_real <- pi
# Lista para guardar resultados del bucle for
resultados_estimaciones <- list()
# Calcular la estimación de pi para cada tamaño de muestra
for (n in tamanos_muestra) {
x <- runif(n, min = 0, max = 1)
y <- runif(n, min = 0, max = 1)
resultados <- Circulo(x, y)
num_dentro <- sum(resultados$Condicion)
total <- n
# Calcular la estimación y el error de pi
estimacion_pi <- 4 * num_dentro / total
error <- estimacion_pi - pi_real
# Guardar los resultados
resultados_estimaciones[[as.character(n)]] <- data.frame(
TamañoDeMuestra = format(n, big.mark = ",", scientific = FALSE),
P_Dentro = format(num_dentro, big.mark = ",", scientific = FALSE),
Pi_Estimado = format(round(estimacion_pi, 6), nsmall = 6, scientific = FALSE),
Error = format(round(error, 6), nsmall = 6, scientific = FALSE)
)}
# Unir los data frames en uno solo con los resultados de pi estimado
tabla_resultados <- do.call(rbind, resultados_estimaciones)
# Mostrar la tabla de resultados con kableExtra
Tabla_final <- kable(tabla_resultados,
format = "pipe",
col.names = c("Tamaño de Muestra", "Puntos Dentro", "Estimación", "Error"),
digits = 6, # Número de decimales para los valores numéricos
row.names = FALSE,
align = 'c') %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 12,
full_width = FALSE
)
# Mostrar la tabla
Tabla_final
| Tamaño de Muestra | Puntos Dentro | Estimación | Error |
|---|---|---|---|
| 100 | 76 | 3.040000 | -0.101593 |
| 1,000 | 791 | 3.164000 | 0.022407 |
| 10,000 | 7,808 | 3.123200 | -0.018393 |
| 100,000 | 78,591 | 3.143640 | 0.002047 |
| 1,000,000 | 785,310 | 3.141240 | -0.000353 |
| 10,000,000 | 7,853,927 | 3.141571 | -0.000022 |
| 20,000,000 | 15,708,487 | 3.141697 | 0.000105 |
library(ggplot2)
library(knitr)
library(kableExtra)
#Se crea una gráfica que muestra como se acerca al valor ral a medida que se incrementa la cantidad de puntos.
ggplot(tabla_resultados, aes(x = as.numeric(gsub(",", "", TamañoDeMuestra)), y = as.numeric(Pi_Estimado))) +
geom_smooth(color = "blue", linewidth = 0.8, method = "loess", formula = y ~ x, se = FALSE) +
geom_hline(yintercept = pi_real, linetype = "dashed", color = "#4baf32", linewidth = 1) +
scale_x_log10(labels = scales::label_number(big.mark = ",")) +
labs(
x = "Cantidad de puntos",
y = "Estimación"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))