производителност на adaptIntegrate срещу integrate

Бих искал да извърша числено интегриране в едно измерение, където интегралната функция е векторна стойност. 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

Благодаря.


person baptiste    schedule 28.10.2011    source източник
comment
Не го разбирам, съжалявам; какво не е наред със сравнението едно към едно, което давам за интегранд със скаларна стойност?   -  person baptiste    schedule 16.03.2013
comment
Направих тест с 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
comment
Виждали ли сте този пакет: cran.r-project.org/web/packages/R2Cuba   -  person Jouni Helske    schedule 20.03.2013
comment
Нямах, благодаря за указателя.   -  person baptiste    schedule 21.03.2013
comment
Иска ли @Hemmo да превърне това в отговор и да получи наградата, преди да отиде на вятъра?   -  person baptiste    schedule 23.03.2013


Отговори (1)


Има също пакет R2Cuba в CRAN, който прилага няколко алгоритма за многоизмерна интеграция:

Опитах се да тествам това с вашата примерна функция и в такъв прост случай не можах да накарам всички алгоритми да работят (въпреки че не се стараех много), а няколко метода, които успях да заработя, бяха значително по-бавни от adaptIntegrate с настройка по подразбиране, но може би във вашето истинско приложение този пакет може да си струва да опитате.

person Jouni Helske    schedule 23.03.2013