Этот пример показывает, как преобразовать положительную полуопределенную квадратичную задачу программирования в форму конуса второго порядка, используемую coneprog
решатель. Квадратичная задача программирования имеет вид
,
возможно, удовлетворяющее границам и линейным ограничениям. coneprog
решает задачи в форме
таким, что
,
возможно, удовлетворяющее границам и линейным ограничениям.
Чтобы преобразовать квадратичную программу в coneprog
форма, сначала вычислите матричный квадратный корень матрицы . Принимая, что - симметричная положительная полуопределенная матрица, команда
A = sqrtm(H);
возвращает положительную полуопределенную матрицу A
таким образом A'*A = A*A = H
. Поэтому,
.
Измените форму квадратичной программы следующим образом:
где удовлетворяет ограничению
.
Расширьте переменную управления кому , который включает в себя как его последний элемент:
.
Расширьте матрицы и векторы ограничения конуса второго порядка следующим образом:
.
Расширьте вектор коэффициента также:
.
С точки зрения новых переменных, квадратичная задача программирования становится
где
.
Это квадратичное ограничение становится ограничением конуса посредством следующего вычисления, которое использует более ранние определения , , и :
.
Квадратичная программа имеет то же решение что и соответствующая конусная программа. Единственное различие - это добавленный термин в программе конуса.
The quadprog
документация приводит этот пример.
H = [1,-1,1 -1,2,-2 1,-2,4]; f = [-7;-12;-15]; lb = zeros(3,1); ub = ones(size(lb)); Aineq = [1,1,1]; bineq = 3; [xqp fqp] = quadprog(H,f,Aineq,bineq,[],[],lb,ub)
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.
xqp = 3×1
1
1
1
fqp = -32.5000
Ссылаясь на описание в начале этого примера, задайте переменные ограничения конуса второго порядка, а затем вызовите coneprog
функция.
Asc = sqrtm(H); Asc((end+1),(end+1)) = 1; d = [zeros(size(f(:)));1]; gamma = -1; b = zeros(size(d)); qp = secondordercone(Asc,b,d,gamma); Aq = Aineq; Aq(:,(end+1)) = 0; lb(end+1) = -Inf; ub(end+1) = Inf; [u,fval,eflag] = coneprog([f(:);1],qp,Aq,bineq,[],[],lb,ub)
Optimal solution found.
u = 4×1
1.0000
1.0000
1.0000
1.0000
fval = -33.0000
eflag = 1
Первые три элемента конусного решения u
равны элементам квадратичного решения программирования xqp
, для отображения точности:
disp([xqp,u(1:(end-1))])
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
Возвращенное значение квадратичной функции fqp
- значение возвращенного конуса минус 1/2, когда положительно, или плюс 1/2, когда отрицательно.
disp([fqp-sign(2*u(end)+1)*1/2 fval])
-33.0000 -33.0000
coneprog
| quadprog
| secondordercone