我正在使用odeint求解一个由4个耦合方程组成的系统,它可以模拟车辆行驶时的振动。我希望我的结果与我在MATLAB中得到的结果类似,但不幸的是没有发生。我已多次检查我的方程式,并且没有错误,所以问题必须在集成期间发生。
我已经在MATLAB中编写了解决方案,以验证我从C ++脚本中获得了什么。使用相同的条件,这是我从odeint得到的解决方案:
我没想到在MATLAB中看到的微振荡会出现在odeint结果中,但大多数值甚至都不接近正确。我使用了错误的混淆器,还是只是不能为这个应用程序工作?
c ++文件可以在Github上找到,here.这个类名为" coupledODE"是与我的系统有关的方程组,odeint在主函数中被强制执行。
答案 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 );
}