Чтобы минимизировать крупномасштабное квадратичное с верхними и нижними границами, можно использовать функцию quadprog с алгоритмом 'trust-region-reflective'.
Проблема, сохраненная в MAT-файле, qpbox1.mat является положительным определенным квадратичным, и матрица Гессиана H, трехдиагональна согласно верхнему (ub) и ниже (lb) границы.
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;
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