我们如何指定给定参数不影响 OpenMDAOv1+ 中组件的梯度?在早期版本中我们设置missing_deriv_policy = 'assume_zero'
了 ,但在新的 OpenMDAO1+ 中似乎不存在。我想我可以通过super
在__init__
函数中添加输入而不是将它们包含在其中params
以便它们对 OpenMDAO 不可见,或者可能只是将偏导数返回为 0,但是预期/推荐的方式是什么?如果这是在文档中,我很抱歉,如果是,那么我一定错过了。
2 回答
如果您不希望您的参数影响渐变并且您不需要将该参数连接到另一个组件,那么您绝对应该将其设置为组件的常规 python 属性,以便它对框架不可见。如果确实需要将其连接到另一个组件,则可以在该变量的元数据中设置“pass_by_obj”,它将由 OpenMDAO 数据传递系统传递,但不会影响渐变。不幸的是,“pass_by_obj”只能串行使用。它还不能在 MPI 中工作。
有三个选项:
- 使其成为 python 属性而不是框架变量。
- 使用 obj 传递
- 把它排除在雅可比行列之外
如果该值是特定于组件的常量并且永远不需要 OpenMDAO 将其传递给其他任何东西,则可以使用 1。如果您确实需要传递信息,那么我建议 2 或 3。
如果您有一个要传递的值,但它不是浮点数或浮点数组(即列表或字典甚至整数数组),那么您将使用选项 2。OpenMDAO 将为您传递数据,但是出于优化的目的,它将被完全忽略。
但是,如果您有一个浮点数或浮点数组的值,并且您希望在优化中考虑它,那么您应该使用选项 3。这可能是最常见的情况!也许您有一个参数不会影响组件中的一个输出,但会影响其他输出。在这种情况下,当您构建偏导数字典时,您只需省略想要为零的密钥对。OpenMDAO 理解任何未定义的导数都暗示为零。
因此,如果您有一个函数 , f(x,y,z) = 3*x + 2*y
,因此 z 对其没有影响,您将按如下方式定义 jacobian:
J = {}
J['f','x'] = 3
J['f','y'] = 2
通过省略('f','z')
偏导数,我告诉 OpenMDAO 它为零。