Я хочу знать, каков наилучший (вычислительно эффективный, красивый код) способ обработки разрыва с помощью 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.
К сожалению, эта функция присутствует только в версии odeint для github.
Btw. там у нас есть обсуждение на ту же тему на нашем трекер и у нас есть реальное решение вашей проблемы и аналогичные. Но это решение не завершено прямо сейчас.
Других решений пока нет …