蒙特卡罗pi方法

时间:2013-03-03 13:29:26

标签: algorithm r

我尝试在R中计算蒙特卡罗pi函数。我在代码中遇到了一些问题。 现在我写这段代码:

ploscinaKvadrata  <- 0
ploscinaKroga <- 0
n = 1000
for (i in i:n) {
  x <- runif(1000, min= -1, max= 1)
  y <- runif(1000, min= -1, max= 1)
  if ((x^2 + y^2) <= 1) {
    ploscinaKroga  <- ploscinaKroga + 1
  } else {
    ploscinaKvadrata <- ploscinaKvadrata + 1
  }
    izracunPi = 4* ploscinaKroga/ploscinaKvadrata
}

izracunPi

这不起作用,但我不知道如何修复它。

我还想编写一个代码来绘制这个(圆圈在正方形和圆点内)。

2 个答案:

答案 0 :(得分:9)

这是一个矢量化版本(你的数学也有问题)

N <- 1000000
R <- 1
x <- runif(N, min= -R, max= R)
y <- runif(N, min= -R, max= R)
is.inside <- (x^2 + y^2) <= R^2
pi.estimate <- 4 * sum(is.inside) / N
pi.estimate
# [1] 3.141472

就绘制点而言,你可以这样做:

plot.new()
plot.window(xlim = 1.1 * R * c(-1, 1), ylim = 1.1 * R * c(-1, 1))
points(x[ is.inside], y[ is.inside], pch = '.', col = "blue")
points(x[!is.inside], y[!is.inside], pch = '.', col = "red")

但我建议你使用较小的N值,也许10000。

答案 1 :(得分:0)

这是一款有趣的游戏 - 网上有很多版本。这是我从命名来源攻击的一个(因为他的代码有些天真)。

来自http://giventhedata.blogspot.com/2012/09/estimating-pi-with-r-via-mcs-dart-very.html

est.pi <- function(n){

# drawing in  [0,1] x [0,1] covers one quarter of square and circle
# draw random numbers for the coordinates of the "dart-hits"
a <- runif(n,0,1)
b <- runif(n,0,1)
# use the pythagorean theorem
c <- sqrt((a^2) + (b^2) )

inside <- sum(c<1)
#outside <- n-inside

pi.est <- inside/n*4

 return(pi.est)
}

错字&#39; nside&#39;到&#39;里面&#39;