Dymos最优控制问题:目标函数与节点相关技术咨询
Dymos最优控制问题解答
原始问题
(1) 最终时刻状态函数目标的设置及代码理解
你的理解错误。phase.add_objective('V(X)', loc='final', scale=1)的作用是最小化最终时刻的V(X)值,而非积分。若要最小化V(X)从t=0到t=T的积分,需去掉loc='final'参数(默认对全时段积分),或显式指定loc='all'。
正确设置最终时刻V(X(T))为目标的步骤:
- 在你的ODE类中添加输出
V,实现V = 关于状态X的函数(仅依赖当前状态)。 - 调用
phase.add_objective('V', loc='final', scale=1),即可让优化器最小化最终时刻的V值。
(2) 两个目标函数求和的设置
要最小化objectval1(最终时刻V(X(T)))与objectval2(最终时刻积分项)的和,需在OpenMDAO模型层整合两个值后设置为全局目标:
- 确保两个目标值可输出到模型层:
- objectval1:通过
phase.add_timeseries_output('V')输出全时段V值,后续取最后一个节点值。 - objectval2:你已通过状态变量
objectval2(导数为L(X,u))实现积分,最终时刻值即为积分结果,同样取最后一个节点值。
- objectval1:通过
- 添加求和子系统:
p.model.add_subsystem('sum_objectives', om.ExecComp('total = obj1 + obj2')) p.model.connect('traj.phase0.timeseries.outputs:V', 'sum_objectives.obj1', src_indices=[-1]) p.model.connect('traj.phase0.timeseries.states:objectval2', 'sum_objectives.obj2', src_indices=[-1]) - 设置全局目标:
p.model.add_objective('sum_objectives.total')
优化器将直接最小化两个目标的和。
补充澄清问题
(1) src_indices与节点时刻的对应关系
是的。无论num_segments和order如何设置,timeseries输出的第0个节点始终对应初始时刻t=0,最后一个节点(索引-1)始终对应最终时刻t=T,这是Dymos的固定行为。
(2) 添加特定时间点的节点
有两种常用方式实现:
- 方式一:指定配点分段的时间断点(适用于需要将特定时间点作为配点节点的场景):
phase = trajectory.add_phase('phase0', dymos.Phase(ode_class=YourODE, transcription=dymos.Radau(num_segments=3, order=3, compressed=False, segment_ends=[0, 500, 1000, 2000])))segment_ends定义了分段的时间节点,每个分段的终点即为你需要的特定时刻,对应的配点节点会包含这些时间点。 - 方式二:添加自定义timeseries输出点(仅需在特定时刻计算值,无需作为配点节点):
后续可通过phase.add_timeseries('custom_timeseries', times=[500, 1000, 2000])traj.phase0.custom_timeseries.states:v获取这些时刻的v值,再求和作为目标。
(3) 多目标设置的行为及正确求和方式
- 你当前的代码
phase.add_objective('x', loc='final')和p.model.add_objective('other_calcs.f')会触发多目标优化,OpenMDAO默认将多个目标以权重1加权求和,但这种方式不直观,不建议用于明确需要求和的场景。 - 正确的求和设置:
- 添加求和子系统整合两个目标:
p.model.add_subsystem('total_obj', om.ExecComp('total = x_final + f_val')) p.model.connect('traj.phase0.timeseries.states:x', 'total_obj.x_final', src_indices=[-1]) p.model.connect('other_calcs.f', 'total_obj.f_val') - 设置全局目标:
p.model.add_objective('total_obj.total')
- 添加求和子系统整合两个目标:
内容的提问来源于stack exchange,提问作者Wei
相关产品推荐
相关产品推荐

