scipy.integrate.ode с двумя связанными ODE? - PullRequest
6 голосов
/ 20 апреля 2011

В настоящее время я пытаюсь использовать пакет SciPy integrate.ode для решения пары связанных ODE первого порядка: скажем, уравнение Лотка-Вольтерра-хищника-жертвы . Тем не менее, это означает, что во время цикла интеграции я должен обновлять параметры, которые я посылаю методам на каждой итерации, и просто отслеживать предыдущее значение и вызывать set_f_params() на каждой итерации, похоже, не помогает .

hprev = Ho
pprev = Po
yh = np.zeros(0)
yp = np.zeros(0)
while dh.successful() and dp.successful() and dp.t < endtime and dh.t < endtime:
    hparams = [alpha, beta, pprev]
    pparams = [delta, gamma, hprev]
    dh.set_f_params(hparams)
    dp.set_f_params(pparams)
    dh.integrate(dh.t + stepsize)
    dp.integrate(dp.t + stepsize)
    yh = np.append(yh, dh.y)
    yp = np.append(yp, dp.y)
    hprev = dh.y
    pprev = dp.y

Значения, которые я устанавливаю на каждой итерации с помощью set_f_params, по-видимому, не распространяются на методы обратного вызова, что неудивительно, учитывая, что ни один из примеров в Интернете, похоже, не содержит передачи "живых" переменных к обратным вызовам, но это был единственный метод, с помощью которого я мог думать, чтобы получить эти значения в методы обратного вызова.

У кого-нибудь есть советы по использованию SciPy для численной интеграции этих ODE?

Ответы [ 2 ]

7 голосов
/ 20 апреля 2011

Я могу ошибаться, но этот пример кажется очень близким к вашей проблеме. :) Он использует odeint для решения системы ODE.

4 голосов
/ 18 июля 2012

У меня была похожая проблема. Оказывается, интегратор не переоценивает функцию дифференциального уравнения для каждого вызова integrate (), но делает это в свое собственное внутреннее время. Я изменил параметр max_step интегратора, чтобы он был таким же, как stepize, и это сработало для меня.

...