MINIBLOG

Blog Note Tags Links About
Home Search
Apr 17, 2026
miniyuan

特征值和特征向量的计算(幂法,幂法加速,Jacobi 法)


问题引入

图 1:弹簧-质点系统
图 1:弹簧-质点系统

考虑弹簧-质点系统,质点 mjm_jmj​ 的竖向位移为 yj(t)y_j(t)yj​(t),运动方程为:

My¨+Ky=0M\ddot{y} + Ky = 0My¨​+Ky=0

其中:

  • M=diag(m1,m2,m3)M = \text{diag}(m_1,m_2,m_3)M=diag(m1​,m2​,m3​) 为质量矩阵(对角阵)
  • KKK 为刚度矩阵(对称正定)

设 yj(t)=xjeiωty_j(t) = x_j e^{i\omega t}yj​(t)=xj​eiωt(谐波振动假设),代入得:

(−ω2M+K)x=0⇒Kx=ω2Mx(-\omega^2 M + K)x = 0 \Rightarrow Kx = \omega^2 Mx(−ω2M+K)x=0⇒Kx=ω2Mx

当 MMM 可逆时,转化为标准特征值问题:

Ax=λxA x = \lambda xAx=λx

其中 A=M−1K,λ=ω2A = M^{-1}K, \lambda = \omega^2A=M−1K,λ=ω2


特征值与特征向量基本概念回顾

基本定义

  1. 特征多项式与特征方程:

    矩阵 A∈Rn×nA \in \mathbb{R}^{n \times n}A∈Rn×n 的特征多项式为:

    ϕ(λ)=det⁡(λI−A)=λn+c1λn−1+⋯+cn\phi(\lambda) = \det(\lambda I - A) = \lambda^n + c_1\lambda^{n-1} + \cdots + c_nϕ(λ)=det(λI−A)=λn+c1​λn−1+⋯+cn​

    特征方程 ϕ(λ)=0\phi(\lambda)=0ϕ(λ)=0 的根 λ1,…,λn\lambda_1,\dots,\lambda_nλ1​,…,λn​ 称为特征值,集合 λ(A)\lambda(A)λ(A) 称为特征谱。

  2. 特征向量与特征子空间:

    对特征值 λ\lambdaλ,齐次方程 (λI−A)x=0(\lambda I - A)x = 0(λI−A)x=0 的非零解 xxx 称为特征向量;所有对应特征向量构成的线性子空间称为特征子空间。

  3. 代数重数与几何重数:

    • 代数重数 njn_jnj​:特征值 λ~j\tilde{\lambda}_jλ~j​ 在特征方程中作为根的重数
    • 几何重数 kjk_jkj​:特征值 λ~j\tilde{\lambda}_jλ~j​ 对应的特征子空间的维数

    有如下等价定义:

    • 代数重数 njn_jnj​:特征值 λ~j\tilde{\lambda}_jλ~j​ 对应的 Jordan 块阶数之和
    • 几何重数 kjk_jkj​:特征值 λ~j\tilde{\lambda}_jλ~j​ 对应的 Jordan 块个数

    从而可见满足关系:1≤kj≤nj1 \leq k_j \leq n_j1≤kj​≤nj​,当且仅当矩阵可对角化时,等号成立。

重要定理

  1. 迹与行列式:

    设 λi\lambda_iλi​ 为 AAA 的特征值,则:

    ∑j=1nλj=tr(A)=∑j=1najj,∏j=1nλj=det⁡(A)\sum_{j=1}^n \lambda_j = \text{tr}(A) = \sum_{j=1}^n a_{jj}, \quad \prod_{j=1}^n \lambda_j = \det(A)j=1∑n​λj​=tr(A)=j=1∑n​ajj​,j=1∏n​λj​=det(A)
  2. 转置不变性:λ(A)=λ(AT)\lambda(A) = \lambda(A^T)λ(A)=λ(AT)

  3. 三角阵特征值:若 AAA 为三角阵,则其对角线元素即为特征值

  4. 分块三角阵特征值:

    对分块上三角阵 A=[A11⋯⋱]A = \begin{bmatrix} A_{11} & \cdots \\ & \ddots \end{bmatrix}A=[A11​​⋯⋱​],有:

    λ(A)=⋃j=1mλ(Ajj)\lambda(A) = \bigcup_{j=1}^m \lambda(A_{jj})λ(A)=j=1⋃m​λ(Ajj​)

    分块下三角阵同理。

  5. 相似变换不变性:

    若 B=X−1AXB = X^{-1}AXB=X−1AX(XXX 非奇异),则:

    • λ(A)=λ(B)\lambda(A) = \lambda(B)λ(A)=λ(B)
    • 若 yyy 是 BBB 的特征向量,则 XyXyXy 是 AAA 的特征向量
  6. 特征值的代数性质:

    设 λi\lambda_iλi​ 为 AAA 的特征值,则:

    • cAcAcA 的特征值:cλic\lambda_icλi​
    • A+cIA + cIA+cI 的特征值:λi+c\lambda_i + cλi​+c
    • AkA^kAk 的特征值:λik\lambda_i^kλik​
    • p(A)p(A)p(A) 的特征值:p(λi)p(\lambda_i)p(λi​)(ppp 为多项式)
    • A−1A^{-1}A−1 的特征值:λi−1\lambda_i^{-1}λi−1​(当 AAA 非奇异)

幂法

幂法(Power Method)用于计算矩阵(模)最大特征值以及对应的特征向量。

幂法的数学原理

矩阵模最大的特征值称为主特征值(dominant eigenvalue),对应特征向量为主特征向量。

幂法收敛性:

设 A∈Rn×nA \in \mathbb{R}^{n \times n}A∈Rn×n 有唯一的主特征值。也即 ∣λ1∣>∣λ2∣≥∣λ3∣≥⋯≥∣λn∣|\lambda_1| > |\lambda_2| \ge |\lambda_3| \ge \cdots \ge |\lambda_n|∣λ1​∣>∣λ2​∣≥∣λ3​∣≥⋯≥∣λn​∣, 其中 λ1\lambda_1λ1​ 是唯一主特征值(显然其为实数),并且 λ1\lambda_1λ1​ 几何重数为 111。

初始向量 x(0)∈Rnx^{(0)} \in \mathbb{R}^nx(0)∈Rn 在 λ1\lambda_1λ1​ 的特征方向上的投影非零。

定义迭代:

x(k)=Ax(k−1),k=1,2,…x^{(k)} = A x^{(k-1)}, \quad k = 1,2,\dotsx(k)=Ax(k−1),k=1,2,…

归一化:

y(k)=x(k)∥x(k)∥∞y^{(k)} = \frac{x^{(k)}}{\|x^{(k)}\|_\infty}y(k)=∥x(k)∥∞​x(k)​

则:

  • y(k)y^{(k)}y(k) 收敛到 λ1\lambda_1λ1​ 的一个特征向量。
  • 主特征值可通过下式估计: λ1=lim⁡k→∞(x(k+1))j(x(k))j,j=arg⁡max⁡i∣(x(k))i∣\lambda_1 = \lim_{k\to\infty} \frac{(x^{(k+1)})_j}{(x^{(k)})_j}, \quad j = \arg\max_i |(x^{(k)})_i|λ1​=k→∞lim​(x(k))j​(x(k+1))j​​,j=argimax​∣(x(k))i​∣

证明:

  1. 分解:

    对 AAA 做 Jordan 分解 A=PJP−1A=PJP^{-1}A=PJP−1:

    J=diag(J1,…,Jr),Ji=(λi1λi⋱⋱1λi)mi,∑mi=n.J=\mathrm{diag}(J_1,\dots,J_r),\quad J_i=\begin{pmatrix}\lambda_i&1&&\\&\lambda_i&\ddots&\\&&\ddots&1\\&&&\lambda_i\end{pmatrix}_{m_i},\quad \sum m_i=n.J=diag(J1​,…,Jr​),Ji​=​λi​​1λi​​⋱⋱​1λi​​​mi​​,∑mi​=n.

    记 z=P−1x(0)=(z1,…,zr)Tz=P^{-1}x^{(0)}=(z_1,\dots,z_r)^{\mathsf T}z=P−1x(0)=(z1​,…,zr​)T,zi∈Rmiz_i\in\mathbb R^{m_i}zi​∈Rmi​,则:

    x(k)=PJkzx^{(k)}=PJ^k zx(k)=PJkz

    对单个块记 J(λ,m)=λI+NJ(\lambda,m)=\lambda I+NJ(λ,m)=λI+N,其中 Nm=0N^m=0Nm=0。

  2. 估阶:

    对 Jordan 块 J(λ,m)=λI+NJ(\lambda,m) = \lambda I + NJ(λ,m)=λI+N,由二项式定理:

    J(λ,m)k=∑j=0m−1(kj)λk−jNj=km−1(m−1)!λk−m+1Nm−1+O(km−2∣λ∣k)J(\lambda,m)^k = \sum_{j=0}^{m-1} \binom{k}{j} \lambda^{k-j} N^j = \frac{k^{m-1}}{(m-1)!}\lambda^{k-m+1}N^{m-1} + O(k^{m-2}|\lambda|^k)J(λ,m)k=j=0∑m−1​(jk​)λk−jNj=(m−1)!km−1​λk−m+1Nm−1+O(km−2∣λ∣k)

    其中 O(⋅)O(\cdot)O(⋅) 为矩阵范数意义下的。

    作用于 ziz_izi​ 并取范数,不论 Nmi−1ziN^{m_i-1}z_iNmi​−1zi​ 是否为 0 均有:

    ∥Jikzi∥=O(∣λi∣kkmi−1)\|J_i^k z_i\| = O(|\lambda_i|^k k^{m_i-1})∥Jik​zi​∥=O(∣λi​∣kkmi​−1)

    对非主块 i≥2i \geq 2i≥2,取 ρ∈(∣λ2∣/∣λ1∣,1)\rho \in (|\lambda_2|/|\lambda_1|, 1)ρ∈(∣λ2​∣/∣λ1​∣,1),则 ∣λi∣≤ρ∣λ1∣|\lambda_i| \leq \rho|\lambda_1|∣λi​∣≤ρ∣λ1​∣:

    ∥Jikzi∥=O(ρk∣λ1∣kkmi−1)=o(∣λ1∣kkm1−1).\|J_i^k z_i\| = O(\rho^k |\lambda_1|^k k^{m_i-1}) = o(|\lambda_1|^k k^{m_1-1}).∥Jik​zi​∥=O(ρk∣λ1​∣kkmi​−1)=o(∣λ1​∣kkm1​−1).

    对主块 i=1i=1i=1,令 w=Nm1−1z1w = N^{m_1-1}z_1w=Nm1​−1z1​。由题设 x(0)x^{(0)}x(0) 在 λ1\lambda_1λ1​ 特征方向投影非零,即 w≠0w \neq 0w=0,且 Nw=0Nw = 0Nw=0(www 为 J1J_1J1​ 的特征向量)。于是:

    J1kz1=Θ(λ1kkm1−1) w.J_1^k z_1 = \Theta(\lambda_1^k k^{m_1-1}) \, w.J1k​z1​=Θ(λ1k​km1​−1)w.

    综上:

    ∥x(k)∥=∥PJkz∥=Θ(∣λ1∣kkm1−1)x(k)=PJkz=[Θ(λ1kkm1−1)Pw, o(∣λ1∣kkm2−1),… ]T\begin{aligned} \|x^{(k)}\| &= \|PJ^k z\| = \Theta(|\lambda_1|^k k^{m_1-1}) \\ x^{(k)} &= PJ^k z = [\Theta(\lambda_1^k k^{m_1-1}) Pw, \, o(|\lambda_1|^k k^{m_2-1}), \dots]^T \end{aligned}∥x(k)∥x(k)​=∥PJkz∥=Θ(∣λ1​∣kkm1​−1)=PJkz=[Θ(λ1k​km1​−1)Pw,o(∣λ1​∣kkm2​−1),…]T​
  3. 方向收敛:

    归一化并消去非主块:

    x(k)∥x(k)∥=(λ1∣λ1∣)kPw∥Pw∥+o(1)\frac{x^{(k)}}{\|x^{(k)}\|} = \left(\frac{\lambda_1}{|\lambda_1|}\right)^k \frac{Pw}{\|Pw\|} + o(1)∥x(k)∥x(k)​=(∣λ1​∣λ1​​)k∥Pw∥Pw​+o(1)

    令 u1=Pw/∥Pw∥u_1 = Pw/\|Pw\|u1​=Pw/∥Pw∥,也即 AAA 的单位特征向量,则对 ∥⋅∥∞\|\cdot\|_\infty∥⋅∥∞​:

    y(k)=(λ1∣λ1∣)ku1∥u1∥∞+o(1)y^{(k)} = \left(\frac{\lambda_1}{|\lambda_1|}\right)^k \frac{u_1}{\|u_1\|_\infty} + o(1)y(k)=(∣λ1​∣λ1​​)k∥u1​∥∞​u1​​+o(1)

    故 y(k)→u1y^{(k)} \to u_1y(k)→u1​。

  4. 特征值估计:

    由 x(k+1)=Ax(k)x^{(k+1)} = A x^{(k)}x(k+1)=Ax(k) 及第 3 部分的渐近展开:

    x(k)=∥x(k)∥∞((λ1∣λ1∣)ku1∥u1∥∞+o(1))x^{(k)} = \|x^{(k)}\|_\infty \left( \left(\frac{\lambda_1}{|\lambda_1|}\right)^k \frac{u_1}{\|u_1\|_\infty} + o(1) \right)x(k)=∥x(k)∥∞​((∣λ1​∣λ1​​)k∥u1​∥∞​u1​​+o(1))

    记 jk=arg⁡max⁡i∣(x(k))i∣j_k = \arg\max\limits_i |(x^{(k)})_i|jk​=argimax​∣(x(k))i​∣。由 u1u_1u1​ 非零,存在唯一分量指标 j∗j_*j∗​ 使得 ∣(u1)j∗∣=∥u1∥∞|(u_1)_{j_*}| = \|u_1\|_\infty∣(u1​)j∗​​∣=∥u1​∥∞​, 且当 kkk 充分大时 jk=j∗j_k = j_*jk​=j∗​ 保持恒定。此时 (x(k))jk=Θ(∥x(k)∥∞)(x^{(k)})_{j_k} = \Theta(\|x^{(k)}\|_\infty)(x(k))jk​​=Θ(∥x(k)∥∞​)。

    将 x(k+1)=Ax(k)x^{(k+1)} = A x^{(k)}x(k+1)=Ax(k) 的第 jkj_kjk​ 分量写出:

    (x(k+1))jk=λ1(x(k))jk+(Ax(k)−λ1x(k))jk(x^{(k+1)})_{j_k} = \lambda_1 (x^{(k)})_{j_k} + \big( A x^{(k)} - \lambda_1 x^{(k)} \big)_{j_k}(x(k+1))jk​​=λ1​(x(k))jk​​+(Ax(k)−λ1​x(k))jk​​

    由第 2 部分的阶的估计,非主特征值部分贡献为 o(∥x(k)∥∞)o(\|x^{(k)}\|_\infty)o(∥x(k)∥∞​),因此:

    (x(k+1))jk=λ1(x(k))jk+o(∥x(k)∥∞)(x^{(k+1)})_{j_k} = \lambda_1 (x^{(k)})_{j_k} + o(\|x^{(k)}\|_\infty)(x(k+1))jk​​=λ1​(x(k))jk​​+o(∥x(k)∥∞​)

    两边除以 (x(k))jk(x^{(k)})_{j_k}(x(k))jk​​(当 kkk 充分大时非零):

    (x(k+1))jk(x(k))jk=λ1+o(∥x(k)∥∞)(x(k))jk=λ1+o(∥x(k)∥∞)Θ(∥x(k)∥∞)=λ1+o(1)\frac{(x^{(k+1)})_{j_k}}{(x^{(k)})_{j_k}} = \lambda_1 + \frac{o(\|x^{(k)}\|_\infty)}{(x^{(k)})_{j_k}} = \lambda_1 + \frac{o(\|x^{(k)}\|_\infty)}{\Theta(\|x^{(k)}\|_\infty)} = \lambda_1 + o(1)(x(k))jk​​(x(k+1))jk​​​=λ1​+(x(k))jk​​o(∥x(k)∥∞​)​=λ1​+Θ(∥x(k)∥∞​)o(∥x(k)∥∞​)​=λ1​+o(1)

    取极限即得

    lim⁡k→∞(x(k+1))j(x(k))j=λ1,j=arg⁡max⁡i∣(x(k))i∣\lim_{k\to\infty} \frac{(x^{(k+1)})_j}{(x^{(k)})_j} = \lambda_1, \qquad j = \arg\max_i |(x^{(k)})_i|k→∞lim​(x(k))j​(x(k+1))j​​=λ1​,j=argimax​∣(x(k))i​∣

注:

非主块贡献为 O(ρk)O(\rho^k)O(ρk),故收敛速度为:

(x(k+1))j(x(k))j−λ1=O ⁣(∣λ2λ1∣k)\frac{(x^{(k+1)})_j}{(x^{(k)})_j} - \lambda_1 = O\!\left( \left|\dfrac{\lambda_2}{\lambda_1}\right|^k \right)(x(k))j​(x(k+1))j​​−λ1​=O(​λ1​λ2​​​k)

幂法的几何直观

设矩阵 A∈Rn×nA \in \mathbb{R}^{n \times n}A∈Rn×n 有唯一的实主特征值 λ1\lambda_1λ1​,且 ∣λ1∣>∣λ2∣≥∣λ3∣≥⋯|\lambda_1| > |\lambda_2| \ge |\lambda_3| \ge \cdots∣λ1​∣>∣λ2​∣≥∣λ3​∣≥⋯。 考虑二维子空间 span{u1,u2}\mathrm{span}\{u_1, u_2\}span{u1​,u2​},其中 u1u_1u1​ 为 λ1\lambda_1λ1​ 对应的单位特征向量(主方向),u2u_2u2​ 为 λ2\lambda_2λ2​ 对应的特征向量(次方向)。

假设初始向量 x(0)x^{(0)}x(0) 在该子空间中的投影为:

x(0)=a0u1+b0u2x^{(0)} = a_0 u_1 + b_0 u_2x(0)=a0​u1​+b0​u2​

迭代 kkk 次:

x(k)=Akx(0)=λ1ka0u1+λ2kb0u2x^{(k)} = A^k x^{(0)} = \lambda_1^k a_0 u_1 + \lambda_2^k b_0 u_2x(k)=Akx(0)=λ1k​a0​u1​+λ2k​b0​u2​

由于 ∣λ1∣>∣λ2∣|\lambda_1| > |\lambda_2|∣λ1​∣>∣λ2​∣,主方向的分量增长比次方向更快,故趋向于 u1u_1u1​。

设 θk\theta_kθk​ 为 x(k)x^{(k)}x(k) 与 u1u_1u1​ 的夹角。则:

tan⁡θk=∣bk∣∣ak∣=∣λ2λ1∣k⋅tan⁡θ0\tan\theta_k = \frac{|b_k|}{|a_k|} = \left|\frac{\lambda_2}{\lambda_1}\right|^k \cdot \tan\theta_0tanθk​=∣ak​∣∣bk​∣​=​λ1​λ2​​​k⋅tanθ0​

特征值估计为:

λ1(k)=(x(k+1))j(x(k))j\lambda_1^{(k)} = \frac{(x^{(k+1)})_j}{(x^{(k)})_j}λ1(k)​=(x(k))j​(x(k+1))j​​

又因为

(x(k))j=ak+bk(u2)j(x(k+1))j=λ1ak+λ2bk(u2)j\begin{aligned} (x^{(k)})_j &= a_k + b_k (u_2)_j \\ (x^{(k+1)})_j &= \lambda_1 a_k + \lambda_2 b_k (u_2)_j \end{aligned}(x(k))j​(x(k+1))j​​=ak​+bk​(u2​)j​=λ1​ak​+λ2​bk​(u2​)j​​

因此:

(x(k+1))j(x(k))j=λ1ak+λ2bk(u2)jak+bk(u2)j=λ1+λ2⋅bkak(u2)j1+bkak(u2)j=λ1+(λ2−λ1)⋅bkak(u2)j+o(bkak)\begin{aligned} \frac{(x^{(k+1)})_j}{(x^{(k)})_j} &= \frac{\lambda_1 a_k + \lambda_2 b_k (u_2)_j}{a_k + b_k (u_2)_j} \\ &= \frac{\lambda_1 + \lambda_2 \cdot \frac{b_k}{a_k} (u_2)_j}{1 + \frac{b_k}{a_k} (u_2)_j} \\ &= \lambda_1 + (\lambda_2 - \lambda_1) \cdot \frac{b_k}{a_k} (u_2)_j + o(\frac{b_k}{a_k}) \end{aligned}(x(k))j​(x(k+1))j​​​=ak​+bk​(u2​)j​λ1​ak​+λ2​bk​(u2​)j​​=1+ak​bk​​(u2​)j​λ1​+λ2​⋅ak​bk​​(u2​)j​​=λ1​+(λ2​−λ1​)⋅ak​bk​​(u2​)j​+o(ak​bk​​)​

从而:

λ1(k)−λ1=O ⁣(∣λ2λ1∣k)\lambda_1^{(k)} - \lambda_1 = O\!\left( \left|\dfrac{\lambda_2}{\lambda_1}\right|^k \right)λ1(k)​−λ1​=O(​λ1​λ2​​​k)

数值稳定性改进

原始迭代 x(k)=Akx(0)x^{(k)} = A^k x^{(0)}x(k)=Akx(0) 存在溢出问题:

  • ∣λ1∣>1|\lambda_1| > 1∣λ1​∣>1:上溢出(overflow)
  • ∣λ1∣<1|\lambda_1| < 1∣λ1​∣<1:下溢出(underflow)

故我们在迭代中用 ∞\infty∞-范数进行归一化:

{y(k)=x(k)/∥x(k)∥∞x(k+1)=Ay(k),k=0,1,2,…\begin{cases} y^{(k)} = x^{(k)}/\|x^{(k)}\|_\infty \\ x^{(k+1)} = A y^{(k)} \end{cases}, \quad k=0,1,2,\dots{y(k)=x(k)/∥x(k)∥∞​x(k+1)=Ay(k)​,k=0,1,2,…

主特征值估计为 λ1(k)=(x(k))j\lambda_1^{(k)} = (x^{(k)})_jλ1(k)​=(x(k))j​,其中 j=arg⁡max⁡i∣(x(k))i∣j = \arg\max_i |(x^{(k)})_i|j=argmaxi​∣(x(k))i​∣。

幂法算法实现

k = 0
lambda_old = 0.0

while k < N:
    k += 1

    j = np.argmax(np.abs(x))
    lambda_new = x[j]
    y = x / lambda_new # 归一化
    x = A @ y # 迭代

    if np.abs(lambda_new - lambda_old) < EPS:
        break

    lambda_old = lambda_new

位移幂法

位移幂法的数学原理

注意到幂法收敛速度为:

(x(k+1))j(x(k))j−λ1=O ⁣(∣λ2λ1∣k)\frac{(x^{(k+1)})_j}{(x^{(k)})_j} - \lambda_1 = O\!\left( \left|\dfrac{\lambda_2}{\lambda_1}\right|^k \right)(x(k))j​(x(k+1))j​​−λ1​=O(​λ1​λ2​​​k)

利用特征值平移性质: 若 Aui=λiuiAu_i = \lambda_i u_iAui​=λi​ui​,则 (A−μI)ui=(λi−μ)ui(A - \mu I)u_i = (\lambda_i - \mu)u_i(A−μI)ui​=(λi​−μ)ui​, 也即

  • λi−μ\lambda_i - \muλi​−μ 为 A−μIA - \mu IA−μI 的特征值
  • uiu_iui​ 仍为 A−μIA - \mu IA−μI 的特征向量

从而可以选择位移 μ\muμ 使收敛更快:

∣λ2−μλ1−μ∣<∣λ2λ1∣\left| \frac{\lambda_2 - \mu}{\lambda_1 - \mu} \right| < \left| \frac{\lambda_2}{\lambda_1} \right|​λ1​−μλ2​−μ​​<​λ1​λ2​​​

特殊地,对称正定矩阵特征值均为实数,故最优位移为:

μ=12(λ2+λn)\mu = \frac{1}{2}(\lambda_2 + \lambda_n)μ=21​(λ2​+λn​)

位移幂法的几何直观

A−μIA - \mu IA−μI 在每个方向上都减去 μ\muμ 倍的该方向向量。取 μ\muμ 接近 λ2\lambda_2λ2​,相当于将 u2u_2u2​ 方向的拉伸大大减小,使得原本占优的 u1u_1u1​ 方向更加占优。

注: 理论上我们也可以利用这种方法求次特征值。

位移幂法算法实现

实际实现时原点位移值 shift 需要利用特征值分布估计。

k = 0
lambda_old = 0.0

while k < N:
    k += 1

    j = np.argmax(np.abs(x))
    lambda_new = x[j]
    y = x / lambda_new # 归一化
    x = A @ y - shift * y # 迭代

    if np.abs(lambda_new - lambda_old) < EPS:
        break

    lambda_old = lambda_new

lambda_old += shift

降阶幂法

降阶幂法的数学原理

假设对称矩阵 AAA,则其特征向量相互正交。

已知主特征值 λ1\lambda_1λ1​ 和单位主特征向量 u1u_1u1​,构造:

A(2)=A−λ1u1u1Tu1Tu1A^{(2)} = A - \lambda_1 \frac{u_1 u_1^T}{u_1^T u_1}A(2)=A−λ1​u1T​u1​u1​u1T​​

则:

  • A(2)u1=0A^{(2)} u_1 = 0A(2)u1​=0
  • A(2)ui=λiuiA^{(2)} u_i = \lambda_i u_iA(2)ui​=λi​ui​(i=2,3,…,ni=2,3,\dots,ni=2,3,…,n)

即 A(2)A^{(2)}A(2) 的特征值为 0,λ2,…,λn0, \lambda_2, \dots, \lambda_n0,λ2​,…,λn​,可对 A(2)A^{(2)}A(2) 再次应用幂法求 λ2,u2\lambda_2, u_2λ2​,u2​。 同理可求更多特征对。

注: 降阶法精度不佳,且破坏稀疏性,仅适用于求前几个特征值;实际中多用 Lanczos 等 Krylov 子空间方法。

降阶幂法的几何直观

注意到 u1u1Tu1Tu1\dfrac{u_1 u_1^T}{u_1^T u_1}u1T​u1​u1​u1T​​ 即为 u1u_1u1​ 方向的投影矩阵,故实际上 A(2)A^{(2)}A(2) 消除了主特征方向的所有贡献,从而让次特征方向变为 A(2)A^{(2)}A(2) 的主特征方向。


反幂法

反幂法(Inverse Power Method)用于计算矩阵(模)最小特征值以及对应的特征向量。

反幂法的数学原理

假设矩阵非奇异。由特征值倒数性质:若 Aui=λiuiAu_i = \lambda_i u_iAui​=λi​ui​,则 A−1ui=λi−1uiA^{-1}u_i = \lambda_i^{-1} u_iA−1ui​=λi−1​ui​。

因此,对 A−1A^{-1}A−1 应用幂法即得 ∣λn∣|\lambda_n|∣λn​∣ 最小的特征值。

为避免显式求逆,可以将 x(k)=A−1x(k−1)x^{(k)} = A^{-1} x^{(k-1)}x(k)=A−1x(k−1) 改为解线性方程组:

Ax(k)=x(k−1)A x^{(k)} = x^{(k-1)}Ax(k)=x(k−1)

反幂法算法实现

k = 0
_, L, U = lu(A)  # 预计算 LU 分解
lambda_old = 1e16  # 初始极大值

while k < N:
    k += 1

    j = np.argmax(np.abs(x))
    lambda_new = x[j]
    y = x / lambda_new # 归一化

    # LU 分解法解 Ax = y
    z = solve_triangular(L, y, lower=True) # 先解 Lz = y
    x = solve_triangular(U, z, lower=False) # 再解 Ux = z

    if np.abs(1 / lambda_new - 1 / lambda_old) < EPS:
        break

    lambda_old = lambda_new

lambda_old = 1 / lambda_old

位移反幂法

结合位移技术,我们可以求已知近似特征值 λ∗\lambda^*λ∗ 附近的精确特征值。

首先构造 B=A−λ∗IB = A - \lambda^* IB=A−λ∗I,然后对 BBB 应用反幂法求模最小特征值 μ\muμ,则待求特征值即为:

λ=μ+λ∗\lambda = \mu + \lambda^*λ=μ+λ∗

由于 ∣λ−λ∗∣≪∣λi−λ∗∣|\lambda - \lambda^*| \ll |\lambda_i - \lambda^*|∣λ−λ∗∣≪∣λi​−λ∗∣,收敛极快。


Jacobi 法

Jacobi 法用于计算实对称矩阵的所有特征值以及对应的特征向量。

核心思想

对实对称矩阵 AAA,存在正交矩阵 QQQ 使 QTAQ=DQ^T A Q = DQTAQ=D 为对角阵。Jacobi 法通过一系列 2D 正交变换逐步消除非对角元。

2×2 子问题求解

对子矩阵 [appapqapqaqq]\begin{bmatrix} a_{pp} & a_{pq} \\ a_{pq} & a_{qq} \end{bmatrix}[app​apq​​apq​aqq​​],构造旋转矩阵:

Q=[cos⁡θ−sin⁡θsin⁡θcos⁡θ]Q = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}Q=[cosθsinθ​−sinθcosθ​]

要求 QTAQQ^T A QQTAQ 的 (p,q)(p,q)(p,q) 元素为 0:

apq(1)=aqq−app2sin⁡2θ+apqcos⁡2θ=0⇒cot⁡2θ=app−aqq2apqa_{pq}^{(1)} = \frac{a_{qq} - a_{pp}}{2} \sin 2\theta + a_{pq} \cos 2\theta = 0 \Rightarrow \cot 2\theta = \frac{a_{pp} - a_{qq}}{2a_{pq}}apq(1)​=2aqq​−app​​sin2θ+apq​cos2θ=0⇒cot2θ=2apq​app​−aqq​​

解得:

τ=aqq−app2apqt=sign(τ)∣τ∣+1+τ2c=11+t2s=ct\begin{aligned} \tau &= \frac{a_{qq} - a_{pp}}{2a_{pq}} \\ t &= \frac{\text{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}} \\ c &= \frac{1}{\sqrt{1+t^2}} \\ s &= ct \end{aligned}τtcs​=2apq​aqq​−app​​=∣τ∣+1+τ2​sign(τ)​=1+t2​1​=ct​

注:直接用反三角函数计算会数值不稳定,所以用上述方法避免三角函数计算。

n×n 矩阵求解

构造 QpqQ_{pq}Qpq​,仅在 (p,p),(p,q),(q,p),(q,q)(p,p),(p,q),(q,p),(q,q)(p,p),(p,q),(q,p),(q,q) 位置非单位元,其余位置与单位阵相同,则迭代:

A(1)=QpqTAQpqA^{(1)} = Q_{pq}^T A Q_{pq}A(1)=QpqT​AQpq​

迭代后非对角元 apq(1)=0a_{pq}^{(1)} = 0apq(1)​=0。重复迭代即可。

收敛性证明

定义非对角元平方和:

∥A∥F2−tr(A2)=∑i≠jaij2\|A\|_F^2 - \text{tr}(A^2) = \sum_{i\neq j} a_{ij}^2∥A∥F2​−tr(A2)=i=j∑​aij2​

由 Frobenius 范数不变:

∑i(aii(k+1))2+∑i≠j(aij(k+1))2=∑i(aii(k))2+∑i≠j(aij(k))2\sum_i (a_{ii}^{(k+1)})^2 + \sum_{i\neq j} (a_{ij}^{(k+1)})^2 = \sum_i (a_{ii}^{(k)})^2 + \sum_{i\neq j} (a_{ij}^{(k)})^2i∑​(aii(k+1)​)2+i=j∑​(aij(k+1)​)2=i∑​(aii(k)​)2+i=j∑​(aij(k)​)2

旋转仅改变 app,aqq,apq,aqpa_{pp}, a_{qq}, a_{pq}, a_{qp}app​,aqq​,apq​,aqp​, 且 (app(k+1))2+(aqq(k+1))2=(app(k))2+(aqq(k))2+2(apq(k))2(a_{pp}^{(k+1)})^2 + (a_{qq}^{(k+1)})^2 = (a_{pp}^{(k)})^2 + (a_{qq}^{(k)})^2 + 2(a_{pq}^{(k)})^2(app(k+1)​)2+(aqq(k+1)​)2=(app(k)​)2+(aqq(k)​)2+2(apq(k)​)2

代入得:

∑i≠j(aij(k+1))2=∑i≠j(aij(k))2−2(aij(k))2\sum_{i\neq j} (a_{ij}^{(k+1)})^2 = \sum_{i\neq j} (a_{ij}^{(k)})^2 - 2(a_{ij}^{(k)})^2i=j∑​(aij(k+1)​)2=i=j∑​(aij(k)​)2−2(aij(k)​)2

选择最大非对角元 ∣apq∣|a_{pq}|∣apq​∣ 消除,则:

∑i≠j(aij(k+1))2≤(1−2n(n−1))∑i≠j(aij(k))2\sum_{i\neq j} (a_{ij}^{(k+1)})^2 \leq \left(1 - \frac{2}{n(n-1)}\right) \sum_{i\neq j} (a_{ij}^{(k)})^2i=j∑​(aij(k+1)​)2≤(1−n(n−1)2​)i=j∑​(aij(k)​)2

故当 k→∞k\to\inftyk→∞ 时,∑i≠j(aij(k))2→0\sum_{i\neq j} (a_{ij}^{(k)})^2 \to 0∑i=j​(aij(k)​)2→0,算法收敛。

注:可以把 Frobenius 范数理解为能量,通过一次变换会将能量集中于对角线,从而实现收敛。

Jacobi 法算法实现

  1. 选择最大非对角元 ∣aij∣|a_{ij}|∣aij​∣
  2. 计算旋转角 θ\thetaθ
  3. 更新 A←QijTAQijA \leftarrow Q_{ij}^T A Q_{ij}A←QijT​AQij​
  4. 累积正交矩阵 V←VQijV \leftarrow V Q_{ij}V←VQij​
  5. 重复直至非对角元足够小
k = 0
n = A.shape[0]
V = np.eye(n)

while k < N:
    k += 1

    # 选最大非对角元
    p, q = 0, 1
    max_off = 0
    for i in range(n):
        for j in range(i + 1, n):
            if abs(A[i, j]) > max_off:
                max_off = abs(A[i, j])
                p, q = i, j
    
    if max_off < EPS:
        break
    
    # 计算旋转参数
    tau = (A[q, q] - A[p, p]) / (2 * A[p, q])
    if tau >= 0:
        t = 1 / (tau + np.sqrt(1 + tau**2))
    else:
        t = -1 / (-tau + np.sqrt(1 + tau**2))
    c = 1 / np.sqrt(1 + t**2)
    s = c * t
    
    # 更新 A
    a_pp, a_qq, a_pq = A[p, p], A[q, q], A[p, q]
    A[p, p] = c**2 * a_pp + s**2 * a_qq - 2*s*c*a_pq
    A[q, q] = s**2 * a_pp + c**2 * a_qq + 2*s*c*a_pq
    A[p, q] = A[q, p] = 0
    
    for i in range(n):
        if i != p and i != q:
            a_ip, a_iq = A[i, p], A[i, q]
            A[i, p] = A[p, i] = c*a_ip - s*a_iq
            A[i, q] = A[q, i] = s*a_ip + c*a_iq
    
    # 累积 V
    for i in range(n):
        v_ip, v_iq = V[i, p], V[i, q]
        V[i, p] = c*v_ip - s*v_iq
        V[i, q] = s*v_ip + c*v_iq

eigvals = np.diag(A)
idx = np.argsort(eigvals)[::-1] # 从大到小排序
eigvals = eigvals[idx]
eigvecs = V[:, idx]

注: 现代实现多按固定顺序遍历所有 (i,j)(i,j)(i,j) 对,虽收敛稍慢但更适合并行计算。


方法对比与适用场景

方法适用矩阵目标特征值计算复杂度
幂法唯一主特征值最大模特征值O(n2)O(n^2)O(n2)
位移幂法唯一主特征值接近 λ0\lambda_0λ0​ 的特征值O(n2)O(n^2)O(n2)
降阶幂法对称矩阵前k个特征值O(kn3)O(kn^3)O(kn3)
反幂法非奇异矩阵最小模特征值O(n3)O(n^3)O(n3)(LU分解)+ O(n2)O(n^2)O(n2)
Jacobi 法实对称矩阵所有特征值O(n4)O(n^4)O(n4)
目录
  • 问题引入
  • 特征值与特征向量基本概念回顾
    • 基本定义
    • 重要定理
  • 幂法
    • 幂法的数学原理
    • 幂法的几何直观
    • 数值稳定性改进
    • 幂法算法实现
  • 位移幂法
    • 位移幂法的数学原理
    • 位移幂法的几何直观
    • 位移幂法算法实现
  • 降阶幂法
    • 降阶幂法的数学原理
    • 降阶幂法的几何直观
  • 反幂法
    • 反幂法的数学原理
    • 反幂法算法实现
  • 位移反幂法
  • Jacobi 法
    • 核心思想
    • 2×2 子问题求解
    • n×n 矩阵求解
    • 收敛性证明
    • Jacobi 法算法实现
  • 方法对比与适用场景
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo