当前位置:  开发笔记 > 编程语言 > 正文

用零替换模型(ODE系统)中的负值

如何解决《用零替换模型(ODE系统)中的负值》经验,为你挑选了1个好方法。

我正在研究使用的常微分方程系统deSolve,并想知道是否有任何方法可以防止差分变量值低于零.我已经看过一些关于在矢量,数据框等中将负值设置为零的其他帖子,但由于这是一个生物模型(并且T细胞计数变为负值没有意义),需要阻止它开始发生,所以这些值不会扭曲结果,而不仅仅是替换最终输出中的底片.



1> Ben Bolker..:

我的标准方法是将状态变量转换为无约束的比例.对正变量执行此操作的最明显/标准方法是写下动力学log(x)而不是动力学的方程式x.

例如,对于感染性疾病流行病的易感染 - 感染 - 恢复(SIR)模型,其中方程式dS/dt = -beta*S*I; dI/dt = beta*S*I-gamma*I; dR/dt = gamma*I我们会天真地将梯度函数写为

gfun <- function(time, y, params) {
   g <- with(as.list(c(y,params)),
       c(-beta*S*I,
          beta*S*I-gamma*I,
          gamma*I)
       )
   return(list(g))
}

如果我们创建log(I)而不是我是状态变量(原则上我们也可以用S做这个,但实际上S不太可能接近边界),那么我们就有了d(log(I))/dt = (dI/dt)/I = beta-gamma; 其余的方程式需要exp(logI)用来指代I.所以:

gfun_log <- function(time, y, params) {
   g <- with(as.list(c(y,params)),
       c(-beta*S*exp(logI),
          beta-gamma,
          gamma*exp(logI))
       )
   return(list(g))
}

(计算exp(logI)一次并存储/重新使用它而不是计算它两次会稍微高效......)

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有