2016-02-26 17 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

衍生错误有点棘手。在声明数组的派生时,将数组中的每个条目作为单独的变量处理。 –