Несколько решателей оптимизации принимают нелинейные ограничения, включая fmincon, fseminf, fgoalattain, fminimaxи решатели панели инструментов глобальной оптимизации ga (инструментарий глобальной оптимизации), gamultiobj (инструментарий глобальной оптимизации), patternsearch (инструментарий глобальной оптимизации), paretosearch (инструментарий глобальной оптимизации), GlobalSearch(Панель инструментов глобальной оптимизации), и MultiStart(Панель инструментов глобальной оптимизации). Нелинейные ограничения позволяют ограничить решение любой областью, которая может быть описана в терминах гладких функций.
Нелинейные ограничения неравенства имеют вид c (x ) ≤ 0, где c - вектор ограничений, по одному компоненту для каждого ограничения. Аналогично, нелинейные ограничения равенства имеют вид ceq ( x) = 0.
Примечание
Функции нелинейных ограничений должны возвращать обе c и ceq, функции ограничения неравенства и равенства, даже если они не существуют. Вернуть пустую запись [] для несуществующего ограничения.
Например, предположим, что в качестве ограничений используются следующие неравенства:
Запишите эти ограничения в файл функции следующим образом:
function [c,ceq] = ellipseparabola(x) c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1; c(2) = x(1)^2 - x(2) - 1; ceq = []; end
ellipseparabola возвращает пустую запись [] для ceq, функция ограничения нелинейного равенства. Также второе неравенство переписывается в форму ≤ 0.Минимизация функции exp(x(1) + 2*x(2)) в соответствии с ellipseparabola ограничения.
fun = @(x)exp(x(1) + 2*x(2));
nonlcon = @ellipseparabola;
x0 = [0 0];
A = []; % No other constraints
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. x = -0.2500 -0.9375
При предоставлении градиентов для c и ceq решатель может работать быстрее и давать более надежные результаты.
Обеспечение градиента имеет еще одно преимущество. Решатель может достичь точки x такой, что x выполнимо, но конечные различия вокруг x всегда приводят к неосуществимой точке. В этом случае решатель может выйти из строя или остановиться преждевременно. Предоставление градиента позволяет продолжить работу решателя.
Чтобы включить информацию о градиенте, запишите обусловленную функцию следующим образом:
function [c,ceq,gradc,gradceq] = ellipseparabola(x) c(1) = x(1)^2/9 + x(2)^2/4 - 1; c(2) = x(1)^2 - x(2) - 1; ceq = []; if nargout > 2 gradc = [2*x(1)/9, 2*x(1); ... x(2)/2, -1]; gradceq = []; end
Сведения о условных функциях см. в разделе Запись скалярных целевых функций. Градиентная матрица имеет вид
gradci, j = [∂cj )/ ∂xi].
Первый столбец матрицы градиента связан с c(1), и второй столбец связан с c(2). Эта производная форма является транспонированием формы якобианцев.
Чтобы иметь решатель, используйте градиенты нелинейных ограничений, укажите, что они существуют с помощью optimoptions:
options = optimoptions(@fmincon,'SpecifyConstraintGradient',true);Убедитесь, что структура опций передана решателю:
[x,fval] = fmincon(@myobj,x0,A,b,Aeq,beq,lb,ub, ...
@ellipseparabola,options)При наличии лицензии на символьные математические Toolbox™ можно автоматически вычислять градиенты и гессены, как описано в разделе Расчет градиентов и гессенов с помощью символьных математических Toolbox™.
Функции нелинейных ограничений должны возвращать два выхода. Первый выход соответствует нелинейным неравенствам, а второй - нелинейным равенствам.
Анонимные функции возвращают только один выход. Как можно записать анонимную функцию как нелинейное ограничение?
deal функция распределяет множество выходов. Например, предположим, что у вас есть нелинейные неравенства
Предположим, что у вас есть нелинейное равенство
x1).
Запишите нелинейную функцию ограничения следующим образом.
c = @(x)[x(1)^2/9 + x(2)^2/4 - 1;
x(1)^2 - x(2) - 1];
ceq = @(x)tanh(x(1)) - x(2);
nonlinfcn = @(x)deal(c(x),ceq(x));Для минимизации функции x2) с учетом ограничений в nonlinfcn, использовать fmincon.
obj = @(x)cosh(x(1))+sinh(x(2)); opts = optimoptions(@fmincon,'Algorithm','sqp'); z = fmincon(obj,[0;0],[],[],[],[],[],[],nonlinfcn,opts)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
z = 2×1
-0.6530
-0.5737
Проверка правильности результирующей точки z удовлетворяет ограничениям, использование nonlinfcn.
[cout,ceqout] = nonlinfcn(z)
cout = 2×1
-0.8704
0
ceqout = 0
z удовлетворяет всем ограничениям в пределах значения допуска ограничения по умолчанию ConstraintTolerance, 1e-6.
Сведения об анонимных целевых функциях см. в разделе Анонимные целевые функции.
fgoalattain | fmincon | ga (инструментарий глобальной оптимизации) | GlobalSearch(Панель инструментов глобальной оптимизации) | MultiStart(Панель инструментов глобальной оптимизации) | patternsearch(Панель инструментов глобальной оптимизации)