В этом примере показано, как решить нелинейную задачу с нелинейными ограничениями с помощью информации о производной.
Обычно в подпрограммах минимизации используются численные градиенты, рассчитанные с помощью аппроксимации конечных разностей. Эта процедура систематически возмущает каждую переменную для вычисления частных производных функций и ограничений. Кроме того, можно предоставить функцию для аналитического вычисления частных производных. Как правило, при предоставлении производной информации решатели работают более точно и эффективно.
Проблема в том, чтобы решить
+ 2x2 + 1),
с учетом ограничений
Потому что fmincon решатель ожидает, что ограничения будут записаны в форме 0, запишите функцию ограничения, чтобы вернуть следующее значение:
5-10-x1x2].
Целевая функция:
4x1x2 + 2x2 + 1).
Вычислите градиент ) относительно переменных x1 и x2.
(4x1 + 4x2 + 2)].
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