быстро вычисляя двойные интегралы в R - PullRequest
16 голосов
/ 18 января 2012

Я ищу решение для двойного интеграла, которое быстрее, чем

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

например

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

Я нашел старую бумагу , в которой упоминалась программа на Фортране под названием quad2d, но я не смог найти ничего другого, кроме некоторых страниц помощи для matlab для остальных. Поэтому я ищу библиотеку C или FORTRAN, которая может быстро выполнять двойные интегралы (т.е. без цикла Саппли) и которая может быть вызвана из R. Все идеи очень ценятся, если они совместимы с GPL.

Если решение включает в себя вызов других функций из библиотек, которые уже поставляются с R, я также хотел бы услышать о них.

Ответы [ 2 ]

16 голосов
/ 18 января 2012

Пакет cubature выполняет 2D (и ND) интеграцию с использованием адаптивного алгоритма.Это должно превзойти более простые подходы для большинства интегратов.

7 голосов
/ 18 января 2012

Пакет pracma, на который указал Джошуа, содержит версию quad2d.

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

Это дает тот же ответ в числовом допуске, что и ваш цикл, с использованием функции примера.

По умолчанию, с вашей примерной функцией, quad2d медленнее, чем цикл. Если вы уроните n вниз, вы сможете сделать это быстрее, но я думаю, это зависит от того, насколько гладкой является ваша функция и насколько вы готовы жертвовать ради скорости.

...