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

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

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

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

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

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 нелинейная ограничительная функция; это появляется в конце этого примера.

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

[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 Алгоритме Внутренней точки с Аналитическим Гессианом, приносит еще больше пользы, такой как меньше итераций решателя.

Функции помощника

Этот код создает 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

Похожие темы