Интегрируйте жесткие ОДЫ с Python

Я ищу хорошую библиотеку, которая интегрирует жесткие ОДЫ в Python. Проблема, odeint scipy иногда дает мне хорошие решения, но малейшее изменение в начальных условиях заставляет это падать и сдаваться. Та же проблема решена вполне счастливо жесткими решателями MATLAB (ode15s и ode23s), но я не могу использовать его (даже из Python, потому что ни одна из привязки Python для MATLAB C обратные вызовы реализации API, и я должен передать функцию решателю ОДЫ). Я пробую PyGSL, но это страшно сложно. Любые предложения значительно ценились бы.

Править: Определенная проблема, которую я имею с PyGSL, выбирает правильную ступенчатую функцию. Существует несколько из них, но никакие прямые аналоги ode15s или ode23s (bdf формула и изменил Rosenbrock, если это имеет смысл). Таким образом, что хорошая ступенчатая функция состоит в том, чтобы выбрать для жесткой системы? Я должен решить эту систему в течение действительно долгого времени, чтобы гарантировать, что она достигает установившийся, и решатели GSL или выбирают миниатюрный такт, или один это является слишком большим.

19
задан Chinmay Kanchi 18 January 2010 в 20:09
поделиться

3 ответа

Python может позвонить C. Промышленный стандарт LSODE в Odepack. Это общедоступный домен. Вы можете скачать версию C . Эти решатели чрезвычайно сложны, поэтому лучше всего использовать проверенный проверенный код.

Добавлено: Убедитесь, что у вас действительно жесткая система, то есть, если скорость (собственные значения) отличаются более чем на 2 или 3 порядка. Кроме того, если система жесткая, но вы ищете только устойчивое решение, эти решатели дают вам возможность решать некоторые из алгебрачески уравнений. В противном случае хорошая решалка Рун-Кутты, как DVERK , будет хорошим, и гораздо проще, решение.

Добавлено здесь, потому что он не поместится в комментарии: это из заголовка DLSODE DOC:

C     T     :INOUT  Value of the independent variable.  On return it
C                   will be the current value of t (normally TOUT).
C
C     TOUT  :IN     Next point where output is desired (.NE. T).

также, Да Михалис-Ментена Кинетика нелинейна. Ускорение Aitken работает с ним, хотя. (Если вы хотите краткое объяснение, сначала рассмотрите простой случай Y, будучи скалярным. Вы запускаете систему, чтобы получить 3 y (t) баллов. Установите экспоненциальную кривую через них (простая алгебра). Затем установите y к асимпту и Повторите. Теперь просто обобщена на y, будучи вектором. Предположим, что 3 балла находятся в самолете - все в порядке, если они нет.) Кроме того, если у вас нет форсирующей функции (например, константу IV), удаление мм будет распадаться Прочь и система будет приближаться к линейности. Надеюсь, это поможет.

14
ответ дан 30 November 2019 в 03:29
поделиться

Я в настоящее время изучаю немного ODE и его решателей, поэтому ваш вопрос очень интересен для меня ...

Из того, что я слышал и читал, за жесткие проблемы правильный путь Чтобы пойти состоит в том, чтобы выбрать неявный метод в качестве функции шага (поправьте меня, если я ошибаюсь, я все еще изучаю мистеры ODE Solvers). Я не могу привести вас в то, что я прочитал это, потому что я не помню, но вот нить от GSL-помощи, где был задан аналогичный вопрос.

Итак, короче говоря, похоже на метод BSIMP , стоит взять съемку, хотя это требует функции якобии. Если вы не можете рассчитать якобиан, я попробую с RK2IMP , RK4IMP или любой из методов передач.

2
ответ дан 30 November 2019 в 03:29
поделиться

Если вы можете решить свою задачу с помощью ode15s из Matlab, вы должны быть в состоянии решить ее с помощью vode решателя scipy. Для моделирования ode15s я использую следующие настройки:

ode15s = scipy.integrate.ode(f)
ode15s.set_integrator('vode', method='bdf', order=15, nsteps=3000)
ode15s.set_initial_value(u0, t0)

и тогда вы можете счастливо решить вашу проблему с помощью ode15s.integrate(t_final). Это должно работать довольно хорошо для жесткой задачи.

(See also http://www.scipy.org/NumPy_for_Matlab_Users)

19
ответ дан 30 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: