如果考虑到相同的输入,如何在同一个组件中定义隐式和显式输出?
我尝试使用隐式组件来执行此操作,就像这样。
class Dis(ImplicitComponent):
def setup(self):
self.add_input('a')
self.add_input('b')
self.add_input('c')
self.add_output('z')
self.add_output('y1')
self.add_output('y2')
self.add_output('y3')
self.declare_partials(of='*', wrt='*', method='fd')
def apply_nonlinear(self, inputs, outputs, residuals):
residuals['z'] = (1 - outputs['z']) / (inputs['a']) ** 0.5 * inputs['b'] - inputs['c']
def solve_nonlinear(self, inputs, outputs):
outputs['y1'] = (1 - outputs['z']) / (inputs['a']) ** 0.5 * inputs['b']
outputs['y2'] = inputs['a'] * (0.01 * outputs['z'] + 1)
outputs['y3'] = inputs['b'] * (outputs['y2'] / inputs['a'])
所以,在同一个学科中,我需要z
来改变以满足剩余等式,我需要它来计算其余的y1
,y2
和y3
我的系统。
然而,OpenMDAO认为所有输出都是隐式输出,因此我后来在我的系统中使用的DirectSolver有一个“奇异矩阵”问题。为了解决这个问题,我创建了一个由两个组件组成的组:一个是直接依赖于输入的变量,另一个是隐式变量,它使用相同的输入,就像这样。
class Dis1(ImplicitComponent):
def setup(self):
self.add_input('a')
self.add_input('b')
self.add_input('c')
self.add_output('z')
self.declare_partials(of='*', wrt='*', method='fd')
def apply_nonlinear(self, inputs, outputs, residuals):
residuals['z'] = (1 - inputs['z']) / (inputs['a']) ** 0.5 * inputs['b'] - inputs['c']
class Dis2(ExplicitComponent):
def setup(self):
self.add_input('a')
self.add_input('b')
self.add_input('c')
self.add_input('z')
self.add_output('y1')
self.add_output('y2')
self.add_output('y3')
self.declare_partials(of='*', wrt='*', method='fd')
def compute(self, inputs, outputs):
outputs['y1'] = (1 - inputs['z']) / (inputs['a']) ** 0.5 * inputs['b']
outputs['y2'] = inputs['a'] * (0.01 * inputs['z'] + 1)
outputs['y3'] = inputs['b'] * (outputs['y2'] / inputs['a'])
class Top(Group):
def setup(self):
self.add_subsystem('compz', Dis1())
self.add_subsystem('comp_exp', Dis2(), promotes_outputs=['y1', 'y2', 'y3'])
self.connect('compz.z', 'comp_exp.z')
self.set_order(['compz', 'comp_ex'])
有没有办法将它们放在一个组件中?我的意思是一个能够计算残差并给出明确输出的组件。