【问题标题】:Error with `norm` function when estimating `pi` using Monte Carlo simulation on a unit circle使用单位圆上的蒙特卡罗模拟估计“pi”时,“norm”函数出错
【发布时间】:2017-04-10 09:15:31
【问题描述】:
## 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

但我明白了:

"范数错误(x[i,]): 'A' 必须是数值矩阵"

不知道哪里出了问题。

【问题讨论】:

    标签: r simulation montecarlo pi


    【解决方案1】:

    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 表示“在圆内”。现在,您想要的值n 就是TRUE 的数量。你可以对这个逻辑向量求和然后除以N,或者简单地对这个向量取平均值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多