Main Content

Solve nonnegative linear least-squares problem

Solve nonnegative least-squares curve fitting problems of the form

$$\underset{x}{\mathrm{min}}{\Vert C\cdot x-d\Vert}_{2}^{2},\text{where}x\ge 0.$$

**Note**

`lsqnonneg`

applies only to the solver-based approach. For a discussion
of the two optimization approaches, see First Choose Problem-Based or Solver-Based Approach.

For problems where

`d`

has length over 20,`lsqlin`

might be faster than`lsqnonneg`

. When`d`

has length under 20,`lsqnonneg`

is generally more efficient.To convert between the solvers when

`C`

has more rows than columns (meaning the system is overdetermined),[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)

is equivalent to

[m,n] = size(C); [x,resnorm,residual,exitflag,output,lambda_lsqlin] = ... lsqlin(C,d,-eye(n,n),zeros(n,1));

The only difference is that the corresponding Lagrange multipliers have opposite signs:

`lambda = -lambda_lsqlin.ineqlin`

.

`lsqnonneg`

uses the algorithm described in [1]. The algorithm starts with a set
of possible basis vectors and computes the associated dual vector `lambda`

.
It then selects the basis vector corresponding to the maximum value
in `lambda`

to swap it out of the basis in exchange
for another possible candidate. This continues until `lambda ≤ 0`

.

The **Optimize** Live Editor task provides a visual interface for `lsqnonneg`

.

[1] Lawson, C. L. and R. J. Hanson. *Solving
Least-Squares Problems*. Upper Saddle River, NJ: Prentice
Hall. 1974. Chapter 23, p. 161.