3

我想集成一个fun_integrate以向量vec作为输入参数的函数:

fun_integrate <- function(x, vec) { 
  y <- sum(x > vec)
  dnorm(x) + y
}

#Works like a charm
fun_integrate(0, rnorm(100))

integrate(fun_integrate, upper = 3, lower = -3, vec = rnorm(100))
300.9973 with absolute error < 9.3e-07
Warning message:
  In x > vec :
  longer object length is not a multiple of shorter object length

据我所知,问题如下:integrate调用它基于and计算fun_integrate的向量。这个向量化调用似乎不适用于作为附加参数传递的另一个向量。我想要的是调用它在内部计算的每一个,并将那个单一的与向量进行比较,我很确定我上面的代码不会那样做。xupperlowerintegratefun_integratexxvec

我知道我可以自己实现一个集成例程,即计算和之间的节点lowerupper分别评估每个节点上的函数。但这不是我的首选解决方案。

另请注意,我检查了Vectorize,但这似乎适用于另一个问题,即该函数不接受x. 我的问题是我想要一个额外的向量作为参数。

4

2 回答 2

3
integrate(Vectorize(fun_integrate,vectorize.args='x'), upper = 3, lower = -3, vec = rnorm(100),subdivisions=10000)

304.2768 with absolute error < 0.013


#testing with an easier function
test<-function(x,y) {
  sum(x-y)
}

test(1,c(0,0))
[1] 2

test(1:5,c(0,0))
[1] 15
Warning message:
In x - y : 
longer object length is not a multiple of shorter object length

Vectorize(test,vectorize.args='x')(1:5,c(0,0))
[1]  2  4  6  8 10

#with y=c(0,0) this is f(x)=2x and the integral easy to solve
integrate(Vectorize(test,vectorize.args='x'),1,2,y=c(0,0))
3 with absolute error < 3.3e-14 #which is correct
于 2012-08-21T17:45:04.733 回答
2

罗兰的回答看起来不错。只是想指出它是sum,而不是integrate抛出警告信息。

Rgames> xf <- 1:10
Rgames> vf <- 4:20
Rgames> sum(xf>vf)
[1] 0
Warning message:
In xf > vf :
 longer object length is not a multiple of shorter object length

您得到的答案不是正确的值这一事实表明integrate没有将您期望的 x 向量发送到您的函数。

于 2012-08-21T17:45:12.477 回答