具有下限的 fmincon 失败,即使解是在初始点

bon*_*faz 3 matlab minimization

我正在尝试最小化非线性目标函数(我的实际函数比这复杂得多,但我发现即使是这个简单的函数也说明了这一点),我知道在初始点获得最小值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])
Run Code Online (Sandbox Code Playgroud)

哪些输出:

>> xc1 = 1.0e-03 * [0.6457    0.6457]
>> fvalc1 = 8.3378e-07
Run Code Online (Sandbox Code Playgroud)

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

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

[xs fvals] = fminsearch(fun, x0)
>> xs =  [0     0]
>> fvals =   0
Run Code Online (Sandbox Code Playgroud)

第一次fmincon通话出了什么问题?

Wol*_*fie 5

我们可以使用文档中output指定的输出参数对此进行诊断

[xc1, fvalc1, ~, output] = fmincon(fun, x0, [],[],[],[], lb1, [Inf Inf])
Run Code Online (Sandbox Code Playgroud)

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

output.stepsize
>> ans = 6.586e-4
Run Code Online (Sandbox Code Playgroud)

估计的最小值为 ,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);
Run Code Online (Sandbox Code Playgroud)

打印到命令窗口,我们看到:

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
Run Code Online (Sandbox Code Playgroud)

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

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