【问题标题】:fmincon with lower bound fails, even though solution is at initial point具有下限的 fmincon 失败,即使解决方案位于初始点
【发布时间】:2018-03-05 11:27:07
【问题描述】:

我试图最小化一个非线性目标函数(我的实际函数比这复杂得多,但我发现即使是这个简单的函数也说明了这一点),我知道在初始点获得最小值x0:

fun = @(x) x(1)^2+x(2)^2;
x0 = [0 0];
lb1 = [0 0];
lb2 = [-1 -1];

[xc1 fvalc1] = fmincon(fun, x0, [],[],[],[], lb1, [Inf Inf])

哪些输出:

>> xc1 = 1.0e-03 * [0.6457    0.6457]
>> fvalc1 = 8.3378e-07

但是,使用不同的下限或使用 fminsearch 都可以正常工作:

[xc2 fvalc2] = fmincon(fun, x0, [],[],[],[], lb2, [Inf Inf])
>> xc2 = [0     0]
>> fvalc2 =  0

[xs fvals] = fminsearch(fun, x0)
>> xs =  [0     0]
>> fvals =   0

第一次fmincon 调用中出了什么问题?

【问题讨论】:

    标签: matlab minimization


    【解决方案1】:

    我们可以使用docs 中指定的output 输出参数来诊断此问题

    [xc1, fvalc1, ~, output] = fmincon(fun, x0, [],[],[],[], lb1, [Inf Inf])
    

    output.stepsize 是迭代求解过程中采用的最终步长。在这种情况下:

    output.stepsize
    >> ans = 6.586e-4
    

    估计的最小值为x = [6.457e-4, 6.457e-4],您允许的下限为[0 0],因此不允许求解器采取进一步措施!另一个步骤将给出边界之外的x = [-1.29e-5, -1.29e-5]

    当您允许下限为[-1, -1] 时,求解器可以超过最小值并从各个方向接近它。


    此外,我们可以使用options 输入来获得更好的洞察力!

    options.Display = 'iter';
    [xc1, fvalc1, ~, output] = fmincon(fun, x0, [],[],[],[], lb1, [Inf Inf], [], options);
    

    打印到命令窗口我们看到这个:

    Your initial point x0 is not between bounds lb and ub; FMINCON
    shifted x0 to strictly satisfy the bounds.
    
                                                First-order      Norm of
     Iter F-count            f(x)  Feasibility   optimality         step
        0       3    1.960200e+00    0.000e+00    9.900e-01
        1       6    1.220345e-02    0.000e+00    8.437e-01    1.290e+00
        2       9    4.489374e-02    0.000e+00    4.489e-02    1.014e-01
        3      12    1.172900e-02    0.000e+00    1.173e-02    1.036e-01
        4      15    3.453565e-03    0.000e+00    3.454e-03    4.953e-02
        5      18    1.435780e-03    0.000e+00    1.436e-03    2.088e-02
        6      21    4.659097e-04    0.000e+00    4.659e-04    1.631e-02
        7      24    2.379407e-04    0.000e+00    2.379e-04    6.160e-03
        8      27    6.048934e-05    0.000e+00    6.049e-05    7.648e-03
        9      30    1.613884e-05    0.000e+00    1.614e-05    3.760e-03
       10      33    5.096660e-06    0.000e+00    5.097e-06    1.760e-03
       11      36    2.470360e-06    0.000e+00    2.470e-06    6.858e-04
       12      39    8.337765e-07    0.000e+00    8.338e-07    6.586e-04
    

    所以你的x0 无效!这就是为什么求解器不返回具有 1 次迭代和[0 0] 下限的结果。

    fminsearch 也出于同样的原因 - 您没有强加解决方案所在的下限。

    【讨论】:

    • 为什么x0=[0 0]不在lb=[0 0]的下限范围内?不管是浮点数表示,都应该在内。
    • 它不是介于边界,即lb < x0 < ub。您可以有一个位于边界上的解决方案(尽管正如您在上面看到的,步长将决定您有多接近),但最初的猜测必须在它们之间才能使求解器工作,因为我假设它是基于3 独特点。值得注意的是,默认方法是'interior-point',线索就在名称中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多