Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 与向量一起使用时,随机函数不起作用_R_Function_Sequence_Random Sample_Montecarlo - Fatal编程技术网

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

R 与向量一起使用时,随机函数不起作用,r,function,sequence,random-sample,montecarlo,R,Function,Sequence,Random Sample,Montecarlo,我用的是R。 我制作了一个随机函数(使用蒙特卡罗积分),它近似于arctan函数(等于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 然而,当我对一系列数字使用函数时,答案似乎是错误的。下面的正确值由a

我用的是R。 我制作了一个随机函数(使用蒙特卡罗积分),它近似于arctan函数(等于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))))}) 
f在函数中使用
mean()
会干扰矢量化。您可以将函数包装在
Vectorize()
中以修复它。比如说

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

f在函数中使用
mean()
会干扰矢量化。您可以将函数包装在
Vectorize()
中以修复它
f=Vectorize(函数(x){…})
@MrFlick谢谢,修复了它。如果您将此作为一个答案进行评论,我可以将此问题标记为已解决。Vectorize()基本上是mapply()的包装器,IIRC。如果您的函数采用一个向量并应返回向量,则可以使用sapply()在函数内部使用
mean()
来降低成本,因为它会干扰向量化。您可以将函数包装在
Vectorize()
中以修复它
f=Vectorize(函数(x){…})
@MrFlick谢谢,修复了它。如果您将此作为一个答案进行评论,我可以将此问题标记为已解决。Vectorize()基本上是mapply()的包装器,IIRC。如果您的函数接受一个向量并返回向量,那么使用sapply()可以更便宜地获得它