检查梯度或雅可比矩阵的有效性

检查目标函数中的梯度或雅可比矩阵

许多求解器允许您提供计算的目标或约束函数一阶导数(梯度或雅克比)的功能。您可以检查你函数的比赛有限差分近似计算的衍生工具是否。该检查可帮助诊断你的导函数是否正确。

  • 如果梯度函数的一个分量小于1,“匹配”是指梯度函数的绝对差和该分量的有限差近似小于1 e-6

  • 否则,“匹配”是指该相对差小于1 e-6

CheckGradients选项使求解器仅在一点上根据有限差分近似检查所提供的导数。如果有限差分和提供的导数不匹配,求解器就会产生误差。如果导数与内部匹配1 e-6时,求解器报告计算出的差异,并继续迭代而不进行进一步的导数检查。求解器在初始点的一个小随机扰动点上检查匹配x0,修改为在任何范围内。求解器不包括的计算CheckGradients在函数计数中;看到迭代次数和函数计数

如何检查衍生品

  • 在MATLAB®命令行:

    1. 设置SpecifyObjectiveGradient要么SpecifyConstraintGradient选项真正使用optimoptions。确保目标函数或约束函数提供适当的导数。

    2. 设置CheckGradients选项真正

  • 采用优化的应用程序:

    1. 在里面问题设置和结果窗格中,选择衍生品:目标函数:提供的梯度要么非线性约束函数:衍生品:提供的梯度。确保目标函数或约束函数提供适当的导数。

    2. 在里面选项窗格中,检查用户提供的衍生物>验证用户提供的衍生物

中央有限差异是不是默认的前进有限差更准确。要使用中央有限差异:

  • 在MATLAB命令行中,设置FiniteDifferenceType选项'中央'使用optimoptions

  • 使用优化应用程序,在近似的衍生品窗格中,设置类型中央差异

示例:检查目标函数和约束函数的导数

目标和约束功能

如中所述,考虑最小化单元磁盘中的Rosenbrock函数的问题解决约束非线性问题,求解基于。的rosenboth函数计算目标函数及其梯度:

函数f (g H] = rosenboth f (x) = 100 * (x (2) - x (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;如果nargout > 1 g = (-400 * (x (2) - x (1) ^ 2) * x (1) 2 * (1 - x (1));200 * (x (2) - x (1) ^ 2)];如果nargout > 2 H = (1200 * (1) ^ 2 - 400 * x (2) + 2, -400 * x (1);-400 * x (1), 200);结束结束

rosenboth也计算Hessian,但本示例不使用Hessian。

unitdisk2函数正确地计算约束函数及其梯度:

功能并[c,CEQ,GC,gceq] = unitdisk2(X)C = X(1)^ 2 + X(2)^ 2  -  1;[];如果nargout> 2 GC = [2 * X(1); 2 * X(2)];gceq = [];结束

unitdiskb函数计算约束函数的梯度错误:

函数[c ceq gc gceq] = unitdiskb(x) c = x(1)²+ x(2)²- 1;[];如果nargout > 2 gc = [x(1);x(2)];%梯度不正确:差1倍gceq = [];结束

在命令行检查导数

  1. 设置选项使用内点算法的目标函数和约束函数的梯度,以及CheckGradients选项:

    %用于重现性——CheckGradients随机扰动初始点rng(0,'twister');选择= optimoptions (@fmincon、“算法”、“内点”,…“CheckGradients”,的确,“SpecifyObjectiveGradient”,真的,‘SpecifyConstraintGradient’,真正的);
  2. 求最小值fmincon使用错误unitdiskb约束功能:

    [x fval exitflag output] = fmincon(@rosenboth,…)[1,2]、[][],[],[],[],[],@unitdiskb,选项);____________________________________________________________导数检查目标函数导数信息:用户提供最大相对区别和有限差分衍生品= 1.84768 e - 008。非线性不等式约束导数:用户供差导数与有限差导数的最大相对差= 1。用户提供的约束导数元素(2,1):1.99838有限差分约束导数元素(2,1):3.99675 ____________________________________________________________错误使用validateFirstDerivatives导数检查失败:用户提供和前进有限差分衍生品不匹配在1 e - 006相对宽容。validateFirstDerivatives(funfcn,confcn,X,…)

    约束函数与计算的梯度不匹配,促使您检查函数是否存在错误。

  3. 取代unitdiskb约束函数unitdisk2并再次运行最小化:

    [X FVAL exitflag输出] = fmincon(@rosenboth,... [-1; 2],[],[],[],[],[],[],@ unitdisk2,选项);____________________________________________________________衍生物检查信息目标函数衍生物:用户提供的和有限差分衍生物= 1.28553e-008之间的最大相对差。非线性不等式约束衍生物:用户提供的和有限差分衍生物= 1.46443e-008之间的最大相对差。衍生检查顺利通过。____________________________________________________________当地最低发现,满足约束条件...

使用优化App检查导数

请注意

优化应用程序警告说,它将在未来的版本中被删除。

要设置例如使用正确的导数函数,但是从[0 0]采用优化的应用程序:

  1. 进入启动优化appoptimtool在命令行。

  2. 设置问题设置和结果窗格匹配如下图:

  3. 设置选项窗格匹配如下图:

  4. 请按开始按钮下方运行求解程序并查看结果

    输出屏幕显示

    向前有限差分逼近近不够不准确[0 0]该衍生物检查失败。

  5. 要使用更精确的中央差异,选择中央差异在里面>型近似导数窗格:

  6. 点击运行解算器和查看结果>清除结果,然后开始。这一次的衍生检查成功:

当您选择了初始点的微分检查还成功[-1 2],或者大多数随机点。