首页 > 解决方案 > 在 Dymos 中保存数据会更改优化和仿真结果

问题描述

我有一个类似的问题,正如这个问题所表达的那样。我遵循了Rob Flack的回答,但遇到了问题。如果有人可以帮助我,我将不胜感激。

我使用了答案中建议的代码,但有一个问题:它改变了模拟结果。我在脚本中为 min_time_climb 示例添加了一行,如下所示:

phase.add_timeseries_output('aero.mach', units=None, shape=(1,), output_name = "recorded_mach")

我使用了“recorded_mach”这个名字,以免覆盖 Dymos 可能已经录制或未录制的任何其他内容。问题是默认的高度 (h) 与时间图实际上发生了变化,离散点和模拟曲线都发生了变化。我最终记录了 4 个具有与我刚刚展示的命令相似的命令的变量,并且通过图表上的离散优化点以某种方式使模拟跟踪更好。当我在此基础上再记录 4 个变量时,情况变得更糟。我觉得这很奇怪,因为我不明白为什么记录模拟应该改变它的输出。

你有没有遇到过这个?您可以就该问题提供的任何见解将不胜感激。

笔记:

在实现上述代码之前,我对示例进行了一些修改,以适应不同的情况(不同的推力和燃料燃烧数据、不同的升力和阻力极地、不同的高度和速度目标)。但是,它仍然可以正常工作。

标签: openmdao

解决方案


没有什么例子可以看,我只能做出有根据的猜测。因此,请对我的回答持保留态度。

一些优化问题具有非常病态的雅可比矩阵和/或 KKT 矩阵(您作为用户通常不会看到,但仍然可能有问题)。这种病态的潜在原因有很多,但一些常见的原因是非常大的导数(即接近无穷大)或不同导数之间的幅度范围非常大。另一个常见的原因是引入了一个鞍点,在那里你有无数个同样好的答案。有时您可以通过缩放来解决问题,有时您需要重新制定问题公式。

病态条件对优化器有两个不好的影响。首先,它使得里面的数字很难计算出计算步长所需的逆。它会得到答案,但可能会受到数字噪声的高度影响。其次,它可能会阻止某些近似值(如 BFGS)一开始就表现良好。

在这些情况下,执行顺序的微小变化或额外的步骤(例如案例重新编码)可能会导致优化器采用不同的路径。如果您发现该路径最终导致一个案例工作而另一个案例失败,那么您可能会遇到一个稍微稳定的问题,您有一次很幸运,而另一次则没有。

在你的雅可比中仔细寻找任何奇异的东西。0行/列?如果您在添加约束时忘记添加额外的自由度,那么恰好满足但仍然有 0 行的约束是在 Dymos 案例中出现的问题。如果您对目标谨慎,也会出现鞍点。


推荐阅读