被積分関数がベクトル値である1 次元で数値積分を実行したいと思います。スカラー被積分関数のみを許可するため、何度か呼び出す必要があります。このパッケージは適しているように見えますが、1D 積分のパフォーマンスは非常に悪いようです。次の例 (スカラー値の被積分関数と 1D 積分) を考えてみましょう。integrate()
cubature
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
ありがとう。