将 Boost/odeint 与 class 结合使用(使用 class 内的 ODE 函数从 class 外部调用积分)

Using Boost/odeint with class (calling integrate from outside the class with ODE-function inside the class)

我写了很多代码,在过去的 weeks/months 中变得非常混乱,我想清理一下,将大部分代码放入 classes。但是,我不知道如何调用 ODE 函数,即 inside 一个 class with Boost/integrate from outside class。我不确定,如果这是 cleanest/best 的做法,但我试过这样的事情:

class ODEclass
{
public:
    // Lots of stuff here (initialization, methods, properties, parameters)
    void odefun(std::vector<double> x, std::vector<double>& dxdt, const double t)
    {
        // ...
    }
}

然后在 class 之外的某个地方调用:

integrate_adaptive(make_controlled<runge_kutta_cash_karp54<std::vector<double>>>(errTol[0], errTol[1]), odefun, Data, 0.0, something, something);

odefun 作为 ODEclass::odefunODEinstance.odefunODEinstance->odefun 以及我能想到的所有其他方法,但都不起作用。将 void odefun(...) 放在 class 之外效果很好,但这会违背我当前的清洁冲动。

我在 Whosebug 上找到了使用 std::bind 的答案,但是那些 odeint 调用形成 inside 而 class 并且似乎没有以我为例。

那么如何将 ODE 函数传递给 class 中的 odeint?或者有更好的(干净的)方法来做到这一点吗?我希望,我把所有必要的信息都放在这里。如果有什么遗漏,请告诉我。

调用 non-static 成员函数需要 class.

的实例

最简单的修复方法是将 odefun 标记为 static。除非您想访问内部结构,否则这将起作用。假设 odefun 的正确签名实际上是 void(std::vector<double>, std::vector<double>&, const double) 或兼容:

ODEclass instance;
auto odefun = std::bind(&ODEclass::odefun, &instance, _1, _2, _3);