n = 1000
Cantidad de puntos dentro del círculo: 797
Estimación de π con 1000 puntos: 3.188
n = 100000
Cantidad de puntos dentro del círculo: 78358
Estimación de π con 1000 puntos: 3.13432
| Variable | Valor |
|---|---|
| Estimación de π | 3.134320 |
| π Real | 3.141593 |
| Error Absoluto | 0.007300 |
| Error Relativo (%) | 0.232400 |
##### 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.")