2017-07-07 5 views
0

私は最初のParaboloid TutorialでOpenMDAOを学んでいます。しかし、私が制約付きのケース(add_constraint(...))でコードを実行すると、私はエラーが発生します。AttributeError: 'float'オブジェクトに 'size'属性がありません。 チュートリアルのコードをコピーして貼り付けただけですが、エラーを修正することはできません。ここでは、コードは次のとおりです。Openmdao - AttributeError: '浮動小数点型'オブジェクトに放物線チュートリアルの属性 'size'がありません

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'])) 

私は、スクリプトを実行して、私は次を得る:

############################################## 
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' 

エラーメッセージは、私は、制約式を入れたときにのみ表示されます。 私はそれがばかげたエラーだと思っていますが、誰かが私に正しい方向を向けることができますか? ご協力いただきありがとうございます!

答えて

-1

imagメソッドが配列を返さないnumpyの古いバージョンを使用している可能性があります。 numpyのそれ以降のバージョンにアップグレードできますか?私は1.12.0を使用しており、コードは私のために働く。

+0

こんにちは、あなたの答えに感謝します。私はnumpyのverionをチェックし、それは1.13.0です。しかし、はい、おそらく私は正しく動作していないバックグラウンドでいくつかのモジュールを持っています。 OpenMDAOは他のモジュールを使用していますか? – Sim81

+0

あなたは正しいです、最近のNumpyアップグレードが私たちを壊したようです。その間、修正を見る機会が得られるまで、1.12.0に戻すことをお勧めします。 –

7

これは、実際にはnumpyの小さな変化が1.12と1.13の間にあるために発生したバグでした。今、githubリポジトリのMasterブランチに修正があります。

関連する問題