Несколько решателей оптимизации принимают нелинейные ограничения, включая fmincon
, fseminf
, fgoalattain
, fminimax
, и решатели Global Optimization Toolbox ga
(Global Optimization Toolbox), gamultiobj
(Global Optimization Toolbox), patternsearch
(Global Optimization Toolbox), paretosearch
(Global Optimization Toolbox), GlobalSearch
(Global Optimization Toolbox), и MultiStart
(Global Optimization Toolbox). Нелинейные ограничения позволяют вам ограничить решение любой областью, которая может быть описана в терминах сглаженных функций.
Нелинейные ограничения неравенства имеют вид 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
Смотрите Запись Скалярных Целевых Функций для получения информации об обусловленных функциях. Градиентная матрица имеет вид
gradc
i, j = [ <reservedrangesplaceholder0>
(<reservedrangesplaceholder1>) / <reservedrangesplaceholder0>].
Первый столбец градиентной матрицы связан с c(1)
, и второй столбец связан с c(2)
. Эта производная форма является транспонированием формы якобийцев.
Чтобы иметь решатель, использующий градиенты нелинейных ограничений, укажите, что они существуют при помощи optimoptions
:
options = optimoptions(@fmincon,'SpecifyConstraintGradient',true);
Обязательно передайте структуру опций решателю:
[x,fval] = fmincon(@myobj,x0,A,b,Aeq,beq,lb,ub, ... @ellipseparabola,options)
Если у вас есть лицензия Symbolic Math Toolbox™, можно вычислить градиенты и Гессианы автоматически, как описано в разделе Вычислить градиенты и Гессианы Используя Symbolic Math Toolbox™.
Нелинейные функции ограничения должны возвращать два выхода. Первый выход соответствует нелинейным неравенствам, а второй - нелинейным равенствам.
Анонимные функции возвращают всего один выход. Так как можно записать анонимную функцию как нелинейное ограничение?
The deal
функция распределяет несколько выходов. Например, предположим, что у вас нелинейные неравенства
Предположим, что у вас нелинейное равенство
.
Напишите нелинейную функцию ограничения следующим образом.
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));
Чтобы минимизировать функцию удовлетворяющее ограничениям в 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
(Global Optimization Toolbox) | GlobalSearch
(Global Optimization Toolbox) | MultiStart
(Global Optimization Toolbox) | patternsearch
(Global Optimization Toolbox)