C ++ - 系统的odeint解决方案差异很大

时间:2016-12-02 21:10:30

标签: c++ matlab ode odeint

我正在使用odeint求解一个由4个耦合方程组成的系统,它可以模拟车辆行驶时的振动。我希望我的结果与我在MATLAB中得到的结果类似,但不幸的是没有发生。我已多次检查我的方程式,并且没有错误,所以问题必须在集成期间发生。

我已经在MATLAB中编写了解决方案,以验证我从C ++脚本中获得了什么。使用相同的条件,这是我从odeint得到的解决方案: enter image description here

这是MATLAB中的相同解决方案: enter image description here

我没想到在MATLAB中看到的微振荡会出现在odeint结果中,但大多数值甚至都不接近正确。我使用了错误的混淆器,还是只是不能为这个应用程序工作?

c ++文件可以在Github上找到,here.这个类名为" coupledODE"是与我的系统有关的方程组,odeint在主函数中被强制执行。

1 个答案:

答案 0 :(得分:1)

在C ++代码中,您从不执行calcRadialFreq()过程,因此radFreq=0在初始化时保持不变,提供恒定的漂移项但不是小的振荡。

在上面的getRoadValues()过程中加入这一行计算将使结果在视觉上与Matlab图相同。

假设一个强制频率为20Hz,输出采样率大于40Hz。对于100Hz,dt=0.01的时间步长可以很好地完成。

我还建议用小的,易于读取的位计算ODE函数。这应该有助于比较不同的版本和捕获错误。例如,它可以采用

形式
void operator()(state_type &x, state_type &dxdt, double t)
{
    double wave_f = car.stiffness_f*road.A*sin((road.radFreq)*t);
    double wave_r = car.stiffness_r*road.A*sin((road.radFreq)*t-(2*pi*(car.frontLength+car.rearLength))/road.L);

    double term1f = car.stiffness_f*x[0] + car.damping_f*x[1];
    double term1r = car.stiffness_r*x[0] + car.damping_r*x[1];
    double term2f = car.stiffness_f*x[2] + car.damping_f*x[3];
    double term2r = car.stiffness_r*x[2] + car.damping_r*x[3];
    double term3f = -term1f + term2f*car.frontLength + wave_f;
    double term3r = -term1r - term2r*car.rearLength  + wave_r;

    dxdt[0] = x[1];
    dxdt[1] = (1 / car.mass)*( term3f                  + term3r                 );
    dxdt[2] = x[3];
    dxdt[3] = (1/car.inertia)*(-term3f*car.frontLength + term3r*car.rearLength  );
}