2011-10-28 7 views
6

を統合し、私は積分はベクトル値ある一次元、で数値積分を実行したいと思います。 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 

感謝として、ベクトル値積分関数を扱うの代替方法の提案を開いています。

+0

申し訳ありません。スカラー値のintegrandに対して私が与える1対1比較の何が問題なのですか? – baptiste

+0

私は '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

+0

あなたはこのパッケージを見たことがありますか:http://cran.r-project.org/web/packages/R2Cuba/ –

答えて

2

いくつかの多次元統合アルゴリズムを実装しCRANでR2Cubaパッケージもあります:

(が、私はあなたの例の機能でこれをテストしてみました、そして、そのような単純なケースでは、私はすべてのアルゴリズムを動作させることができませんでした私は本当に頑張っていませんでした)、私が仕事に就かなかったいくつかの方法は、デフォルト設定のadaptIntegrateよりもかなり遅かったですが、実際のアプリケーションではこのパッケージを試してみる価値があります。

関連する問題