Как передать вектор для интегрирования функции
Я хочу интегрировать функцию 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-вектор в вашу функцию.