2012-01-18 11 views
14

Busco una solución para una integral doble es más rápido quecalcular integrales dobles en I rápidamente

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

con, por ejemplo

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

he encontrado un old paper que hacía referencia a un programa FORTRAN llamado quad2d, pero no pude encontrar nada más que algunas páginas de ayuda para matlab para el resto. Así que estoy buscando una biblioteca C o FORTRAN que pueda hacer integrales dobles rápidamente (es decir, sin el bucle sapply), y que se puede llamar desde R. Todas las ideas son muy apreciadas, siempre y cuando todas sean compatibles con GPL.

Si la solución implica llamar a otras funciones de las bibliotecas que ya vienen con R, me gustaría saber de ellas también.

+4

¿Has considerado: 'pracma :: dblquad',' pracma: simpson2d', o las funciones en los paquetes cubature y R2Cuba? –

Respuesta

7

El paquete pracma que Joshua señaló que contiene una versión de quad2d.

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

Esto da la misma respuesta, dentro de la tolerancia numérica, como su bucle, usando la función de ejemplo.

Por defecto, con su función de ejemplo, quad2d es más lento que el bucle. Si tira el n hacia abajo, puede hacerlo más rápido, pero supongo que depende de cuán suave sea su función y de cuánta precisión esté dispuesto a sacrificar por la velocidad.

+0

Thx para el ejemplo también. Lo probaré en las funciones reales, ya que son un poco más complejas. Necesito la precisión más, pero la velocidad realmente es un problema. Te mantendré informado. –

14

El paquete cubature realiza una integración 2D (y N-D) utilizando un algoritmo adaptativo. Debería superar los enfoques más simples para la mayoría de los integrandos.

+0

Thx para el puntero, estoy realizando las pruebas este fin de semana y veo cuál me hace más feliz. –

+2

Para referencia futura, el enfoque 'cubature' sería:' adaptIntegrate (función (x) cos (x [1] + x [2]), c (llim, llim), c (ulim, ulim)) '. – jbaums