Квадратичная минимизация со связанными ограничениями

Чтобы минимизировать крупномасштабное квадратичное с верхними и нижними границами, можно использовать функцию quadprog с алгоритмом 'trust-region-reflective'.

Проблема, сохраненная в MAT-файле, qpbox1.mat является положительным определенным квадратичным, и матрица Гессиана H, трехдиагональна согласно верхнему (ub) и ниже (lb) границы.

Шаг 1: Загрузите Гессиан и задайте f, lb, и ub.

load qpbox1   % Get H
lb = zeros(400,1); lb(400) = -inf;
ub = 0.9*ones(400,1); ub(400) = inf;
f = zeros(400,1); f([1 400]) = -2;

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

xstart = 0.5*ones(400,1);
options = optimoptions('quadprog','Algorithm','trust-region-reflective');
[x,fval,exitflag,output] = ... 
        quadprog(H,f,[],[],[],[],lb,ub,xstart,options);

Смотря на получившиеся значения exitflag, output.iterations и output.cgiterations,

exitflag,output.iterations,output.cgiterations

exitflag =

     3


ans =

    19


ans =

        1637

Вы видите, что, в то время как сходимость произошла в 19 итерациях, высокое количество итераций CG указывает, что стоимость решения линейной системы высока. В свете этой стоимости попытайтесь использовать прямой решатель в каждой итерации путем установки опции SubproblemAlgorithm на 'factorization':

options = optimoptions(options,'SubproblemAlgorithm','factorization');
[x,fval,exitflag,output] = ... 
        quadprog(H,f,[],[],[],[],lb,ub,xstart,options);

Теперь количество итераций спало 10:

exitflag,output.iterations,output.cgiterations

exitflag =

     3


ans =

    10


ans =

     0

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

Можно также использовать алгоритм 'interior-point-convex' по умолчанию, чтобы решить эту выпуклую проблему:

options = optimoptions('quadprog','Algorithm','interior-point-convex');
[x,fval,exitflag,output] = ... 
        quadprog(H,f,[],[],[],[],lb,ub,[],options);

Проверяйте выходной флаг, и итерации (алгоритм внутренней точки не использует итерации CG):

exitflag,output.iterations

exitflag =

     1


ans =

     8
Для просмотра документации необходимо авторизоваться на сайте