在单位圆上使用蒙特卡罗模拟估计`pi`时,`norm`函数出错

时间:2016-11-26 01:06:51

标签: r simulation montecarlo pi

## simulate `N` uniformly distributed points on unit square
N <- 1000
x <- matrix(runif(2 * N), ncol = 2)

## count number of points inside unit circle
n <- 0; for(i in 1:N) {if (norm(x[i,]) < 1) {n <- n + 1} } 
n <- n / N 

## estimate of pi
4 * n

但我明白了:

  

&#34;规范中的错误(x [i,]):&#39; A&#39;必须是数字矩阵&#34;

不确定是什么问题。

1 个答案:

答案 0 :(得分:2)

norm会给你错误,因为它要求一个矩阵。但是,x[i, ]不是矩阵,而是矢量。换句话说,从矩阵中提取单个行/列时,会删除其维度。您可以使用x[i, , drop = FALSE]来维护矩阵类。

第二个问题是,你想要 L2-norm 。因此,将type = "2"设置在规范内。总之,使用

norm(x[i, , drop = FALSE], type = "2") < 1

norm不是唯一的解决方案。您还可以使用以下任一项:

sqrt(c(crossprod(x[i,])))
sqrt(sum(x[i,] ^ 2))
事实上,它们更有效率。它们也支持在下面的矢量化方法中使用rowSums的想法。

<强>矢量

我们可以通过以下方式避免循环:

n <- mean(sqrt(rowSums(x ^ 2)) < 1)  ## or simply `mean(rowSums(x ^ 2) < 1)`

sqrt(rowSums(x ^ 2))为所有行提供L2范数。在与1(半径)比较后,我们得到一个逻辑向量,TRUE表示&#34;在圈内&#34;。现在,您想要的值n只是TRUE的数量。您可以对此逻辑向量求和,然后除以N,或者简单地对该向量求平均值。