Несколько решателей оптимизации принимают нелинейные ограничения, включая fmincon
, fseminf
, fgoalattain
, fminimax
, и решатели Global Optimization Toolbox 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
всегда приводите к неосуществимой точке. В этом случае решатель может перестать работать или остановиться преждевременно. Обеспечение градиента позволяет решателю продолжать.
Чтобы включать информацию о градиенте, запишите функцию conditionalized можно следующим образом:
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
Смотрите Пишущие Скалярные Целевые функции для получения информации о функциях conditionalized. Матрица градиента имеет форму
gradc
i, j = [∂c
(j) / ∂xi].
Первый столбец матрицы градиента сопоставлен с 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 Вычисляет Градиенты и Гессианы.
Нелинейные ограничительные функции должны возвратить два выходных параметра. Первый выход соответствует нелинейным неравенствам, и второе соответствует нелинейным равенствам.
Анонимные функции возвращают всего один выходной параметр. Таким образом, как можно записать анонимную функцию как нелинейное ограничение?
deal
функция распределяет несколько выходных параметров. Например, предположите, что у вас есть нелинейные неравенства
Предположим, что у вас есть нелинейное равенство
x 2 = tanh (x 1).
Запишите нелинейную ограничительную функцию можно следующим образом:
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));
Чтобы минимизировать функциональную дубинку (x 1) + sinh (x 2) подвергают ограничениям в 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 default value of the function tolerance, and constraints are satisfied to within the default value of the constraint tolerance. z = -0.6530 -0.5737
Проверять как хорошо получившаяся точка z
удовлетворяет ограничениям, используйте nonlinfcn
:
[cout,ceqout] = nonlinfcn(z) cout = -0.8704 0 ceqout = 0
z
удовлетворяет всем ограничениям к в значении по умолчанию допуска ограничения ConstraintTolerance
, 1e-6
.
Для получения информации об анонимных целевых функциях смотрите Цели Анонимной функции.
GlobalSearch
| MultiStart
| fgoalattain
| fmincon
| ga
| patternsearch