在openmdao中声明约束时的TypeError(我的ndarray用于浮点数)

时间:2016-05-19 16:25:17

标签: python-2.7 numpy openmdao

各位大家好,如果我犯了一些错误,请原谅我,我不会说英语。

我在尝试向OpenMdao中的组添加约束时遇到TypeError。 我宣布了一个组件:

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:源'p.x'的Type('numpy.ndarray')必须与目标'con0.x'的type('float')相同。

我一直试图找出几个小时的错误,但我不明白为什么我的'x'会被认为是浮动的... 我遵循Paraboloid tutorial声明约束的方式,Sellar Problem tutorial表明可以在字符串中使用ndarray来声明约束。

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

先谢谢你

GAEL

1 个答案:

答案 0 :(得分:1)

您正在连接来源' 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假设任何进来的是一个浮点数,所以你必须明确地调整任何ndarrays的大小。