![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Iterators and RangesBoost , Chapter 1. Boost.Numeric.Odeint , odeint in detail
|
![]() | Home | Libraries | People | FAQ | More |
odeint поддерживает итераторы, которые итерируют вдоль приблизительного решения обычного дифференциального уравнения. Итераторы предлагают альтернативу интегрированным функциям. Кроме того, многие стандартные алгоритмы в стандартной библиотеке C++ и Boost. Диапазон можно использовать с итераторами odeint.
Предусмотрено несколько типов итераторов, в соответствии синтегрированными функциями.. Следовательно, есть<const_step_iterator
>,<adaptive_step_iterator
>,<n_step_iterator
>и<times_iterator
>— каждая из них в двух вариантах: либо только с<state
>, либо с<std::pair<state,time>
>в качестве типа значения. Все они являются единичными итераторами. Ниже мы покажем несколько примеров того, как использовать эти итераторы вместе с алгоритмами std.
runge_kutta4< state_type > stepper; state_type x = {{ 10.0 , 10.0 , 10.0 }}; double res = std::accumulate( make_const_step_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , make_const_step_iterator_end( stepper , lorenz() , x ) , 0.0 , []( double sum , const state_type &x ) { return sum + x[0]; } ); cout << res << endl;
В этом примере аккумулируются все x-значения решения. Обратите внимание, как отступление от итератора дает текущее состояние<x
>ОДЭ (второй аргумент аккумулируемой лямбды). Сам итератор не встречается непосредственно в этом примере, но он генерируется заводскими функциями<make_const_step_iterator_begin
>и<make_const_step_iterator_end
>. Диапазон, позволяющий записать вышеприведенный пример в более компактном виде с заводской функцией<make_const_step_range
>, но теперь использующий<boost::accumulate
>из __bost_range:
runge_kutta4< state_type > stepper; state_type x = {{ 10.0 , 10.0 , 10.0 }}; double res = boost::accumulate( make_const_step_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , []( double sum , const state_type &x ) { return sum + x[0]; } ); cout << res << endl;
Второй тип итератора также является итератором с размером шага const. Но ценностный тип этого итератора состоит здесь из пары времени и состояния решения ОДЭ. Примером является
runge_kutta4< state_type > stepper; state_type x = {{ 10.0 , 10.0 , 10.0 }}; double res = boost::accumulate( make_const_step_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , []( double sum , const std::pair< const state_type &, double > &x ) { return sum + x.first[0]; } ); cout << res << endl;
В настоящее время заводские функции<make_const_step_time_iterator_begin
>,<make_const_step_time_iterator_end
>и<make_const_step_time_range
>. Обратите внимание, что лямбда теперь ожидает<std::pair
>, поскольку это тип стоимости<const_step_time_iterator
>.
Далее мы обсудим адаптивные итераторы, которые полностью аналогичны конст-ступенчатым итераторам, но основаны на адаптивных степперных процедурах и, таким образом, корректируют размер шага во время итерации. Примерами являются
auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); state_type x = {{ 10.0 , 10.0 , 10.0 }}; double res = boost::accumulate( make_adaptive_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , []( double sum , const state_type& x ) { return sum + x[0]; } ); cout << res << endl;
auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); state_type x = {{ 10.0 , 10.0 , 10.0 }}; double res = boost::accumulate( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , []( double sum , const pair< const state_type& , double > &x ) { return sum + x.first[0]; } ); cout << res << endl;
![]() | Note |
---|---|
Adaptive_iterator< |
В общем, можно сказать, что повторение в диапазоне<const_step_iterator
>ведет себя как<integrate_const
>вызов функции, и аналогично для<adaptive_iterator
>и<integrate_adaptive
>,<n_step_iterator
>и<integrate_n_steps
>, и, наконец,<times_iterator
>и<integrate_times
>.
Ниже мы перечислим наиболее важные свойства итераторов:
const_step_iterator<Stepper
,System
,State
>
>value_type
>является<State
>reference_type
>является<Stateconst&
>make_const_step_iterator_begin(stepper
,system
,state
,t_start
,t_end
,dt
)
>make_const_step_iterator_end(stepper
,system
,state
)
>make_const_step_range(stepper
,system
,state
,t_start
,t_end
,dt
)
>state
>— текущее состояние ОДЭ во время итерации.const_step_time_iterator<Stepper
,System
,State
>
>value_type
>является<std::pair<
State,
Stepper::time_type>
>reference_type
>является<std::pair<
Stateconst&,Stepper::time_type>
const&
>make_const_step_time_iterator_begin(stepper
,system
,state
,t_start
,t_end
,dt
)
>make_const_step_time_iterator_end(stepper
,system
,state
)
>make_const_step_time_range(stepper
,system
,state
,t_start
,t_end
,dt
)
>state
>. Значение<state
>— текущее состояние ОДЭ во время итерации.adaptive_iterator<Stepper
,System
,State
>
>value_type
>является<State
>reference_type
>является<Stateconst&
>make_adaptive_iterator_begin(stepper
,system
,state
,t_start
,t_end
,dt
)
make_adaptive_iterator_end(stepper
,system
,state
)
>make_adaptive_range(stepper
,system
,state
,t_start
,t_end
,dt
)
>state
>, изменяется в соответствии с текущим состоянием ODE. Для DenseOutputStepper состояние изменяется не за счет оптимизации производительности, а за счет самих шагов.adaptive_iterator<Stepper
,System
,State
>
>value_type
>является<std::pair<
State,
Stepper::time_type>
>reference_type
>является<std::pair<
Stateconst&,Stepper::time_type>
const&
>make_adaptive_time_iterator_begin(stepper
,system
,state
,t_start
,t_end
,dt
)
>make_adaptive_time_iterator_end(stepper
,system
,state
)
>make_adaptive_time_range(stepper
,system
,state
,t_start
,t_end
,dt
)
>state
>изменяется в соответствии с текущим состоянием ODE. Для DenseOutputStepper состояние изменяется не за счет оптимизации производительности, а за счет самого степпера.n_step_iterator<Stepper
,System
,State
>
>value_type
>является<State
>reference_type
>является<Stateconst&
>make_n_step_iterator_begin(stepper
,system
,state
,t_start
,dt
,num_of_steps
)
>make_n_step_iterator_end(stepper
,system
,state
)
>make_n_step_range(stepper
,system
,state
,t_start
,dt
,num_of_steps
)
>state
>— текущее состояние ОДЭ во время итерации.n_step_time_iterator<Stepper
,System
,State
>
>value_type
>является<std::pair<
State,
Stepper::time_type>
>reference_type
>является<std::pair<
Stateconst&,Stepper::time_type>
const&
>make_n_step_time_iterator_begin(stepper
,system
,state
,t_start
,dt
,num_of_steps
)
>make_n_step_time_iterator_end(stepper
,system
,state
)
>make_n_step_time_range(stepper
,system
,state
,t_start
,dt
,num_of_steps
)
>state
>. Значение<state
>— текущее состояние ОДЭ во время итерации.times_iterator<Stepper
,System
,State
,TimeIterator
>
>value_type
>является<State
>reference_type
>является<Stateconst&
>make_times_iterator_begin(stepper
,system
,state
,t_start
,t_end
,dt
)
>make_times_iterator_end(stepper
,system
,state
)
>make_times_range(stepper
,system
,state
,t_start
,t_end
,dt
)
>state
>— текущее состояние ОДЭ во время итерации.times_time_iterator<Stepper
,System
,State
,TimeIterator>
>value_type
>является<std::pair<
State,
Stepper::time_type>
>reference_type
>является<std::pair<
Stateconst&,Stepper::time_type>
const&
>make_times_time_iterator_begin(stepper
,system
,state
,t_start
,t_end
,dt
)
>make_times_time_step_iterator_end(stepper
,system
,state
)
>make_times_time_range(stepper
,system
,state
,t_start
,t_end
,dt
)
>state
>. Значение<state
>— текущее состояние ОДЭ во время итерации.Статья Iterators and Ranges раздела Chapter 1. Boost.Numeric.Odeint odeint in detail может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: odeint in detail ::
реклама |