Можно включать нелинейные ограничения путем записи функции, которая вычисляет и ограничение равенства и значения ограничения неравенства. Нелинейная ограничительная функция имеет синтаксис
[c,ceq] = nonlinconstr(x)
Функциональный c(x) представляет ограничение c(x) <= 0. Функциональный ceq(x) представляет ограничение ceq(x) = 0.
У вас должно быть нелинейное ограничение функциональный возврат оба c(x) и ceq(x), даже если у вас есть только один тип нелинейного ограничения. Если ограничение не существует, имейте функциональный возврат [] для того ограничения.
Например, если у вас есть нелинейное ограничение равенства и нелинейное ограничение неравенства x 1x2 ≥ –10, перепишите их как
и затем решите задачу с помощью следующих шагов.
В данном примере решите задачу
подвергните этим нелинейным ограничениям.
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] = confuneq(x) % Nonlinear inequality constraints c = -x(1)*x(2) - 10; % Nonlinear equality constraints ceq = x(1)^2 + x(2) - 1;
x0 = [-1,1]; % Make a starting guess at the solution options = optimoptions(@fmincon,'Algorithm','sqp'); [x,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],... @confuneq,options);
После 21 функциональной оценки произведенное решение
x,fval
x =
-0.7529 0.4332
fval =
1.5093
[c,ceq] = confuneq(x) % Check the constraint values at x
c =
-9.6739
ceq =
-2.2204e-16Обратите внимание на то, что ceq равно 0 в допуске по умолчанию на ограничениях 1.0e-006 и тот c меньше чем или равно 0, как желаемый.