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