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