Ответ 1
В пакете cubature реализована интеграция 2D (и N-D) с использованием адаптивного алгоритма. Он должен превосходить более простые подходы для большинства подынтегральных функций.
Я ищу решение для двойного интеграла, который быстрее, чем
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, я также хотел бы услышать от них.
В пакете cubature реализована интеграция 2D (и N-D) с использованием адаптивного алгоритма. Он должен превосходить более простые подходы для большинства подынтегральных функций.
Пакет pracma
, который указал Джошуа, содержит версию quad2d
.
quad2d(myfun, llim, ulim, llim, ulim)
Это дает тот же ответ, в пределах численного допуска, как ваш цикл, используя примерную функцию.
По умолчанию, с вашей примерной функцией, quad2d
работает медленнее, чем цикл. Если вы уроните n
вниз, вы можете сделать это быстрее, но я думаю, это зависит от того, насколько гладкой ваша функция и насколько вы готовы пожертвовать скоростью.