を統合し、私は積分はベクトル値ある一次元、で数値積分を実行したいと思います。 integrate()
はスカラー積分を許すだけなので、私はそれを何度か呼び出す必要があります。 cubature
パッケージが適しているように見えますが、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
どういうわけか、次の例(スカラー値積分および1Dの統合)を考える、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
感謝として、ベクトル値積分関数を扱うの代替方法の提案を開いています。
申し訳ありません。スカラー値のintegrandに対して私が与える1対1比較の何が問題なのですか? – baptiste
私は 'fDim = 2'でテストしました(最後の例では345回の評価もあります)、比較は単に' integrate'を2回呼び出しただけです。 'str(lapply(c(integrand1、integrand2)、integrate、-1,1 、rel.tol = tolerance、subdivisions = Nmax)) 'は10 + 1 = 11の評価を与える。私の指摘は、 'adaptIntegrate'は多次元の積分、ベクトル化された被積分関数を対象としていますが、1次元積分の場合は' integrate'を繰り返し呼び出すよりもはるかに効率が悪いですが、ここに)。 – baptiste
あなたはこのパッケージを見たことがありますか:http://cran.r-project.org/web/packages/R2Cuba/ –