2016-11-03 2 views
0

Ich habe eine inkonsistente Ergebnisse von integrate() und suave() aus dem Paket "R2Cuba" bei der Berechnung einer zweifachen Integration erfahren.Inkonsistente Ergebnisse zwischen R2Cuba und integrate()

wo

Eine ähnliche Frage zu diesem Thema kann here gefunden werden, lassen Sie sich f gesetzt (x) = 6 * sin (x) und g (x) = 1 und die obere Zeit T = 3.

der folgende Code verwenden integrieren() und Suave(), um das Ziel 2-fach zu berechnen Integral:

library(R2Cuba) 

integrand = function(x){6*sin(x)} 

phi = function(x){integrate(integrand,lower=x,upper = 3)[["value"]]^2} 

NDIM=1 
NCOMP=1 

phicuba= function(x){suave(NDIM,NCOMP,integrand,lower=x,upper=3)$value^2} 

foldintegral = integrate(Vectorize(phi),lower = 0,upper = 3) 

foldintegralcuba = suave(NDIM,NCOMP,phicuba,lower = 0,upper = 3) 

Die Ergebnisse:

> foldintegral 
167.3934 with absolute error < 1.9e-12 
> foldintegralcuba 
integral: 6.365749 (+-0.0057) 
nregions: 8; number of evaluations: 10000; probability: 1 

, die nicht im Einklang steht. Wenn wir jedoch nur vergleichen phi und phicuba

> phi(2) 
[1] 11.85476 
> phicuba(2) 
Iteration 1: 1000 integrand evaluations so far 
[1] 3.44367 +- 0.0429822 chisq 0 (0 df) 
Iteration 2: 2000 integrand evaluations so far 
[1] 3.4436 +- 0.00866171 chisq 0.00513973 (2 df) 
Iteration 3: 3000 integrand evaluations so far 
[1] 3.44181 +- 0.00386046 chisq 5.38913 (5 df) 
Iteration 4: 4000 integrand evaluations so far 
[1] 3.44283 +- 0.00206345 chisq 23.0816 (8 df) 
[1] 11.85309 

wir ein Ergebnis bekommen, das so konsequent zu sehen ist. Außerdem, wenn wir den Integra innen suave()

> suave(NDIM,NCOMP,phi,lower = 0,upper = 3) 
Iteration 1: 1000 integrand evaluations so far 
[1] 167.426 +- 4.91983  chisq 0 (0 df) 
Iteration 2: 2000 integrand evaluations so far 
[1] 167.315 +- 0.771248  chisq 0.00208764 (2 df) 
Iteration 3: 3000 integrand evaluations so far 
[1] 167.357 +- 0.432941  chisq 5.50239 (5 df) 
Iteration 4: 4000 integrand evaluations so far 
[1] 167.362 +- 0.129012  chisq 5.51661 (8 df) 
integral: 167.3621 (+-0.13) 
nregions: 4; number of evaluations: 4000; probability: 0.2988006 

verwenden ersetzen haben wir noch konsistentes Ergebnis.

Ich wünschte, ich kann die suave() verwenden, da es im komplizierten Integral viel schneller ist, aber warum ist das inkonsistent?

========================= UPDATE ==================== =

Es scheint, dass es ist, weil der Algorithmus, der in suave(), From the Cuba Documentation verwendet wird, suave globale adaptive Unterteilung + Wichtigkeitsabtastung verwenden. Wenn suave() in cuhre() geändert wird, die nur global adaptive Unterteilung verwenden, sollte alles konsistent sein.

+0

@ZheyuanLi Danke für die Erinnerung! – lz10086lz

Antwort

1

Es scheint, dass es, weil der Algorithmus, der in suave() verwendet wird, aus der Kuba-Dokumentation, suave global adaptive Unterteilung + Wichtigkeitsabtastung verwenden. Wenn suave() in cuhre() geändert wird, die nur global adaptive Unterteilung verwenden, sollte alles konsistent sein.

Verwandte Themen