Я смотрю на создание простой модели SEIR с использованием scipy.integrate. Пока я просто запускаю одно местоположение, но мне нужно настроить его для работы с вектором местоположений с вероятностями перехода между ними. Однако, когда я передаю переменную в функцию 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, 0
beta = 2.3/4
gamma = 0.07
alpha = 0.25
mu = 0.02
i = 1
ret_correct = odeint(deriv_correct, y0, t, args=(beta, gamma, alpha, mu, i))
Но эта версия, Дублирование выше, но с переменными в виде массивов, возвращает неверные результаты:
def deriv_wrong(y, t, beta, gamma, alpha, mu, 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,dEdt,dIdt,dRdt,dDdt])
y_new = np.squeeze(y_new)
return y_new
Forecast_days = 200
t = np.linspace(0, Forecast_days, Forecast_days)
y0 = [59000000,709*2.3/4,709,0,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, y0, t, args=(beta, gamma, alpha, mu, i))
Буду признателен за помощь в том, почему это происходит. И производные, и правильные, и производные возвращают одинаковые результаты, поэтому, похоже, что-то с ODEINT