我正在使用R. 我做了一个随机函数(使用蒙特卡罗积分)近似arctan函数(等于1 /(1 + x ^ 2)的积分)。它似乎运作良好,并提供准确的近似值。例如3 * arctan(sqrt(3))应该给pi,而在下面我得到一个近似值。
return triples.stream().filter(st ->
{
if (prop.equals(st.getPredicate()) {
// add this triple if its subject has the correct type
return triples.contains(st.getSubject(), RDF.TYPE, c));
} else if (RDF.TYPE.equals(st.getPredicate())
&& c.equals(st.getObject()) {
// add this triple if its subject has the correct prop
return triples.contains(st.getSubject(), prop, null);
}
return false;
}).collect(Collectors.toCollection(LinkedHashModel::new));
但是,当我在一系列数字上使用该函数时,答案似乎出错了。 atan函数给出了正确的值,但在同一个向量上使用f函数时给出了错误的值。
> f=function(x)
+ {y=runif(10^6,0,x); return(x*mean((1/(1+y^2))))}
> f(sqrt(3))*3
[1] 3.140515
注意当我在1,1,5和2上单独使用f时,它是如何工作的,但不是以矢量形式?这里发生了什么?我试过在向量上运行f几次,错误的值与2位小数非常一致。
答案 0 :(得分:3)
在函数内部使用mean()
会干扰矢量化。您可以将函数包装在Vectorize()
中以修复它。例如
f <- Vectorize(function(x) {y=runif(10^6,0,x); return(x*mean((1/(1+y^2))))})