随机函数在与向量一起使用时不起作用

Random function not working when used with vectors

我正在使用 R。 我做了一个随机函数(使用 monte carlo 积分)来近似反正切函数(等于 1/(1+x^2) 的积分)。它似乎运行良好并给出了准确的近似值。例如 3*arctan(sqrt(3)) 应该给出 pi,下面我得到一个近似值。

> f=function(x)
+ {y=runif(10^6,0,x); return(x*mean((1/(1+y^2))))}
> f(sqrt(3))*3
[1] 3.140515

但是,当我对数字序列使用该函数时,答案似乎是错误的。下面的 atan 函数给出了正确的值,但是 f 函数在同一向量上使用时给出了错误的值。

> atan(c(1,1.5,2))
[1] 0.7853982 0.9827937 1.1071487
> f(c(1,1.5,2))
[1] 0.6648275 0.9972412 1.3296550
> f(1)
[1] 0.7852855
> f(1.5)
[1] 0.9828134
> f(2)
[1] 1.107888

请注意,当我分别在 1、1.5 和 2 上使用 f 时,它是如何工作的,但不是矢量形式?这里发生了什么?我在向量上尝试了几次 运行 f,错误的值与小数点后 2 位非常一致。

在函数内部使用 mean() 会干扰矢量化。您可以将函数包装在 Vectorize() 中以修复它。例如

f <- Vectorize(function(x) {y=runif(10^6,0,x); return(x*mean((1/(1+y^2))))})