Я собираюсь понять odeint
из библиотеки c++ boost
, и мне нужно знать, какая часть что делает. В boost/numeric/odeint/integrate/integrate_adaptive.hpp
есть функция integrate_adaptive
. Эта функция имеет несколько перегрузок. Упрощенный файл с моими небольшими манипуляциями выглядит следующим образом:
интегрировать_адаптивный_минимальный.hpp
#define BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_ADAPTIVE_HPP_INCLUDED
#include <boost/type_traits/is_same.hpp>
#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
#include <boost/numeric/odeint/integrate/null_observer.hpp>
#include <boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>
using namespace std;
namespace boost {
namespace numeric {
namespace odeint {
/*
* the two overloads are needed in order to solve the forwarding problem
*/
template< class Stepper , class System , class State , class Time , class Observer >
size_t integrate_adaptive(
Stepper stepper , System system , State &start_state ,
Time start_time , Time end_time , Time dt ,
Observer observer )
{
cout<<"type one"<<endl; //added by me ***************************************
typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
return detail::integrate_adaptive(
stepper , system , start_state ,
start_time , end_time , dt ,
observer , stepper_category() );
/*
* Suggestion for a new extendable version:
*
* integrator_adaptive< Stepper , System, State , Time , Observer , typename Stepper::stepper_category > integrator;
* return integrator.run( stepper , system , start_state , start_time , end_time , dt , observer );
*/
}
/**
* \brief Second version to solve the forwarding problem,
* can be called with Boost.Range as start_state.
*/
template< class Stepper , class System , class State , class Time , class Observer >
size_t integrate_adaptive(
Stepper stepper , System system , const State &start_state ,
Time start_time , Time end_time , Time dt ,
Observer observer )
{
cout<<"type two"<<endl; //added by me ***************************************
typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
return detail::integrate_adaptive(
stepper , system , start_state ,
start_time , end_time , dt ,
observer , stepper_category() );
}
} // namespace odeint
} // namespace numeric
} // namespace boost
Разница между этими двумя функциями связана с параметром start_state
. Во второй функции он содержит ключевое слово const
. Я хочу знать, какая перегрузка называется. Итак, я добавил cout в каждую функцию. Затем я вызываю их из этого тестового файла:
минимальный.cpp
#include "integrate_adaptive_minimal.hpp"
#include <boost/numeric/odeint.hpp>
#include <armadillo>
using namespace arma;
using namespace boost::numeric::odeint;
typedef vec::fixed<2> state_type;
void sys( const state_type &x , state_type &dxdt , const double t)
{
mat A;
A<<-1<<0<<endr<<0<<-1;
mat B;
B<<1<<endr<<1;
dxdt=A*x+B*(t>0?1:0);
}
void observer( const state_type &x , const double t )
{
}
typedef runge_kutta_dopri5<state_type> stepper_type;
int main()
{
state_type x;
x(0) = 0.0;
x(1) = 0.0;
integrate_adaptive(make_controlled(1E-10,1E-10,stepper_type()),
sys,x,0.0,11.0,0.1,observer);
return 0;
}
Когда я компилирую и запускаю:
g++ -std=c++11 minimal.cpp -larmadillo -lboost_thread -lboost_filesystem -lboost_system -Wfatal-errors
./a.out
Результат показывает, что вызывается первая функция integrate_adaptive
, у которой нет const
. Теперь я хочу знать, как правильно вызвать вторую функцию? Объект x не может быть const
!
Если кто-то даже знает о механизме библиотеки boost
, скажите мне, что преимущество второй функции оценено.
Обновление:
state_type const cx = x;
, а затем используйтеcx
вместоx
в вызовеintegrate_adaptive
. Вы также можете инициализироватьcx
напрямую, вызвав конструкторvec::fixex<2>
... что-то вродеstate_type const cx(0.0, 0.0);
- person Praetorian   schedule 14.01.2015cout<<"type one"<<endl; //added by me
- person barej   schedule 14.01.2015