主要内容

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

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

许多求解器允许你提供一个函数来计算目标函数或约束函数的一阶导数(梯度或雅可比矩阵)。你可以检查你的函数计算的导数是否符合有限差分近似。这个检查可以帮助您诊断您的导数函数是否正确。

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

  • 否则,“匹配”表示相对差异小于1 e-6

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

如何检查衍生品

在MATLAB®命令行:

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

  2. 设置CheckGradients选项真正的

中心有限差分比默认的前向有限差分更精确。要在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;[];If nargout > 2 gc = [2*x(1)]; / /gceq = [];结束

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

函数[c ceq gc gceq] = unitdiskb(x) c = x(1)^2 + x(2)^2 - 1;[];If nargout > 2 gc = [x(1);x(2)];%梯度错误:关闭一个因子2 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。using validateFirstDerivatives derivative Check failed: user - provided and forward Finite-difference derivatives do not match within 1e-006 relative tolerance.使用validateFirstDerivatives检查失败:user - provided and forward Finite-difference derivatives do not match within 1e-006 relative tolerance.使用validateFirstDerivatives检查失败:user - provided and forward Finite-difference derivatives do not match within 1e-006 relative tolerance.使用validateFirstDerivatives检查失败:user - provided and forward Finite-difference derivatives not match within 1e-006 relative tolerance。Error in fmincon at 805 validateFirstDerivatives(funfcn,confcn,X,…)

    约束函数与计算的梯度不匹配,鼓励您检查函数是否有错误。

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

    [x fval exitflag output] = fmincon(@rosenboth,…[1, 2 ],[],[],[],[],[],[],@ unitdisk2选项);____________________________________________________________ 导数检查目标函数导数信息:用户提供最大相对区别和有限差分衍生品= 1.28553 e - 008。非线性不等式约束导数:用户提供的导数与有限差分导数的最大相对差= 1.46443e-008。衍生检查成功通过。____________________________________________________________ 局部最小值发现,满足约束……