Можно включать нелинейные ограничения путем записи функции, которая вычисляет и ограничение равенства и значения ограничения неравенства. Нелинейная ограничительная функция имеет синтаксис
[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, как желаемый.