我们如何指定给定参数不会影响OpenMDAOv1 +中组件的渐变?

时间:2015-10-27 18:35:10

标签: gradient openmdao

我们如何指定给定参数不会影响OpenMDAOv1 +中组件的渐变?在早期版本中,我们设置missing_deriv_policy = 'assume_zero',但在新的OpenMDAO1 +中似乎不存在。我想我可以在super函数中通过__init__添加输入,而不是将它们包含在params中,以便它们对OpenMDAO不可见,或者只是将偏导数返回为0,但是什么是预期/推荐的方式?如果这是在文档中,我很抱歉,如果是,那么我一定错过了它。

2 个答案:

答案 0 :(得分:1)

如果你不希望你的参数影响渐变,你不需要将该参数连接到另一个组件,那么你一定要把它作为你组件的常规python属性,这样它对于框架是不可见的。如果确实需要将其连接到另一个组件,则可以在该变量的元数据中设置“pass_by_obj”,它将由OpenMDAO数据传递系统传递,但不会影响渐变。不幸的是,'pass_by_obj'只能用于串行。它在MPI中不起作用。

答案 1 :(得分:1)

有三种选择:

  1. 使其成为python属性而不是框架变量。
  2. 使用pass by obj
  3. 将其从Jacobian中取出
  4. 如果值是特定于组件的常量,则可以使用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它为零。