2016-05-19 5 views
1

Hallo allerseits, bitte vergib mir, wenn ich ein paar Fehler mache, ich spreche kein Englisch so gut.TypeError beim Deklarieren einer Constraint in openmdao (mein ndarray ist für ein float)

Ich erhalte einen TypeError, während ich versuche, einer Gruppe in OpenMdao eine Einschränkung hinzuzufügen. ich eine Komponente erklärt:

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

und dann eine Gruppe:

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) 

und ich bekomme diese:

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

Ich habe zu finden versucht, was stundenlang falsch ist, aber ich sehe nicht, warum mein 'x' als Float betrachtet würde ... Ich folgte dem Weg, der die Paraboloid tutorial Constraints deklariert, und die Sellar Problem tutorial zeigen s dass ein ndarray innerhalb der Zeichenkette verwendet werden kann, um die Einschränkung zu deklarieren.

Kann jemand sehen, was in meinem Code falsch ist?

Danke von vorab

Gaël

Antwort

1

Sie sind die Quelle ‚px‘ zur Ziel ‚con0.x‘ (und spätere Auflagen) verbindet, und x eine ndarray, so auch das Ziel muss sei ein Ndray. Sie können dies auf dem Execomp angeben, indem Sie ein zusätzliches Schlüsselwortargument übergeben, wobei das Schlüsselwort der Name des Zieleingangs ist. Wenn wir geben es nur die gleiche Größe wie ‚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))) 

dann es es durch die Einrichtung ohne einen Fehler macht.

Also yeah, ExecComp geht davon aus, dass alles, was reinkommt, ein Float ist, also muss man explizit alle ndarrays skalieren.

Verwandte Themen