我正在使用deSolve
套餐制作出生脉冲SIR model。使用以下代码,我预计在第0,12和24时间出生脉冲,但输出显示没有出生脉冲 - 实际上根本没有出生!
library(deSolve); library(ggplot2)
SIR <- function (times,x,parameters) {
SL = x[1]
IL = x[2]
RL = x[3]
NL = x[4]
if (IL<0) IL=0
with(as.list(c(x,parameters)), {
npopL <- SL + IL + RL
dSL <- -(betaL*SL*IL/npopL) - ((b + (.5*(a-b)*npopL/kl))*SL) + ((((.918*round(cos(2%%((times%%12)+2)))))*(SL+RL)))
dIL <- +(betaL*SL*IL/npopL) - gamma*IL - (b+0.015)*IL
dRL <- +gamma*IL - b*RL
dNL <- +dSL + dIL + dRL
out <- c(dSL,dIL,dRL,dNL)
list(out)
})
}
times <- seq(1,24, by = 1)
parameters <- c(betaL = 0.9, gamma = 0.3, a= 0.0765, b = 0.06,kl = 50)
init <- c(SL=50,IL=0,RL=0,NL=50)
out <- as.data.frame(ode(y = init, times = times, func = SIR, parms = parameters))
mydata1 <- data.frame(Period=rep((1:length(out$SL)),4),Population = c(out$SL,out$IL,out$RL,out$NL),Indicator=rep(c("SusceptibleL","InfectedL","RecoveredL","TotalL"),each=length(out$SL)))
p1 = ggplot(mydata1,aes(x=Period,y=Population, group=Indicator))
f1 = p1+geom_line(aes(colour = Indicator))
f1
我做错了什么?在此先感谢您的帮助!
答案 0 :(得分:1)
library(deSolve); library(ggplot2)
我正在修改您的模型,因为我认为它可以简化。
没有必要使用npopL
,因为您需要变量NL
。
SIR <- function (times,x,parms) {
SL = x[1]
IL = x[2]
RL = x[3]
NL = x[4]
if (IL<0) IL=0
# with(as.list(c(x,parameters)), {
with(as.list(c(x,parms)), {
dSL <- -(betaL*SL*IL/NL) - ((b + (.5*(a-b)*NL/kl))*SL)
dIL <- +(betaL*SL*IL/NL) - gamma*IL - (b+0.015)*IL
dRL <- +gamma*IL - b*RL
dNL <- +dSL + dIL + dRL
out <- c(dSL,dIL,dRL,dNL)
list(out)
})
}
正如我在评论中所说,请查看包events
的文档中的deSolve
。
因此,为您的出生脉冲创建一个事件函数(这来自哪里?)我将出生脉搏改为总人口的一小部分(NL
)。
eventfun <- function(t, y, parms){
with (as.list(c(y,parms)),{
SL <- SL + .1*round(cos(2%%((t%%12)+2)))*NL
return(c(SL,IL,RL,NL))
})
}
这会在离散时间更改SL
,即事件:出生脉冲。
您的其他代码并不需要修改,但我假设ode
从字面上parms
传递parameters
,因此我将您的函数中的parms
更改为{ {1}}。
times <- seq(1,24, by = 1)
parameters <- c(betaL = 0.9, gamma = 0.3, a= 0.0765, b = 0.06,kl = 50)
init <- c(SL=50,IL=0,RL=0,NL=50)
out <- as.data.frame(ode(y = init, times = times, func = SIR, parms = parameters, events=list(func=eventfun,time=times))
)
mydata1 <- data.frame(Period=rep((1:length(out$SL)),4),Population = c(out$SL,out$IL,out$RL,out$NL),
Indicator=rep(c("SusceptibleL","InfectedL","RecoveredL","TotalL"),each=length(out$SL)))
p1 = ggplot(mydata1,aes(x=Period,y=Population, group=Indicator))
f1 = p1+geom_line(aes(colour = Indicator))
f1
我觉得结果很奇怪。 您可以找到一组合理的参数并纠正任何进一步的错误。