производительность AdaptIntegrate по сравнению с интегрированием

Я хотел бы выполнить численное интегрирование в одномерном , где подынтегральное выражение является векторным . Integrate () допускает только скалярные подынтегральные выражения, поэтому мне пришлось бы вызывать его несколько раз. Пакет кубатур кажется хорошо подходящим, но, похоже, он плохо работает с одномерными интегралами. Рассмотрим следующий пример (скалярное подынтегральное выражение и одномерное интегрирование)

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

Каким-то образом, adapIntegrate , похоже, использует гораздо больше вычислений функций для аналогичной точности. В обоих методах явно используется квадратура Гаусса-Кронрода (одномерный случай: 15-точечное квадратурное правило Гаусса), хотя ? Интегрировать добавляет «алгоритм Эпсилона Винна». Объясняет ли это большую разницу во времени?

Я открыт для предложений об альтернативных способах работы с векторными подынтегральными выражениями, например

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

Спасибо.

6
задан baptiste 22 March 2013 в 20:03
поделиться