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 ...
}
答案 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, ¶ms);
// ...
rk.do_step(my_fun, inout, t, dt);