В этом примере показано, как решить скалярную задачу минимизации с нелинейными ограничениями неравенства. Проблема состоит в том, чтобы найти x, который решает
| (1) |
удовлетворяющее ограничениям
x 1x2 – x 1 – x 2 ≤ –1.5,
x 1x2 ≥ –10.
Поскольку ни одно из ограничений не линейно, вы не можете передать ограничения fmincon в командной строке. Вместо этого можно создать второй файл, confun.m, это возвращает значение при обоих ограничениях в текущем x в векторном c. Ограниченный оптимизатор, fmincon, затем вызывается. Поскольку fmincon ожидает, что ограничения будут написаны в форме c (x) ≤ 0, необходимо переписать ограничения в форме
| x 1x2 – x 1 – x 2 + 1,5 ≤ 0, – x 1x2 – 10 ≤ 0. | (2) |
function f = objfun(x) f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);
function [c, ceq] = confun(x)
% Nonlinear inequality constraints
c = [1.5 + x(1)*x(2) - x(1) - x(2);
-x(1)*x(2) - 10];
% Nonlinear equality constraints
ceq = [];x0 = [-1,1]; % Make a starting guess at the solution options = optimoptions(@fmincon,'Algorithm','sqp'); [x,fval] = ... fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);
fmincon производит решение x со значением функции fval:
x,fval
x =
-9.5474 1.0474
fval =
0.0236Можно оценить ограничения в решении путем ввода
[c,ceq] = confun(x)
Это возвращает числа близко к нулю, такой как
c =
1.0e-14 *
0.5107
-0.5329
ceq =
[]Обратите внимание на то, что оба ограничительных значения, к в маленьком допуске, меньше чем или равном 0; то есть, x удовлетворяет c (x) ≤ 0.