求解成功后
当求解器成功求解时,可能会存在什么问题?
求解器可能报告最小化成功,但给出的解未必正确。举一个比较简单的示例 - 在 x 位于 - 2 和 2 之间时最小化函数 f(x) = x3,从点 1/3
开始求解:
options = optimoptions('fmincon','Algorithm','active-set'); ffun = @(x)x^3; xfinal = fmincon(ffun,1/3,[],[],[],[],-2,2,[],options) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default valueof the function tolerance, and constraints were satisfied to within the default value of the constraint tolerance. No active inequalities. xfinal = -1.5056e-008
真正的最小值出现在 x = -2
处。fmincon
给出以上报告,是因为函数 f(x) 在 x = 0 附近非常平坦。
另一个常见问题是求解器找到局部最小值,但您可能需要全局最小值。有关详细信息,请参阅局部最优与全局最优。
经验提示:请检查您的结果,即使求解器报告它“找到”局部最小值,或方程“已求解”。
本节给出了验证结果的方法。
1.更改初始点
初始点对求解有很大影响。如果您从不同初始点获得的解和原来的解一样或比它更差,您会对原来的解更有信心。
例如,从 1/4 点开始最小化 f(x) = x3 + x4:
ffun = @(x)x^3 + x^4; options = optimoptions('fminunc','Algorithm','quasi-newton'); [xfinal fval] = fminunc(ffun,1/4,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = -1.6764e-008 fval = -4.7111e-024
稍微更改一下初始点,求解器会找到更好的解:
[xfinal fval] = fminunc(ffun,1/4+.001,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. xfinal = -0.7500 fval = -0.1055
x = -0.75
是全局解;从其他点开始无法改进解。
有关详细信息,请参阅局部最优与全局最优。
2.检查附近的点
要查看是否有比给出的解更好的值,请在附近各点处计算您的目标函数和约束。
例如,使用 当求解器成功求解时,可能会存在什么问题? 中的目标函数 ffun
以及终点 xfinal = -1.5056e-008
,针对某个 Δ
计算 ffun(xfinal±Δ)
:
delta = .1; [ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)] ans = -0.0000 0.0011 -0.0009
目标函数在 ffun(xfinal-Δ)
处较低,因此求解器给出的解不正确。
再举一个复杂一点的示例:
options = optimoptions(@fmincon,'Algorithm','active-set'); lb = [0,-1]; ub = [1,1]; ffun = @(x)(x(1)-(x(1)-x(2))^2); [x fval exitflag] = fmincon(ffun,[1/2 1/3],[],[],[],[],... lb,ub,[],options) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default valueof the function tolerance, and constraints were satisfied to within the default value of the constraint tolerance. Active inequalities (to within options.ConstraintTolerance = 1e-006): lower upper ineqlin ineqnonlin 1 x = 1.0e-007 * 0 0.1614 fval = -2.6059e-016 exitflag = 1
在附近的可行点计算 ffun
表明解 x
不是真正的最小值:
[ffun([0,.001]),ffun([0,-.001]),... ffun([.001,-.001]),ffun([.001,.001])] ans = 1.0e-003 * -0.0010 -0.0010 0.9960 1.0000
列出的前两个值小于已计算出的最小值 fval
。
如果您拥有 Global Optimization Toolbox 许可证,则可以使用 patternsearch
(Global Optimization Toolbox) 函数来检查附近的点。
3.检查目标函数和约束函数
仔细检查您的目标函数和约束函数,确保它们适用于您要求解的问题。建议:
在几个点上检查您的目标函数的计算。
检查每个不等式约束的符号是否正确。
如果您执行了最大化,请记住要取所得解的负值。(此建议假设您通过最小化目标的负值来最大化函数。)例如,要最大化 f(x) = x – x2,请最小化 g(x) = –x + x2:
options = optimoptions('fminunc','Algorithm','quasi-newton'); [x fval] = fminunc(@(x)-x+x^2,0,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = 0.5000 fval = -0.2500
f 的最大值为 0.25,它是
fval
的负数。检查以确保不可行点不会导致函数中出现错误;请参阅迭代可能违反约束。