错误发生在这一行:
dS=v*S -beta*S*I/N -delta*S
non-numeric argument to binary operator
意味着您尝试将函数(例如)乘以数字。您可以通过以下方式重现它I*1
Error in I * 1 : non-numeric argument to binary operator`
在这里,R 无法找到 beta ,而 beta 被解释为数学的特殊函数,因此出现错误。
您需要将参数定义为
# a list
list(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15)
and
## you get a vector mu,N,p,delta,beta1,bet2,...
c(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15)
我认为你甚至可以将你的函数重写为:
SEIR0 <- function(t,x,parameters){
with(as.list(c(parameters, x)), {
dS = v*S -beta*S*I/N -delta*S ## matrix
dE = beta*S*1/N -E*(sigma+delta) ## matrix
dI = sigma*E -I*(gamma+delta)
dR = gamma*I-delta*R
res = c(dS,dE,dI,dR)
list(res) ## different of the structure of xstart
})
}
这将纠正上述问题,但 ODE 将不起作用,因为 SEIR0 返回的导数数量必须等于初始条件的长度xstart
向量(此处为 4)。
我建议例如:
res <- c(dS=mean(dS),dE=mean(dE),dI=dI,dR=dR)
list(res)