在 openmdao 中声明约束时出现 TypeError(我的 ndarray 被当作浮点数)

TypeError when declaring a constraint in openmdao (my ndarray is taken for a float)

大家好,我的英语不太好,如果说错了还请多多包涵

我在尝试向 OpenMdao 中的组添加约束时遇到类型错误。 我声明了一个组件:

class ShipOpenmdao(Component):
    def __init__(self, **d):
        super(ShipOpenmdao, self).__init__()
        [...]
        self.add_param('x', val=np.zeros(3))

然后是一组:

class Point(Group):
    def __init__(self, **d):
        super(Point, self).__init__()
        self.add('p', IndepVarComp('x', np.zeros(3)))
        self.add('s', ShipOpenmdao(**d))
        self.connect('p.x', 's.x')
        ship = self.s

        for i in range(len(ship.Azimuth)):
            n = len(ship.Tunnel) + len(ship.Thruster) + 2*i
            self.add('con%d' % i, 
                ExecComp('c{0} = x[{1}]*x[{1}] + x[{2}]*x[{2}]'.format(i, n, n+1)))
            self.connect('p.x', 'con%d.x' % i)

我明白了:

TypeError: Type ('numpy.ndarray') of source 'p.x' must be the same as type ('float') of target 'con0.x'.

几个小时以来,我一直在努力找出问题所在,但我不明白为什么我的 'x' 会被视为浮动... 我按照 Paraboloid tutorial declares constraints, and the Sellar Problem tutorial 显示可以在字符串内部使用 ndarray 来声明约束的方式。

有人看到我的代码有什么问题吗?

提前致谢

盖尔

您正在将源 'p.x' 连接到目标 'con0.x'(以及后续约束),并且 x 是一个 ndarray,因此目标也必须是一个 ndarray。您可以通过传递一个附加关键字参数在 Execomp 上指定它,其中关键字是目标输入的名称。如果我们只是给它相同的大小 'p.x':

self.add('con%d' % i,
         ExecComp('c{0} = x[{1}]*x[{1}] + x[{2}]*x[{2}]'.format(i, n, n+1),
                  x=np.zeros(3)))

然后它顺利通过设置。

是的,ExecComp 假定传入的任何内容都是浮点数,因此您必须明确调整任何 ndarray 的大小。