我尝试使用boost :: numerics :: odeint来集成微分方程组。我的代码是
dMat Equation::solveODE(dMat u_i, double t_i)
{
dVec u_iVec(2 * u_i.size());
u_iVec = MtoV(u_i);
void(Equation::*pointer)(const dVec &, dVec &, const double ) = &Equation::ODEf;
runge_kutta4< dVec > stepper;
integrate_const(stepper, pointer, u_iVec, 0.0, 1.0, 0.01);
return u_i;
}
void Equation::ODEf(const dVec &u_i, dVec &dxdt, const double /* t */)
{
for (size_t I = 0; I < u_i.size(); I++)
{
if (I % 2 == 0)
{
dxdt[I] = f1(VtoM(u_i, u_i.size() / 2, 2))[I];
}
else
{
dxdt[I] = f2(VtoM(u_i, u_i.size() / 2, 2))[I];
}
}
}
MtoV仅将矩阵更改为向量,f1和f2评估等式的rhs。我曾经认为问题是ODEf是一个成员函数od Equation(我得到的错误是我有非标准语法)但是现在我得到的错误是该术语没有评估为一个带3个参数的函数...可能是因为ODEf再次成为Equation的成员函数吗?
解答: 我不得不使用: std :: function ODEf_without_classname(std :: bind(&amp; Equation :: ODEf,this,std :: placeholders :: _ 1,std :: placeholders :: _ 2,std :: placeholders :: _ 3));
为了摆脱Odef开头的Equation ::
答案 0 :(得分:1)
pointer
不是一个带3个参数的函数,它是一个成员函数指针;略有不同,从概念上讲也是第0个参数,this
指针。尝试使用自由函数/函数对象/绑定表达式或lambda。