我正在考虑使用scipy.integrate构建一个简单的SEIR模型。现在,我只运行一个位置,但是我需要将其设置为在具有过渡概率的位置矢量上运行。但是,当我将变量作为数组而不是标准元组传递给odeint函数时,会产生错误的结果!
此版本可以正常工作并提供正确的输出:
def deriv_correct(y,t,beta,gamma,alpha,mu,i):
su = 1-mu
S,E,I,R,D = y
dsdt = -beta * i * S * I / (S+E+I+R)
dEdt = beta * i * S * I / (S+E+I+R) - alpha*E
dIdt = alpha*E - gamma * I
dRdt = gamma * I * su
dDdt = gamma * I * mu
return dsdt,dEdt,dIdt,dRdt,dDdt
Forecast_days = 200
t = np.linspace(0,Forecast_days,Forecast_days)
y0 = 59000000,500,800,0
beta = 2.3/4
gamma = 0.07
alpha = 0.25
mu = 0.02
i = 1
ret_correct = odeint(deriv_correct,y0,args=(beta,i))
但是此版本是上面的重复版本,但变量作为数组,返回错误结果:
def deriv_wrong(y,i):
su = np.ones_like(mu)-mu
S = y[0]
E = y[1]
I = y[2]
R = y[3]
D = y[4]
dsdt = -beta * i * S * I / (S+E+I+R)
dEdt = beta * i * S * I / (S+E+I+R) - alpha*E
dIdt = alpha*E - gamma * I
dRdt = gamma * I * su
dDdt = gamma * I * mu
y_new = np.array([dsdt,dDdt])
y_new = np.squeeze(y_new)
return y_new
Forecast_days = 200
t = np.linspace(0,Forecast_days)
y0 = [59000000,709*2.3/4,709,0]
beta = np.array([2.3/4])
gamma = np.array([1/14])
alpha = np.array([1/4])
mu = np.array([0.02])
i = np.array([1])
ret_wrong = odeint(deriv_wrong,i))
我希望能得到一些帮助,以帮助您了解为什么会这样。 deriv_correct和deriv_wrong都返回相同的结果,因此似乎与ODEINT有关