如何在C++中用ODENT进行简单的数值积分 你能给我提供一个简单的例子吗?用C++ + < /p>进行数值积分

如何在C++中用ODENT进行简单的数值积分 你能给我提供一个简单的例子吗?用C++ + < /p>进行数值积分,c++,integration,numeric,odeint,C++,Integration,Numeric,Odeint,我想使用方便的集成功能,如: 此外,如果可能的话,我不确定如何传递它而不是函数或函子、类方法。在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 ); 绑

我想使用方便的集成功能,如:


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

在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 );
绑定也可以工作,但如果值是通过值的引用传递的,则必须小心

在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不能正确使用两个以上的参数。

在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 );
绑定也可以工作,但如果值是通过值的引用传递的,则必须小心

在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不能正确处理两个以上的参数。

您是指除这些参数外的其他示例吗


查看用户指南和更多示例。

您指的是除这些示例之外的示例吗


查看用户指南和更多示例。

集成基本上不是for循环吗?@crush是的,它是。但是Odeint自动化了这个过程,并使您能够在以后与OpenMP、Cuda和推力进行集成,这就是我决定使用它的原因。@crush:集成不仅仅是一个for循环。我还实例化了一个步进机,它执行密集输出和步长控制的集成。集成基本上不是for循环吗?@crush是的,它是。但是Odeint自动化了这个过程,并使您能够在以后与OpenMP、Cuda和推力进行集成,这就是我决定使用它的原因。@crush:集成不仅仅是一个for循环。我还实例化了一个步进器,它执行与密集输出和步长控制的集成。该方法是否可能是该类的同一实例的成员?还有,c、p1::_1等到底是什么?在您的示例中?我不理解您的第一个问题。使用实例c调用该方法。pl是std::占位符的名称空间。我已经编辑了我的答案。我不明白在这个例子中我的函数如何传递它的结果值。计算函数曲面时使用的图形点。啊,您是对的,传递给std::bind的值是按值传递的。但是,您可以使用lambda函数,在该函数中,您可以显式指定如何自动传递值f=[&c]const state_type&x,state_type&dxdt,double t{c.system_func x,dxdt,t;};积分f,x,t0,t1,dt;这个方法可能是这个类的同一个实例的成员吗?还有,在你的例子中,c、p1::_1等等到底是什么?我不理解你的第一个问题。使用实例c调用该方法。pl是std::占位符的名称空间。我已经编辑了我的答案。我不明白在这个例子中我的函数如何传递它的结果值。计算函数曲面时使用的图形点。啊,您是对的,传递给std::bind的值是按值传递的。但是,您可以使用lambda函数,在该函数中,您可以显式指定如何自动传递值f=[&c]const state_type&x,state_type&dxdt,double t{c.system_func x,dxdt,t;};积分f,x,t0,t1,dt;
sys( x , dxdt , t ) // returning void