![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Using boost::rangeBoost , Chapter 1. Boost.Numeric.Odeint , odeint in detail
|
![]() | Home | Libraries | People | FAQ | More |
Большинство степперов в одейте также принимают состояние дай в качестве диапазона. Диапазон - это последовательность значений, смоделированных концепцией диапазона. См. Boost.Range для обзора существующих концепций и примеров диапазонов. Это означает, что метод state_type
степпера не обязательно должен использоваться для вызова метода do_step
.
Один пример использования Boost.Range в odeint показан в Chaotic System, где состояние состоит из двух частей: одна для исходной системы и одна для возмущений. Диапазоны используются для инициализации (решения) только системной части, где не затрагивается часть возмущения, то есть используется диапазон, состоящий только из системной части. После этого решается полное состояние, включая возмущения.
Другим вариантом использования является система, состоящая из связанных блоков, где вы хотите инициализировать каждый блок отдельно с ODE несвязанного блока. Примером может служить цепь связанных ван-дер-поль-осцилляторов, которые инициализируются равномерно из несвязанного ван-дер-поль-осциллятора. Затем можно использовать Boost.Range для решения только одного отдельного осциллятора в цепи.
Короче говоря, вы можете Boost.Range использовать одно состояние в двух системных функциях, которые ожидают состояний с разными размерами.
Пример был приведен в учебнике Хаотическая система. Используя Boost. Диапазон обычно означает, что ваша системная функция должна адаптироваться к итераторам Boost. Диапазон. То есть ваша функция называется диапазоном, и вам нужно получить итераторы из этого диапазона. Это легко сделать. Вы должны реализовать свою систему в виде класса или структуры, и вы должны шаблонизировать оператор()
. Затем вы можете использовать range_iterator
-мета-функцию и boost::begin
и boost::end
для получения итераторов вашего диапазона:
class sys { template< class State , class Deriv > void operator()( const State &x_ , Deriv &dxdt_ , double t ) const { typename boost::range_iterator< const State >::type x = boost::begin( x_ ); typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); // fill dxdt } };
Если ваш диапазон является случайным диапазоном доступа, вы также можете применить оператор скобки к итератору для доступа к элементам в диапазоне:
class sys { template< class State , class Deriv > void operator()( const State &x_ , Deriv &dxdt_ , double t ) const { typename boost::range_iterator< const State >::type x = boost::begin( x_ ); typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); dxdt[0] = f1( x[0] , x[1] ); dxdt[1] = f2( x[0] , x[1] ); } };
Следующие две таблицы показывают, какие степперы и какие алгебры совместимы с Boost.Range.
Table 1.9. Steppers supporting Boost.Range
Шагай |
---|
adams_bashforth_moulton |
bulirsch_stoer |
dense_output_runge_kutta |
explicit_error_generor_rk |
rosenbrock4_контроллер |
rosenbrock4_dense_output |
runge_kutta4 |
runge_kutta_cash_karp54 |
runge_kutta_dopri5 |
runge_kutta_fehlberg78 |
Статья Using boost::range раздела Chapter 1. Boost.Numeric.Odeint odeint in detail может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: odeint in detail ::
реклама |