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

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

Создайте квадратичный матричный H как трехдиагональная симметрическая матрица размера 400 400 с записями +4 на основной диагонали и –2 на вне диагоналей.

Bin = -2*ones(399,1);
H = spdiags(Bin,-1,400,400);
H = H + H';
H = H + 4*speye(400);

Установите границы [0,0.9] в каждом компоненте кроме 400-го. Позвольте 400-му компоненту быть неограниченным.

lb = zeros(400,1);
lb(400) = -inf;
ub = 0.9*ones(400,1);
ub(400) = inf;

Установите линейный векторный f к нулям, кроме набора f(400) = –2.

f = zeros(400,1);
f(400) = -2;

Доверительная область отражающее решение

Решите квадратичную программу с помощью 'trust-region-reflective' алгоритм.

options = optimoptions('quadprog','Algorithm',"trust-region-reflective");
tic
[x1,fval1,exitflag1,output1] = ... 
        quadprog(H,f,[],[],[],[],lb,ub,[],options);
Local minimum possible.

quadprog stopped because the relative change in function value is less than the function tolerance.
time1 = toc
time1 = 0.0836

Исследуйте решение.

fval1,exitflag1,output1.iterations,output1.cgiterations
fval1 = -0.9930
exitflag1 = 3
ans = 18
ans = 1682

Алгоритм сходится в относительно немногих итерациях, но принимает тысячу итераций CG. Чтобы избежать итераций CG, установите опции использовать прямой решатель вместо этого.

options = optimoptions(options,'SubproblemAlgorithm','factorization');
tic
[x2,fval2,exitflag2,output2] = ... 
        quadprog(H,f,[],[],[],[],lb,ub,[],options);
Local minimum possible.

quadprog stopped because the relative change in function value is less than the function tolerance.
time2 = toc
time2 = 0.0180
fval2,exitflag2,output2.iterations,output2.cgiterations
fval2 = -0.9930
exitflag2 = 3
ans = 10
ans = 0

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

Решение внутренней точки

'interior-point-convex' по умолчанию алгоритм может решить эту задачу.

tic
[x3,fval3,exitflag3,output3] = ... 
    quadprog(H,f,[],[],[],[],lb,ub); % No options means use the default algorithm
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.

<stopping criteria details>
time3 = toc
time3 = 0.0435
fval3,exitflag3,output3.iterations
fval3 = -0.9930
exitflag3 = 1
ans = 8

Сравните результаты

Все алгоритмы дают то же значение целевой функции точности отображения, –0.9930.

'interior-point-convex' алгоритм берет наименьшее количество итераций. Однако 'trust-region-reflective' алгоритм с прямым подрешателем задач достигает самого быстрого решения.

tt = table([time1;time2;time3],[output1.iterations;output2.iterations;output3.iterations],...
    'VariableNames',["Time" "Iterations"],'RowNames',["TRR" "TRR Direct" "IP"])
tt=3×2 table
                    Time      Iterations
                  ________    __________

    TRR           0.083564        18    
    TRR Direct    0.018008        10    
    IP             0.04352         8