主要内容gydF4y2Ba

当求解成功时gydF4y2Ba

如果求解器成功了会有什么问题?gydF4y2Ba

求解器可以报告最小化成功,但报告的解决方案可能是不正确的。对于一个相当简单的示例,考虑最小化该函数gydF4y2BafgydF4y2Ba(gydF4y2BaxgydF4y2Ba) =gydF4y2BaxgydF4y2Ba3.gydF4y2Ba为gydF4y2BaxgydF4y2Ba在-2和2之间,从这个点开始gydF4y2Ba1/3gydF4y2Ba:gydF4y2Ba

选择= optimoptions(“fmincon”、“算法”,“激活集”);ffun = @ (x) x ^ 3;xfinal = fmincon(ffun,1/3,[],[],[], -2,2,[],options)找到满足约束条件的局部最小值。由于目标函数在可行方向上不减小到函数公差的默认值内,且约束条件满足到约束公差的默认值内,因此优化完成。没有活跃的不平等。xfinal = -1.5056 e - 008gydF4y2Ba

真正的最小值出现在gydF4y2Bax = 2gydF4y2Ba.gydF4y2BafmincongydF4y2Ba给出这个报告因为函数gydF4y2BafgydF4y2Ba(gydF4y2BaxgydF4y2Ba)是如此平坦的附近gydF4y2BaxgydF4y2Ba= 0gydF4y2Ba.gydF4y2Ba

另一个常见问题是,求解器找到了局部最小值,但您可能想要全局最小值。有关更多信息,请参见gydF4y2Ba局部优化与全局优化gydF4y2Ba.gydF4y2Ba

教训:检查你的结果,即使解算器报告它“找到”一个局部最小值,或“解出”一个方程。gydF4y2Ba

本节给出验证结果的技术。gydF4y2Ba

1.改变起始点gydF4y2Ba

初始点对解有很大的影响。如果你从不同的初始点得到相同或更差的解,你就会对你的解更有信心。金宝搏官方网站gydF4y2Ba

例如,最小化gydF4y2BafgydF4y2Ba(gydF4y2BaxgydF4y2Ba) =gydF4y2BaxgydF4y2Ba3.gydF4y2Ba+gydF4y2BaxgydF4y2Ba4gydF4y2Ba从1/4点开始:gydF4y2Ba

= @(x)x^3 + x^4;选择= optimoptions(“fminunc”、“算法”、“拟牛顿”);[xfinal fval] = fminunc(fun,1/4,options)找到局部最小值。由于梯度的大小小于函数公差的默认值,优化已经完成。fval = -4.7111e-024gydF4y2Ba

稍微改变初始点,求解器就会找到更好的解:gydF4y2Ba

[xfinal fval] = fminunc(fun,1/4+.001,options)找到局部最小值。由于梯度的大小小于函数公差的默认值,优化已经完成。Xfinal = 0.7500 fval = 0.1055gydF4y2Ba

x = -0.75gydF4y2Ba是全球解决方案;从其他观点出发不能改善解决方案。gydF4y2Ba

有关更多信息,请参见gydF4y2Ba局部优化与全局优化gydF4y2Ba.gydF4y2Ba

2.检查附近的点gydF4y2Ba

要查看是否有比报告的解决方案更好的值,请评估您的目标函数和附近各点的约束条件。gydF4y2Ba

以目标函数为例gydF4y2BaffungydF4y2Ba从gydF4y2Ba如果求解器成功了会有什么问题?gydF4y2Ba,也是最后一点gydF4y2Baxfinal = -1.5056 e - 008gydF4y2Ba,计算gydF4y2Baffun (xfinal±Δ)gydF4y2Ba对于一些gydF4y2BaΔgydF4y2Ba:gydF4y2Ba

δ= 1;[ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)] ans = -0.0000 0.0011 -0.0009gydF4y2Ba

目标函数较低gydF4y2Baffun (xfinal -Δ)gydF4y2Ba,因此求解器报告了一个不正确的解。gydF4y2Ba

一个不那么琐碎的例子:gydF4y2Ba

选择= optimoptions (@fmincon、“算法”、“有效集”);磅= [0,1];乌兰巴托= [1];ffun = @ (x) (x (1) - (x (1) - x (2)) ^ 2);[x fval exitflag] = fmincon (ffun [1/2 1/3 ],[],[],[],[],...lb,ub,[],options)满足约束条件的局部最小值。由于目标函数在可行方向上不减小到函数公差的默认值内,且约束条件满足到约束公差的默认值内,因此优化完成。主动的不平等(在选项之内。constraintolerance = 1e-006): lower upper ineqlin ineqnonlin 1 x = 1.0e-007 * 0 0.1614 fval = -2.6059e-016 exitflag = 1gydF4y2Ba

评估gydF4y2BaffungydF4y2Ba在附近的可行点处证明了解gydF4y2BaxgydF4y2Ba不是真正的最小值:gydF4y2Ba

[ffun([0,措施]),ffun([0,措施]),…ffun([措施,措施]),ffun([措施,措施])]ans = 1.0 e - 003 * -0.0010 -0.0010 0.9960 1.0000gydF4y2Ba

列出的前两个值小于计算的最小值gydF4y2BafvalgydF4y2Ba.gydF4y2Ba

如果你有gydF4y2Ba全局优化工具箱gydF4y2Ba许可证,您可以使用gydF4y2BapatternsearchgydF4y2Ba(全局优化工具箱)gydF4y2Ba函数检查附近的点。gydF4y2Ba

3.检查目标和约束函数gydF4y2Ba

仔细检查目标函数和约束函数,确保它们与您想要解决的问题相对应。建议:gydF4y2Ba

  • 在几个点上检查你的目标函数的评估。gydF4y2Ba

  • 检查每个不等式约束是否有正确的符号。gydF4y2Ba

  • 如果您执行了一个最大化,记住要取报告解的负数。(这个建议假设你通过最小化目标的负面来最大化功能。)例如,最大化gydF4y2BafgydF4y2Ba(gydF4y2BaxgydF4y2Ba) =gydF4y2BaxgydF4y2Ba- - - - - -gydF4y2BaxgydF4y2Ba2gydF4y2Ba,最大限度地减少gydF4y2BaggydF4y2Ba(gydF4y2BaxgydF4y2Ba) = -gydF4y2BaxgydF4y2Ba+gydF4y2BaxgydF4y2Ba2gydF4y2Ba:gydF4y2Ba

    选择= optimoptions(“fminunc”、“算法”、“拟牛顿”);[x fval] = fminunc(@(x)-x+x^2,0,options)找到局部最小值。由于梯度的大小小于函数公差的默认值,优化已经完成。X = 0.5000 fval = -0.2500gydF4y2Ba

    的最大的gydF4y2BafgydF4y2Ba是的负数吗gydF4y2BafvalgydF4y2Ba.gydF4y2Ba

  • 检查不可行点不会在函数中引起错误;看到gydF4y2Ba迭代会违反约束gydF4y2Ba.gydF4y2Ba