exponenta event banner

Или вместо ограничений и

В общем случае решатели принимают ограничения с неявным И:

ограничение 1 И ограничение 2 И ограничение 3 удовлетворяются.

Однако иногда требуется ИЛИ:

ограничение 1 ИЛИ ограничение 2 ИЛИ ограничение 3 удовлетворено.

Эти составы не являются логически эквивалентными, и обычно нет возможности выразить ограничения ИЛИ в терминах ограничений И.

Совет

К счастью, нелинейные ограничения чрезвычайно гибки. Ограничения ИЛИ можно получить, просто установив для нелинейной функции ограничения минимум функций ограничения.

Причина, по которой можно установить минимальное значение в качестве ограничения, связана с характером нелинейных ограничений: они предоставляются в виде набора функций, которые должны быть отрицательными в осуществимой точке. Если ограничения

F1 (x) ≤ 0 ИЛИ F2 (x) ≤ 0 ИЛИ F3 (x) ≤ 0,

затем задайте функцию ограничения нелинейного неравенства c (x) как:

c (x) = мин (F1 (x), F2 (x), F3 (x)).

c (x) не является гладким, что является общим требованием для функций ограничения из-за минимума. Тем не менее метод часто работает.

Примечание

Нельзя использовать обычные границы и линейные ограничения в ограничении ИЛИ. Вместо этого преобразуйте границы и линейные ограничения в функции нелинейных ограничений, как в этом примере.

Например, предположим, что выполнимой областью является L-образная область: x находится в прямоугольнике -1 ≤ x (1 ) ≤ 1, 0 ≤ x ( 2) ≤ 1 ИЛИ x находится в прямоугольнике 0  x (1 ) ≤ 1, - 1 ≤ x ( 2) ≤ 1.

 Код для создания фигуры

Чтобы представить прямоугольник как нелинейное ограничение, а не как ограничивающие ограничения, создайте функцию, отрицательную внутри прямоугольника a ≤ x (1 ) ≤ b,  c ≤ x ( 2)  d:

function cout = rectconstr(x,a,b,c,d)
% Negative when  x is in the rectangle [a,b][c,d]
% First check that a,b,c,d are in the correct order

if (b <= a) || (d <= c)
    error('Give a rectangle a < b, c < d')
end

cout = max([(x(1)-b),(x(2)-d),(a-x(1)),(c-x(2))]);

В соответствии с предписанием использовать минимум функций нелинейных ограничений для L-образной области функция нелинейных ограничений имеет вид:

function [c,ceq] = rectconstrfcn(x)

ceq = []; % no equality constraint
F(1) = rectconstr(x,-1,1,0,1); % one rectangle
F(2) = rectconstr(x,0,1,-1,1); % another rectangle
c = min(F); % for OR constraints

 Код для создания фигуры

Предположим, что ваша целевая функция

fun = @(x)exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);

Минимизировать fun по Г-образной области:

opts = optimoptions(@fmincon,'Algorithm','interior-point','Display','off');
x0 = [-.5,.6]; % an arbitrary guess
[xsol,fval,eflag] = fmincon(fun,x0,[],[],[],[],[],[],@rectconstrfcn,opts)
xsol =

    0.4998   -0.9996


fval =

   2.4650e-07


eflag =

     1

Ясно, что решение xsol находится внутри Г-образной области. Флаг выхода: 1, указывая, что xsol является локальным минимумом.

См. также

Связанные темы