2015-01-17 1 views
1

Запуск следующий код:odeint сбрасывает объект во время итерации

#include <iostream> 
#include <boost/numeric/odeint.hpp> 

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<double> stepper_type; 
     std::function<void(const double &,const double)> 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!

Каков правильный способ его крепления? Я бы предпочел избежать использования внешнего объекта.

+1

Ваше использование '* this' делает * копию * вашего объекта' CSystem', который, возможно, будет скопирован дальше. Что происходит, когда вы меняете это на 'std :: ref (* this)'? –

+0

@DrewDormann Хорошо работает и отлично – oslo

+0

Это здорово. Я переведу его на «официальный» ответ. –

ответ

1

Ваше использование *this делает копию вашего объекта CSystem, которая, возможно, будет скопирована дальше.

Я думаю, вы должны изменить этот параметр на std::ref(*this).