使用 RKF7(8) 进行数值积分 - 不同的结果

计算科学 数字 一体化
2021-12-24 23:52:11

在我的论文中,我研究了车辆以非常高的速度穿过大气层的轨迹。我有一组运动方程,我使用 Runge-Kutta-Fehlberg (RKF) 7(8) 数值积分器进行传播,该积分器已经由我大学的系开发。整个代码是用 C++ 编写的。

对于我的车辆,我需要找到实现特定目标的特定倾斜角轮廓(不必了解倾斜角轮廓是什么,我只需要一个作为运动方程的输入)。优化算法提供了一个(随机)坡度曲线,我将其用作模拟的输入。基于该模拟的结果,优化算法改变坡度角轮廓并评估新轨迹。这不断重复,直到找到达到设定目标的倾​​斜角轮廓。让我们将由坡度角剖面产生的相应轨迹称为参考轨迹。

现在我也在开发一种引导算法。该算法需要不同的状态变量和派生值(例如高度或大气密度)在指定的时间间隔内,比如每 1.0 秒。我想将此引导算法应用于找到的参考轨迹。由于 RKF7(8) 算法具有自适应步长控制,这在优化过程中是有益的,因为它减少了函数评估的次数,因此肯定不能保证提供每 1.0 秒的输出。因此,为了实现每 1.0 秒的输出,在与参考轨迹相同的初始条件下再次执行积分,期望修改从 RKF7(8) 获得的步长以确保每 1.0 秒的输出。

然而,问题是在修改步长的情况下获得的轨迹与参考轨迹不同。我的猜测是,由于我每 1.0 秒减小步长以实现输出,因此由于步长更小,我会强制提高精度。我还尝试修改 RKF7(8) 算法中使用的容差,以及不同的排序方法(RKF4(5)、RKF5(6) 和 Adams-Bashfort-Moulton)。我将这个公差(绝对和相对)降低到 1e-15(我认为或多或少是极限,因为它接近机器精度),但我仍然获得不同的轨迹。相同 thi 为了让您对差异有一个印象,请参见下图:

高度作为时间的函数 高度作为时间的函数

可能会产生影响但我不确定的一件事是高速。如果我降低速度,仍然会有很小的差异,但这不会导致轨迹有明显的差异。然而,对于我的研究来说,拥有这些高速是必不可少的。

有人对我表现出的行为有解释吗?如果是这样,我能做些什么来解决这个问题?

编辑根据 Doug Lipinski 的评论,我使用固定步长积分器 Runge-Kutta 4 执行了多次运行,用于多个步长。见下图。从该图中可以看出,即使步长非常小,该解决方案也不会收敛到一个解决方案。

使用 RK4 为不同步长传播的轨迹

3个回答

我认为第一步是确认哪种解决方案更准确。如果您使用的 RKF7(8) 参考实现可能已被其他人验证过其他问题,那么当您修改时间步长时,错误似乎极有可能出现在您身上。

如果有可能(即计算成本不会太高)。我会尝试使用简单的固定时间步长积分方案(比如 RK4)进行收敛性研究。如果改进时间步长导致固定时间步长方法收敛到您拥有的两个解决方案之一,那么这将提供对正确解决方案的额外验证。如果您发现“参考解决方案”不正确,那么您需要查看如何设置公差。理想情况下,您应该使用相对公差,而不是绝对公差(请参阅 Wolfgang 的回答)。

假设错误发生在您对时间步长的修改中,我会建议一种稍微不同的方法:与其修改时间步长,不如将结果内插到所需的时间值。如果您显示的图是典型的结果,则使用附近点的简单多项式插值应该非常准确。

编辑:

如果以越来越小的固定步长连续运行似乎没有收敛,则可能是您的问题很僵硬或问题表现出混乱的迹象(例如,对初始条件的敏感依赖,或者在这种情况下,每次的差异很小步)。在第一种情况下,您可以考虑使用适用于刚性 ODE 的不同时间积分器(通常使用隐式方法)。在第二种情况下,我不确定最好的选择是什么。

如果您从两个 ODE 积分器得到质量不同的结果,则至少其中一个的时间步长选择太大。哪一个不是很明显,但是如果您使用积分器的时间步长(例如,将其缩小十倍)并且您得到不同的结果,那么时间步长太大了;如果结果相同,则时间步长可能是合适的。

我会继续玩宽容。1e-15 不是先验接近四舍五入水平。四舍五入约为 1e-16,但仅在对于您要比较的变量的大小时才能看到。如果您要比较的变量的顺序是 1e-12,那么 1e-15 是一个完全不合适的大公差。也不清楚公差实际上与什么相比 - 错误?剩余的?不知道它在您使用的实现中是什么,我会继续使用它来看看会发生什么。

一句话(看到到目前为止给出的两个答案带有很多评论,我决定将其作为单独的答案发布):

使用 ODE 积分器解决问题后,您可能希望考虑 [sec]处对解插值采用 Runge-Kutta密集输出机制。与您以较小的时间步重新运行集成的方法相比,密集的输出方案可能会节省大量的计算时间,特别是如果您需要多次重复集成(具有不同的初始条件),这可能是您的情况“指导”优化算法。tk=k

这是因为密集输出近似(或多或少)“免费”提供 - 多项式解插值可以直接从 Runge-Kutta 阶段的输出构建。并且您不需要人为地将您的时间步长减少到 RK 自适应步长逻辑计算的时间步长以下(即,您不会牺牲效率)。

您将在此论坛上找到更多信息:

Runge-Kutta 计算后的中间值(插值)

另一个极好的参考书是海尔和万纳的经典著作