Как справиться с разрывом с помощью odeint

Я хочу знать, каков наилучший (вычислительно эффективный, красивый код) способ обработки разрыва с помощью odeint. Есть ли пример кода?

Я имитирую что-то вроде двигателя с обратной связью, угол которого измеряется цифровым способом с помощью поворотного энкодера. Выход ротационного энкодера y может быть смоделирован как y = floor (angle), где angle является действительным числом.

Я концептуально знаю, что делать. Во время моделирования мне нужно найти время, когда угол пересекает целочисленные значения, затем вернуться к предыдущему шагу, интегрировать до этого времени пересечения, отрегулировать состояние y в соответствии с разрывом и возобновить интеграцию с той же точки время.

После некоторого поиска в Google я нашел код ниже. Но я не вижу функцию make_const_step_time_range, доступную в библиотеке.

На странице 18 http://meetingcpp.com/tl_files/mcpp/slides/12/odeint.pdf:

auto iter = boost::find_if(
make_const_step_time_range(rk4,ode, x, t1, t2, dt),
[](const std::pair< state_type &, double> &x) {
return ( x.first[0] < 0.0 ); } );

Я использую boost_1_54_0.

3

Решение

К сожалению, эта функция присутствует только в версии odeint для github.

Btw. там у нас есть обсуждение на ту же тему на нашем трекер и у нас есть реальное решение вашей проблемы и аналогичные. Но это решение не завершено прямо сейчас.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]