Как численно решить ODE в R быстрее - PullRequest
0 голосов
/ 28 января 2019

В настоящее время я работаю над решением и оптимизацией параметров системы дифференциальных уравнений Lotka-Volterra в R. Чтобы оптимизировать решение, мне нужно решить ODE более чем в 10 000 раз, поэтому мне нужно найтиболее быстрый способ их решения.

В настоящее время я использую команду 'ode' в пакете deSolve (версия 1.20).Я использую R версии 3.4.2 в RStudio (версия 1.1.419) в Windows 10 с 4 ГБ ОЗУ.Воспроизведенный ниже код занимает около 16 секунд.Хотя это звучит не так уж и плохо, для десятков тысяч пробежек по большому набору данных время непомерно велико.Я выполнил код на супер кластерном компьютере на 28 ядрах;Однако это все еще занимает много времени.

start <- Sys.time()
library(deSolve)


##CONTROL PANEL##
state <- c(4,1)
time <- seq(0,9,1)

parms <- c(alpha_star = 4.577,
    theta_a = 2.334,
    beta_star = 4.560,
    theta_b = 0.085,
    delta_star = 2.836,
    theta_d = 2.496, 
    gamma_star = 1.254,
    theta_g = 0.031)

extVar <- c(154.35, 150.8, 150.85, 152, 152.15, 153.3, 155.1, 154.65, 156.35, 152.5)


data <- data.frame(x = c(4,5,2,5,4,7,8,3,7,10), 
                   y = c(1,3,3,4,9,9,2,2,6,4))



##LOTKA-VOLTERRA##
LotVmod <- function (Time, State, pars) {
    with(as.list(c(State, pars)), {
        alpha <- alpha_star + theta_a*sigimp(Time)
        beta <- beta_star  + theta_b*sigimp(Time)
        gamma <- gamma_star + theta_g*sigimp(Time)
        delta <- delta_star + theta_d*sigimp(Time)
    dx = alpha*State[1]-(beta*State[1]*State[2])
    dy = (-delta*State[2]) + (gamma*State[1]*State[2])
  return(list(c(dx, dy)))
  })
}


sigimp <- approxfun(time, extVar, rule=2)


out <- ode(state, time, LotVmod, parms, rtol = 1e-15, maxsteps = 500000)

print(Sys.time() - start)

Я бы хотел максимально сократить время выполнения вышеуказанного кода.Я открыт для любого типа решения.Кроме того, если этот вопрос лучше всего подходит для другого места или другой дисциплины, я был бы очень признателен, если бы вы указали мне правильное направление!

Большое вам спасибо!

...