我错过了如何从一个被用作问题组件的元模型中获取'输出'的观点。 很明显,计算部分应该有输出,但是如何。下面是简单的sin函数作为元模型结构组件。我试图修改样本。但错误是:
文件 “C:\用户\ ebarlas \应用程序数据\本地\连续\ anaconda3 \ LIB \站点包\ openmdao \核心\ group.py” 第201行,在_setup_procs中 subsys._setup_procs(subsys.name,sub_comm)
TypeError:_setup_procs()缺少1个必需的位置参数: 'COMM'
import numpy as np
from openmdao.api import Problem, Group, IndepVarComp
from openmdao.api import ScipyOptimizeDriver
from openmdao.api import MetaModelUnStructured, FloatKrigingSurrogate
# Below class syntax is not working
class trig(MetaModelUnStructured):
def setup(self):
self.add_input('x', 0., training_data=np.linspace(0,10,20))
self.add_output('sin_x', 0., surrogate=FloatKrigingSurrogate(),
training_data=.5*np.sin(np.linspace(0,10,20)))
self.declare_partials(of='sin_x', wrt='x', method='fd')
# If I uncomment 4 lines below and comment out the class above it works fine.
#trig = MetaModelUnStructured()
#trig.add_input('x', 0., training_data=np.linspace(0,10,20))
#trig.add_output('sin_x', 0., surrogate=FloatKrigingSurrogate(),
# training_data=.5*np.sin(np.linspace(0,10,20)))
#trig.declare_partials(of='sin_x', wrt='x', method='fd')
prob = Problem()
inputs_comp = IndepVarComp()
inputs_comp.add_output('x', 5)
prob.model.add_subsystem('inputs_comp', inputs_comp)
prob.model.add_subsystem('trig', trig)
prob.model.connect('inputs_comp.x', 'trig.x')
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'COBYLA'
prob.driver.options['tol'] = 1e-3
prob.driver.options['disp'] = True
prob.model.add_design_var('inputs_comp.x', lower=4, upper=7)
prob.model.add_objective('trig.sin_x')
prob.setup(check=True)
prob.run_driver()
print(prob['trig.sin_x'])
print(prob['trig.x'])
答案 0 :(得分:3)
您不应该为MetaModel实现compute
函数(预测未计算输出)。
答案 1 :(得分:0)
您正在错误地使用MetaModelUnstructured
组件,但是还有另一个错误。
您定义的类trig
与注释掉的代码中名为trig
的实例不同。一个是类,另一个是实例。您无法将类传递给add_subsystem。
然而,即使解决了这个问题,MetaModelUnstructured在分类时仍然存在错误。我们将在OpenMDAO 2.3之前获得修复,但是现在您在注释掉的代码中完成它的方式将起作用。
答案 2 :(得分:0)
感谢对问题的澄清。请注意,更新示例中的错误是用于传递类定义trig
而不是实例,但在更正后我可以看到问题。
这是MetaModelUnStructured
中的错误......很快就会修复。