Распараллелить интегрировать в R

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

Я пишу здесь небольшой пример на случай, если кто-то может мне помочь.

b0=function(time){0.05*sin(0.1*time)+0.1}  
d0=0.14  
#Function to integrate
f0<-Vectorize(function(t,d0){b0(t)-d0},"t")

integrate(f0,lower=0,upper=1000,d0=d0)$value

Этот небольшой пример работает очень быстро, но у меня есть более сложные примеры, которые работают медленнее, и я хотел бы сделать их быстрее.


person user3436882    schedule 30.04.2018    source источник
comment
Не могли бы вы просто разделить регионы, которые вы интегрируете, и распараллелить это?   -  person bk18    schedule 30.04.2018
comment
Если вы можете создать функцию, которая фактически векторизована, вместо использования цикла с mapply/Vectorize, вы получите гораздо больший прирост скорости, чем с распараллеливанием.   -  person Roland    schedule 30.04.2018
comment
@Roland, но моя функция уже векторизована. Вы имеете в виду, что если я распараллелю эту векторизованную функцию, я не выиграю скорость??   -  person user3436882    schedule 30.04.2018
comment
Вы можете получить ускорение от компиляции вашей подынтегральной функции.   -  person James    schedule 30.04.2018
comment
Я думаю, что есть пакет RcppNumerical, который очень быстро интегрируется.   -  person F. Privé    schedule 01.05.2018


Ответы (1)


Приведенный выше комментарий @Roland точен. Но ответ на ваш вопрос напрямую:

library(parallel)
options(mc.cores = 2)
b0=function(time){0.05*sin(0.1*time)+0.1}  
d0=0.14  
#Function to integrate
f0<-Vectorize(function(t,d0){b0(t)-d0},"t")

ans <- mclapply(
  list(c(0, 500), c(500, 1000)),
  function(i){
    integrate(f0,lower=i[1],upper=i[2],d0=d0)$value
  }
)

Reduce("+", ans)
person bk18    schedule 30.04.2018
comment
Нет никакой гарантии, что это ускорит процесс, поскольку integrate использует адаптивную квадратуру. Интенсивность вычислений определяется сложностью подынтегральной функции, а не длиной интервала. - person James; 30.04.2018