跳至内容

Jacobi 旋转

Jacobi 旋转方法是一种用于对角化对称矩阵的经典迭代算法。它特别适合中小尺寸的矩阵,并以简单、稳健著称。该方法通过一系列正交变换(旋转)系统地消去非对角元,最终收敛到一个对角矩阵,其对角元即为原矩阵的本征值。

Jacobi 方法每次针对矩阵中最大的非对角元,施加一次旋转将其消为零。这一过程反复迭代,直到所有非对角元都足够小,从而得到一个对角矩阵。原矩阵的本征值就位于对角线上,而本征矢则由过程中施加的所有旋转矩阵的乘积给出。

原理

对于对称矩阵 AA,目标是找到一个正交矩阵 PP,使得:

D=PTAP D = P^T A P

其中 DD 是由 AA 的本征值构成的对角矩阵,PP 的各列是相应的本征矢。

Jacobi 方法通过对 AA 施加一系列正交变换(旋转)来实现这一目标。每次旋转针对一个特定的非对角元 AijA_{ij},并将其消为零。

旋转矩阵

Jacobi 旋转矩阵 RR 是一个正交矩阵,它与单位矩阵只有四个矩阵元不同:

R=(1⋯0⋯0⋯0 ⋮⋱⋮⋮⋮ 0⋯cos⁡θ⋯−sin⁡θ⋯0 ⋮⋮⋱⋮⋮ 0⋯sin⁡θ⋯cos⁡θ⋯0 ⋮⋮⋮⋱⋮ 0⋯0⋯0⋯1) R = \begin{pmatrix} 1 & \cdots & 0 & \cdots & 0 & \cdots & 0 \\\ \vdots & \ddots & \vdots & & \vdots & & \vdots \\\ 0 & \cdots & \cos \theta & \cdots & -\sin \theta & \cdots & 0 \\\ \vdots & & \vdots & \ddots & \vdots & & \vdots \\\ 0 & \cdots & \sin \theta & \cdots & \cos \theta & \cdots & 0 \\\ \vdots & & \vdots & & \vdots & \ddots & \vdots \\\ 0 & \cdots & 0 & \cdots & 0 & \cdots & 1 \end{pmatrix}

其中,cos⁡θ\cos \theta 和 sin⁡θ\sin \theta 位于第 ii、jj 行与第 ii、jj 列的交点处。选取角度 θ\theta 使非对角元 AijA_{ij} 被消为零。

算法

  1. 找出最大的非对角元:

    • 在矩阵 AA 中找出(绝对值)最大的非对角元 AijA_{ij}。
  2. 计算旋转角 θ\theta:

    • 选取角度 θ\theta 使其满足: tan⁡(2θ)=2AijAii−Ajj \tan(2\theta) = \frac{2A_{ij}}{A_{ii} - A_{jj}}
    • 由此计算 cos⁡θ\cos \theta 和 sin⁡θ\sin \theta。
  3. 构造旋转矩阵 RR:

    • 用 cos⁡θ\cos \theta 和 sin⁡θ\sin \theta 构造旋转矩阵 RR。
  4. 施加旋转:

    • 按如下方式更新矩阵 AA: A′=RTAR A^{\prime} = R^T A R
    • 该变换将 AijA_{ij} 和 AjiA_{ji} 消为零。
  5. 累积变换:

    • 按如下方式更新本征矢矩阵 PP: P′=PR P^{\prime} = P R
    • 这样累积各次旋转,形成最终的本征矢矩阵。
  6. 重复直至收敛:

    • 重复上述过程,直到所有非对角元都小于指定的容差 ϵ \epsilon。

示例

考虑对称矩阵 AA:

A=(412 131 215) A = \begin{pmatrix} 4 & 1 & 2 \\\ 1 & 3 & 1 \\\ 2 & 1 & 5 \end{pmatrix}

第 1 步:初始化

从矩阵 AA 和一个用于累积旋转的单位矩阵 PP 开始:

A=(4.0000001.0000002.000000 1.0000003.0000001.000000 2.0000001.0000005.000000),P=(1.0000000.0000000.000000 0.0000001.0000000.000000 0.0000000.0000000.000000). A = \begin{pmatrix} 4.000000 & 1.000000 & 2.000000 \\\ 1.000000 & 3.000000 & 1.000000 \\\ 2.000000 & 1.000000 & 5.000000 \end{pmatrix}, \quad P = \begin{pmatrix} 1.000000 & 0.000000 & 0.000000 \\\ 0.000000 & 1.000000 & 0.000000 \\\ 0.000000 & 0.000000 & 0.000000 \end{pmatrix}.

第 2 步:找出最大的非对角元

AA 中最大的非对角元是 A13=2.000000A_{13} = 2.000000。

第 3 步:计算旋转参数

对于 (1,3)(1, 3) 平面内的旋转:

  • 计算角度 θ\theta:

    θ=12arctan⁡(2A13A11−A33). \theta = \frac{1}{2} \arctan\left(\frac{2A_{13}}{A_{11} - A_{33}}\right).

    代入数值:

    θ=12arctan⁡(2⋅2.0000004.000000−5.000000)=12arctan⁡(−4.000000). \theta = \frac{1}{2} \arctan\left(\frac{2 \cdot 2.000000}{4.000000 - 5.000000}\right) = \frac{1}{2} \arctan(-4.000000).

    使用单精度运算:

    θ≈−0.674741 radians. \theta \approx -0.674741 \, \text{radians}.
  • 计算 c=cos⁡(θ)c = \cos(\theta) 和 s=sin⁡(θ)s = \sin(\theta):

    c≈0.780869,s≈−0.624695. c \approx 0.780869, \quad s \approx -0.624695.

第 4 步:施加旋转

构造旋转矩阵 JJ:

J=(c0s 010 −s0c)≈(0.7808690.000000−0.624695 0.0000001.0000000.000000 0.6246950.0000000.780869). J = \begin{pmatrix} c & 0 & s \\\ 0 & 1 & 0 \\\ -s & 0 & c \end{pmatrix} \approx \begin{pmatrix} 0.780869 & 0.000000 & -0.624695 \\\ 0.000000 & 1.000000 & 0.000000 \\\ 0.624695 & 0.000000 & 0.780869 \end{pmatrix}.

更新 AA 和 PP:

A=JTAJ,P=PJ. A = J^T A J, \quad P = P J.

旋转之后:

A≈(5.5615530.7808690.000000 0.7808693.0000000.624695 0.0000000.6246952.438447), A \approx \begin{pmatrix} 5.561553 & 0.780869 & 0.000000 \\\ 0.780869 & 3.000000 & 0.624695 \\\ 0.000000 & 0.624695 & 2.438447 \end{pmatrix},

P≈(0.7808690.000000−0.624695 0.0000001.0000000.000000 0.6246950.0000000.780869). P \approx \begin{pmatrix} 0.780869 & 0.000000 & -0.624695 \\\ 0.000000 & 1.000000 & 0.000000 \\\ 0.624695 & 0.000000 & 0.780869 \end{pmatrix}.

第 5 步:对其他非对角元重复上述过程

对下一个最大的非对角元重复这一过程,直到所有非对角元都足够小(例如低于容差 10−610^{-6})。

第 6 步:最终的对角化矩阵

收敛后,对角化后的矩阵 AA 为:

A≈(6.0000000.0000000.000000 0.0000003.0000000.000000 0.0000000.0000003.000000). A \approx \begin{pmatrix} 6.000000 & 0.000000 & 0.000000 \\\ 0.000000 & 3.000000 & 0.000000 \\\ 0.000000 & 0.000000 & 3.000000 \end{pmatrix}.

相应的本征矢矩阵 PP 为:

P≈(0.7071070.000000−0.707107 0.0000001.0000000.000000 0.7071070.0000000.707107). P \approx \begin{pmatrix} 0.707107 & 0.000000 & -0.707107 \\\ 0.000000 & 1.000000 & 0.000000 \\\ 0.707107 & 0.000000 & 0.707107 \end{pmatrix}.

优点

  • 简单:算法易于实现。
  • 稳健:对于对称矩阵保证收敛。
  • 精确:能给出高精度的本征值和本征矢。

局限性

  • 收敛慢:对于大矩阵,该方法需要很多次迭代。
  • 大矩阵效率低:不适用于非常大的矩阵或稀疏矩阵。
  • 计算代价:每次旋转都需要更新整个矩阵,对于大体系代价可能很高。