为离散和连续动力学仿真选择合适的时间步长

计算科学 模拟 收敛 离散化 数值建模 一体化
2021-12-02 09:52:48

我继承了 C++ 中的飞行动力学模拟,它代表了一架带有自动驾驶仪、执行器动力学和固态 IMU 的小型无人机。

因此,它由几个模型组成,一些是连续的(飞行动力学和执行器),与 runge kutta 4 方案集成,一些是离散的(自动驾驶仪和 IMU)。我可以完全控制物理时间步长。自动驾驶仪应该以 500Hz 运行,固态 IMU 以 2000Hz 运行。

我要找到一个“正确的”时间步长值,以便在保持合理计算时间的同时最大限度地减少错误。

我尝试绘制在(16Khz)和其他模拟(500hz、1000hz、2000hz、4000hz、8000hz)下运行模型的最高频率之间的机械能差异我选择了这些频率以便模拟精确地踩到自动驾驶仪和 IMU 的“激活”。

我在由飞行动力学状态变量(速度、位置、旋转速度和欧拉角)组成的 L2 范数上做了同样的事情。

结果与我的预期大不相同:

虽然错误似乎可以接受(errMax ~ 0.3%),但我不明白为什么在 2000 / 4000hz 点附近的错误如此增加。此外,错误似乎不会随着时间步长而减少。这让我对我的方法的相关性感到非常困惑。

有谁知道在混合连续和离散状态模型的模拟中可能导致特定时间步长误差增加的任何原因?

此外,是否有任何相关的物理分析可以让人们获得准确表示模拟状态的规范(以研究所述模拟的收敛性)

1个回答

这是推测,因为我不知道 Lipschitz 常数或模拟的导数尺度。此外,离散部分和连续部分的相互作用可能会产生一些共振效应。但我首先要注意的是,RK4(和任何其他方法)的误差在 loglog 图中与步长的关系呈 V 形。这是对误差的两个贡献的结果,一个是大小,其中表示每个积分步骤的浮点噪声的大小,而表示积分步骤的数量。另一个贡献来自方法错误,大小为它们都在左右保持平衡,浮点数约为μ/hμ1/hCh4h=μ5103

这适用于具有可观的值和导数尺度的小尺寸测试模型。一般来说,它应该给人的印象是,与任何高阶方法一样,RK4 在相对较大的步长处具有最佳性能。可能是您的参考解决方案已经太小步长了。然后浮点误差的累积给它一个准随机失真,应该使它失去作为参考解决方案的资格。

检验这个假设的方法是使用理查森外推法将低频解相互比较、双步长和半步长,并检查误差向量的大多数分量中的误差h4

或者,您可以将 RK4 解决方案与更高阶方法的固定步骤“滥用”进行比较,例如,Fehlberg 或 Dormand-Prince 的 5 阶阶段,或者更高阶的东西。对于较低频率,这应该提供有效的参考解决方案。

我为 DoPri5 实现了这个固定步骤来测试https://stackoverflow.com/a/54502790/3088138中方法的顺序,阶段看起来更杂乱,但原理保持不变。