2017-07-07 1 views
0

I OpenMDAO mit den ersten Paraboloid Tutorial lerne. Aber wo ich den Code mit dem eingeschränkten Fall (add_constraint (...)) laufen bekomme ich die Fehler: Attribute: ‚schweben‘ Objekt hat kein Attribut ‚Größe‘. ich nur den Code aus dem Tutorial kopiert kleisterte aber ich den Fehler nicht fein kann. Hier ist der Code:Openmdao - Attribute: 'schweben' Objekt hat kein Attribut 'Größe' in Paraboloid Tutorial

from __future__ import print_function 
from openmdao.api import IndepVarComp, Component, Problem, Group 
from openmdao.api import ScipyOptimizer 
from openmdao.api import ExecComp 

class Paraboloid(Component): 
    def __init__(self): 
     super(Paraboloid, self).__init__() 

     self.add_param('x', val=0.0) 
     self.add_param('y', val=0.0) 

     self.add_output('f_xy', shape=1) 

    def solve_nonlinear(self, params, unknowns, resids): 
     """f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 
     """ 

     x = params['x'] 
     y = params['y'] 

     unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0 

    def linearize(self, params, unknowns, resids): 
     """ Jacobian for our paraboloid.""" 

     x = params['x'] 
     y = params['y'] 
     J = {} 

     J['f_xy', 'x'] = 2.0*x - 6.0 + y 
     J['f_xy', 'y'] = 2.0*y + 8.0 + x 
     return J 

if __name__ == "__main__": 

    top = Problem() 

    root = top.root = Group() 

    root.add('p1', IndepVarComp('x', 3.0)) 
    root.add('p2', IndepVarComp('y', -4.0)) 
    root.add('p', Paraboloid()) 

    # Constraint Equation 
    root.add('con', ExecComp('c = x-y')) 

    root.connect('p1.x', 'p.x') 
    root.connect('p2.y', 'p.y') 
    root.connect('p.x', 'con.x') 
    root.connect('p.y', 'con.y') 

    top.driver = ScipyOptimizer() 
    top.driver.options['optimizer'] = 'SLSQP' 

    top.driver.add_desvar('p1.x', lower=-50, upper=50) 
    top.driver.add_desvar('p2.y', lower=-50, upper=50) 
    top.driver.add_objective('p.f_xy') 
    top.driver.add_constraint('con.c', lower=15.0) 

    top.setup() 
    top.run() 

    print('\n') 
    print('Minimum of %f found at (%f, %f)' % (top['p.f_xy'], top['p.x'], top['p.y'])) 

ich das Skript ausführen und ich folgendes:

############################################## 
Setup: Checking root problem for potential issues... 

No recorders have been specified, so no data will be saved. 

Setup: Check of root problem complete. 
############################################## 

Traceback (most recent call last): 
    File "paraboloid.py", line 65, in <module> 
    top.run() 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/core/problem.py", line 1151, in run 
    self.driver.run(self) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/drivers/scipy_optimizer.py", line 211, in run 
    options=self.opt_settings) 
    File "/home/sim/.local/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 458, in minimize 
    constraints, callback=callback, **options) 
    File "/home/sim/.local/lib/python2.7/site-packages/scipy/optimize/slsqp.py", line 390, in _minimize_slsqp 
    g = append(fprime(x),0.0) 
    File "/home/sim/.local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 292, in function_wrapper 
    return function(*(wrapper_args + args)) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/drivers/scipy_optimizer.py", line 334, in _gradfunc 
    return_format='array') 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/core/driver.py", line 834, in calc_gradient 
    sparsity=sparsity, inactives=inactives) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/core/problem.py", line 1310, in calc_gradient 
    inactives=inactives) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/core/problem.py", line 1561, in _calc_gradient_ln_solver 
    root._sys_linearize(root.params, unknowns, root.resids) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/core/system.py", line 947, in _sys_linearize 
    self._jacobian_cache = linearize(params, unknowns, resids) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/core/group.py", line 836, in linearize 
    sub._sys_linearize(sub.params, sub.unknowns, sub.resids) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/core/system.py", line 947, in _sys_linearize 
    self._jacobian_cache = linearize(params, unknowns, resids) 
    File "/home/sim/.local/lib/python2.7/site-packages/openmdao/components/exec_comp.py", line 273, in linearize 
    J[(u, param)] = numpy.zeros((jval.size, psize)) 
AttributeError: 'float' object has no attribute 'size' 

Die Fehlermeldung erscheint nur, wenn ich die Beschränkungsgleichung setzen. Ich glaube, es ist ein dummer Fehler, aber kann mir jemand die richtige Richtung zeigen? Vielen Dank im Voraus für Ihre Hilfe!

Antwort

-1

Ich denke, man kann eine ältere Version von numpy verwenden, unter denen die imag Verfahren nicht ein Array zurückgibt. Können Sie versuchen, auf eine spätere Version von numpy zu aktualisieren? Ich benutze 1.12.0 und der Code funktioniert für mich.

+0

Hallo, danke für deine Antwort. Ich habe die numpy Version überprüft und es ist 1.13.0. Aber, ja, wahrscheinlich habe ich ein Modul im Hintergrund, das nicht richtig funktioniert. OpenMDAO verwendet andere Module? – Sim81

+0

Sie haben Recht, sieht aus wie eine aktuelle Numpy Upgrade uns gebrochen hat. In der Zwischenzeit schlage ich vor, es zurück auf 1.12.0 zu rollen, bis wir die Chance haben, eine Lösung zu finden. –

7

Dies war eigentlich ein durch eine kleine Änderung in numpy zwischen 1.12 und 1.13 verursachten Fehler. Wir haben jetzt einen Fehler im Master-Zweig des GitHub-Repositorys behoben.

Verwandte Themen