基于Jacobi旋转的对称矩阵特征值分解算法
字数 3178 2025-12-22 02:53:08

基于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旋转将其归零,并更新矩阵和累积的特征向量矩阵。迭代收敛后,对角线元素即为特征值,累积的正交矩阵的列即为特征向量。这是一种稳定可靠、适合中小规模矩阵或需要高精度特征向量的方法。

基于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旋转将其归零,并更新矩阵和累积的特征向量矩阵。迭代收敛后,对角线元素即为特征值,累积的正交矩阵的列即为特征向量。这是一种稳定可靠、适合中小规模矩阵或需要高精度特征向量的方法。