基于Jacobi旋转的对称矩阵特征值分解算法
题目描述
给定一个 \(n \times n\) 的实对称矩阵 \(A\),我们需要计算它的所有特征值和对应的特征向量。这个问题是线性代数中的核心问题之一,在物理、工程、统计学和机器学习等领域有广泛应用。Jacobi旋转算法是一种经典的迭代方法,它通过一系列正交相似变换(Jacobi旋转)将对称矩阵逐步对角化,从而同时得到特征值和特征向量。本题目要求详细讲解该算法的原理、步骤、收敛性及实现细节。
解题过程
第一步:理解Jacobi方法的核心思想
Jacobi方法的目标是通过一系列正交相似变换(即 \(A \to Q^T A Q\))将对称矩阵 \(A\) 逐步化为对角矩阵 \(D\)。由于正交相似变换不改变特征值,最终得到的对角矩阵的对角元素就是 \(A\) 的特征值,而所有变换的累积正交矩阵的列就是对应的特征向量。
具体来说,每次迭代选取一个非对角元中绝对值最大的元素 \(a_{pq}\)(\(p < q\)),然后构造一个Jacobi旋转矩阵 \(J(p, q, \theta)\),使得通过变换 \(A' = J^T A J\) 后,\(a'_{pq} = a'_{qp} = 0\)。如此反复迭代,直到所有非对角元的绝对值都小于某个预设的容差 \(\epsilon\),此时矩阵近似为对角矩阵。
第二步:构造Jacobi旋转矩阵
Jacobi旋转矩阵 \(J(p, q, \theta)\) 是一个正交矩阵,形式如下:
\[J(p, q, \theta) = \begin{bmatrix} 1 & & & & & & & \\ & \ddots & & & & & & \\ & & 1 & & & & & \\ & & & \cos\theta & & -\sin\theta & & \\ & & & & 1 & & & \\ & & & \sin\theta & & \cos\theta & & \\ & & & & & & 1 & \\ & & & & & & & \ddots \\ \end{bmatrix} \]
其中,只有第 \(p\) 行、第 \(p\) 列、第 \(q\) 行、第 \(q\) 列的元素与单位矩阵不同。旋转角度 \(\theta\) 的选择是为了消去 \(A\) 中的元素 \(a_{pq}\) 和 \(a_{qp}\)。
第三步:确定旋转角度 \(\theta\)
设当前矩阵为 \(A^{(k)}\),选取的非对角元为 \(a_{pq}\)(\(p < q\))。我们希望找到 \(\theta\) 使得变换后的 \(a'_{pq} = 0\)。
通过计算可得:
\[a'_{pq} = (a_{qq} - a_{pp}) \sin\theta \cos\theta + a_{pq} (\cos^2\theta - \sin^2\theta) \]
令 \(a'_{pq} = 0\),并记 \(\tau = \frac{a_{qq} - a_{pp}}{2a_{pq}}\),则:
\[\tan 2\theta = \frac{2a_{pq}}{a_{pp} - a_{qq}} = \frac{1}{\tau} \quad (\text{若 } a_{pp} \neq a_{qq}) \]
实际操作中,为了避免直接计算 \(\theta\),我们通常计算:
\[t = \tan\theta = \frac{\operatorname{sgn}(\tau)}{|\tau| + \sqrt{1 + \tau^2}} \]
然后:
\[\cos\theta = \frac{1}{\sqrt{1 + t^2}}, \quad \sin\theta = t \cos\theta \]
如果 \(a_{pp} = a_{qq}\),则取 \(\theta = \frac{\pi}{4} \cdot \operatorname{sgn}(a_{pq})\)。
第四步:更新矩阵 \(A\)
应用旋转 \(A' = J^T A J\) 后,只有第 \(p\) 行、第 \(p\) 列、第 \(q\) 行、第 \(q\) 列的元素发生变化。具体更新公式为:
\[\begin{aligned} a'_{pp} &= a_{pp} - t \cdot a_{pq} \\ a'_{qq} &= a_{qq} + t \cdot a_{pq} \\ a'_{pj} &= a'_{jp} = a_{pj} \cos\theta - a_{qj} \sin\theta, \quad j \neq p, q \\ a'_{qj} &= a'_{jq} = a_{pj} \sin\theta + a_{qj} \cos\theta, \quad j \neq p, q \\ a'_{pq} &= a'_{qp} = 0 \end{aligned} \]
其他元素保持不变。这样,每次旋转只更新两行和两列,计算量为 \(O(n)\)。
第五步:累积特征向量矩阵
设 \(V^{(k)}\) 为累积的正交变换矩阵,初始时 \(V^{(0)} = I\)。每次迭代后更新:
\[V^{(k+1)} = V^{(k)} J \]
同样只需更新两列:
\[\begin{aligned} v'_{ip} &= v_{ip} \cos\theta - v_{iq} \sin\theta \\ v'_{iq} &= v_{ip} \sin\theta + v_{iq} \cos\theta \end{aligned} \]
最终,当 \(A\) 近似对角化时,\(V\) 的列就是 \(A\) 的特征向量。
第六步:算法流程
- 初始化:\(A^{(0)} = A\),\(V = I\),设置容差 \(\epsilon\)。
- 重复直到所有 \(|a_{ij}| < \epsilon\)(\(i \neq j\)):
- 找到绝对值最大的非对角元 \(a_{pq}\)。
- 计算 \(\tau = \frac{a_{qq} - a_{pp}}{2a_{pq}}\),然后 \(t = \frac{\operatorname{sgn}(\tau)}{|\tau| + \sqrt{1 + \tau^2}}\)。
- 计算 \(\cos\theta = \frac{1}{\sqrt{1 + t^2}}\),\(\sin\theta = t \cos\theta\)。
- 更新矩阵 \(A\) 的第 \(p, q\) 行和列。
- 更新特征向量矩阵 \(V\) 的第 \(p, q\) 列。
- 输出:\(D = \text{diag}(A)\)(特征值),\(V\)(特征向量)。
第七步:收敛性与复杂度
- 收敛性:经典Jacobi方法每次消去最大非对角元,可保证 \(\operatorname{off}(A) = \sum_{i \neq j} a_{ij}^2\) 单调递减,且最终收敛到对角矩阵。一般需要 \(O(n^2)\) 次旋转达到机器精度。
- 复杂度:每次旋转更新需 \(O(n)\) 操作,总复杂度为 \(O(n^3)\),与QR算法相当。虽然比现代分治或MRRR算法慢,但Jacobi方法具有数值稳定性高、易于并行、可同时计算特征向量的优点。
第八步:数值稳定性与变体
- 由于只使用正交变换,Jacobi方法在数值上非常稳定,不会像非正交变换那样放大误差。
- 变体包括循环Jacobi(按固定顺序遍历所有非对角元)和阈值Jacobi(只消去大于阈值的非对角元),可减少寻找最大元的时间。
总结
Jacobi旋转算法通过对对称矩阵进行一系列简单的正交旋转,逐步将其对角化。它直观、稳定,且能同时得到特征值和特征向量,是理解对称特征值问题几何本质的经典方法。尽管对于大规模矩阵,现代算法在速度上更有优势,但Jacobi方法在需要高精度和稳定性的场合仍有其价值。