如何在维度 Dymos 问题中设置状态、控制和参数选项?
How to set the state, control, and parameter options in a dimensioned Dymos problems?
我有一个以 形式给出的 ODE,其中 x、u 和 d 是向量(例如 )。我在 OpenMDAO/Dymos 中使用维度输入和输出
制定了这个系统
self.add_input('x',shape(num_nodes,Nx))
我的 ODE 和轨迹运行良好,但是,我有兴趣澄清一些信息:
(1) 我看到在添加状态、输入和参数时,我可以通过 upper
和 lower
(https://openmdao.github.io/dymos/features/phases/constraints.html?highlight=dimensioned#path-constraints) 提供唯一的框约束。例如,状态 1 可以有边界 [0,1],而状态 2 可以有边界 [-1,5]。我的问题是,提供 ref
和 ref0
信息的方式是否相同?我对此进行了测试(例如 ref0 = [0,-1]
),但我不知道它是否真的在做任何事情?
(2)能否具体说明量纲题中具体元素的单位?例如,状态 1 是温度,状态 2 是电压。看起来我不能简单地做:
self.add_input('x',shape=(num_nodes,2),units=['K','V'])
因为这 returns 一个错误。
(3) 你能为状态、输入和维度向量中的各个部分指定不同的优化属性吗?例如,假设我想优化输入 1 (opt=True
) 但不优化输入 2 (opt=False
)。理想情况下,我希望
phase.add_parameter('u',opt=[True,False])
但这returns是一个错误。
如果可以使用此功能,您能否指导我到哪里可以找到更多信息。我浏览了 Dymos 文档,但找不到太多关于该主题的内容。
在一般的 OpenMDAO 中,您可以为设计变量设置向量值 ref/ref0。理论上,Dymos 应该也支持这一点。您可以给一个 ref/ref0 与您所在州相同的大小,然后 Dymos 会为您将其扩展到完整的 num_nodes
大小。不幸的是,从 Dymos V 1.30 开始,它看起来不太管用。我们已经 logged that bug here,V1.4 应该会修复它。
OpenMDAO 不允许数组中的混合单元。这是一个有意的设计选择,与有关如何处理单位转换以及如何保持它们高效(在内存和计算使用方面)的细节有关。因为 OpenMDAO 不允许,所以 Dymos 不能。
因此您要么需要将状态拆分为多个变量,要么处理非量纲量。
- 对于参数和控制,这是通过 OpenMDAO 的 APIs 相当简单的。如果你想要更细粒度的索引控制,只需为所有这些设置 opt=False 。 Dymos 将为您将它们作为输入显示在 phase/trajectory 的顶部(您可以使用 N2 找到它们)。然后你可以调用本地 OpenMDAO API
add_design_var
在那些 phase/trajectory 级别的输入上使用你想要的任何索引。
对各州执行此操作并不是一个好主意。无需深入数学...... Dymos 非常努力地为您保留定义明确(在数学意义上)的优化问题。对于状态,这意味着仔细匹配缺陷约束与设计变量。您不能只关闭状态数组的一部分而不解决相应的缺陷约束。当然,如果您弄乱了缺陷约束,那么您将无法再获得有效的物理学。这是一大堆蠕虫,你真的不想碰它。
我有一个以 形式给出的 ODE,其中 x、u 和 d 是向量(例如 )。我在 OpenMDAO/Dymos 中使用维度输入和输出
制定了这个系统self.add_input('x',shape(num_nodes,Nx))
我的 ODE 和轨迹运行良好,但是,我有兴趣澄清一些信息:
(1) 我看到在添加状态、输入和参数时,我可以通过 upper
和 lower
(https://openmdao.github.io/dymos/features/phases/constraints.html?highlight=dimensioned#path-constraints) 提供唯一的框约束。例如,状态 1 可以有边界 [0,1],而状态 2 可以有边界 [-1,5]。我的问题是,提供 ref
和 ref0
信息的方式是否相同?我对此进行了测试(例如 ref0 = [0,-1]
),但我不知道它是否真的在做任何事情?
(2)能否具体说明量纲题中具体元素的单位?例如,状态 1 是温度,状态 2 是电压。看起来我不能简单地做:
self.add_input('x',shape=(num_nodes,2),units=['K','V'])
因为这 returns 一个错误。
(3) 你能为状态、输入和维度向量中的各个部分指定不同的优化属性吗?例如,假设我想优化输入 1 (opt=True
) 但不优化输入 2 (opt=False
)。理想情况下,我希望
phase.add_parameter('u',opt=[True,False])
但这returns是一个错误。
如果可以使用此功能,您能否指导我到哪里可以找到更多信息。我浏览了 Dymos 文档,但找不到太多关于该主题的内容。
在一般的 OpenMDAO 中,您可以为设计变量设置向量值 ref/ref0。理论上,Dymos 应该也支持这一点。您可以给一个 ref/ref0 与您所在州相同的大小,然后 Dymos 会为您将其扩展到完整的
num_nodes
大小。不幸的是,从 Dymos V 1.30 开始,它看起来不太管用。我们已经 logged that bug here,V1.4 应该会修复它。OpenMDAO 不允许数组中的混合单元。这是一个有意的设计选择,与有关如何处理单位转换以及如何保持它们高效(在内存和计算使用方面)的细节有关。因为 OpenMDAO 不允许,所以 Dymos 不能。
因此您要么需要将状态拆分为多个变量,要么处理非量纲量。
- 对于参数和控制,这是通过 OpenMDAO 的 APIs 相当简单的。如果你想要更细粒度的索引控制,只需为所有这些设置 opt=False 。 Dymos 将为您将它们作为输入显示在 phase/trajectory 的顶部(您可以使用 N2 找到它们)。然后你可以调用本地 OpenMDAO API
add_design_var
在那些 phase/trajectory 级别的输入上使用你想要的任何索引。
对各州执行此操作并不是一个好主意。无需深入数学...... Dymos 非常努力地为您保留定义明确(在数学意义上)的优化问题。对于状态,这意味着仔细匹配缺陷约束与设计变量。您不能只关闭状态数组的一部分而不解决相应的缺陷约束。当然,如果您弄乱了缺陷约束,那么您将无法再获得有效的物理学。这是一大堆蠕虫,你真的不想碰它。