Нелинейные ограничения с градиентами

Этот пример показывает, как решить нелинейную задачу с нелинейными ограничениями с помощью информации о производной.

Обычно в стандартных программах минимизации используются числовые градиенты, вычисленные конечноразностным приближением. Эта процедура систематически возмущает каждую переменную в порядок, чтобы вычислить производные функции и ограничения. Также можно задать функцию для аналитического вычисления частных производных. Как правило, когда вы предоставляете информацию о производной, решатели работают более точно и эффективно.

Целевая функция и нелинейное ограничение

Задача в том, чтобы решить

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1),

удовлетворяющее ограничениям

x1x2-x1-x2-1.5x1x2-10.

Потому что fmincon решатель ожидает, что ограничения будут записаны в форму c(x)  0, напишите свою функцию ограничения, чтобы вернуть следующее значение:

c(x)=[x1x2-x1-x2+1.5-10-x1x2].

Целевая функция с градиентом

Целевая функция является

f(x)=ex1(4x12+2x22+4x1x2+2x2+1).

Вычислите градиент f(x) относительно переменных x1 и x2.

f(x)=[f(x)+exp(x1)(8x1+4x2)exp(x1)(4x1+4x2+2)].

The objfungrad вспомогательная функция в конце этого примера возвращает обе целевые функции f(x) и его градиент во втором выходном gradf. Задайте @objfungrad как цель.

fun = @objfungrad;

Функция ограничения с градиентом

Функция помощника confungrad - нелинейная функция ограничения; он появляется в конце этого примера.

Информация о производной для ограничения неравенства имеет каждый столбец, соответствующий одному ограничению. Другими словами, градиент ограничений имеет следующий формат:

[c1x1c2x1c1x2c2x2]=[x2-1-x2x1-1-x1].

Задайте @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

Похожие темы