Дифференциальное уравнение задержки ошибки deSolve (dede)

Я пишу дифференциальное уравнение с задержкой в ​​deSolve (R) и получаю сообщение об ошибке. Я не знаю, как решить. Итак, для некоторой предыстории. У меня есть система с 12 дифференциальными уравнениями, и 3 из них имеют запаздывание. Мне удалось написать систему без deSolve, но я хочу использовать deSolve, потому что это дает мне возможность легко работать с другими методами, которые не являются эйлером с фиксированным шагом. Однако теперь я помещаю его в deSolve и использую общий решатель для дифференциальных уравнений с запаздыванием (dede), я получаю сообщение об ошибке.

Это задержка и дифференциальное уравнение, в котором содержится ошибка:

lag2=ifelse(t-tau2<0, 0, e2(lagvalue(t-tau2,3))*lagvalue(t-tau2,8))

dn9dt=lag2-IP2*ethaP2M*P2-mu2*sf0B(B2)*P2-DNB(N2,B2)*P2+DD*PD

Первое и третье дифференциальные уравнения с запаздыванием выполняются так же, как это, и, похоже, не содержат ошибок. Ошибка:

Error in lagvalue(t - tau2, 3) : illegal input in lagvalue - lag, 0, too large, at time = 15.945

Важно отметить, что в этом случае задержка (tau2) равна 16, а ошибка возникает незадолго до time = 16.

Я уже пытался изменить t-tau2<0 на t-tau2<=0, но это не помогает, и я попытался увеличить размер массива истории (control=list(mxhist = 1e6)), который тоже не помогло. Я также несколько раз пытался переписать задержку, но каждый раз получаю одну и ту же ошибку.

Я пробовал искать в Интернете, но почти не могу найти что-нибудь на dede в deSolve, поэтому надеюсь, что кто-то здесь сможет помочь.

1 ответ

Вопрос не содержал полного воспроизводимого примера, но ошибка может быть воспроизведена, если моделирование выполняется с большим количеством временных шагов , а массив истории слишком мал. Следующий пример представляет собой адаптированную версию из ?dedeстраница справки:

      library("deSolve")

derivs <- function(t, y, parms) {

  #cat(t, "\n") # uncomment this to see when the error occurs
  
  lag1 <- ifelse(t - tau1 < 0, 0.1, lagvalue(t - tau1, 2))
  lag2 <- ifelse(t - tau2 < 0, 0.1, lagvalue(t - tau2, 2))

  dy1 <- -y[1] * lag1 + lag2
  dy2 <-  y[1] * lag1 - y[2]
  dy3 <-  y[2] - lag2
  list(c(dy1, dy2, dy3))
}

yinit <- c(x=5, y=0.1, z=1)
times <- seq(0, 40, by = 0.1)

tau1 <-  1
tau2 <- 10

Он успешно работает с:

      yout <- dede(y = yinit, times = times, func = derivs, parms = NULL)

но если мы увеличим количество временных шагов:

      times <- seq(0, 40, by = 1e-3)
yout <- dede(y = yinit, times = times, func = derivs, parms = NULL)

можем получить ошибку:

      Error in lagvalue(t - tau2, 2) : 
  illegal input in lagvalue - lag, 0, too large, at time = 9.99986 

Это происходит после превышения порогового времени (раскомментируйте catвыше), когда алгоритм начинает интерполировать массив истории. В качестве решения увеличьте буфер истории:

      yout <- dede(y = yinit, times = times, func = derivs, 
  parms = NULL, control = list(mxhist = 1e5))

Это также может помочь уменьшить количество временных шагов.

Другие вопросы по тегам