Нелинейное равенство и ограничения неравенства

Можно включать нелинейные ограничения путем записи функции, которая вычисляет и равенство и значения ограничения неравенства. Нелинейная ограничительная функция имеет синтаксис

[c,ceq] = nonlinconstr(x)

Функциональный c(x) представляет ограничение c(x) <= 0. Функциональный ceq(x) представляет ограничение ceq(x) = 0.

Примечание

У вас должно быть нелинейное ограничение функциональный возврат и c(x) и ceq(x), даже если у вас есть только один тип нелинейного ограничения. Если ограничение не существует, имейте функциональный возврат [] для того ограничения.

Например, если у вас есть нелинейное ограничение равенства x12+x2=1 и нелинейное ограничение неравенства x 1x2  ≥ –10, перепишите их как

x12+x21=0,x1x2100,

и затем решите проблему с помощью следующих шагов.

В данном примере решите проблему

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1).

подвергните этим нелинейным ограничениям.

Шаг 1: Запишите файл objfun.m.

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);

Шаг 2: Запишите файл confuneq.m для нелинейных ограничений.

function [c,ceq] = confuneq(x)
% Nonlinear inequality constraints
c = -x(1)*x(2) - 10;
% Nonlinear equality constraints
ceq = x(1)^2 + x(2) - 1;

Шаг 3: Вызовите ограниченную стандартную программу оптимизации.

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, как желаемый.

Похожие темы