1

你能给我提供一个使用odeint in执行数字积分的简单示例C++吗?

我想使用方便的集成功能,记录为:

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

我也不确定,如果可能的话,如何传递它而不是函数或仿函数、类方法。

4

2 回答 2

5

在 C++11 中,您可以使用一个简单的 lambda 函数来包装对成员方法的调用

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 不能与两个以上的参数一起正常工作)。

于 2013-09-12T16:41:00.177 回答
2

您的意思是除了在线提供的示例之外的示例?

#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

在线查看用户指南(以及更多示例)。

于 2013-09-12T17:53:59.597 回答