Минимизация с линейными ограничениями равенства

Отражающий метод доверительной области для fmincon может обработать линейные ограничения равенства, если никакие другие ограничения не существуют. Предположим, что вы хотите минимизировать

f(x)=i=1n1((xi2)(xi+12+1)+(xi+12)(xi2+1)),

подвергните некоторым линейным ограничениям равенства. Целевая функция закодирована в функциональном brownfgh.m. Этот пример берет n = 1000. Кроме того, файл browneq.mat содержит матрицы Aeq и beq, которые представляют линейные ограничения Aeq · x = beq. Aeq имеет 100 строк, представляющих 100 линейных ограничений (таким образом, Aeq 100 1000 матрица).

Шаг 1: Запишите файл brownfgh.m, который вычисляет целевую функцию, градиент цели и разреженную трехдиагональную матрицу Гессиана.

Файл длинен, так не включен здесь. Просмотрите код с командой

type brownfgh

Поскольку brownfgh вычисляет градиент и значения Гессиана, а также целевую функцию, необходимо использовать optimoptions, чтобы указать, что эта информация доступна в brownfgh, с помощью опций Hessian и SpecifyObjectiveGradient.

Разреженная матрица Aeq и векторный beq доступна в файле browneq.mat:

load browneq

Линейная ограничительная система 100 1000, не структурировал разреженность (используйте spy (Aeq), чтобы просмотреть структуру разреженности), и не слишком ужасно плохо обусловлено:

condest(Aeq*Aeq')
ans =
  2.9310e+006

Шаг 2: Вызовите нелинейную стандартную программу минимизации с отправной точкой xstart.

fun = @brownfgh;
load browneq          % Get Aeq and beq, the linear equalities
n = 1000;
xstart = -ones(n,1); xstart(2:2:n) = 1;
options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'HessianFcn','objective',...
    'Algorithm','trust-region-reflective');
[x,fval,exitflag,output] = ...
   fmincon(fun,xstart,[],[],Aeq,beq,[],[],[],options);

fmincon распечатывает следующее выходное сообщение:

Local minimum possible.

fmincon stopped because the final change in function value relative to 
its initial value is less than the default value of the function tolerance.

Значение exitflag 3 также указывает, что алгоритм остановился, потому что изменение в значении целевой функции было меньше, чем допуск FunctionTolerance. Итоговое значение функции дано fval. Ограничения удовлетворены, как вы видите в output.constrviolation

exitflag,fval,output.constrviolation

exitflag =

     3


fval =

  205.9313


ans =

   2.2071e-13

Линейные равенства удовлетворены в x.

norm(Aeq*x-beq)

ans =
    1.1858e-12

Похожие темы