许多求解器允许您提供计算的目标或约束函数一阶导数(梯度或雅克比)的功能。您可以检查你函数的比赛有限差分近似计算的衍生工具是否。该检查可帮助诊断你的导函数是否正确。
如果梯度函数的一个分量小于1
,“匹配”是指梯度函数的绝对差和该分量的有限差近似小于1 e-6
。
否则,“匹配”是指该相对差小于1 e-6
。
的CheckGradients
选项使求解器仅在一点上根据有限差分近似检查所提供的导数。如果有限差分和提供的导数不匹配,求解器就会产生误差。如果导数与内部匹配1 e-6
时,求解器报告计算出的差异,并继续迭代而不进行进一步的导数检查。求解器在初始点的一个小随机扰动点上检查匹配x0
,修改为在任何范围内。求解器不包括的计算CheckGradients
在函数计数中;看到迭代次数和函数计数。
在MATLAB®命令行:
设置SpecifyObjectiveGradient
要么SpecifyConstraintGradient
选项真正
使用optimoptions
。确保目标函数或约束函数提供适当的导数。
设置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;[];如果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 = [];结束
设置选项使用内点算法的目标函数和约束函数的梯度,以及CheckGradients
选项:
%用于重现性——CheckGradients随机扰动初始点rng(0,'twister');选择= optimoptions (@fmincon、“算法”、“内点”,…“CheckGradients”,的确,“SpecifyObjectiveGradient”,真的,‘SpecifyConstraintGradient’,真正的);
求最小值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,…)
约束函数与计算的梯度不匹配,促使您检查函数是否存在错误。
取代unitdiskb
约束函数unitdisk2
并再次运行最小化:
[X FVAL exitflag输出] = fmincon(@rosenboth,... [-1; 2],[],[],[],[],[],[],@ unitdisk2,选项);____________________________________________________________衍生物检查信息目标函数衍生物:用户提供的和有限差分衍生物= 1.28553e-008之间的最大相对差。非线性不等式约束衍生物:用户提供的和有限差分衍生物= 1.46443e-008之间的最大相对差。衍生检查顺利通过。____________________________________________________________当地最低发现,满足约束条件...
优化应用程序警告说,它将在未来的版本中被删除。
要设置例如使用正确的导数函数,但是从[0 0]
采用优化的应用程序:
进入启动优化appoptimtool
在命令行。
设置问题设置和结果窗格匹配如下图:
设置选项窗格匹配如下图:
请按开始按钮下方运行求解程序并查看结果。
输出屏幕显示
向前有限差分逼近近不够不准确[0 0]
该衍生物检查失败。
要使用更精确的中央差异,选择中央差异
在里面>型近似导数窗格:
点击运行解算器和查看结果>清除结果,然后开始。这一次的衍生检查成功:
当您选择了初始点的微分检查还成功[-1 2]
,或者大多数随机点。