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