7

被積分関数がベクトル値である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

ありがとう。

4

1 に答える 1

3

CRANには、いくつかの多次元統合アルゴリズムを実装するR2Cubaパッケージもあります。

私はあなたのサンプル関数でこれをテストしようとしました、そしてそのような単純なケースでは私はすべてのアルゴリズムを動作させることができませんでした(私は本当に一生懸命努力しませんでしたが)そして私が動作するようになったいくつかのメソッドはよりもかなり遅くなりadaptIntegrateましたデフォルト設定ですが、実際のアプリケーションでは、このパッケージを試す価値があるかもしれません。

于 2013-03-23T13:16:35.623 に答える