将数组传递给微分函数vs​​元组会产生不同的scipy.integrated odeint结果?

我正在考虑使用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有关

limo2737 回答:将数组传递给微分函数vs​​元组会产生不同的scipy.integrated odeint结果?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2552145.html

大家都在问