适应性与整合性的表现

bap*_*ste 6 r numerical-integration

我想在一个维度上执行数值积分,其中被积函数是向量值的.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
Run Code Online (Sandbox Code Playgroud)

不知何故,adaptIntegrate似乎使用了更多功能评估来获得类似的精度.两种方法显然都使用Gauss-Kronrod正交(1D情况:15点高斯求积法则),但?integrate增加了"Wynn's Epsilon算法".这会解释大的时间差异吗?

我愿意接受处理矢量值积分的替代方法的建议,例如

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
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jou*_*ske 3

CRAN中还有R2Cuba包,它实现了多种多维积分算法:

我尝试用您的示例函数来测试这一点,在这样一个简单的情况下,我无法让所有算法都工作(尽管我没有真正努力尝试),而且我确实工作的方法很少比使用慢adaptIntegrate得多默认设置,但也许在您真正的应用程序中这个包值得尝试。