当矩阵的最大特征值是实数的时候,无论该特征值是否是重根,都可以使用幂法来求矩阵的这个最大特征值、也就是主特征值
关于幂法的说明,可以参考搜狗百科
幂法求矩阵特征值 - 搜狗百科baike.sogou.com这里补充一点,无论该特征值是否是重根,都可以使用幂法来求矩阵的这个最大特征值。重根的情况下,最后得到的特征向量,也是在这个特征值的特征子空间里的,只不过会与选取的迭代初始值有关。
MATLAB 程序
function [eig, v] = power_method(M, tol)
% 使用幂法求矩阵的最大实特征值的近似值
% M: 给定的矩阵,tol: 允许的误差上界。 eig: 返回的主特征值近似值
[m, ~] = size(M);
v0 = ones(m, 1);
v1 = M * v0;
k = 1;
while abs(max(v0) - max(v1)) > tol
v0 = v1;
v1 = M * (v0 / max(v0));
k = k + 1;
end
eig = max(v1);
v = v1 / max(v1);
fprintf('共迭代%d次n', k)
end
Python 程序
import numpy as np
def power_method(M, tol):
'''
使用幂法求矩阵的最大实特征值的近似值
M: 给定的矩阵, ndarray类型,tol: 允许的误差上界。 eig: 返回的主特征值近似值
'''
m = M.shape[0]
v0 = np.ones((m, 1))
v1 = M @ v0
k = 0
while np.abs(np.max(v0) - np.max(v1)) > tol:
v0 = v1
v1 = M @ (v1 / np.max(v1))
k += 1
print(f'共迭代{k}次')
eig = np.max(v1)
v = v1 / eig
return eig, v
对于一个 n 阶矩阵,幂法每次迭代需要计算
次,若迭代 k 次,那么总的计算次数近似为
,要减少计算量就需要减少迭代的次数。
幂法收敛速度取决于
,其中
是主特征值,
是除主特征值外第二大的特征值,当这个比值接近 1 的时候,收敛的速度是不够快的。
对幂法的改进,比较经典和易于理解的就是原点平移法。欲求矩阵A的特征值,转化为求矩阵
的特征值,就有收敛速度
,如果这个数是远小于1的,那么就能有较快的收敛速度,当然这个 p 值的选取也是有考量的。
此外,实际应用中,幂法通常用来求稀疏矩阵的主特征值和对应的特征向量。
对于一个稀疏的马尔科夫矩阵,我们已经知道它必有一个最大的实特征值 1,且代数重数也是1,要求 特征值 1 对应的特征向量,就可以用这种办法!!
不知道大家有没有想到什么,一个非常经典的算法就要用到本文所说的幂法。总之,欢迎大家转载我的文章并且附上链接哦~