【问题标题】:Check Partial Derivatives with pass_by_obj使用 pass_by_obj 检查偏导数
【发布时间】:2015-12-23 00:19:29
【问题描述】:

我有一个输入是 int 的组件,所以我设置 pass_by_obj = True。但是,当我使用 check_partial_derivatives() 检查导数时,会抛出此错误:

data = prob.check_partial_derivatives(out_stream=sys.stdout)
  File "/usr/local/lib/python2.7/site-packages/openmdao/core/problem.py", line 1711, in check_partial_derivatives
    jac_rev[(u_name, p_name)][idx, :] = dinputs._dat[p_name].val
TypeError: float() argument must be a string or a number

它似乎在尝试求导,尽管它不能。这是一个简单的例子:

import sys
from openmdao.api import IndepVarComp, Problem, Group, Component

class Comp(Component):
    def __init__(self):
        super(Comp, self).__init__()
        self.add_param('x', val=0.0)
        self.add_param('y', val=3, pass_by_obj=True)
        self.add_output('z', val=0.0)

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['z'] = params['y']*params['x']

    def linearize(self, params, unknowns, resids):
        J = {}
        J['z', 'x'] = params['y']
        return J

prob = Problem()
prob.root = Group()
prob.root.add('comp', Comp(), promotes=['*'])
prob.root.add('p1', IndepVarComp('x', 0.0), promotes=['x'])
prob.root.add('p2', IndepVarComp('y', 3, pass_by_obj=True), promotes=['y'])

prob.setup(check=False)
prob['x'] = 2.0
prob['y'] = 3

prob.run()
print prob['z']

data = prob.check_partial_derivatives(out_stream=sys.stdout)

是否可以对具有指定为 pass_by_obj 的输入的组件使用 check_partial_derivatives() 方法?我不关心指定为 pass_by_obj 的输入的导数,但我关心其他输入。

【问题讨论】:

  • 这几乎肯定是代码中的错误。我们会尽快修复它,并在不再损坏时通知您。

标签: openmdao


【解决方案1】:

感谢您的报告和测试。这是一个错误,我们没有排除声明 pass_by_obj 的设计变量。我在 OpenMDAO 存储库上收到了一个拉取请求,并进行了修复。它可能会在一天之内被合并到 master 中。

EDIT -- 修复被合并。 https://github.com/OpenMDAO/OpenMDAO/commit/b123b284e46aac7e15fa9bce3751f9ad9bb63b95

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多