knitr::opts_chunk$set(echo = TRUE)

if (!require("ggplot2")) install.packages("ggplot2")
## Loading required package: ggplot2
library("ggplot2")

if (!require("rmarkdown")) install.packages("rmarkdown")
## Loading required package: rmarkdown

Estimacion π

Este proyecto presenta la simulacion de n puntos que estan dentro de un circulo con radio 0.5 teniendo datos aleatorios con una distribucion uniforme

ifInside Function

Creo una funcion para determinar si un punto esta o no dentro del circulo

ifInside <- function(row){
  
  xx <- row['x']
  yy <- row['y']

  inside <-  ((xx-0.5)**2 + (yy-0.5)**2)

  result <- ifelse(inside<0.25, TRUE, FALSE)
  return(result)
  
}

Desarrollo el ejercicio teniendo en cuenta recorriendo los posibles numeros de puntos

numberPoint <- list(1000,10000,100000)

for (numberPoints in numberPoint) {


  
  x <- runif(numberPoints, 0, 1)
  y <- runif(numberPoints, 0, 1)
  
  
  #creo un grafico para ver como estan distribuidos en un plano 
  
  plot(x, y, col = 'blue', main = paste('Distribucion con ', numberPoints, ' puntos')   , xlab = 'X', ylab = 'Y',type="p")
  
  
  #demostracion que los datos generados en X y Y son mas o menos uniformes
  
  hist(x)
  title(paste('Distribucion con ', numberPoints, ' puntos'),outer=TRUE)
  hist(y)
  title(paste('Distribucion con ', numberPoints, ' puntos'),outer=TRUE)
  
  #creo un df con la informacion de x y y
  point <- data.frame(x,y)
  
  #creo una columnda llamada isInside la cual tiene el calculo de la funcion que determina si esta o no dentro del circulo
  point$isInside<-apply(point, MARGIN =1, FUN = ifInside)
  

  #creo la grafica con los datos discriminando por la columna isInside
  graphCircleInside <- ggplot(point, aes(x = x, y = y, colour = isInside)) +
    geom_point() +  ggtitle(paste('Visualizacion grafica con ', numberPoints, ' puntos'))
  
  
  print(graphCircleInside)
  
  ##para saber cuantos puntos estan dentro del circulo, basta con agrupar por la columna isInside
  
  df<- aggregate(point$isInside, by=list(point$isInside),  FUN=length)
  
  print('Numero de puntos adentro o afuera')
  print(df)
  
  #los elementos adentro del ciculo son:
  totalInsidePoints <- as.integer(df[2,2])
  cat("   -El total de puntos adentro del circulo es  ", totalInsidePoints)
  
  cat("   -La estimacion de PI es ", 4* (totalInsidePoints/numberPoints))

  
  print('/   ----------------------------------------------------  ')
  
  
}

## [1] "Numero de puntos adentro o afuera"
##   Group.1   x
## 1   FALSE 224
## 2    TRUE 776
##    -El total de puntos adentro del circulo es   776   -La estimacion de PI es  3.104[1] "/   ----------------------------------------------------  "

## [1] "Numero de puntos adentro o afuera"
##   Group.1    x
## 1   FALSE 2160
## 2    TRUE 7840
##    -El total de puntos adentro del circulo es   7840   -La estimacion de PI es  3.136[1] "/   ----------------------------------------------------  "

## [1] "Numero de puntos adentro o afuera"
##   Group.1     x
## 1   FALSE 21638
## 2    TRUE 78362
##    -El total de puntos adentro del circulo es   78362   -La estimacion de PI es  3.13448[1] "/   ----------------------------------------------------  "
paged_table(df ,options = NULL)