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

时间:2016-01-15 23:06:11

标签: r function sequence random-sample montecarlo

我正在使用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位小数非常一致。

1 个答案:

答案 0 :(得分:3)

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

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