# Convert Quadratic Programming Problem to Second-Order Cone Program

This example show how to convert a positive semidefinite quadratic programming problem to the second-order cone form used by the `coneprog` solver. A quadratic programming problem has the form

$\underset{x}{\mathrm{min}}\frac{1}{2}{x}^{T}Hx+{f}^{T}x$,

possibly subject to bounds and linear constraints. `coneprog` solves problems in the form

`$\underset{x}{\mathrm{min}}{f}_{sc}^{T}x$`

such that

$‖{A}_{sc}x-{b}_{sc}‖\le {d}_{sc}^{T}x-\gamma$,

possibly subject to bounds and linear constraints.

To convert a quadratic program to `coneprog` form, first calculate the matrix square root of the matrix $H$. Assuming that $H$ is a symmetric positive semidefinite matrix, the command

```A = sqrtm(H); ```

returns a positive semidefinite matrix `A` such that `A'*A = A*A = H`. Therefore,

${x}^{T}Hx={x}^{T}{A}^{T}Ax=\left(Ax{\right)}^{T}Ax=‖Ax{‖}^{2}$.

Modify the form of the quadratic program as follows:

`$\underset{x}{\mathrm{min}}\frac{1}{2}{x}^{T}Hx+{f}^{T}x=-\frac{1}{2}+\underset{x,t}{\mathrm{min}}\left[\left(t+1/2\right)+{f}^{T}x\right]$`

where $t$ satisfies the constraint

$t+1/2\ge \frac{1}{2}{x}^{T}Hx$.

Extend the control variable $x$ to $u$, which includes $t$ as its last element:

$\mathit{u}=\left[\begin{array}{c}\mathit{x}\\ \mathit{t}\end{array}\right]$.

Extend the second-order cone constraint matrices and vectors as follows:

`${\mathit{A}}_{\mathrm{sc}}=\left[\begin{array}{cc}\mathit{A}& 0\\ 0& 1\end{array}\right]$`

`${\mathit{b}}_{\mathrm{sc}}=\left[\begin{array}{c}0\\ ⋮\\ 0\end{array}\right]$`

`${\mathit{d}}_{\mathrm{sc}}=\left[\begin{array}{c}0\\ ⋮\\ 0\\ 1\end{array}\right]$`

$\gamma =-1$.

Extend the coefficient vector $f$ as well:

${\mathit{f}}_{\mathrm{sc}}=\left[\begin{array}{c}\mathit{f}\\ 1\end{array}\right]$.

In terms of the new variables, the quadratic programming problem becomes

`$\underset{u}{\mathrm{min}}\frac{1}{2}{u}^{T}{A}_{sc}^{2}u+{f}_{sc}^{T}u=-1/2+\underset{u}{\mathrm{min}}\left[1/2+{f}_{sc}^{T}u\right]$`

where

$u\left(end\right)+1/2\ge \frac{1}{2}{u}^{T}{A}_{sc}u$.

This quadratic constraint becomes a cone constraint through the following calculation, which uses the earlier definitions of ${A}_{sc}$, ${d}_{sc}$, and $\gamma$:

`$\frac{1}{2}‖Hx{‖}^{2}=\frac{1}{2}{u}^{T}{A}_{sc}^{2}u\le t+\frac{1}{2}$`

`$‖Hx{‖}^{2}\le 2t+1$`

`$‖Hx{‖}^{2}+{t}^{2}\le {t}^{2}+2t+1=\left(t+1{\right)}^{2}$`

`$\sqrt{‖Hx{‖}^{2}+{t}^{2}}\le |t+1|=±\left(t+1\right)$`

But $‖Hx{‖}^{2}+{t}^{2}=‖{A}_{sc}u{‖}^{2}$. So, recalling that $\gamma =-1$ and the definition of ${d}_{sc}$, the inequality becomes

`$‖{A}_{sc}u‖\le ±\left(t-\gamma \right)$`

$‖{A}_{sc}u‖\le ±\left({d}_{sc}^{T}u-\gamma \right)$.

The quadratic program has the same solution as the corresponding cone program. The only difference is the added term $-1/2$ in the cone program.

### Numerical Example

The `quadprog` documentation gives this example.

```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 ```

Referring to the description at the beginning of this example, specify the second-order cone constraint variables, and then call the `coneprog` function.

```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 ```

The first three elements of the cone solution `u` are equal to the elements of the quadratic programming solution `xqp`, to display precision:

`disp([xqp,u(1:(end-1))])`
``` 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 ```

The returned quadratic function value `fqp` is the returned cone value minus 1/2 when $2t+1$ is positive, or plus 1/2 when $2t+1$ is negative.

`disp([fqp-sign(2*u(end)+1)*1/2 fval])`
``` -33.0000 -33.0000 ```