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

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

Рассмотрите, как решить

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

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

x 1x2 x 1x 2 ≤ –1.5,
x 1x2 ≥ –10.

Чтобы решить задачу, использующую аналитически определенные градиенты, сделайте следующее.

Шаг 1: Запишите файл для целевой функции и градиента.

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

Шаг 2: Запишите файл для нелинейных ограничений и градиентов нелинейных ограничений.

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

gradf содержит частные производные целевой функции, f, возвращенный objfungrad(x), относительно каждого из элементов в x:

f=[ex1(4x12+2x22+4x1x2+2x2+1)+ex1(8x1+4x2)ex1(4x1+4x2+2)].(1)

Столбцы DC содержите частные производные для каждого соответствующего ограничения (т.е. iстолбец th DC частная производная iограничение th относительно x). Таким образом в вышеупомянутом примере, DC

[c1x1c2x1c1x2c2x2]=[x21x2x11x1].(2)

Поскольку вы обеспечиваете градиент цели в objfungrad.m и градиент ограничений в confungrad.m, необходимо сказать fmincon то, что эти файлы содержат эту дополнительную информацию. Используйте optimoptions поворачивать опции SpecifyObjectiveGradient и SpecifyConstraintGradient к true в существующем options примера:

options = optimoptions(options,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);

Если вы не устанавливаете эти опции на 'on', fmincon не использует аналитические градиенты.

Аргументы lb и ub поместите нижние и верхние границы в независимые переменные в x. В этом примере нет никаких связанных ограничений, таким образом установите обоих на [].

Шаг 3: Вызовите ограниченную стандартную программу оптимизации.

x0 = [-1,1];            % Starting guess 
options = optimoptions(@fmincon,'Algorithm','sqp');
options = optimoptions(options,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);
lb = [ ]; ub = [ ];   % No upper or lower bounds
[x,fval] = fmincon(@objfungrad,x0,[],[],[],[],lb,ub,... 
   @confungrad,options);

Результаты:

x,fval
x =
    -9.5474    1.0474
fval =
     0.0236

[c,ceq] = confungrad(x) % Check the constraint values at x
c =
   1.0e-13 *
   -0.1066
    0.1066

ceq =
     []

Похожие темы