1

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

尝试向 OpenMdao 中的组添加约束时出现 TypeError。我声明了一个组件:

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

然后是 Group :

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:源“px”的类型(“numpy.ndarray”)必须与目标“con0.x”的类型(“float”)相同。

几个小时以来我一直试图找出问题所在,但我不明白为什么我的“x”会被视为浮点数......我遵循抛物面教程声明约束的方式,而Sellar Problem 教程表明可以在字符串内部使用 ndarray 来声明约束。

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

提前谢谢你

盖尔

4

1 回答 1

1

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

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 的大小。

于 2016-05-19T16:54:18.140 回答