【问题标题】:Check partial derivatives and finite differences error检查偏导数和有限差分误差
【发布时间】:2016-07-24 07:37:20
【问题描述】:

关于我之前的问题Scaled paraboloid and derivatives checking,我看到您修复了与运行该问题有关的问题。我想尝试,但在以下代码中显示的导数检查和有限差分仍然存在问题:

""" Unconstrained optimization of the scaled paraboloid component."""

from __future__ import print_function
import sys
import numpy as np

from openmdao.api import IndepVarComp, Component, Problem, Group, ScipyOptimizer

class Paraboloid(Component):

    def __init__(self):
        super(Paraboloid, self).__init__()

        self.add_param('X', val=np.array([0.0, 0.0]))
        self.add_output('f_xy', val=0.0)

    def solve_nonlinear(self, params, unknowns, resids):
        X = params['X']
        x = X[0]
        y = X[1]
        unknowns['f_xy'] = (1000.*x-3.)**2 + (1000.*x)*(0.01*y) + (0.01*y+4.)**2 - 3.

    def linearize(self, params, unknowns, resids):
        """ Jacobian for our paraboloid."""
        X = params['X']
        J = {}

        x = X[0]
        y = X[1]

        J['f_xy', 'X'] = np.array([[ 2000000.0*x - 6000.0 + 10.0*y,
                                    0.0002*y + 0.08 + 10.0*x]])

        return J

if __name__ == "__main__":

    top = Problem()

    root = top.root = Group()
    #root.fd_options['force_fd'] = True    # Error if uncommented

    root.add('p1', IndepVarComp('X', np.array([3.0, -4.0])))
    root.add('p', Paraboloid())

    root.connect('p1.X', 'p.X')

    top.driver = ScipyOptimizer()
    top.driver.options['optimizer'] = 'SLSQP'

    top.driver.add_desvar('p1.X',
                          lower=np.array([-1000.0, -1000.0]),
                          upper=np.array([1000.0, 1000.0]),
                          scaler=np.array([1000., 0.001]))
    top.driver.add_objective('p.f_xy')


    top.setup()
    top.check_partial_derivatives()
    top.run()
    top.check_partial_derivatives()

    print('\n')
    print('Minimum of %f found at (%s)' % (top['p.f_xy'], top['p.X']))

第一次检查工作正常,但第二次check_partial_derivatives 给出了 FD 奇怪的结果:

[...] 偏导数检查 ---------------- 组件:'p' ---------------- p: 'f_xy' wrt 'X' 前进幅度:1.771706e-04 反向幅度:1.771706e-04 Fd 幅度:9.998228e-01 绝对误差 (Jfor - Jfd) : 1.000000e+00 绝对误差(Jrev - Jfd):1.000000e+00 绝对误差(Jfor - Jrev):0.000000e+00 相对误差 (Jfor - Jfd):1.000177e+00 相对误差 (Jrev - Jfd):1.000177e+00 相对误差(Jfor - Jrev):0.000000e+00 原始前向导数 (Jfor) [[ -1.77170624e-04 -8.89040341e-10]] 原始逆导数 (Jrev) [[ -1.77170624e-04 -8.89040341e-10]] 原始 FD 衍生品 (Jfd) [[ 0.99982282 0. ]] 在 ([ 6.66666658e-03 -7.33333333e+02]) 找到最小值 -27.333333

并且(可能不相关)当我尝试设置root.fd_options['force_fd'] = True(只是为了看看)时,我在第一次检查时遇到错误:

偏导数检查 ---------------- 组件:'p' ---------------- 回溯(最近一次通话最后): 文件“C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py”,第 59 行,在 文件“d:\rlafage\OpenMDAO\OpenMDAO\openmdao\core\problem.py”,第 1827 行,在 check_partial_derivatives u_size = np.size(dunknowns[u_name]) 文件“d:\rlafage\OpenMDAO\OpenMDAO\openmdao\core\vec_wrapper.py”,第 398 行,在 __getitem__ 返回 self._dat[name].get() 文件“d:\rlafage\OpenMDAO\OpenMDAO\openmdao\core\vec_wrapper.py”,第 223 行,在 _get_scalar 返回 self.val[0] IndexError:索引 0 超出轴 0 的范围,大小为 0

我使用 OpenMDAO HEAD (d1e12d4)。

【问题讨论】:

    标签: openmdao


    【解决方案1】:

    这只是有限差分的步长问题。第 2 次 FD 出现在不同的点(最佳点),它必须在那个点更敏感。

    我尝试了中心差异

    top.root.p.fd_options['form'] = 'central'
    

    得到了更好的结果。

    ----------------
    Component: 'p'
    ----------------
    p: 'f_xy' wrt 'X'
    
    Forward Magnitude : 1.771706e-04
    Reverse Magnitude : 1.771706e-04
         Fd Magnitude : 1.771738e-04
    

    设置“fd”时的异常是一个真正的错误,与 des_var 上的缩放器是一个数组有关。感谢您的报告;我们会编造一个故事来解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2016-03-25
      • 2021-04-19
      • 1970-01-01
      • 2013-09-30
      • 2016-06-18
      • 2012-12-03
      相关资源
      最近更新 更多