Возвращаемое значение подозрительно при возникновении этой ошибки. В качестве тестового примера я попытался объединить dy / dt = y от 0 до 1 всего за 10 шагов:
from scipy.integrate import ode
r = ode(lambda t, y: y).set_initial_value(1, 0).set_integrator('lsoda', nsteps=10)
print(r.integrate(1))
Это печатает [1.40213975]
с предупреждением "Излишняя работа, выполненная для этого вызова (возможно, неправильный тип Dfun)". Возвращаемое значение явно неверно: точное решение - exp(1) = 2.718...
Кажется, что процесс интеграции действительно останавливается, когда достигается nsteps, и все, что y найдено к этому времени, возвращается, даже если это не y (1).
Вы можете обнаружить это, вызвав r.successful()
после r.integrate
: если возвращается False, последний шаг завершился неудачей.
Увеличение nsteps (здесь достаточно 50) устраняет предупреждение и возвращает правильное значение.
В сторону: рассмотрите возможность использования нового SciPy API для ODE , такого как solve_ivp
, что устраняет некоторые микроуправления старого метода ode
(в solve_ivp
опция nsteps
отсутствует) ,