我想使用缩放器并最终使用 OpenMDAO 1.x 测试OpenMDAO 0.x文档中的抛物面示例,但无论是否使用缩放器,我都会得到奇怪的结果。这是代码:
从 __future__ 导入 print_function 导入系统 从 openmdao.api 导入 IndepVarComp,组件,问题,组,ScipyOptimizer 类抛物面(组件): def __init__(self): 超级(抛物面,自我).__init__() self.add_param('x', val=0.0) self.add_param('y', val=0.0) self.add_output('f_xy', val=0.0) def solve_nonlinear(self, params, unknowns, resids): x = 参数['x'] y = 参数['y'] #unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0 未知数['f_xy'] = (1000.*x-3.)**2 + (1000.*x)*(0.01*y) + (0.01*y+4.)**2 - 3。 def 线性化(自我,参数,未知数,残差): """ 抛物面的雅可比行列式。""" x = 参数['x'] y = 参数['y'] J = {} #J['f_xy', 'x'] = 2.0*x - 6.0 + y #J['f_xy', 'y'] = 2.0*y + 8.0 + x J['f_xy', 'x'] = 2000000.0*x - 6000.0 + 10.0*y J['f_xy', 'y'] = 0.0002*y + 0.08 + 10.0*x 返回 J 如果 __name__ == "__main__": 顶部 = 问题() root = top.root = Group() root.add('p1', IndepVarComp('x', 3.0)) root.add('p2', IndepVarComp('y', -4.0)) root.add('p', 抛物面()) root.connect('p1.x', 'px') root.connect('p2.y', 'py') top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'SLSQP' top.driver.add_desvar('p1.x', lower=-1000, upper=1000, scaler=0.001) top.driver.add_desvar('p2.y', lower=-1000, upper=1000, scaler=1000.) top.driver.add_objective('p.f_xy') top.setup() 顶部运行() 打印('\n') print('在 (%f, %f) 处找到 %f 的最小值' % (top['p.f_xy'], top['px'], top['py']))
当我在我的系统上运行它时,它给出:
2.7.11 |Anaconda 2.5.0(64 位)| (默认,2016 年 1 月 29 日,14:26:21)[MSC v.1500 64 位 (AMD64)] Python 键入“help”、“copyright”、“credits”或“license”以获取更多信息。 [评估 paraboloid_optimize_scaled.py] ############################################# 设置:检查潜在问题... 没有指定记录器,因此不会保存数据。 设置:检查完成。 ############################################# 优化成功终止。(退出模式 0) 当前函数值:[8981902.27846645] 迭代次数:1 功能评估:12 梯度评估:1 优化完成 ---------------------------------- 8981902.278466 的最小值位于 (3.000000, -4.000000)
我错过了什么?