Least squares

To solve a linear least-squares problem, simply build the matrices that define it and call the solve_ls() function:

from numpy import array, dot
from qpsolvers import solve_ls

R = array([[1., 2., 0.], [-8., 3., 2.], [0., 1., 1.]])
s = array([3., 2., 3.])
G = array([[1., 2., 1.], [2., 0., 1.], [-1., 2., -1.]])
h = array([3., 2., -2.]).reshape((3,))

x_sol = solve_ls(R, s, G, h, solver=solver, verbose=True)
print(f"LS solution: x = {x}")

This example outputs the solution [-0.0530504, 0.0265252, 2.1061008]. The solve_ls() function accepts a solver keyword argument to select the backend solver:

qpsolvers.solve_ls(R, s, G=None, h=None, A=None, b=None, lb=None, ub=None, W=None, solver='quadprog', initvals=None, sym_proj=False, verbose=False, **kwargs)

Solve a constrained weighted linear Least Squares problem defined as:

\[\begin{split}\begin{split}\begin{array}{ll} \mbox{minimize} & \frac12 \| R x - s \|^2_W = \frac12 (R x - s)^T W (R x - s) \\ \mbox{subject to} & G x \leq h \\ & A x = b \\ & lb \leq x \leq ub \end{array}\end{split}\end{split}\]

using one of the available QP solvers.

  • R (Union[ndarray, csc_matrix, spmatrix]) – Symmetric matrix of the cost function (most solvers require it to be definite).

  • s (Union[ndarray, csc_matrix, spmatrix]) – Vector term of the cost function.

  • G (Union[ndarray, csc_matrix, spmatrix, None]) – Linear inequality matrix.

  • h (Union[ndarray, csc_matrix, spmatrix, None]) – Linear inequality vector.

  • A (Union[ndarray, csc_matrix, spmatrix, None]) – Linear equality matrix.

  • b (Union[ndarray, csc_matrix, spmatrix, None]) – Linear equality vector.

  • lb (Union[ndarray, csc_matrix, spmatrix, None]) – Lower bound constraint vector.

  • ub (Union[ndarray, csc_matrix, spmatrix, None]) – Upper bound constraint vector.

  • W (Union[ndarray, csc_matrix, spmatrix, None]) – Definite symmetric weight matrix used to define the norm of the cost function. The standard L2 norm (W = Identity) is used by default.

  • solver (str) – Name of the QP solver, to choose in qpsolvers.available_solvers.

  • initvals (Union[ndarray, csc_matrix, spmatrix, None]) – Vector of initial x values used to warm-start the solver.

  • sym_proj (bool) – Set to True when the R matrix provided is not symmetric.

  • verbose (bool) – Set to True to print out extra information.

Return type



Optimal solution if found, otherwise None.


Extra keyword arguments given to this function are forwarded to the underlying solvers. For example, OSQP has a setting eps_abs which we can provide by solve_ls(R, s, G, h, solver='osqp', eps_abs=1e-4).

See the examples/ folder in the repository for more advanced use cases. For a more general introduction you can also check out this post on least squares in Python.