【问题标题】:Error delay differential equation deSolve (dede)误差延迟微分方程 deSolve (dede)
【发布时间】:2021-12-28 08:29:57
【问题描述】:

我正在 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

我尝试过在线搜索,但是我在deSolve的dede上几乎找不到任何东西,所以我希望这里的人可以提供帮助。

【问题讨论】:

  • 您能否提供一个可重现的最小示例,即重现错误但只有 2 个方程的东西?

标签: r if-statement differential-equations timedelay 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))

这也可能有助于减少时间步数。

【讨论】:

  • 感谢您帮助我,很抱歉没有提供可重现的示例。我已经尝试增加历史缓冲区,但没有固定的时间步长。看起来减少时间步数确实解决了错误!
  • times 中给出的时间步长决定了存储结果的位置。无论如何,积分时间步长都会自动调整。
  • Ah tnx 用于解释,这是有道理的,因为我使用的是 lsoda
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 2016-11-28
  • 2022-01-09
相关资源
最近更新 更多