我目前正在研究和优化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)
我想尽可能地缩短运行上述代码的时间。我愿意接受任何类型的解决方案。另外,如果这是最适合其他地方或学科的问题,非常感谢您指出正确的方向!
非常感谢!