3

很菜鸟的问题,所以请多多包涵。

我正在按照此处给出的示例-> 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 的了解有限,但我愿意学习。

谢谢你。

4

2 回答 2

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 );
}
于 2012-08-21T18:02:47.017 回答
3

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

于 2012-08-22T05:45:36.357 回答