exponenta event banner

Нелинейные зависимости с градиентами

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

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

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

Проблема в том, чтобы решить

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)].

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

fun = @objfungrad;

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

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

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

[∂c1∂x1∂c2∂x1∂c1∂x2∂c2∂x2]=[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

Связанные темы