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!
Каков правильный способ его крепления? Я бы предпочел избежать использования внешнего объекта.
Ваше использование '* this' делает * копию * вашего объекта' CSystem', который, возможно, будет скопирован дальше. Что происходит, когда вы меняете это на 'std :: ref (* this)'? –
@DrewDormann Хорошо работает и отлично – oslo
Это здорово. Я переведу его на «официальный» ответ. –