主要内容gydF4y2Ba

当求解器成功时gydF4y2Ba

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

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

options = optimoptions('fmincon','Algorithm','active-set');Ffun = @(x)x^3;xfinal = fmincon(ffun,1/3,[],[],[],[], [],-2,2,[],options)找到满足约束的局部最小值。由于目标函数在可行方向上不递减,在函数容差默认值范围内,且约束条件满足在约束容差默认值范围内,优化完成。没有主动不等式。Xfinal = -1.5056e-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

Ffun = @(x)x³+ x^4;options = optimoptions('fminunc','算法','准牛顿');[xfinal fval] = fminunc(ffun,1/4,options)找到局部最小值。优化完成,因为梯度的大小小于函数的默认值公差。X = -1.6764e-008 fval = -4.7111e-024gydF4y2Ba

将初始点改变少量,求解器会找到一个更好的解:gydF4y2Ba

[xfinal fval] = fminunc(ffun,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.5056e-008gydF4y2Ba,计算gydF4y2Baffun (xfinal±Δ)gydF4y2Ba对于一些gydF4y2BaΔgydF4y2Ba:gydF4y2Ba

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

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

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

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)找到满足约束的局部最小值。由于目标函数在可行方向上不递减,在函数容差默认值范围内,且约束条件满足在约束容差默认值范围内,优化完成。主动不等式(到选项内)。约束容忍= 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

    options = optimoptions('fminunc','算法','准牛顿');[x fval] = fminunc(@(x)-x+x^2,0,options)找到的局部最小值。优化完成,因为梯度的大小小于函数的默认值公差。X = 0.5000 fval = -0.2500gydF4y2Ba

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

  • 检查一个不可行的点不会在你的函数中导致错误;看到gydF4y2Ba迭代可能会违反约束gydF4y2Ba.gydF4y2Ba