2016-02-26 32 views
0

我正在教程中運行「Sellar exmaple」的代碼。根據tutorial page上給出的文檔,ExecComp只是宣佈正常Component的簡寫。所以我嘗試在示例中重新定義ExecComp作爲正常的Components並在相同的示例中使用它們。OpenMDAO:使用普通組件替換ExecComps組件更改輸出

ExecComp S IN的例子中定義如下 - 是我所定義

self.add('obj_cmp', ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)', 
          z=np.array([0.0, 0.0]), x=0.0, y1=0.0, y2=0.0), 
          promotes=['*']) 
self.add('con_cmp1', ExecComp('con1 = 3.16 - y1'), promotes=['*']) 
self.add('con_cmp2', ExecComp('con2 = y2 - 24.0'), promotes=['*']) 

正常Component S作爲如下 -

目的組分

class SellarObjective(Component): 
    def __init__(self): 
     super(SellarObjective, self).__init__()  
     self.add_param('x', val=0.0) 
     self.add_param('y2', val=0.0) 
     self.add_param('y1', val=0.0) 
     self.add_param('z', val=np.zeros(2))  
     self.add_output('obj', val=0.0) 

    def solve_nonlinear(self, params, unknowns, resids): 
     unknowns['obj'] = params['x']**2 + params['z'][0] + params['y1'] + exp(-params['y2']) 

    def linearize(self, params, unknowns, resids): 
     J = {} 
     J['obj', 'x'] = 2 * params['x'] 
     J['obj', 'y2'] = (-1) * exp(-params['y2']) 
     J['obj', 'y1'] = 1.0 
     J['obj', 'z[0]'] = 1.0 
     return J 

約束1

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

     self.add_param('y1', val=0.0) 
     self.add_output('con1', val=0.0) 

    def solve_nonlinear(self, params, unknowns, resids): 
     unknowns['con1'] = 3.16 - params['y1'] 

    def linearize(self, params, unknowns, resids): 
     J = {} 
     J['con1', 'y1'] = -1.0 
     return J 

約束2

class SellarConstraint2(Component): 
    def __init__(self): 
     super(SellarConstraint2, self).__init__() 
     self.add_param('y2', val=0.0) 
     self.add_output('con2', val=0.0) 

    def solve_nonlinear(self, params, unknowns, resids): 
     unknowns['con2'] = params['y2'] - 24.0 

    def linearize(self, params, unknowns, resids): 
     J = {} 
     J['con2', 'y2'] = 1.0 
     return J 

我舉例說明這些新聲明Component S IN的重新編寫執行情況 -

self.add('obj_cmp', SellarObjective(), promotes=['*']) 
self.add('con_cmp1', SellarConstraint1(), promotes=['*']) 
self.add('con_cmp2', SellarConstraint2(), promotes=['*']) 

一切都在代碼中其他是一樣的的教程。但是在執行它們之後,當我比較結果時 - 結果不匹配。

我在這裏錯過了一些明顯的東西嗎?感謝您的時間。

回答

1

沒有與您的替換目標類中的兩個小問題:

  1. 的目標是z[1]功能,沒有z[0]
  2. 的目標相對於到Z衍生物是數組,你可以不要用z[1]作爲關鍵。您必須改用z

糾正你的目標補償爲以下,和它應該工作:

class SellarObjective(Component): 
    def __init__(self): 
     super(SellarObjective, self).__init__()  
     self.add_param('x', val=0.0) 
     self.add_param('y2', val=0.0) 
     self.add_param('y1', val=0.0) 
     self.add_param('z', val=np.zeros(2))  
     self.add_output('obj', val=0.0) 

    def solve_nonlinear(self, params, unknowns, resids): 
     unknowns['obj'] = params['x']**2 + params['z'][1] + params['y1'] + np.exp(-params['y2']) 

    def linearize(self, params, unknowns, resids): 
     J = {} 
     J['obj', 'x'] = 2 * params['x'] 
     J['obj', 'y2'] = (-1) * np.exp(-params['y2']) 
     J['obj', 'y1'] = 1.0 
     J['obj', 'z'] = np.array([[0,1],]) 
     return J 
+0

'Z [1]',而不是'Z [0]'是我的一個很瑣碎的錯誤。對於那個很抱歉。 –

+1

衍生錯誤有點棘手。在聲明數組的派生時,將數組中的每個條目作爲單獨的變量處理。 –