Бих искал да извърша числено интегриране в едно измерение, където интегралната функция е векторна стойност. integrate()
позволява само скаларни интегранти, поради което ще трябва да го извикам няколко пъти. Пакетът cubature
изглежда много подходящ, но изглежда, че се представя доста слабо за 1D интеграли. Разгледайте следния пример (скаларна интегрална функция и 1D интеграция),
library(cubature)
integrand <- function(x, a=0.01) exp(-x^2/a^2)*cos(x)
Nmax <- 1e3
tolerance <- 1e-4
# using cubature's adaptIntegrate
time1 <- system.time(replicate(1e3, {
a <<- adaptIntegrate(integrand, -1, 1, tol=tolerance, fDim=1, maxEval=Nmax)
}) )
# using integrate
time2 <- system.time(replicate(1e3, {
b <<- integrate(integrand, -1, 1, rel.tol=tolerance, subdivisions=Nmax)
}) )
time1
user system elapsed
2.398 0.004 2.403
time2
user system elapsed
0.204 0.004 0.208
a$integral
> [1] 0.0177241
b$value
> [1] 0.0177241
a$functionEvaluations
> [1] 345
b$subdivisions
> [1] 10
По някакъв начин adaptIntegrate
изглежда използва много повече оценки на функции за подобна прецизност. И двата метода очевидно използват квадратура на Гаус-Кронрод (1D случай: 15-точково квадратурно правило на Гаус), въпреки че ?integrate
добавя "алгоритъм на Епсилон на Уин". Това би ли обяснило голямата разлика във времето?
Отворен съм за предложения за алтернативни начини за справяне с векторно стойностни интегранти като
integrand <- function(x, a = 0.01) c(exp(-x^2/a^2), cos(x))
adaptIntegrate(integrand, -1, 1, tol=tolerance, fDim=2, maxEval=Nmax)
$integral
[1] 0.01772454 1.68294197
$error
[1] 2.034608e-08 1.868441e-14
$functionEvaluations
[1] 345
Благодаря.
fDim=2
(последният пример, също 345 оценки), сравнението е просто случай на извикване наintegrate
два пъти,str(lapply(c(integrand1, integrand2), integrate, -1,1, rel.tol=tolerance, subdivisions=Nmax))
дава 10+1 = 11 оценки. Мисълта ми е, че да,adaptIntegrate
е насочена към многоизмерна интеграция и по избор към интегранти с векторни стойности, но случаят на едномерна интеграция е много по-малко ефективен от извикването наintegrate
многократно, но голям марж (~30 пъти тук). - person baptiste   schedule 17.03.2013