基于Jacobi旋转的对称矩阵特征值分解算法
题目描述
Jacobi旋转算法是一种经典的、迭代求解实对称矩阵全部特征值和特征向量的方法。其核心思想是通过一系列正交相似变换(即Jacobi旋转),逐步将对称矩阵对角化,从而直接得到特征值(对角线元素)和特征向量(所有旋转矩阵的累积乘积)。
对于给定的 \(n \times n\) 实对称矩阵 \(A\),目标是找到正交矩阵 \(Q\) 和对角矩阵 \(\Lambda\),使得:
\[A = Q \Lambda Q^T \]
其中 \(\Lambda = \text{diag}(\lambda_1, \lambda_2, \dots, \lambda_n)\) 包含特征值,\(Q\) 的列向量为对应的特征向量。
循序渐进讲解
第一步:核心思想
Jacobi算法的基本策略是逐次消减非对角元。对于一个实对称矩阵,我们可以通过平面旋转(Givens旋转),每次选择一对非对角元中绝对值最大的那个 \((p, q)\),构造一个正交矩阵 \(J\),使得经过相似变换 \(A' = J^T A J\) 后,\(A'\) 的 \((p, q)\) 和 \((q, p)\) 元素变为零。通过不断重复这一过程,矩阵会越来越接近对角形式。迭代的极限就是对角矩阵 \(\Lambda\),而所有旋转矩阵的累积乘积趋近于特征向量矩阵 \(Q\)。
第二步:单次Jacobi旋转矩阵的构造
假设我们选择了非对角位置 \((p, q)\),其中 \(p < q\)。定义旋转矩阵 \(J = J(p, q, \theta)\):
- \(J\) 是一个单位矩阵,除了以下四个元素被替换:
\[ J_{pp} = J_{qq} = \cos\theta, \quad J_{pq} = -J_{qp} = \sin\theta \]
这里 \(\theta\) 是旋转角度,通过选择合适的 \(\theta\) 可以使变换后的矩阵 \(A' = J^T A J\) 满足 \(A'_{pq} = A'_{qp} = 0\)。
第三步:计算旋转角度
设当前矩阵为 \(A\),目标是将 \(a_{pq}\) 归零。变换后的元素为:
\[\begin{aligned} a'_{pp} &= a_{pp} \cos^2\theta + a_{qq} \sin^2\theta - 2a_{pq} \sin\theta \cos\theta \\ a'_{qq} &= a_{pp} \sin^2\theta + a_{qq} \cos^2\theta + 2a_{pq} \sin\theta \cos\theta \\ a'_{pq} &= (a_{pp} - a_{qq}) \sin\theta \cos\theta + a_{pq} (\cos^2\theta - \sin^2\theta) \end{aligned} \]
令 \(a'_{pq} = 0\),得到:
\[(a_{pp} - a_{qq}) \sin\theta \cos\theta + a_{pq} (\cos^2\theta - \sin^2\theta) = 0 \]
设 \(t = \tan\theta = \frac{\sin\theta}{\cos\theta}\),上式可化为:
\[\frac{a_{pp} - a_{qq}}{2a_{pq}} = \frac{1 - t^2}{2t} \]
记 \(\tau = \frac{a_{pp} - a_{qq}}{2a_{pq}}\),则有:
\[t^2 + 2\tau t - 1 = 0 \]
解方程,取绝对值较小的根(保证旋转角度小,数值稳定):
\[t = \frac{\text{sgn}(\tau)}{|\tau| + \sqrt{1 + \tau^2}} \]
然后可计算:
\[\cos\theta = \frac{1}{\sqrt{1 + t^2}}, \quad \sin\theta = t \cos\theta \]
第四步:更新矩阵
构造好 \(J\) 后,计算相似变换 \(A' = J^T A J\)。实际上不需要完整矩阵乘法,只需更新第 \(p\) 行、第 \(q\) 行和第 \(p\) 列、第 \(q\) 列的元素,因为其他位置不变。设 \(c = \cos\theta, s = \sin\theta\),更新公式如下(对 \(k \neq p, q\)):
\[\begin{aligned} a'_{kp} &= a'_{pk} = c a_{pk} - s a_{qk} \\ a'_{kq} &= a'_{qk} = s a_{pk} + c a_{qk} \end{aligned} \]
对角元的更新:
\[\begin{aligned} a'_{pp} &= c^2 a_{pp} + s^2 a_{qq} - 2cs a_{pq} \\ a'_{qq} &= s^2 a_{pp} + c^2 a_{qq} + 2cs a_{pq} \\ a'_{pq} &= a'_{qp} = 0 \end{aligned} \]
第五步:累积特征向量矩阵
初始化 \(Q = I\)(单位矩阵)。每次应用旋转 \(J\) 后,更新 \(Q = Q \cdot J\),即对 \(Q\) 的列 \(p\) 和 \(q\) 进行相同旋转:
\[\begin{aligned} q_{:,p} &= c \cdot q_{:,p} - s \cdot q_{:,q} \\ q_{:,q} &= s \cdot q_{:,p} + c \cdot q_{:,q} \end{aligned} \]
迭代结束时,\(Q\) 的列即为特征向量。
第六步:迭代策略与停止条件
经典Jacobi算法采用循环遍历策略:按顺序遍历所有上三角非对角元(如行遍历 \(p = 1 \dots n-1\),对每个 \(p\) 遍历 \(q = p+1 \dots n\)),对每个非零元执行一次旋转。一次完整遍历称为一次“扫描”(sweep)。由于旋转会改变之前归零的元素,因此需要多次扫描,直到所有非对角元的绝对值小于给定容差 \(\epsilon\)。
更高效的策略是逐次最大元法:每次选择当前矩阵中绝对值最大的非对角元 \((p, q)\) 进行旋转。这通常收敛更快,但寻找最大值需要额外开销。
停止条件:当所有 \(|a_{pq}| < \epsilon \sqrt{\sum_{i \neq j} a_{ij}^2}\) 或非对角范数足够小时,终止迭代。
第七步:算法复杂度与特性
- 每次旋转的更新成本为 \(O(n)\),因为只更新两行两列。
- 一次完整扫描(遍历所有非对角元)的成本约为 \(O(n^3)\)。
- 整体收敛通常是二次的,但可能需要多次扫描。
- 优点:数值稳定,可得到高精度特征值/向量,天然并行(可同时处理多对不重叠的非对角元)。
- 缺点:对于大型矩阵,相比基于三对角化的QR算法(\(O(n^3)\) 但常数更小)可能较慢,但易于实现且稳健。
总结
Jacobi旋转算法通过一系列正交相似变换,逐步将对称矩阵对角化。每一步选取一个非对角元,构造Givens旋转将其归零,并更新矩阵和累积的特征向量矩阵。迭代收敛后,对角线元素即为特征值,累积的正交矩阵的列即为特征向量。这是一种稳定可靠、适合中小规模矩阵或需要高精度特征向量的方法。