Как выполнить простую числовую интеграцию с odeint в Stack Overflow

Можете ли вы дать мне простой пример выполнения числовой интеграции с odeint в C++?

Я хотел бы использовать удобный интегрировать функцию, документированный как:

integrate( system , x0 , t0 , t1 , dt )

Также я не уверен, как передать его вместо функции или функтора, метода класса, если это возможно.

1

Решение

В C ++ 11 вы можете использовать простую лямбда-функцию, заключающую в себе вызов метода-члена

Class c;
auto f = [&c]( const state_type & x , state_type &dxdt , double t ) {
c.system_func( x , dxdt , t ); };
integrate( f , x0 , t0 , t1 , dt );

std::bind может также работать, но тогда вы должны позаботиться о том, чтобы значения передавались посредством ссылки по значению.

В C ++ 03 вам нужно написать простую оболочку для вашего метода класса

struct wrapper
{
Class &c;
wrapper( Class &c_ ) : c( c_ )  { }
template< typename State , typename Time >
void operator()( State const &x , State &dxdt , Time t ) const
{
c.system_func( x , dxdt , t );
}
};

// ...
integrate( wrapper( c ) , x0 , t0 , t1 , dt );

(Boost.Bind не будет работать правильно с более чем двумя аргументами).

4

Другие решения

Вы имеете в виду примеры в дополнение к тем, предоставляется онлайн?

#include <iostream>
#include <boost/array.hpp>

#include <boost/numeric/odeint.hpp>

using namespace std;
using namespace boost::numeric::odeint;

const double sigma = 10.0;
const double R = 28.0;
const double b = 8.0 / 3.0;

typedef boost::array< double , 3 > state_type;

void lorenz( const state_type &x , state_type &dxdt , double t )
{
dxdt[0] = sigma * ( x[1] - x[0] );
dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
dxdt[2] = -b * x[2] + x[0] * x[1];
}

void write_lorenz( const state_type &x , const double t )
{
cout << t << '\t' << x[0] << '\t' << x[1] << '\t' << x[2] << endl;
}

int main(int argc, char **argv)
{
state_type x = { 10.0 , 1.0 , 1.0 }; // initial conditions
integrate( lorenz , x , 0.0 , 25.0 , 0.1 , write_lorenz );
}

График выхода из примера выше

А что касается системы, вы можете указать все, что подходит для следующего выражения:

sys( x , dxdt , t ) // returning void

Проверьте руководство пользователя (и другие примеры) онлайн.

2

По вопросам рекламы [email protected]