衍生品警告没有意义
Derivatives warning doesn't make sense
我收到了这种形式的警告:
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 被限制为 0?
无论如何,优化器收敛得很好,并产生看起来正确且在交叉检查时有意义的结果。只是好奇这个。
在OpenMDAO V3.9.0中增加了一个功能,可以检测全导雅可比矩阵中的行和列全为0。一行全为 0 表示 objective 或约束不受任何设计变量的影响。全 0 的列表示设计变量不影响任何约束或 objective 值。
这两种情况都可能存在问题。 0 列意味着自由度比您想象的要少,因为 DV 不会影响任何东西。这不是致命的,但仍然值得警告用户。
0 行问题更大。如果该行与约束相关联,则意味着优化器没有能力满足该约束。您可能会“幸运”并发现约束恰好在初始条件下恰好满足约束,因此您可以在技术上解决优化问题(您的具体情况可能是其中之一)。然而,从数学上讲,这个问题是单一的,除非您使用的优化器有特定的代码来处理这种极端情况,否则它会使事情变得困难。
添加此功能的主要原因之一是 OpenMDAO 开发团队注意到 Dymos 用户在添加链接和路径约束时特别容易意外创建 0 行。通常这些 0 行似乎不会造成伤害,但我们肯定也看到过它们适合优化器的情况。
该警告可帮助您确定问题,以便您进行更正。
在这种情况下,您似乎有两个单独的 0 行。
traj.linkages.stage_1_grav_turn:alpha_final|coast_1:alpha_initial
表示您提供给优化器的设计变量中的 none 会影响该约束。这可能意味着您已将 alpha_final
和 alpha_initial
分别指定为 fixed_final 和 fixed_initial。你逃脱了它,因为你提供的初始条件必须有两个 alpha 等于构造。
您仍然最好删除约束,或者至少添加链接的一端或另一端作为设计变量。
traj.phases.stage_1_maneuver.path_constraints.path:q_alpha
表示路径约束中至少有一个条目不受任何 DV 的影响。它可能不是整个路径约束,而只是它的一端是固定的,因为它是根据固定边界条件计算的。在这种情况下,您可以简单地将索引添加到 add_path_constraint
调用以从约束中排除第一个或最后一个点。
由于您的优化是 运行,因此 0 行不会让您丧命。但是,清理它是一种很好的做法。没有它们现在可能会提高性能,或者它可能会使您免于将来优化“神秘地”停止工作的情况,因为您以某种方式触发了优化器无法再处理 0 行的情况。
我收到了这种形式的警告:
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 被限制为 0?
无论如何,优化器收敛得很好,并产生看起来正确且在交叉检查时有意义的结果。只是好奇这个。
在OpenMDAO V3.9.0中增加了一个功能,可以检测全导雅可比矩阵中的行和列全为0。一行全为 0 表示 objective 或约束不受任何设计变量的影响。全 0 的列表示设计变量不影响任何约束或 objective 值。
这两种情况都可能存在问题。 0 列意味着自由度比您想象的要少,因为 DV 不会影响任何东西。这不是致命的,但仍然值得警告用户。
0 行问题更大。如果该行与约束相关联,则意味着优化器没有能力满足该约束。您可能会“幸运”并发现约束恰好在初始条件下恰好满足约束,因此您可以在技术上解决优化问题(您的具体情况可能是其中之一)。然而,从数学上讲,这个问题是单一的,除非您使用的优化器有特定的代码来处理这种极端情况,否则它会使事情变得困难。
添加此功能的主要原因之一是 OpenMDAO 开发团队注意到 Dymos 用户在添加链接和路径约束时特别容易意外创建 0 行。通常这些 0 行似乎不会造成伤害,但我们肯定也看到过它们适合优化器的情况。 该警告可帮助您确定问题,以便您进行更正。
在这种情况下,您似乎有两个单独的 0 行。
traj.linkages.stage_1_grav_turn:alpha_final|coast_1:alpha_initial
表示您提供给优化器的设计变量中的 none 会影响该约束。这可能意味着您已将alpha_final
和alpha_initial
分别指定为 fixed_final 和 fixed_initial。你逃脱了它,因为你提供的初始条件必须有两个 alpha 等于构造。 您仍然最好删除约束,或者至少添加链接的一端或另一端作为设计变量。traj.phases.stage_1_maneuver.path_constraints.path:q_alpha
表示路径约束中至少有一个条目不受任何 DV 的影响。它可能不是整个路径约束,而只是它的一端是固定的,因为它是根据固定边界条件计算的。在这种情况下,您可以简单地将索引添加到add_path_constraint
调用以从约束中排除第一个或最后一个点。
由于您的优化是 运行,因此 0 行不会让您丧命。但是,清理它是一种很好的做法。没有它们现在可能会提高性能,或者它可能会使您免于将来优化“神秘地”停止工作的情况,因为您以某种方式触发了优化器无法再处理 0 行的情况。