# lsqnonneg

## 语法

``x = lsqnonneg(C,d)``
``x = lsqnonneg(C,d,options)``
``x = lsqnonneg(problem)``
``[x,resnorm,residual] = lsqnonneg(___)``
``[x,resnorm,residual,exitflag,output] = lsqnonneg(___)``
``[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___)``

## 说明

``x = lsqnonneg(C,d)` 返回在 `x ≥ 0` 的约束下，使得 `norm(C*x-d)` 最小的向量 `x`。参量 `C` 和 `d` 必须为实数。`

``x = lsqnonneg(C,d,options)` 使用结构体 `options` 中指定的优化选项求最小值。使用 `optimset` (Optimization Toolbox) 可设置这些选项。`
``x = lsqnonneg(problem)` 求 `problem` 的最小值，其中 `problem` 是一个结构体。`

``[x,resnorm,residual] = lsqnonneg(___)`，对于上述任何语法，还返回残差的 2-范数平方值 `norm(C*x-d)^2` 以及残差 `d-C*x`。`
``[x,resnorm,residual,exitflag,output] = lsqnonneg(___)` 还返回描述 `lsqnonneg` 的退出条件的值 `exitflag`，以及提供优化过程信息的结构体 `output`。`

``[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___)` 还返回拉格朗日乘数向量 `lambda`。`

## 示例

```C = [0.0372 0.2869 0.6861 0.7071 0.6233 0.6245 0.6344 0.6170]; d = [0.8587 0.1781 0.0747 0.8405];```

`x = lsqnonneg(C,d)`
```x = 2×1 0 0.6929 ```
`xunc = C\d`
```xunc = 2×1 -2.5627 3.1108 ```

`x` 中的所有项均为非负数，但 `xunc` 中某些项为负数。

`constrained_norm = norm(C*x - d)`
```constrained_norm = 0.9118 ```
`unconstrained_norm = norm(C*xunc - d)`
```unconstrained_norm = 0.6674 ```

`Display` 选项设置为 `'final'`，以查看 `lsqnonneg` 结束时的输出。

`options = optimset('Display','final');`

```C = [0.0372 0.2869 0.6861 0.7071 0.6233 0.6245 0.6344 0.6170]; d = [0.8587 0.1781 0.0747 0.8405];```

`x = lsqnonneg(C,d,options);`
```Optimization terminated. ```

```C = [0.0372 0.2869 0.6861 0.7071 0.6233 0.6245 0.6344 0.6170]; d = [0.8587 0.1781 0.0747 0.8405];```

` [x,resnorm,residual] = lsqnonneg(C,d)`
```x = 2×1 0 0.6929 ```
```resnorm = 0.8315 ```
```residual = 4×1 0.6599 -0.3119 -0.3580 0.4130 ```

` norm(residual)^2`
```ans = 0.8315 ```

`lsqnonneg` 完成之后，请求所有输出参量，以检查解和求解过程。

```C = [0.0372 0.2869 0.6861 0.7071 0.6233 0.6245 0.6344 0.6170]; d = [0.8587 0.1781 0.0747 0.8405];```

`[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)`
```x = 2×1 0 0.6929 ```
```resnorm = 0.8315 ```
```residual = 4×1 0.6599 -0.3119 -0.3580 0.4130 ```
```exitflag = 1 ```
```output = struct with fields: iterations: 1 algorithm: 'active-set' message: 'Optimization terminated.' ```
```lambda = 2×1 -0.1506 -0.0000 ```

`exitflag``1`，表示正确的解。

`x(1) = 0`，对应的 `lambda(1)` $\ne$ `0`，表示正确的对偶性。同样，`x(2) > 0`，对应的 `lambda(2) = 0`

## 输入参数

 `Display` 显示级别：`'notify'`（默认值）仅在函数未收敛时显示输出。`'off'` 或 `'none'` 不显示输出。`'final'` 仅显示最终输出。 `TolX` 关于正标量 `x` 的终止容差。默认值为 `10*eps*norm(C,1)*length(C)`。请参阅 容差和终止条件。

`C`

`d`

`solver`

`'lsqnonneg'`

`options`

Options 结构体，例如 `optimset` 返回的结构体

## 输出参量

`lsqnonneg` 停止的原因，以整数形式返回。

 `1` 函数收敛于解 `x`。 `0` 迭代次数超出 `options.MaxIter`。

 `iterations` 执行的迭代次数 `algorithm` `'active-set'` `message` 退出消息

## 算法

`lsqnonneg` 使用 [1] 中所述的算法。算法以一组可能的基向量开始并计算关联的对偶向量 `lambda`。然后将选择对应于 `lambda` 中的最大值的基向量，以便将该基向量交换为其他可能的向量。此操作会一直继续，直至 `lambda ≤ 0`

## 参考

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