2016-04-11 9 views
0

ich verwende cuhre von R2Cuba 1,1-0 für die Integration der folgenden FunktionIntegration mit cuhre

fn <- function(x) { 
     pnorm((-2-sum(sqrt(vecRho)*x))/sqrt(1-sum(vecRho)))*prod(dnorm(x)) 
     } 

wo vecRho ist ein Vektor von 6 Zahlen zwischen 0 und 0,1, dh

vecRho<-runif(6,0,0.1) 

Per Definition liegt der Integrand fn zwischen 0 und 1. Die Integration wird voraussichtlich positiv sein. Jedoch unter Verwendung von cuhre das Ergebnis negativ wird, wenn die Länge des vecRho überschreitet 5.

NDIM<-length(vecRho) 
cuhre(NDIM, 1, fn, 
     flags = list(verbose =0), 
     lower = rep(-10,NDIM), 
     upper = rep(10,NDIM))$value 
[1] -0.4738284 

Wenn darüber hinaus die Länge der vecRho> = 6 der absolute Wert der Integration erhöht, wenn die Länge der vecRho erhöht.

Gibt es etwas, was ich tun kann, um das zu beheben? Vielen Dank!

+0

Es ist unklar, was ist die Bedeutung von 'prod (dnorm (x))'. Brauchen Sie wirklich PRODUKT aller Gaußkerne? –

+0

Ja, prod (dnorm (x)) ist die Dichtefunktion. Da alle Variablen unabhängig sind, ist die Dichte der n-dim-Zufallsnormalverteilung effektiv das Produkt von dnorm (x). – Lamothy

Antwort

0

ok, hab es, du hast 6D integral mit 6 Gauß'schen Kernen drin. Ich kenne gute Antworten für 1D-Integration mit Gaussian Kernel. Es heißt Gauss-Hermite quadrature, und dafür gibt es ein Paket R. Wenn Sie diese Route gehen, müssen Sie Curry-Funktionen machen, aber es könnte sich lohnen.

Einige Beispielcode:

library(gaussquad) 

n.quad <- 128 # integration order 

# get the particular (weights,abscissas) as data frame 
# with 2 observables and n.quad observations 
rule <- ghermite.h.quadrature.rules(n.quad, mu = 0.0)[[n.quad]] 

# test function - integrate 1 over exp(-x^2) from -Inf to Inf 
# should get sqrt(pi) as an answer 
f <- function(x) { 
    1.0 
} 

q <- ghermite.h.quadrature(f, rule) 
print(q - sqrt(pi)) 
+0

Danke, Severin. Ich denke, mit Currying-Funktion Ansatz funktioniert. Tatsächlich funktioniert es nur mit der Funktion "integrate" in r. Das Problem ist Laufzeit. Es ist sehr zeitaufwendig sogar mit D = 3. Ich frage mich, wie "Gaussquad" funktioniert, wenn D> = 3. – Lamothy

+0

@Loy Nun, jede Integration ist eine gewichtete Summe von 128 (im Fall oben) Aufrufe an "f". Also wäre 6D Integral 128^6 Aufrufe. Ich bevorzuge G-H (oder Gauss-Legendre im Falle des exponentiellen Kernels), weil es besser als alles andere Werte unter der Gaußschen Glocke behandelt –

+0

Vielen Dank für Ihre Kommentare, Severin. Werde es versuchen. – Lamothy