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