2012-01-18 11 views
14

Sto cercando una soluzione per un doppio integrale che è più veloce dicalcolare integrali doppi in R rapidamente

integrate(function(y) { 
    sapply(y, function(y) { 
    integrate(function(x) myfun(x,y), llim, ulim)$value 
    }) 
}, llim, ulim) 

con ad esempio

myfun <- function(x,y) cos(x+y) 
llim <- -0.5 
ulim <- 0.5 

ho trovato un old paper quella di cui a un programma FORTRAN chiamato quad2d, ma non sono riuscito a trovare nient'altro che alcune pagine di aiuto per matlab per il resto. Quindi sto cercando una libreria C o FORTRAN in grado di eseguire rapidamente double integrals (cioè senza il ciclo sapply), e che può essere chiamata da R. Tutte le idee sono molto apprezzate, purché siano compatibili con GPL.

Se la soluzione prevede il richiamo di altre funzioni dalle librerie che sono già state fornite con R, mi piacerebbe anche sentirle.

+4

Avete considerato: 'pracma :: dblquad',' pracma: simpson2d', o le funzioni nei pacchetti cubatura e R2Cuba? –

risposta

7

Il pacchetto pracma che Joshua ha indicato contiene una versione di quad2d.

quad2d(myfun, llim, ulim, llim, ulim) 

Questo dà la stessa risposta, entro la tolleranza numerica, come loop, utilizzando la funzione di esempio.

Per impostazione predefinita, con la funzione di esempio, quad2d è più lento del ciclo. Se fai cadere n verso il basso, puoi renderlo più veloce, ma suppongo che dipenda da quanto sia fluida la tua funzione e da quanta accuratezza sei disposto a sacrificare per la velocità.

+0

Thx anche per l'esempio. Lo proverò sulle funzioni reali, poiché sono un po 'più complesse. Ho più bisogno della precisione, ma la velocità è davvero un problema. Ti terrò aggiornato. –

14

Il pacchetto cubature esegue l'integrazione 2D (e N-D) utilizzando un algoritmo adattativo. Dovrebbe superare gli approcci più semplici per la maggior parte degli integrandi.

+0

Thx per il puntatore, sto facendo i test questo fine settimana e vedo quale mi sta rendendo più felice. –

+2

Per riferimento futuro, l'approccio 'cubature' sarebbe:' adaptIntegrate (function (x) cos (x [1] + x [2]), c (llim, llim), c (ulim, ulim)) '. – jbaums