衍生品警告没有意义

问题描述

我收到了这种形式的警告:

DerivativesWarning:Constraints or objectives ['traj.linkages.stage_1_grav_turn:alpha_final|coast_1:alpha_initial','traj.phases.stage_1_maneuver.path_constraints.path:q_alpha'] cannot be impacted by the design variables of the problem.

不确定第一个是什么,链接约束。 Alpha 是grav_turn 和coast 阶段的一个参数,它被设置为0。第二个没有意义,因为在stage_1_maneuver 阶段alpha 是一个控件,因此您绝对可以控制动态压力* alpha。也许是因为该阶段结束时的 alpha 被限制为 0?

无论如何,优化器都能很好地收敛,并产生看起来正确且在交叉检查时有意义的结果。只是对这个很好奇。

解决方法

在 OpenMDAO V3.9.0 中添加了一项功能,可以检测总导数雅可比行列式中全 0 的行和列。一行全为 0 表示目标或约束不受任何设计变量的影响。一列全为 0 表示设计变量不影响任何约束或目标值。

这两种情况都有潜在的问题。 0 列意味着自由度比您想象的要小,因为该 DV 不会影响任何事情。这不是致命的,但仍然值得警告用户。

0 行的问题要大得多。如果该行与约束相关联,则意味着优化器无法满足该约束。您可能会“幸运”并发现约束发生在初始条件下恰好满足约束,因此您可以从技术上解决优化问题(您的具体情况可能是其中之一)。然而,从数学上讲,这个问题是奇异的,除非您使用的优化器具有特定的代码来处理这种极端情况,否则它可能会使事情变得困难。

添加此功能的主要原因之一是 OpenMDAO 开发团队注意到 Dymos 用户在添加链接和路径约束时特别容易意外创建 0 行。通常这些 0 行似乎不会造成伤害,但我们肯定也看到了它们给优化器拟合的情况。 该警告可帮助您识别问题,以便您进行更正。

在这种情况下,您似乎有两个单独的 0 行。

  1. traj.linkages.stage_1_grav_turn:alpha_final|coast_1:alpha_initial 表示您提供给优化器的任何设计变量都不会影响该约束。这可能意味着您已将 alpha_finalalpha_initial 分别指定为 fixed_final 和 fixed_initial。您可以侥幸成功,因为您提供的初始条件必须通过构造使两个 alpha 相等。 您最好还是移除约束,或者至少添加链接的一端或另一端作为设计变量。

  2. traj.phases.stage_1_maneuver.path_constraints.path:q_alpha 表示路径约束中的至少一个条目不受任何 DV 的影响。可能不是整个路径约束,而只是它的一端是固定的,因为它是根据固定边界条件计算的。在这种情况下,您可以简单地向 add_path_constraint 调用添加索引以从约束中排除第一个或最后一个点。

由于您的优化正在运行,因此 0 行不会杀死您。但是,清理它是一种很好的做法。现在没有它们可能会提高性能,或者它可以使您免于未来优化“神秘地”停止工作的情况,因为您以某种方式触发了优化器无法再处理 0 行的情况。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...