Передача массивов в производную функцию против кортежей дает разные результаты scipy.integrate odeint? - PullRequest
0 голосов
/ 30 марта 2020

Я смотрю на создание простой модели 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

...