本文介绍一种简单有效的计算矩阵特征值与特征向量的近似值的方法——幂法。
主要参考《数值计算方法与算法》,《数值方法:设计、分析和算法实现 》
一、幂法基本方法
在实际问题中, 矩阵的按模最大特征值往往起更重要的作用. 例如: 矩阵的谱半径即矩阵的按模最大特征值的值, 决定了迭代矩阵是否收敛。因此, 矩阵的按模最大的特征值比其余的特征值的地位更加重要. 幂法是计算矩阵按模最大特征值及相应的特征向量的数值方法.
简单地说,任取初始向量 X(0) ,进行迭代计算
X(k+1)=AX(k)
得到迭代序列 {X(k)}, 分析 X(k+1) 与 X(k) 之间的关系, 得到 A 的按模最大特征值及特征向量的近似解.
在幂法中, 假设矩阵 A 有特征值 λi,i=1,2,⋯,n, 其中
∣λ1∣⩾∣λ2∣⩾∣λ3∣⩾⋯⩾∣λn∣
并有 n 个线性无关的特征向量 vi,Avi=λivi,i=1,2,⋯,n.
任取初始向量 X(0),X(0) 可由 A 的 n 个线性无关的特征向量 vi 的线性表示. 设
X(0)=α1v1+α2v2+⋯+αnvn
那么,
X(1)=AX(0)=α1λ1v1+α2λ2v2+⋯+αnλnvn
一般地, 有
X(k)=AX(k−1)=α1λ1kv1+α2λ2kv2+⋯+αnλnkvn
(1) 按模最大的特征值只有一个, 且是单实根.
设 ∣λ1∣>∣λ2∣⩾∣λ3∣⩾⋯∣λn∣,
由上面的讨论我们知道
X(k)=α1λ1kv1+α2λ2kv2+⋯+αnλnkvn=λ1k[α1v1+α2(λ1λ2)kv2+⋯+αn(λ1λn)kvn]
若 α1=0, 由于 ∣∣∣∣λ1λi∣∣∣∣<1,i=2,3,⋯,n, 对充分大的 k :
∣∣∣∣∣λ1λi∣∣∣∣∣k→0,i=2,3,⋯,n
故
X(k)≈λ1kα1v1,X(k+1)≈λ1k+1α1v1=λ1λ1kα1v1=λ1X(k)
得到按模最大的特征值
λ1≈xi(k+1)/xi(k),i=1,2,⋯,n
相应的特征向量近似地为 X(k).
显然{xi(k+1)/xi(k)} 收敛于 λ1 的速度取决于比值 ∣∣∣∣λ1λ2∣∣∣∣ 的大小
(2) 按模最大的特征值是互为反号的实根.
设 λ1>0, 且 λ1=−λ2, 即 ∣λ1∣=∣λ2∣>∣λ3∣⩾⋯⩾∣λn∣. 这时有
X(k)=λ1k(α1v1+(−1)kα2v2+α3(λ1λ3)kv3+⋯+αn(λ1λn)kvn)
当 k 充分大时,有
X(k)≈λ1k(α1v1+(−1)kα2v2)X(k+1)=λ1k+1(α1v1+(−1)k+1α2v2)(X(k) 与 X(k+1) 没有比例关系 )X(k+2)≈λ1k+2(α1v1+(−1)k+2α2v2)≈λ12X(k)
对充分大的 k,X(k) 与 X(k+2) 近似一个常数因子 λ12. 所以
λ1=xi(k+2)/xi(k)
再计算相应的特征值
得
{X(k+1)=λ1k+1(α1v1+(−1)k+1α2v2)X(k)=λ1k(α1v1+(−1)kα2v2){X(k+1)+λ1X(k)≈2λ1k+1α1v1X(k+1)−λ1X(k)≈(−1)(k+1)2λ1α2v2
按特征向量的性质, 相应的特征向量可以取为
{v1=X(k+1)+λ1X(k)v2=X(k+1)−λ1X(k)
还有很多更复杂的情况, 可参考有关书籍或选用其他方法. 这里只讨论两种情况. 在计算中若 xi(k+1)/xi(k) 的比值趋于一个稳定的值, 则属于第一种情况, 如果 xi(k+1)/xi(k) 不能趋于一个稳定的值, 但是 xi(2k+2)/xi(2k) 和 xi(2k+1)/xi(2k−1) 的比值分别趋于一个稳定的值, 则属于第二种情况。
二、幂法的规范计算
在幂法迭代计算 X(k+1)=AX(k) 中, 当 k 充分大时, 若 A 的按模最大特征值其绝对值较大时, X(k) 的某些分量迅速增大, 或许会超过计算机实数的值域 (上溢); 而 A 的按模最大特征值其绝对值较小时, X(k) 的分量迅速缩小,当 k 充分大时, 或许会被计算机当零处理 (下溢). 因此, 分量过大或过小都会导致计算失败。在实际计算中, 通常采用规范运算, 对 X(k) 的每个元素除以 X(k) 按模最大的分量 ∥∥∥X(k)∥∥∥∞=max1⩽i⩽n∣∣∣∣xi(k)∣∣∣∣
规范运算可按下面公式进行
{Y(k)=X(k)/∥∥∥X(k)∥∥∥∞,X(k+1)=AY(k),k=0,1,⋯
规范化运算保证了 ∥∥∥Y(k)∥∥∥=1, 即 Y(k) 按摸最大分量的值保持为 1 或 -1 .下面给出在规范运算中迭代序列的几种情况:
(1) 如果 {X(k)} 收敛, 则 A 的特征值按模最大分量的值仅有一个, 且 λ1>0,对充分大的 k, 按模最大分量 xj(k) 不变号, 对应的 ∣∣∣∣yj(k)∣∣∣∣=1,λ1≈∣∣∣∣xj(k+1)∣∣∣∣, 即
λ1≈1⩽i⩽nmax∣∣∣∣xi(k+1)∣∣∣∣=∣∣∣∣xj(k+1)∣∣∣∣
相应的特征向量是 v1≈Y(k).
(2) 如果 {X(2k)},{X(2k+1)} 分别收敛于互为反号的向量, 则按模最大的特征值也仅有一个单实根, 且 λ1<0, 即对充分大的 k, 若 xj(k) 的符号交替变号, 则 λ1为负值.
λ1≈−1⩽i⩽nmax∣∣∣∣xi(k)∣∣∣∣=−∣∣∣∣xj(k)∣∣∣∣
相应的特征向量是 v1≈Y(k).
(3) 如果 {X(2k)},{X(2k+1)} 分别收敛于两个不同的向量(与(2)不同),则按模最大的特征值有两个, 是互为反号的一对实根. 这时, 对充分大的 k, 再作一次非规范运算
X(k+1)=AX(k)
则
λ1≈xi(k+1)/yi(k−1),λ2=−λ1
而仍有
{V1=X(k+1)+λ1X(k)V2=X(k+1)−λ1X(k)
(4) 如果 {X(k)} 的趋势无一定的规律, 这时 A 的按模最大的特征值的情况更为复杂,需要另行处理.
三、幂法加速:原点位移法
矩阵 B=A−pI 特征值与矩阵 A 的特征值分别为 λ 与 λ−p. 通过计算矩阵 A−pI 的特征值得到矩阵 A 的特征值的方法称为原点位移法.
若取得的 p 满足
∣∣∣∣∣λ1−pλ2−p∣∣∣∣∣<∣∣∣∣∣λ1λ2∣∣∣∣∣
则对矩阵 B 的幂法, 收敛会比矩阵 A 的幂法要快. 只有对矩阵特征值的分布有个大致了解, 才能有效选取 p
四、反幂法
反幂法是计算矩阵按模最小的特征值以及相应的特征向量的数值方法,实际上同样使用的是幂法方法
设矩阵 A 可逆, λ 和 v 分别为 A 的特征值以及相应的特征向量,对 Av=λv两边同乘 A−1, 得 A−1v=λ1v. 可见 A 和 A−1 的特征值互为倒数, 而且 v 也是 A−1 的特征值 λ1 的特征向量. A−1 的按模最大的特征值正是 A 的按模最小的特征值的倒数. 用幂法计算 A−1 按模最大的特征值从而得到 A 的按模最小的特征值的方法, 称为反幂法. 显然, A 的按模最小特征值越接近于 0 , 收敛越快.
用幂法计算 A−1 按模最大的特征值仍可用规范方法:
任取 X(0) ,规范迭代
{Y(k)=X(k)/∥∥∥X(k)∥∥∥∞,k=0,1,⋯....X(k+1)=A−1Y(k),
在实际计算中不是先算出 A−1, 再作乘积 A−1Y(k) ,而是解方程 AX(k+1)= Y(k), 求得 X(k+1). 由于需要反复求解, 一般不用 Gauss 消元法, 而用直接分解法解方程. 将 A 分解为 A=LU, 记 UX(k+1)=Z(k+1), 由 LZ(k+1)=Y(k) 解出 Z(k+1),再由 UX(k+1)=Z(k+1) 解出 X(k+1) 。
规范迭代计算公式:
{Y(k)=X(k)/∥∥∥X(k)∥∥∥∞,AX(k+1)=Y(k),k=0,1,⋯
若我们想知道最接近 p 的特值值 λi, 可以使用带原点位移的反幂法计算公式
{Y(k)=X(k)/∥∥∥X(k)∥∥∥∞,(A−pI)X(k+1)=Y(k),k=0,1,⋯
计算得到特征值 μ,
λi=p+μ1
五、幂法的程序实现
下面给出一个简单的幂法计算示例,用Python实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import numpy as np def power_method(A, num_iterations=1000, tolerance=1e-9):
n = A.shape[0] b_k = np.random.rand(n)
b_k = b_k / np.linalg.norm(b_k)
for _ in range(num_iterations): b_k1 = np.dot(A, b_k) eig_val = np.linalg.norm(b_k1) b_k1 = b_k1 / eig_val if np.linalg.norm(b_k1 - b_k) < tolerance: return eig_val, b_k1
b_k = b_k1
return eig_val, b_k
if __name__ == "__main__": A = np.array([ [1, 1 ,0.5], [1, 1 ,0.25], [0.5, 0.25, 2] ])
eigenvalue, eigenvector = power_method(A) print("最大特征值:", eigenvalue) print("对应的特征向量:", eigenvector)
|
六、小结
总结一下,幂法和反幂法可以帮助我们求解矩阵的主特征值与最小模值特征值,通过原点平移以及归一化方法,可以加速幂法的计算。但这一方法也有很大的局限性,例如并不是所有的矩阵都可以在幂法下收敛,以及很多时候,我们同样需要关心除了最大与最小模特征值以外的特征值,就需要选用其他方法了。