adaptIntegrateと統合のパフォーマンス

私は、被積分関数がベクトル値のである 1次元で数値積分を実行したいと考えています。 integrate()はスカラー積分を許すだけなので、私はそれを何度か呼び出す必要があります。 立方体パッケージはうまくいくようですが、1Dの積分では非常にうまく動作していないようです。次の例(スカラ値の被積分関数と1次元積分)を考えてみましょう。

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 は、同様の精度でさらに多くの関数評価を使用しているようです。 ?integrate には "Wynn's Epsilon algorithm"が追加されていますが、どちらの方法もGauss-Kronrod直交(1Dの場合:15ポイントのガウスの直交則)を使用しています。それは大きなタイミング差を説明するでしょうか?

私はベクトル値の被積分関数を扱う別の方法の提案に

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

ありがとう。

6
私はそれを残念にはしません。スカラー値のintegrandに対して私が与える1対1比較の何が問題なのですか?
追加された 著者 baptiste,
私は fDim = 2 (最後の例では345回の評価もあります)でテストしましたが、比較は単に integrate を2回、 str(lapply(c 1、rel.tol = tolerance、subdivisions = Nmax))は、10 + 1 = 11の評価を与える。私の指摘は、 adaptIntegrate は多次元の統合とベクトル値の被積分関数を対象としていますが、1次元の統合の場合は integrate 繰り返しますが、大きなマージン(ここでは〜30回)。
追加された 著者 baptiste,
私はいなかった、ポインタのおかげで。
追加された 著者 baptiste,
@ヘムモはこれを答えに変えて浪費する前に賞金を得るように気をつけますか?
追加された 著者 baptiste,
このパッケージを見たことがありますか: cran.r-project.org/web/packages/R2Cuba
追加された 著者 Jouni Helske,

1 答え

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

私はあなたのサンプル関数でこれをテストしようとしましたが、そのような単純なケースでは、すべてのアルゴリズムを動作させることができませんでした(実際には苦労しませんでしたが) code> adaptIntegrate をデフォルト設定で使用しますが、実際のアプリケーションではこのパッケージを試してみる価値があります。

2
追加された