Dymos 约束依赖于参数
Dymos constraint dependency on parameter
我想知道是否可以处理边界约束取决于优化器可以更改的参数的问题。我有一个多级火箭模型,我可以优化轨迹和某些参数,例如给定级的推力。但是,假设我还想制作实际的舞台质量参数(受限于它们全部加起来为常数)。我的模型中有某些取决于质量的边界约束——当燃烧的推进剂质量等于推进剂负载时,一个阶段代表一个阶段结束,这被编码为边界约束。因此,实际约束本身会根据优化器如何更改该阶段质量的参数而有所不同。
此外,阶段之间发生的阶段链接,代表火箭阶段的阶段,需要我以
的形式添加链接约束
traj.add_linkage_constraint('stage_1', 'stage_2', equals=stage_1_dry_mass)
为了表示抛弃第一级空质量。因此,抛弃质量是预先确定的,不能作为优化的参数进行更改。
有没有办法在 Dymos 中处理这个问题?我想我可以用分数来重新表述这个问题,但还没有想清楚,我觉得阶段联系仍然是一个问题。
I am wondering if it is possible to handle problems where a boundary constraint is dependent on a parameter that can be changed by the optimizer.
绝对。
所以你的车的质量是:
初始质量 = 1 级支撑质量 + 1 级干质量 + 2 级支撑质量 + 2 级干质量
如果您有状态或 ODE 输出来跟踪您当前的车辆质量 (m)。在第 1 阶段下降之前,m_1 将包括第 1 阶段干质量。紧接着下降,总质量m_2就不会了
此时,定义关系的方程式将是:
m_1 - m_2 = m_stage_1
正如您所说,您不能将 ODE 变量指定为边界或 linkage 约束中的边界(它们只是数值),但我们可以将上面的等式写成 link年龄限制。
如果您在 ODE 中输出“当前总质量减去第 1 级干质量”(m_minus_stage_1,因为缺少更好的名称),那么我们可以使 that 变量与下降后下一阶段开始时的当前总质量连续。
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 约束 link 它们。像这样的东西会起作用。
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 中开发一个 'statics' 输出组件,它可以让我们输出这些参数,以便它们可以连接。
现在我完全承认手动方式虽然比在 ODE 中计算某些东西更有效,但更令人困惑。这就是 dymos 旨在帮助用户处理的那种复杂性。
此外,可能还有一种方法可以将其作为一组边界约束来处理,但它似乎更自然地构成 link年龄约束。
我想知道是否可以处理边界约束取决于优化器可以更改的参数的问题。我有一个多级火箭模型,我可以优化轨迹和某些参数,例如给定级的推力。但是,假设我还想制作实际的舞台质量参数(受限于它们全部加起来为常数)。我的模型中有某些取决于质量的边界约束——当燃烧的推进剂质量等于推进剂负载时,一个阶段代表一个阶段结束,这被编码为边界约束。因此,实际约束本身会根据优化器如何更改该阶段质量的参数而有所不同。 此外,阶段之间发生的阶段链接,代表火箭阶段的阶段,需要我以
的形式添加链接约束traj.add_linkage_constraint('stage_1', 'stage_2', equals=stage_1_dry_mass)
为了表示抛弃第一级空质量。因此,抛弃质量是预先确定的,不能作为优化的参数进行更改。
有没有办法在 Dymos 中处理这个问题?我想我可以用分数来重新表述这个问题,但还没有想清楚,我觉得阶段联系仍然是一个问题。
I am wondering if it is possible to handle problems where a boundary constraint is dependent on a parameter that can be changed by the optimizer.
绝对。
所以你的车的质量是:
初始质量 = 1 级支撑质量 + 1 级干质量 + 2 级支撑质量 + 2 级干质量
如果您有状态或 ODE 输出来跟踪您当前的车辆质量 (m)。在第 1 阶段下降之前,m_1 将包括第 1 阶段干质量。紧接着下降,总质量m_2就不会了
此时,定义关系的方程式将是:
m_1 - m_2 = m_stage_1
正如您所说,您不能将 ODE 变量指定为边界或 linkage 约束中的边界(它们只是数值),但我们可以将上面的等式写成 link年龄限制。
如果您在 ODE 中输出“当前总质量减去第 1 级干质量”(m_minus_stage_1,因为缺少更好的名称),那么我们可以使 that 变量与下降后下一阶段开始时的当前总质量连续。
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 约束 link 它们。像这样的东西会起作用。
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 中开发一个 'statics' 输出组件,它可以让我们输出这些参数,以便它们可以连接。
现在我完全承认手动方式虽然比在 ODE 中计算某些东西更有效,但更令人困惑。这就是 dymos 旨在帮助用户处理的那种复杂性。
此外,可能还有一种方法可以将其作为一组边界约束来处理,但它似乎更自然地构成 link年龄约束。