В настоящее время я работаю над решением и оптимизацией параметров системы дифференциальных уравнений 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)
Я бы хотел максимально сократить время выполнения вышеуказанного кода.Я открыт для любого типа решения.Кроме того, если этот вопрос лучше всего подходит для другого места или другой дисциплины, я был бы очень признателен, если бы вы указали мне правильное направление!
Большое вам спасибо!