В общем случае решатели принимают ограничения с неявным И:
ограничение 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 является локальным минимумом.