如何更快地在R中以数字方式求解ODE

时间:2019-01-28 19:08:39

标签: r optimization ode

我目前正在研究和优化R中Lotka-Volterra微分方程组的参数。为了优化解决方案,我需要求解10,000次以上的ODE,因此我需要找到一个解决它们的快捷方式。

我目前在软件包deSolve(1.20版)中使用“ ode”命令。我正在Windows 10上具有4 GB RAM的RStudio(版本1.1.419)中运行R版本3.4.2。下面复制的代码运行大约需要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)

我想尽可能地缩短运行上述代码的时间。我愿意接受任何类型的解决方案。另外,如果这是最适合其他地方或学科的问题,非常感谢您指出正确的方向!

非常感谢!

0 个答案:

没有答案