Этот пример показывает, как решить скалярную проблему минимизации с нелинейными ограничениями неравенства. Проблема состоит в том, чтобы найти 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.