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

标签 c++ matlab ode odeint

我正在使用 odeint 求解一个包含 4 个耦合方程的系统,这些方程模拟车辆在行驶时的振动。我希望我的结果与我在 MATLAB 中得到的结果相似,但不幸的是,这并没有发生。我已经多次检查我的方程式,没有错误,所以问题一定是在积分过程中发生的。

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

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

我没想到在 MATLAB 中看到的微振荡会出现在 odeint 结果中,但大多数值甚至都不接近正确。我是否使用了错误的集成器,或者 odeint 是否不适用于此应用程序?

c++文件可以在Github上找到,here.名为“coupledODE”的类是属于我的系统的方程组,odeint 在主函数中实现。

最佳答案

在 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  );
}

关于C++ - 系统的odeint解决方案差异很大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40940880/

相关文章:

c++ - 如何将 Qt 表单类移动到另一个命名空间?

c++ - 如何解决C++模板类型声明顺序

c# - MarshalAs(UnmanagedType.LPStr) - 这如何将 utf-8 字符串转换为 char*

algorithm - 过滤和平滑算法

python - RK4 给出错误结果

c++ - 使用 GDI+ Graphics.DrawString 打印会产生垃圾字符

matlab - 这两个用于 ML 中正则化 Logistic 回归的 Octave 语句有什么区别

matlab - 如果 A.B = C,给定 A、B、C 是矩阵,如何使用 Matlab 从 B 和 C 计算 A?

matlab - 求解和绘制分段 ODE