使用odeint函数定义

时间:2012-08-21 17:36:52

标签: numerical-methods differential-equations numerical-integration

漂亮的noob问题所以请耐心等待。

我按照这里给出的例子 - > http://www.codeproject.com/Articles/268589/odeint-v2-Solving-ordinary-differential-equations

特别是,我正在研究这个功能:

void lorenz( 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] = x[0]*x[1] - b * x[2];
 } 

在我的情况下,R接受一系列值(带有100个双打的矢量)。

odeint被称为:

integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , dt );

我想为R的每个值做这个。我怎么能做到这一点?我对C ++ / OOP的了解有限,但我愿意学习。

谢谢。

2 个答案:

答案 0 :(得分:4)

您可以使用“类”版本,但修改它以便使用您感兴趣的R值进行初始化。

class lorenz_class {
    double R_;
public:
    lorenz_class (double r) : R_(r) {}
    void operator()( 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] = x[0]*x[1] - b * x[2];
    }
};

然后,迭代向量R并将值传递给传递给lorenz_class模板函数的integrate_const实例。

for (unsigned i = 0; i < myR.size(); ++i) {
    lorenz_class lorenz(myR[i]);
    integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , dt );
}

答案 1 :(得分:3)

只是一点注意事项:本教程展示了一个非常类似的Lorenz系统参数研究示例:http://headmyshoulder.github.com/odeint-v2/doc/boost_numeric_odeint/tutorial.html。它位于Thrust和VexCL部分,它显示了如何将此问题并行化以在多个CPU或GPU上工作。