odeint隐式欧拉简单的例子

时间:2014-06-13 14:38:30

标签: c++ ode odeint

我有兴趣使用隐式方案使用odeint库来解决ODE系统,我很难实现一个简单的implicit_euler示例。

查看文档,我设法使工作显式步进器,自适应步进器以及rosenbrock4步进器。前者似乎是半隐含的。因此,我有兴趣实现一个完全隐式的方案(同时在每个时间步检索雅可比矩阵)。但我没有设法找到这个步进器的文档和工作示例。我拥有的是

typedef boost::numeric::ublas::vector< double > vector_type;
typedef boost::numeric::ublas::matrix< double > matrix_type;`

struct stiff_system
{
    void operator()( const vector_type &x , vector_type &dxdt , double /* t */ )
    {
        dxdt[ 0 ] = -101.0 * x[ 0 ] - 100.0 * x[ 1 ];
        dxdt[ 1 ] = x[ 0 ];
    }
};

struct stiff_system_jacobi
{
    void operator()( const vector_type & /* x */ , matrix_type &J , const double & /* t */ , vector_type &dfdt )
    {
    J( 0 , 0 ) = -101.0;
    J( 0 , 1 ) = -100.0;
    J( 1 , 0 ) = 1.0;
    J( 1 , 1 ) = 0.0;
    dfdt[0] = 0.0;
    dfdt[1] = 0.0;
    }
};

typedef implicit_euler< double > stepper_IE;
vector_type inout( 2 , 1.0 );
size_t steps = integrate_const( stepper_IE() ,
            std::make_pair( stiff_system() , stiff_system_jacobi() ) ,
            inout , 0.0 , 5.0 , 0.01, streaming_observer( std::cout, x_vec , times ));

错误如下:

  

C:\boost_1_55_0\boost\numeric\odeint\stepper\implicit_euler.hpp:94:错误:C2064:term不评估为带有3个参数的函数   class没有将“operator()”或用户定义的转换运算符定义为指向函数的指针或函数的引用,它接受适当数量的参数

我现在的问题是:有人知道如何让它发挥作用,或者有人能指出我比这更详细的文档:

codeproject documentation

或者这个:

main odeint page

由于

1 个答案:

答案 0 :(得分:1)

不幸的是,隐式Euler方法和Rosenbrock求解器(另一个隐式求解器)没有相同的接口。详细地说,隐式Euler期望具有此签名的雅可比行列函数

void jacobian( const state_type &x , matrix_type &jacobi , const value_type t );

因此,您需要将stiff_system_jacobi的定义更改为

struct stiff_system_jacobi
{
    void operator()( const vector_type & , matrix_type &J , const double & ) const
    {
        J( 0 , 0 ) = -101.0;
        J( 0 , 1 ) = -100.0;
        J( 1 , 0 ) = 1.0;
        J( 1 , 1 ) = 0.0;
    }
};

如果你的系统真的是非自治的,你需要用一个额外的坐标来增强你的状态类型,这个坐标代表时间并具有微不足道的动力学dt / dt = 1.