scipy ODE, что происходит при превышении nsteps? - PullRequest
0 голосов
/ 15 мая 2018

Я выполняю числовую интеграцию с использованием scipy ode в нескольких миллионах случаев, и иногда я получаю сообщение об ошибке:

Излишняя работа, выполненная для этого вызова (возможно, неправильный тип Dfun).

Я немного увеличил nsteps (500 000), а также попытался указать метод BDF для "жестких" задач, как описано в этом вопросе

r = ode(RHS).set_initial_value(state0, t_initial).set_f_params(Efield,qmp)
r.set_integrator('vode',nsteps=500000,method='bdf')

Мой вопросэто: что происходит, когда это происходит?Этот интеграционный прогон выброшен?Или я могу заставить его выбросить?Мне все равно, если я потеряю несколько из миллионов прогонов, но я не хочу, чтобы данные были заражены.

1 Ответ

0 голосов
/ 15 мая 2018

Возвращаемое значение подозрительно при возникновении этой ошибки. В качестве тестового примера я попытался объединить 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, что устраняет некоторые микроуправления старого метода odesolve_ivp опция nsteps отсутствует) ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...