В этом примере показано, как получить лучшую допустимую точку, с которой сталкивается fmincon.
Функция помощника bigtoleft целевая функция кубического полинома в 3D переменной x это становится быстро отрицательным как x(1) координата становится отрицательной. Его градиент является трехэлементным вектором. Код для bigtoleft функция помощника появляется в конце этого примера.
Ограничительное множество для этого примера является пересечением внутренних частей двух конусов — один, обращенный вверх и один, обращенный вниз. Ограничительная функция является двухкомпонентным вектором, содержащим один компонент для каждого конуса. Поскольку этот пример 3D, градиент ограничения является 3-на-2 матрицей. Код для twocone функция помощника появляется в конце этого примера.
Создайте фигуру ограничений, окрашенных с помощью целевой функции путем вызова plottwoconecons функция, код которой появляется в конце этого примера.
figure1 = plottwoconecons;

Включить fmincon чтобы использовать объективный градиент и ограничительные градиенты, установите подходящие варианты. Выберите 'sqp' алгоритм.
options = optimoptions('fmincon','Algorithm','sqp',... "SpecifyConstraintGradient",true,"SpecifyObjectiveGradient",true);
Чтобы исследовать процесс решения, установите опции возвращать итеративное отображение.
options.Display = 'iter';Установите начальную точку x0 = [-1/20,-1/20,-1/20].
x0 = -1/20*ones(1,3);
Проблема не имеет никаких линейных ограничений или границ. Установите те аргументы на [].
A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
Решите задачу.
[x,fval,eflag,output] = fmincon(@bigtoleft,x0,...
A,b,Aeq,beq,lb,ub,@twocone,options); Iter Func-count Fval Feasibility Step Length Norm of First-order
step optimality
0 1 -1.625000e-03 0.000e+00 1.000e+00 0.000e+00 8.250e-02
1 3 -2.490263e-02 0.000e+00 1.000e+00 8.325e-02 5.449e-01
2 5 -2.529919e+02 0.000e+00 1.000e+00 2.802e+00 2.585e+02
3 7 -6.408576e+03 9.472e+00 1.000e+00 1.538e+01 1.771e+03
4 9 -1.743599e+06 5.301e+01 1.000e+00 5.991e+01 9.216e+04
5 11 -5.552305e+09 1.893e+03 1.000e+00 1.900e+03 1.761e+07
6 13 -1.462524e+15 5.632e+04 1.000e+00 5.636e+04 8.284e+10
7 15 -2.573346e+24 1.471e+08 1.000e+00 1.471e+08 1.058e+17
8 17 -1.467510e+41 2.617e+13 1.000e+00 2.617e+13 1.789e+28
9 19 -8.716877e+72 2.210e+24 1.000e+00 2.210e+24 2.387e+49
10 21 -2.426511e+135 8.214e+44 1.000e+00 6.596e+44 1.167e+91
11 23 -7.428634e+134 4.785e+44 1.000e+00 2.543e+44 5.301e+90
12 25 -6.128293e+133 2.010e+44 1.000e+00 2.518e+44 1.003e+90
13 27 -5.589950e+131 9.249e+43 1.000e+00 1.509e+44 3.657e+88
14 34 2.149685e+130 1.006e+44 1.681e-01 5.456e+43 1.548e+88
15 36 -3.016774e+137 3.618e+45 1.000e+00 3.206e+45 2.907e+92
16 38 -3.628884e+137 3.577e+45 1.000e+00 4.039e+44 3.288e+92
17 87 -3.628884e+137 3.577e+45 2.569e-08 4.560e+37 3.288e+92
Feasible point with lower objective function value found.
Converged to an infeasible point.
fmincon stopped because the size of the current step is less than
the value of the step size tolerance but constraints are not
satisfied to within the value of the constraint tolerance.
Исследуйте решение, значение целевой функции, выходной флаг и количество вычислений функции и итераций.
disp(x)
1.0e+45 * -3.3193 -0.0383 0.2577
disp(fval)
-3.6289e+137
disp(eflag)
-2
disp(output.constrviolation)
3.5773e+45
Значение целевой функции меньше, чем –1e250, очень отрицательная величина. Нарушение ограничений больше, чем 1e85, большая сумма, которая все еще намного меньше в величине, чем значение целевой функции. Выходной флаг также показывает, что возвращенное решение неосуществимо.
Восстановить лучшую допустимую точку что fmincon обнаружение, наряду с его значением целевой функции, отображает output.bestfeasible структура.
disp(output.bestfeasible)
x: [-2.9297 -0.1813 -0.1652]
fval: -252.9919
constrviolation: 0
firstorderopt: 258.5032
bestfeasible точка не является хорошим решением, как вы видите в следующем разделе. Это - просто лучшая допустимая точка что fmincon столкнутый в его итерациях. В этом случае, даже при том, что bestfeasible не решение, это - лучшая точка, чем возвращенное неосуществимое решение.
table([fval;output.bestfeasible.fval],... [output.constrviolation;output.bestfeasible.constrviolation],... 'VariableNames',["Fval" "Constraint Violation"],'RowNames',["Final Point" "Best Feasible"])
ans=2×2 table
Fval Constraint Violation
____________ ____________________
Final Point -3.6289e+137 3.5773e+45
Best Feasible -252.99 0
Существует несколько способов получить возможное решение. Один путь состоит в том, чтобы установить границы на переменных.
lb = -10*ones(3,1);
ub = -lb;
[xb,fvalb,eflagb,outputb] = fmincon(@bigtoleft,x0,...
A,b,Aeq,beq,lb,ub,@twocone,options); Iter Func-count Fval Feasibility Step Length Norm of First-order
step optimality
0 1 -1.625000e-03 0.000e+00 1.000e+00 0.000e+00 8.250e-02
1 3 -2.490263e-02 0.000e+00 1.000e+00 8.325e-02 5.449e-01
2 5 -2.529919e+02 0.000e+00 1.000e+00 2.802e+00 2.585e+02
3 7 -4.867942e+03 5.782e+00 1.000e+00 1.151e+01 1.525e+03
4 9 -1.035980e+04 3.536e+00 1.000e+00 9.587e+00 1.387e+03
5 12 -5.270039e+03 2.143e+00 7.000e-01 4.865e+00 2.804e+02
6 14 -2.538946e+03 2.855e-02 1.000e+00 2.229e+00 1.715e+03
7 16 -2.703320e+03 2.330e-02 1.000e+00 5.517e-01 2.521e+02
8 19 -2.845099e+03 0.000e+00 1.000e+00 1.752e+00 8.873e+01
9 21 -2.896934e+03 2.150e-03 1.000e+00 1.709e-01 1.608e+01
10 23 -2.894135e+03 7.954e-06 1.000e+00 1.039e-02 2.028e+00
11 25 -2.894126e+03 4.113e-07 1.000e+00 2.312e-03 2.100e-01
12 27 -2.894125e+03 4.619e-09 1.000e+00 2.450e-04 1.471e-04
Feasible point with lower objective function value found.
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
Итеративное отображение показывает тот fmincon запускается в допустимой точке (выполнимость 0), тратит несколько неосуществимых итераций, снова достигает 0 выполнимости, затем имеет маленькую но ненулевую недопустимость для остающихся итераций. Решатель снова сообщает, что нашел более низкое выполнимое значение в точке кроме конечной точки xb. Просмотрите конечную точку и значение целевой функции и допустимую точку, о которой сообщают, с более низким значением целевой функции.
disp(xb)
-6.5000 -0.0000 -3.5000
disp(fvalb)
-2.8941e+03
disp(outputb.bestfeasible)
x: [-6.5000 2.4500e-04 -3.5000]
fval: -2.8941e+03
constrviolation: 4.1127e-07
firstorderopt: 0.2100
Нарушение ограничений в bestfeasible точка о 4.113e-7. В итеративном отображении эта недопустимость происходит в итерации 11. Значением целевой функции, о котором сообщают, в той итерации является -2.894126e3, который немного меньше окончательного значения -2.894125e3. Конечная точка имеет более низкую недопустимость и меру оптимальности первого порядка. Какая точка лучше? Они - почти то же самое, но каждая точка имеет некоторое требование того, чтобы быть лучше. Чтобы видеть детали решения, установите формат отображения на long.
format long table([fvalb;outputb.bestfeasible.fval],... [outputb.constrviolation;outputb.bestfeasible.constrviolation],... [outputb.firstorderopt;outputb.bestfeasible.firstorderopt],... 'VariableNames',["Function Value" "Constraint Violation" "First-Order Optimality"],... 'RowNames',["Final Point" "Best Feasible"])
ans=2×3 table
Function Value Constraint Violation First-Order Optimality
_________________ ____________________ ______________________
Final Point -2894.12500606454 4.61884486213648e-09 0.000147102542086941
Best Feasible -2894.12553454177 4.11274928779903e-07 0.210022995438408
Другой способ получить возможное решение состоит в том, чтобы использовать 'interior-point' алгоритм, даже без границ,
lb = []; ub = []; options.Algorithm = "interior-point"; [xip,fvalip,eflagip,outputip] = fmincon(@bigtoleft,x0,... A,b,Aeq,beq,lb,ub,@twocone,options);
First-order Norm of
Iter F-count f(x) Feasibility optimality step
0 1 -1.625000e-03 0.000e+00 7.807e-02
1 2 -2.374253e-02 0.000e+00 5.222e-01 8.101e-02
2 3 -2.232989e+02 0.000e+00 2.379e+02 2.684e+00
3 4 -3.838433e+02 1.768e-01 3.198e+02 5.573e-01
4 5 -3.115565e+03 1.810e-01 1.028e+03 4.660e+00
5 6 -3.143463e+03 2.013e-01 8.965e+01 5.734e-01
6 7 -2.917730e+03 1.795e-02 6.140e+01 5.231e-01
7 8 -2.894095e+03 0.000e+00 9.206e+00 1.821e-02
8 9 -2.894107e+03 0.000e+00 2.500e+00 3.899e-03
9 10 -2.894142e+03 1.299e-05 2.136e-03 1.371e-02
10 11 -2.894125e+03 3.614e-08 4.070e-03 1.739e-05
11 12 -2.894125e+03 0.000e+00 5.994e-06 5.832e-08
Feasible point with lower objective function value found.
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
Итеративное отображение снова показывает fmincon достигание точек, которые неосуществимы в его поиске решения и fmincon снова выпускает сообщение, что это столкнулось с допустимой точкой с более низким значением целевой функции.
disp(xip)
-6.499999996950366 -0.000000032933162 -3.500000000098132
disp(fvalip)
-2.894124995999976e+03
disp(outputip.bestfeasible)
x: [1x3 double]
fval: -2.894125047137579e+03
constrviolation: 3.613823285064655e-08
firstorderopt: 0.004069724066085
Снова, эти два решения являются почти тем же самым и bestfeasible решение прибывает из итерации перед концом. Конечное решение xip имеет лучшую меру оптимальности первого порядка и выполнимость, но bestfeasible решение имеет немного более низкое значение целевой функции и недопустимость что это не слишком большой.
table([fvalip;outputip.bestfeasible.fval],... [outputip.constrviolation;outputip.bestfeasible.constrviolation],... [outputip.firstorderopt;outputip.bestfeasible.firstorderopt],... 'VariableNames',["Function Value" "Constraint Violation" "First-Order Optimality"],... 'RowNames',["Final Point" "Best Feasible"])
ans=2×3 table
Function Value Constraint Violation First-Order Optimality
_________________ ____________________ ______________________
Final Point -2894.12499599998 0 5.99383553128062e-06
Best Feasible -2894.12504713758 3.61382328506465e-08 0.00406972406608475
Наконец, сбросьте формат к short по умолчанию.
format shortЭтот код создает bigtoleft функция помощника.
function [f gradf] = bigtoleft(x) % This is a simple function that grows rapidly negative % as x(1) becomes negative % f = 10*x(:,1).^3 + x(:,1).*x(:,2).^2 + x(:,3).*(x(:,1).^2 + x(:,2).^2); if nargout > 1 gradf=[30*x(1)^2+x(2)^2+2*x(3)*x(1); 2*x(1)*x(2)+2*x(3)*x(2); (x(1)^2+x(2)^2)]; end end
Этот код создает twocone функция помощника.
function [c ceq gradc gradceq] = twocone(x) % This constraint is two cones, z > -10 + r % and z < 3 - r ceq = []; r = sqrt(x(1)^2 + x(2)^2); c = [-10+r-x(3); x(3)-3+r]; if nargout > 2 gradceq = []; gradc = [x(1)/r,x(1)/r; x(2)/r,x(2)/r; -1,1]; end end
Этот код создает функцию, которая строит нелинейные ограничения.
function figure1 = plottwoconecons % Create figure figure1 = figure; % Create axes axes1 = axes('Parent',figure1); view([-63.5 18]); grid('on'); hold('all'); % Set up polar coordinates and two cones r = linspace(0,6.5,14); th = 2*pi*linspace(0,1,40); x = r'*cos(th); y = r'*sin(th); z = -10+sqrt(x.^2+y.^2); zz = 3-sqrt(x.^2+y.^2); % Evaluate objective function on cone surfaces newxf = reshape(bigtoleft([x(:),y(:),z(:)]),14,40)/3000; newxg = reshape(bigtoleft([x(:),y(:),z(:)]),14,40)/3000; % Create lower surf with color set by objective surf(x,y,z,newxf,'Parent',axes1,'EdgeAlpha',0.25); % Create upper surf with color set by objective surf(x,y,zz,newxg,'Parent',axes1,'EdgeAlpha',0.25); axis equal xlabel 'x(1)' ylabel 'x(2)' zlabel 'x(3)' end