Вычисление двойных интегралов в R быстро

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

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

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

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

Ответы

Ответ 1

В пакете cubature реализована интеграция 2D (и N-D) с использованием адаптивного алгоритма. Он должен превосходить более простые подходы для большинства подынтегральных функций.

Ответ 2

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

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

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

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