OpenMDAO Dymos defect_refs -- 我应该如何设置这些?
OpenMDAO Dymos defect_refs -- how should I set these?
我希望获得一些有关如何以智能方式在 Dymos 中设置缺陷引用的信息。我在此处 https://github.com/hweyandtnasa/scaling-tutorial 找到了以下关于缩放的注释,但它仍然将 Dymos 中的缺陷缩放列为 TODO。我是否应该将它们设置为等于它们所属状态的参考值?
缩放伪谱最优控制问题很棘手。如果您能得到 John Betts 的 Practical Methods for Optimal Control and Estimation Using Nonlinear Programming 的副本,我强烈推荐它。 Betts 建议对状态设计变量值和缺陷使用相同的比例。这通常是一个很好的经验法则,但与大多数扩展方法一样,并不通用。决定动力学在物理上是否正确的搭配“缺陷”只是近似多项式的斜率与计算出的运动方程之间的差异。
在状态值很大但微小的变化率很重要的情况下,根据我的经验,不同的缩放比例是必要的。这些可能是真实的状态的例子是飞机范围或航天器轨道元素。就在最近,我们遇到了一种情况,航天器的低推力轨道转移与物理学不符。例如,半纬度直肠通常以公里为单位测量,因此在地球轨道上以千为单位)。在使用的单元中,缺陷的“显着”差异小于 1E-6(使用的可行性阈值)。在这种情况下,通过将 defect_scaler 提高几个数量级(相当于将 defect_ref 降低几个数量级)解决了问题。
我也推荐 this paper from Ross, Gong, Karpenko, and Proulx。它列出了一些很好的经验法则,并且在最速记时器中有一个平易近人的例子。它引用了很多成本。 Dymos 还没有提供自动 Costate 估计,但它们与问题的拉格朗日乘数密切相关,如果您使用 SNOPT,它会打印在 pyoptsparse 输出中。
您指出的 github 存储库是一名实习生的工作,并且基于此 scaling method developed by Sagliano。我们发现它在很多情况下都能很好地工作,但它也不是万灵药。
最终我们希望在 Dymos and/or OpenMDAO 中有一些自动缩放选项,但我们不确定它们何时会进入框架。我们过去的工作通常将缩放方法与运动方程更紧密地联系在一起,而 Dymos 的设计更通用,因为用户可以提供他们选择的任何 EOM。
在 Dymos 中,如果您在调用 set_state_options
时未设置 defect_ref
值,则默认行为是使 defect_ref
等于 ref
值.这就是这样做的原因:
缺陷是多项式插值函数计算的状态速率与 ODE 计算的实际状态速率之间的差异。
如您所见here:
defect = (f_approx-f_computed) * dt_dstau
dt_dstau
只是将事物调整为标准化时间 space,称为 tau
,但它也乘以时间单位(tau
是无量纲的)。这意味着缺陷是以与状态本身相同的单位计算的。因此,对缩放的合理猜测是匹配状态和缺陷之间的缩放。正如 Rob Falck 的回答所指出的那样,这并不总是正确的解决方案,但它是一个很好的起点。
我希望获得一些有关如何以智能方式在 Dymos 中设置缺陷引用的信息。我在此处 https://github.com/hweyandtnasa/scaling-tutorial 找到了以下关于缩放的注释,但它仍然将 Dymos 中的缺陷缩放列为 TODO。我是否应该将它们设置为等于它们所属状态的参考值?
缩放伪谱最优控制问题很棘手。如果您能得到 John Betts 的 Practical Methods for Optimal Control and Estimation Using Nonlinear Programming 的副本,我强烈推荐它。 Betts 建议对状态设计变量值和缺陷使用相同的比例。这通常是一个很好的经验法则,但与大多数扩展方法一样,并不通用。决定动力学在物理上是否正确的搭配“缺陷”只是近似多项式的斜率与计算出的运动方程之间的差异。
在状态值很大但微小的变化率很重要的情况下,根据我的经验,不同的缩放比例是必要的。这些可能是真实的状态的例子是飞机范围或航天器轨道元素。就在最近,我们遇到了一种情况,航天器的低推力轨道转移与物理学不符。例如,半纬度直肠通常以公里为单位测量,因此在地球轨道上以千为单位)。在使用的单元中,缺陷的“显着”差异小于 1E-6(使用的可行性阈值)。在这种情况下,通过将 defect_scaler 提高几个数量级(相当于将 defect_ref 降低几个数量级)解决了问题。
我也推荐 this paper from Ross, Gong, Karpenko, and Proulx。它列出了一些很好的经验法则,并且在最速记时器中有一个平易近人的例子。它引用了很多成本。 Dymos 还没有提供自动 Costate 估计,但它们与问题的拉格朗日乘数密切相关,如果您使用 SNOPT,它会打印在 pyoptsparse 输出中。
您指出的 github 存储库是一名实习生的工作,并且基于此 scaling method developed by Sagliano。我们发现它在很多情况下都能很好地工作,但它也不是万灵药。
最终我们希望在 Dymos and/or OpenMDAO 中有一些自动缩放选项,但我们不确定它们何时会进入框架。我们过去的工作通常将缩放方法与运动方程更紧密地联系在一起,而 Dymos 的设计更通用,因为用户可以提供他们选择的任何 EOM。
在 Dymos 中,如果您在调用 set_state_options
时未设置 defect_ref
值,则默认行为是使 defect_ref
等于 ref
值.这就是这样做的原因:
缺陷是多项式插值函数计算的状态速率与 ODE 计算的实际状态速率之间的差异。
如您所见here:
defect = (f_approx-f_computed) * dt_dstau
dt_dstau
只是将事物调整为标准化时间 space,称为 tau
,但它也乘以时间单位(tau
是无量纲的)。这意味着缺陷是以与状态本身相同的单位计算的。因此,对缩放的合理猜测是匹配状态和缺陷之间的缩放。正如 Rob Falck 的回答所指出的那样,这并不总是正确的解决方案,但它是一个很好的起点。