具有下限的 fmincon 失败,即使解在初始点
fmincon with lower bound fails, even though solution is at initial point
我正在尝试最小化非线性 objective 函数(我的实际函数比那个复杂得多,但我发现即使这个简单的函数也说明了这一点),我知道最小值得到初始点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
调用出了什么问题?
我们可以使用 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]
时,求解器可以 over-shoot 最小值并从各个方向接近它。
此外,我们可以使用 options
输入来获得 更好的 洞察力!
options.Display = 'iter';
[xc1, fvalc1, ~, output] = fmincon(fun, x0, [],[],[],[], lb1, [Inf Inf], [], options);
打印到命令window我们看到这个:
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
是无效的! 这就是为什么求解器没有 return 1 次迭代和 [=17 的下限的结果=].
fminsearch
也出于同样的原因起作用 - 您没有强加解决方案所在的下限。
我正在尝试最小化非线性 objective 函数(我的实际函数比那个复杂得多,但我发现即使这个简单的函数也说明了这一点),我知道最小值得到初始点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
调用出了什么问题?
我们可以使用 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]
时,求解器可以 over-shoot 最小值并从各个方向接近它。
此外,我们可以使用 options
输入来获得 更好的 洞察力!
options.Display = 'iter';
[xc1, fvalc1, ~, output] = fmincon(fun, x0, [],[],[],[], lb1, [Inf Inf], [], options);
打印到命令window我们看到这个:
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
是无效的! 这就是为什么求解器没有 return 1 次迭代和 [=17 的下限的结果=].
fminsearch
也出于同样的原因起作用 - 您没有强加解决方案所在的下限。