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

Чтобы минимизировать крупномасштабное квадратичное с верхними и нижними границами, можно использовать 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