R中的deSolve给出了不正确的中间值

R中的deSolve给出了不正确的中间值,r,ode,R,Ode,我在deSolve的R中遇到ode解算器问题 我发现解算器为变量提供了非零的中间值,这些变量应始终等于零。在我开始尝试使用if(R>0){browser()}之类的测试进行调试之前,它看起来并不是一个问题,这会被触发 我的代码如下。提前谢谢 艾伦 库(deSolve) simpleSIR首先,我不知道您是否理解状态变量和参数之间的差异 R(在您的情况下)是一个状态变量。这意味着,在模拟开始时(t=0)R=0。但随着时间的发展,这种情况可能会改变。查看您的状态变量S 您的参数beta和gamma在

我在deSolve的R中遇到ode解算器问题

我发现解算器为变量提供了非零的中间值,这些变量应始终等于零。在我开始尝试使用if(R>0){browser()}之类的测试进行调试之前,它看起来并不是一个问题,这会被触发

我的代码如下。提前谢谢

艾伦

库(deSolve)

simpleSIR首先,我不知道您是否理解状态变量和参数之间的差异

R
(在您的情况下)是一个状态变量。这意味着,在模拟开始时(t=0)
R=0
。但随着时间的发展,这种情况可能会改变。查看您的状态变量S

您的参数beta和gamma在计算过程中不会改变

然后你可以简化你的代码。使用此行代替您对
par
init
的定义:

par <- c(beta = 0.3, gamma = 0.0)

init <- c(S = 0.99, I = 0.01, R = 0)
您还可以简化绘图:

matplot(out[,1], out[,2:4], type = "l", col = c("black", "red", "blue"))
问候,


我认为你的问题在于,
ode()
中数值积分的默认方法是
lsoda
。该方法可以在刚性和非刚性问题的解算器之间切换。如果您切换到刚性解算器,则会对雅可比矩阵进行数值求值,这可能会导致您看到的数值错误。 您可以在以下代码中看到这可能是原因:

out <- deSolve::ode(y = init, times = times, func = simpleSIR, parms = par,maxsteps=2000)
deSolve::diagnostics.deSolve(out)

out为什么要检查函数内部的
R>0
,而不是检查输入?但无论如何,仔细看看这两个答案。这不是我的代码,而是一个简单的例子。我认为刚性/非刚性解算器是解决方案。这还不太清楚:根据文档,如果问题实际上是刚性的或非刚性的,
lsoda
会自动选择(而不是切换)合适的解算器。你是否建议原始方程组根据当前值进行某种切换?虽然我找不到算法的详细解释,但我的理解是,该方法确实在运行时切换。(“它最初使用nonsiff方法,并动态监视数据以决定使用哪个方法。”)。如果你有更多关于算法的细节,我很高兴听到!杰出的非常感谢。切换到rk4会阻止这种情况。我没有意识到lsoda转换了解算器。很高兴它有帮助!请考虑接受为您工作的答案(StAdvOx.com/帮助/某人回答)。谢谢。上面的人回答了我的问题R’是一个状态变量,但在整个模拟过程中,它应等于零,因为gamma=0。
matplot(out[,1], out[,2:4], type = "l", col = c("black", "red", "blue"))
out <- deSolve::ode(y = init, times = times, func = simpleSIR, parms = par,maxsteps=2000)
deSolve::diagnostics.deSolve(out)
out.rk4 <- deSolve::ode(y = init, times = times, func = simpleSIR,method = "rk4", parms = par,maxsteps=2000)