矩阵范数
Gauss 消元
Gauss 消元 设 `bm A` 是 `n` 阶可逆实方阵, `bm b` 是 `n` 维列向量.
用如下步骤求解线性方程组 `bm (A x) = bm b`:
- 将矩阵 `bm A` 与 `bm b` 合成一个增广矩阵 `[bm A, bm b]`.
- 从 `bm A` 的第一列找到绝对值最大的元素 `p = a_(i 1)`, 称为列主元.
由于 `bm A` 可逆, `|p| gt 0`.
- 将增广矩阵的第一行与第 `i` 行交换, 使得列主元占据左上角的位置.
- 对第一列进行 Gauss 消元.
将增广矩阵第一行的 `-a_(i 1)//p` 倍加到第 `i` 行, `i = 2, cdots, n`, 使得矩阵第一列除第一行外全为零, 形如
`[p, ast, ast;
0, bm A_2, bm b_2]`.
- 继续对右下角的矩阵 `[bm A_2, bm b_2]` 使用前面的步骤, 选主元并消元,
最终矩阵化为 `[bm R, bm c]`, 其中 `bm R` 是上三角矩阵, 对角元非零.
- 使用代入法轻松求解上三角形的方程组 `bm (R x) = bm c`:
`x_n = c_n//r_(n n)`,
`x_i = (c_i - sum_(j=i+1)^n r_(i j) x_j) // r_(i i)`,
`quad i = n-1, cdots, 1`.
求矩阵的秩
模仿 Gauss 消元的流程, 但只需化为上三角矩阵即可, 不需要代入的步骤.
一般消元法
对任意实矩阵 `bm A_(m xx n)` 和任意 `n` 维向量 `bm b` 求解线性方程组 `bm (A x) = bm b`.
- 选主元. 和 Gauss 消元一样, 从增广矩阵 `[bm A, bm b]` 开始, 遍历 `bm A` 的各列,
选出当前列的绝对值最大者作为列主元 (跳过那些已被选为主元的行).
- 消元步骤.
记第 `j` 列的主元是 `p = a_(i j)`. 首先将第 `i` 行同乘以 `1//p` 使主元化为 1, 再将这一行的
`-a_(k j)` 倍加到第 `k` 行, `k = 1, cdots, i-1, i+1, cdots, m`.
这样操作后, 第 `j` 列除主元所在行等于 1 以外, 其余元素均为 0.
- 退化情形. 当然, 有可能某一列的元素全为 0, 或者矩阵的每一行都已经选出主元,
导致当前列不存在有效主元. 在这两种情况下, 不能进行 2. 的消元步骤.
如果某一列选不出有效主元, 就称这一列对应的未知数为非基变量, 否则称为基变量.
- 解的存在.
理想情况下, 若 `bm A` 行满秩, 则每一行都能选出一个主元.
否则, 需要检查未能选出主元的那些行, 如果该行的常数项不为 0, 则方程无解.
- 求解步骤.
若方程有解, 把基变量留在方程左边, 非基变量移动到方程右边.
每个基变量的系数恰好都是 1, 方程形如
`bm (I x_1) = bm c - bm (B x_2)`,
其中 `bm x_1, bm x_2` 分别为基变量和非基变量, `bm c` 是常数项, `bm B` 是非基变量的系数矩阵.
方程的解已经显化出来:
`[bm x_1; bm x_2] = [bm c - bm B bm x_2; bm x_2]`,
`quad` 其中 `bm x_2` 取遍 `RR^(n-r)`.
QR 分解
QR 分解
[来自 知乎@Iterator]
设 `bm A` 是 `m xx n` 实矩阵, 且 `bm A` 的各列向量线性无关, 则存在唯一分解
`bm A_(m xx n) = bm Q_(m xx n) bm R_(n xx n)`.
其中 `bm Q` 满足各列向量单位正交, `bm R` 是主对角线全为正数的上三角矩阵.
QR 分解以矩阵的形式, 编码了 Schmidt 正交化的计算过程.
- 存在性.
对 `bm A` 的各列进行 Schmidt 正交化, 其中 `k_(i,j) = ((bm a_i, bm b_j))/((bm b_j, bm b_j))`:
`bm b_1 = bm a_1`,
`bm b_2 = bm a_2 - k_(2,1) bm b_1`,
`cdots`
`bm b_n = bm a_n - k_(n,1) bm b_1 - k_(n,2) bm b_2 - cdots - k_(n,n-1) bm b_(n-1)`.
再单位化,
`hat bm b_j = bm b_j/|bm b_j|`, `quad j = 1, cdots, n`.
写为矩阵形式就是
`bm A = (hat bm b_1, cdots, hat bm b_n)[
|bm b_1|, k_(2,1)|bm b_1|, cdots, k_(n,1)|bm b_1|;
, |bm b_2|, cdots, k_(n,2)|bm b_2|;
,,ddots,vdots;
,,,|bm b_n|
]`.
- 唯一性.
设 `bm A` 有 QR 分解 `bm A = bm Q_1 bm R_1 = bm Q_2 bm R_2`, 下证 `bm R_1 = bm R_2`.
由于 `bm Q_1, bm Q_2` 的各列向量单位正交, 有 `bm Q_1^T bm Q_1 = bm Q_2^T bm Q_2 = bm I`, 于是
`bm R_1^T bm R_1`
`= bm R_1^T bm Q_1^T bm Q_1 bm R_1`
`= bm A^T bm A`
`= bm R_2^T bm Q_2^T bm Q_2 bm R_2`
`= bm R_2^T bm R_2`.
上式两边左乘 `(bm R_2^T)^-1`, 右乘 `bm R_1^-1` 得
`(bm R_2^T)^-1 bm R_1^T = bm R_2 bm R_1^-1`.
上式左边是下三角矩阵, 右边是上三角矩阵, 但两边相等, 从而只能是对角形矩阵, 记为 `bm D`. 则 `bm R_2 = bm D bm R_1`. 于是
`bm R_1^T bm R_1`
`= bm R_2^T bm R_2`
`= bm R_1^T bm D^T bm D bm R_1`,
即 `bm D^T bm D = bm I`.
显然 `bm D` 的主对角线全为正, 故 `bm D = bm I`, 即 `bm R_1 = bm R_2`.
从而 `bm Q_1 = bm A bm R_1^-1 = bm A bm R_2^-1 = bm Q_2`.
# sympy 求 QR 分解
A.QRdecomposition()
注: 若 `bm A` 的列向量线性相关, 则 `bm Q` 含有零列, `bm R` 含有零行.
在最小二乘法中, 对于可能无解的实系数方程组 `bm (A x) = bm b`, 两边左乘 `bm A^T`, 转化为
`bm A^T bm A x = bm A^T bm b`, 我们需要计算
`bm x = (bm A^T bm A)^-1 bm A^T bm b`.
如果先将 `bm A` 分解为 `bm A = bm (Q R)`,
则上式化为
`bm x`
`= (bm R^T bm Q^T bm Q bm R)^-1 bm R^T bm Q^T bm b`
`= (bm R^T bm R)^-1 bm R^T bm Q^T bm b`
`= bm R^-1 bm Q^T bm b`.
从而将复杂度较高的矩阵求逆运算, 化为较容易的上三角矩阵 `bm R` 的求逆运算.
QR 分解 (基于 Householder 变换)
Householder 变换是指镜面反射, 或称反向正交变换.
它可以写为 `bm H(bm u) = bm I - 2 bm u bm u^T` 的形式, 其中 `bm u` 为单位向量.
由这里知道,
已知向量 `bm x` 和单位向量 `bm y`, 要使 `bm (H x)` 平行于 `bm y`,
只需取 `bm H = bm H(hat bm u)`, 其中
`bm u = bm x - |bm x| bm y`,
`quad hat bm u = bm u //|bm u|`.
记实矩阵 `bm A` 的第 `j` 列为 `bm a_j`,
又记 `bm e_i` 是第 `i` 个分量为 1, 其余分量为 0 的单位向量.
先作 Householder 变换 `bm H_1` 使得 `bm (H_1 bm a_1)` 平行于 `bm e_1`,
得到
`bm (H_1 A)`
`= [|bm a_1|, ast;
0, bm A_2]`.
对于右下角的 `bm A_2`, 继续以 Householder 变换 `bm H_2` 将它的第一列除第一行外的所有元素化为零.
最终得到上三角矩阵 `bm R = bm H_n cdots bm H_1 bm A`,
其中 `bm Q = bm H_n cdots bm H_1` 是正交矩阵.
特征值问题
下面这个定理可以帮助我们估计特征值的范围:
Gerschgorin (盖尔) 圆盘定理
设 `bm A in CC^(n xx n)`, 分别定义
行盖尔圆盘: `S_i := {z in CC: |z-a_(i i)| le sum_(j!=i) |a_(i j)|}`,
列盖尔圆盘: `G_i := {z in CC: |z-a_(i i)| le sum_(j!=i) |a_(j i)|}`.
行 (列) 盖尔圆盘的半径分别叫做去心行 (列) 和.
`bm A` 的任一特征值 `lambda` 必然落在某个行盖尔圆盘中,
也必然落在某个列盖尔圆盘中:
`lambda in (uuu_(i=1)^n S_i) nn (uuu_(i=1)^n G_i)`.
以行盖尔圆盘为例, 任取 `bm A` 的特征值 `lambda` 和特征向量 `bm x !=
0`, 又设 `x_i` 是 `bm x` 的各分量中模最大的一个, 则由 `bm (A x)
= lambda bm x` 知,
`sum_(j=1)^n a_(i j) x_j = lambda x_i`,
于是
`|x_i(a_(i i) - lambda)|`
`= |sum_(j!=i) a_(i j) x_j|`
`le |x_i| sum_(j!=i) |a_(i j)|`.
这说明 `lambda` 落在一个行盖尔圆盘中.
Jacobi 迭代法 适用于求实对称矩阵 `bm A` 的特征值与特征向量.
思想是作相似变换 `bm T^-1 bm A bm T`, 使得变换后的矩阵接近对角矩阵.
其中, `bm T = bm T(i, j, theta)` 是一个 Givens 旋转矩阵, 满足
`[T_(i i), T_(i j);
T_(j i), T_(j j)]`
`= [cos theta, -sin theta; sin theta, cos theta]`,
其它元素与单位矩阵 `bm I` 相同.
`i, j` 元的选择应当使得 `|A_(i j)|` 在非对角元上取得最大值, 称为主元 (pivot).
`theta` 的选择应当使得 `bm A^((1)) = bm T^-1 bm A bm T` 的 `i j` 元等于零, 即
`A^((1))_(i j) = A_(i j) cos 2 theta + (A_(i i) - A_(j j))/2 sin 2 theta = 0`.
于是
`theta = {1/2 arctan((2 A_(i j))/(A_(i i) - A_(j j))), if A_(i i) != A_(j j);
pi/4, otherwise:}`.
若干次迭代后, 得到一个近似对角阵 `bm Lambda = bm T^-1 bm A bm T`,
`bm Lambda` 的对角元即为 `bm A` 的特征值.
而 `bm T = bm T_1 bm T_2 cdots bm T_n` 的每一列都是 `bm A` 的一个特征向量.
由于 `bm T` 为正交矩阵, 这些特征向量恰好是单位向量.
# numpy 求特征向量
np.linalg.eig(A)
QR 迭代法 适用于求解一般实方阵 `bm A` 的特征值;
如果 `bm A` 是对称的可逆矩阵, 那么还能求出特征向量.
步骤如下:
- 先记 `bm A_1 = bm A`, 将它分解为正交矩阵乘以上三角阵: `bm A_1 = bm Q_1 bm R_1`.
- 然后记 `bm A_2 = bm R_1 bm Q_1 = bm Q_1^-1 bm A bm Q_1`, 于是 `bm A_2` 与 `bm A_1` 相似.
- 反复迭代使 `bm A_n` 收敛于上三角阵, 此时主对角元为 `bm A` 的特征值.
- 特别当 `bm A` 对称时, `bm A_n` 收敛于对角阵, 此时 `bm Q = bm Q_1 cdots bm Q_(n-1)`
的每一列是 `bm A` 的特征向量.
- `bm A` 不对称或不可逆时, 上述方法无法求出特征向量. 此时可以将特征值代入到特征方程
`(bm A - lambda bm I) bm x = bb 0` 来求解特征向量.
输出 eigvecs 的每一列表示一个特征向量, 重数大于 1 的特征值可能对应相同的特征向量 (见例3).