В этом примере показано, как решить задачу оптимизации, содержащую нелинейные ограничения. Включение нелинейных ограничений путем записи функции, которая вычисляет значения ограничений равенства и неравенства. Нелинейная функция ограничения имеет синтаксис
[c,ceq] = nonlinconstr(x)
Функция c(x) представляет ограничение c(x) <= 0. Функция ceq(x) представляет ограничение ceq(x) = 0.
Примечание.Функция нелинейных ограничений должна возвращать оба значения c(x) и ceq(x), даже если имеется только один тип нелинейного ограничения. Если ограничение не существует, возвращайте функцию [] для этого ограничения.
Предположим, что имеется ограничение нелинейного равенства
и ограничение нелинейного неравенства
.
Перезаписать эти ограничения как
confuneq вспомогательная функция в конце этого примера реализует эти неравенства в правильном синтаксисе.
Решить проблему
4x1x2 + 2x2 + 1)
с учетом ограничений. 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