Этот пример показывает, как решить нелинейную задачу с нелинейными ограничениями с помощью информации о производной.
Обычно в стандартных программах минимизации используются числовые градиенты, вычисленные конечноразностным приближением. Эта процедура систематически возмущает каждую переменную в порядок, чтобы вычислить производные функции и ограничения. Также можно задать функцию для аналитического вычисления частных производных. Как правило, когда вы предоставляете информацию о производной, решатели работают более точно и эффективно.
Задача в том, чтобы решить
удовлетворяющее ограничениям
Потому что fmincon
решатель ожидает, что ограничения будут записаны в форму , напишите свою функцию ограничения, чтобы вернуть следующее значение:
.
Целевая функция является
.
Вычислите градиент относительно переменных и .
.
The objfungrad
вспомогательная функция в конце этого примера возвращает обе целевые функции и его градиент во втором выходном gradf
. Задайте @objfungrad
как цель.
fun = @objfungrad;
Функция помощника confungrad
- нелинейная функция ограничения; он появляется в конце этого примера.
Информация о производной для ограничения неравенства имеет каждый столбец, соответствующий одному ограничению. Другими словами, градиент ограничений имеет следующий формат:
Задайте @confungrad
как нелинейная функция ограничения.
nonlcon = @confungrad;
Указание на fmincon
решатель, что функции цели и ограничения обеспечивают информацию производной. Для этого используйте optimoptions
для установки SpecifyObjectiveGradient
и SpecifyConstraintGradient
значения опций в true
.
options = optimoptions('fmincon',... 'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);
Установите начальную точку равной [-1,1]
.
x0 = [-1,1];
Задача не имеет границ или линейных ограничений, поэтому установите эти значения аргументов равными []
.
A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
Функции fmincon
чтобы решить проблему.
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
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
-9.5473 1.0474
fval = 0.0236
Решение такое же, как в примере Нелинейные Ограничения Неравенства, который решает задачу, не используя производную информацию. Преимущество использования производных в том, что решение задачи принимает меньше вычислений функции, получая при этом робастность, хотя это преимущество не очевидно в этом примере. Использование еще большей производной информации, как в fmincon Interior-Point Algorithm with Analytic Hessian, дает еще больше преимуществ, таких как меньше итераций решателя.
Этот код создает objfungrad
вспомогательная функция.
function [f,gradf] = objfungrad(x) f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1); % Gradient of the objective function: if nargout > 1 gradf = [ f + exp(x(1)) * (8*x(1) + 4*x(2)), exp(x(1))*(4*x(1)+4*x(2)+2)]; end end
Этот код создает confungrad
вспомогательная функция.
function [c,ceq,DC,DCeq] = confungrad(x) c(1) = 1.5 + x(1) * x(2) - x(1) - x(2); % Inequality constraints c(2) = -x(1) * x(2)-10; % No nonlinear equality constraints ceq=[]; % Gradient of the constraints: if nargout > 2 DC= [x(2)-1, -x(2); x(1)-1, -x(1)]; DCeq = []; end end