Как передать вектор для интегрирования функции

Я хочу интегрировать функцию 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 звонки fun_integrate для вектора x что он вычисляет на основе upper а также lower, Этот векторизованный вызов не работает с другим вектором, передаваемым в качестве дополнительного аргумента. Что я хочу это integrate звонки fun_integrate для каждого x что он вычисляет внутри и сравнивает этот единственный x к вектору vec и я уверен, что мой код выше не делает этого.

Я знаю, что мог бы сам реализовать процедуру интеграции, то есть вычислить узлы между lower а также upper и оцените функцию на каждом узле отдельно. Но это не будет моим предпочтительным решением.

Также обратите внимание, что я проверил Vectorize, но это, кажется, относится к другой проблеме, а именно, что функция не принимает вектор для x, Моя проблема в том, что я хочу дополнительный вектор в качестве аргумента.

2 ответа

Решение
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

Ответ Роланда выглядит хорошо. Просто хотел отметить, что это 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-вектор в вашу функцию.

Другие вопросы по тегам