La siguiente figura sugiere como estimar el valor de π con una simulación. En la figura 1, un circuito con un área igual a π/4, 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 este, la cual es π/4. Por tanto, se puede estimar el valor de π/4 al contar el número de puntos dentro del círculo, para obtener la estimación de π/4. De este último resultado se debe encontrar una aproximación para el valor de π .
Pasos a seguir:
coord = 1000
coordx=runif(coord, min=0, max=1) # coordenadas eje X
coordy=runif(coord, min=0, max=1) # coordenadas eje y
data = data.frame(CX=coordx,CY=coordy) # se genera dataframe con coordenadas xy
#se genera funcion para calcular la diferencia
Calculo_diferencia <- function(data) {
diferencia =(data$CX-0.5)^2+(data$CY-0.5)^2
return(diferencia) }
ContarDentro=0
ContarFuera=0
TotalCoord=0
Resultado=Calculo_diferencia(data)
#ciclo para contar puntos dentro o fuera del círculo
for (i in 1:coord){
if(Resultado[i]<=0.25)
{ContarDentro=ContarDentro+1} else {ContarFuera=ContarFuera+1}
TotalCoord=TotalCoord+1 }
El total de puntos dentro del círculo con 1.000 coordenadas para xy es de:
## [1] 784
#calculo del area de puntos dentro del círculo
porcentajepuntosD = (ContarDentro*100)/TotalCoord
area = (1*porcentajepuntosD)/100
Pi1= area/(0.5^2)
Pi1
## [1] 3.136
Simulación con 10.000 Puntos
A continuación se presentan resultados con simulación de 10.000 Puntos:
coord = 10000
coordx=runif(coord, min=0, max=1) # coordenadas eje X
coordy=runif(coord, min=0, max=1) # coordenadas eje y
data = data.frame(CX=coordx,CY=coordy) # se genera dataframe con coordenadas xy
Calculo_diferencia <- function(data) {
diferencia =(data$CX-0.5)^2+(data$CY-0.5)^2
return(diferencia) }
ContarDentro=0
ContarFuera=0
TotalCoord=0
Resultado=Calculo_diferencia(data)
#ciclo para contar puntos dentro o fuera del círculo
for (i in 1:coord){
if(Resultado[i]<=0.25)
{ContarDentro=ContarDentro+1} else {ContarFuera=ContarFuera+1}
TotalCoord=TotalCoord+1 }
El total de puntos dentro del círculo con 10.000 coordenadas para xy es de:
## [1] 7835
La estimación de Pi para 10.000 coordenadas es de:
## [1] 3.134
Simulación con 100.000 Puntos
A continuación se presentan resultados con simulación de 100.000 Puntos:
coord = 100000
coordx=runif(coord, min=0, max=1) # coordenadas eje X
coordy=runif(coord, min=0, max=1) # coordenadas eje y
data = data.frame(CX=coordx,CY=coordy) # se genera dataframe con coordenadas xy
Calculo_diferencia <- function(data) {
diferencia =(data$CX-0.5)^2+(data$CY-0.5)^2
return(diferencia) }
ContarDentro=0
ContarFuera=0
TotalCoord=0
Resultado=Calculo_diferencia(data)
#ciclo para contar puntos dentro o fuera del círculo
for (i in 1:coord){
if(Resultado[i]<=0.25)
{ContarDentro=ContarDentro+1} else {ContarFuera=ContarFuera+1}
TotalCoord=TotalCoord+1 }
El total de puntos dentro del círculo con 100.000 coordenadas para xy es de:
## [1] 78688
La estimación de Pi para 100.000 coordenadas es de:
## [1] 3.14752
CONCLUSION
Se evidencia que al aumentar las simulaciones se aproxima más al valor de Pi.
x <- c(1, 2, 3)
y <- c(Pi1, Pi2, Pi3)
plot(x, y, type = "b", main ="Variacion de Pi acorde con simulaciones", xlab = "aumento de n", xaxt = "n", ylab= "valor de Pi")
etiquetas <- c("Pi1", "Pi2", "Pi3")
text(x = x, y = y, etiquetas, col = "red")