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
...

Что сбрасывает счетчик? кажется единым!

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


person oslo    schedule 17.01.2015    source источник
comment
Использование вами *this создает копию вашего объекта CSystem, которая, возможно, копируется дальше. Что произойдет, если вы измените это на std::ref(*this)?   -  person Drew Dormann    schedule 18.01.2015
comment
@DrewDormann Работает отлично и круто   -  person oslo    schedule 18.01.2015
comment
Это приятно слышать. Я перенесу это в официальный ответ.   -  person Drew Dormann    schedule 18.01.2015
comment
Великолепно! Целый день мучаюсь с этой проблемой!   -  person Simon Woodward    schedule 29.10.2018


Ответы (1)


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

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

person Drew Dormann    schedule 17.01.2015