Я хочу решить жесткую оду с odeint. Я следовал this (rosenbrock4_dense_output stepper), но моя функция может расти довольно быстро, поэтому я хочу остановить интеграцию, если x (t)> xMAX.Остановить интеграцию в odeint с жесткой одой
В этом question у них есть решение для него, но поскольку я новичок в C++, я не знаю, как реализовать это при использовании шага rosenbrock4_dense_output.
Я хотел бы посмотреть, как написать это специально для шага rosenbrock4_dense_output.
Только на прошлой неделе я добавил пример, который находит точные точки, где перекрещенные некоторый порог: https://github.com/headmyshoulder/odeint-v2/blob/master/examples/find_crossing.cpp. Он использует интерфейс итератора odeint вместе с find_if для остановки при пересечении порога. Затем он делает деление пополам, чтобы приблизиться к точке пересечения, но вам может и не понадобиться. Чтобы адаптироваться к rosenbrock, вам просто нужно изменить шагомер и функцию rhs. – mariomulansky
Это похоже на то, что мне нужно, но я не знаю, как заставить его работать с шаге rosenbrock4_dense_output. Просто изменение runge_kutta_dopri5 к rosenbrock4_dense_output и вместо state_type с помощью vector_type: где vector_Type определяется: ЬурейеЕ повышение :: числовыми :: ublas :: вектор < double > vector_type; - это не все, что требуется. Не могли бы вы объяснить, как это изменится для моего конкретного случая. – marRrR
Вам также необходимо отрегулировать rhs, например. auto ode = make_pair (stiff_system(), stiff_system_jacobi()); - см. также ответ headmyshoulder ниже – mariomulansky