使用`boost :: numeric :: odeint`扩展System的类型签名

时间:2016-04-11 07:01:12

标签: c++ boost odeint

ode $ f'(x,t)= f(x,t)$的系统必须具有如上所述的以下签名here

void sys( const state_type & /*x*/ , state_type & /*dxdt*/ , const double /*t*/ )
{
    // ...
}

可以将其修改为以下

void sys( const state_type & /*x*/ , state_type & /*dxdt*/ , const double /*t*/, void * params )
{
    // do something with params now ...
}

2 个答案:

答案 0 :(得分:3)

另一种可能性是使用lambdas。在C ++ 14中,您将它们写为

params

此外,如果您不需要致电第三方图书馆并通过void*传递 struct sys { param_t param; void operator()( state_type const& x , state_type& dxdt , double t ) const { // implement sys and access params } }; sys s; rk.do_step(s, inout, t, dt); ,请考虑使用仿函数来访问您的参数:

operator()

这正是odeint使用函数对象的原因。您可以使用看起来像函数的所有内容。具有某个成员和适当{{1}}的类的行为与函数完全相同。

答案 1 :(得分:1)

您应该使用boost::bind或(可能std::bind)将4 th 参数绑定到您要使用的params对象的指针。这将创建一个具有正确签名的函数对象。

然后你应该像往常一样使用它。

params_t params;
// Set the parameters...

auto my_fun = boost::bind(&sys, _1, _2, _3, &params);
// ...
rk.do_step(my_fun, inout, t, dt);