首页 > 解决方案 > Dymos 约束对参数的依赖

问题描述

我想知道是否可以处理边界约束依赖于优化器可以更改的参数的问题。我有一个多级火箭的模型,我可以优化轨迹和某些参数,例如给定阶段的推力。但是,假设我还想制作实际的舞台质量参数(受制于它们全部加起来为常数的约束)。我的模型中有某些取决于质量的边界约束——当推进剂燃烧质量等于推进剂载荷时,一个阶段代表一个阶段结束,这被编码为边界约束。因此,实际约束本身会根据优化器如何更改该阶段质量的参数而有所不同。此外,阶段之间发生的阶段链接,代表火箭阶段的阶段,

traj.add_linkage_constraint('stage_1', 'stage_2', equals=stage_1_dry_mass)

为了表示抛弃第一阶段的空质量。因此,抛弃质量是预先确定的,并且不能作为优化的参数进行更改。

有没有办法在 Dymos 中处理这个问题?我想我也许可以用分数重新表述这个问题,但还没有考虑清楚,而且我觉得相位链接仍然是一个问题。

标签: openmdao

解决方案


我想知道是否可以处理边界约束依赖于优化器可以更改的参数的问题。

绝对地。

所以你的车辆的质量是:

初始质量 = 第 1 阶段支柱质量 + 第 1 阶段干质量 + 第 2 阶段支柱质量 + 第 2 阶段干质量

如果您有跟踪当前车辆质量 ( m ) 的状态或 ODE 输出。在第 1 阶段下降之前,m_1将包括第 1 阶段的干重。立即下降后,总质量m_2不会。

此时,定义关系的方程将是:

m_1 - m_2 = m_stage_1

正如您所说,您不能将 ODE 变量指定为边界或链接约束中的边界(它们只是数值),但我们可以将上面的等式写为链接约束。

如果您在 ODE 中输出“当前总质量减去第 1 阶段干质量”(m_minus_stage_1没有更好的名称),那么我们可以使变量在下一阶段开始时与当前总质量连续下降。

traj.add_linkage_constraint(phase_a='phase1', phase_b='phase2',
                            loc_a='final', loc_b='initial',
                            var_a='m_minus_stage_1', var_b='m',
                            equals=0)

此外,没有什么能阻止您使用 openMDAO 约束将它们链接到此处。像这样的东西会起作用。

prob.add_subsystem('mass_linkage', om.ExecComp(m_error = m_1 - m_2 - m_stage_1))
prob.model.connect('traj.phase1.timeseries.states:m', 'mass_linkage.m_1', src_indices=[-1])
prob.model.connect('traj.phase2.timeseries.states:m', 'mass_linkage.m_2', src_indices=[0])
prob.model.promotes('traj', inputs=[('parameters:m_stage_1', 'm_stage_1')])
prob.model.promotes('mass_linkage', inputs=['m_stage_1'])
prob.model.add_constraint('mass_linkage.m_error', equals=0)

请注意,参数在 Dymos 中被视为输入,OpenMDAO 不允许一个输入连接到另一个输入。他们都必须提升为相同的名称。我们正在 Dymos 中开发一个“静态”输出组件,它可以让我们输出这些参数,以便它们可以连接。

现在我完全承认,手动方式虽然比在 ODE 中计算更有效,但更令人困惑。这就是 dymos 旨在帮助用户处理的复杂性。

此外,可能还有一种方法可以将其作为一组边界约束来处理,但它似乎更自然地构成一个链接约束。


推荐阅读