将 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::odefun
、ODEinstance.odefun
、ODEinstance->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);
我写了很多代码,在过去的 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::odefun
、ODEinstance.odefun
、ODEinstance->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);