check_partial_derivatives()我对应用于我之前的问题中显示的问题的方法的输出感到惊讶:抛物面优化需要缩放。当我添加对该方法的调用时:
从 __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.fd_options['force_fd'] = True
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=1000.)
top.driver.add_desvar('p2.y', lower=-1000, upper=1000, scaler=0.001)
top.driver.add_objective('p.f_xy')
top.setup()
top.check_partial_derivatives() # 添加行
顶部运行()
打印('\n')
print('在 (%f, %f) 处找到 %f 的最小值' % (top['p.f_xy'], top['px'], top['py']))
我得到以下输出:
偏导数检查
----------------
组件:'p'
----------------
p: 'f_xy' wrt 'x'
正向幅度:6.000000e+03
反向幅度:6.000000e+03
Fd 幅度:2.199400e+07
绝对误差 (Jfor - Jfd) : 2.200000e+07
绝对误差(Jrev - Jfd):2.200000e+07
绝对误差(Jfor - Jrev):0.000000e+00
相对误差 (Jfor - Jfd):1.000273e+00
相对误差 (Jrev - Jfd):1.000273e+00
相对误差(Jfor - Jrev):0.000000e+00
原始前向导数 (Jfor)
[[-6000.]]
原始逆导数 (Jrev)
[[-6000.]]
原始 FD 导数 (Jfor)
[[ 21994001.]]
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
p: 'f_xy' wrt 'y'
正向幅度:8.000000e-02
反向幅度:8.000000e-02
Fd 幅度:2.200000e+07
绝对误差 (Jfor - Jfd) : 2.200000e+07
绝对误差(Jrev - Jfd):2.200000e+07
绝对误差(Jfor - Jrev):0.000000e+00
相对误差(Jfor - Jfd):1.000000e+00
相对误差(Jrev - Jfd):1.000000e+00
相对误差(Jfor - Jrev):0.000000e+00
原始前向导数 (Jfor)
[[ 0.08]]
原始逆导数 (Jrev)
[[ 0.08]]
原始 FD 导数 (Jfor)
[[ 22000000.08]]
优化成功终止。(退出模式 0)
当前函数值:[-27.33333333]
迭代次数:4
功能评估:6
梯度评估:4
优化完成
----------------------------------
-27.333333 的最小值位于 (0.006667, -733.333333)
优化是正确的(即几乎可以肯定地证明导数是正确的),但check_partial_derivatives输出并未显示 fd 和正向/反向方法之间的一致结果。