Выполнение следующего кода:
#include #include using namespace std; using namespace boost::numeric::odeint; class CSystem { private: int counter=0; public: void operator() ( const double &x , double &dxdt , const double t) { double mat_A=-1; double mat_B=1; dxdt=mat_A*x+mat_B*1; cout<<"counter: "<<counter<<endl; counter++; // seems it does not apply to the rest of the iterations appropriately } void solve() { double x; x = 0.0; typedef runge_kutta_dopri5 stepper_type; std::function my_observer = [&](const double &x,const double t){/* do nothing*/}; integrate_adaptive(make_controlled(1E-10,1E-10,stepper_type()), *this,x,0.0,3.0,0.1,my_observer); } }; int main() { CSystem sys; sys.solve(); return 0; }
Я ожидаю, что counter
начнет отсчет с 0 до и cout
генерирует следующий результат:
0 1 2 3 4 5 6 7 8 9 10 11 ...
Пока я получаю что-то еще:
counter: 0 counter: 0 counter: 1 counter: 2 counter: 3 counter: 4 counter: 5 counter: 0 counter: 1 counter: 2 counter: 3 counter: 4 counter: 5 counter: 0 counter: 1 counter: 2 counter: 3 ...
Что сбросит счетчик? кажется odeint!
Каков правильный способ его устранения? Я бы предпочел избежать использования внешнего объекта.
Ваше использование *this
делает копию вашего объекта CSystem, которая, возможно, будет скопирована дальше.
Я думаю, вы должны изменить этот параметр на std::ref(*this)
.