Несколько решателей оптимизации принимают нелинейные ограничения, включая 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