Этот пример показывает, как решить задачу оптимизации, содержащую нелинейные ограничения. Включите нелинейные ограничения путем написания функции, которая вычисляет значения ограничений равенств и неравенств. Нелинейная функция ограничения имеет синтаксис
[c,ceq] = nonlinconstr(x)
Функция c(x)
представляет ограничение c(x) <= 0
. Функция ceq(x)
представляет ограничение ceq(x) = 0
.
Примечание: Вы должны иметь нелинейную функцию ограничения возвращают оба c(x)
и ceq(x)
, даже если у вас есть только один тип нелинейного ограничения. Если ограничение не существует, иметь функцию возврата []
для этого ограничения.
Предположим, что у вас есть нелинейное ограничение равенства
и нелинейное ограничение неравенства
.
Перепишите эти ограничения как
The confuneq
вспомогательная функция в конце этого примера реализует эти неравенства в правильном синтаксисе.
Решите задачу
удовлетворяющее ограничениям. The objfun
вспомогательная функция в конце этого примера реализует эту целевую функцию.
Решите проблему, позвонив в fmincon
решатель. Этот решатель требует начальной точки; используйте точку x0 = [-1,-1]
.
x0 = [-1,-1];
Задача не имеет границ или линейных ограничений, поэтому установите эти входы равными []
.
A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
Вызовите решатель.
[x,fval] = fmincon(@objfun,x0,A,b,Aeq,beq,lb,ub,@confuneq)
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 = 1×2
-0.7529 0.4332
fval = 1.5093
Решатель сообщает, что ограничения выполняются в решении. Проверьте нелинейные ограничения в решении.
[c,ceq] = confuneq(x)
c = -9.6739
ceq = 2.0668e-12
c
меньше 0, как требуется. ceq
равно 0 в пределах допуска ограничений по умолчанию 1e-6
.
Следующий код создает confuneq
вспомогательная функция.
function [c,ceq] = confuneq(x) % Nonlinear inequality constraints c = -x(1)*x(2) - 10; % Nonlinear equality constraints ceq = x(1)^2 + x(2) - 1; end
Следующий код создает objfun
вспомогательная функция.
function f = objfun(x) f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1); end