幂法求特征值 matlab_幂法求矩阵的主特征值和对应的特征向量

当矩阵的最大特征值是实数的时候,无论该特征值是否是重根,都可以使用幂法来求矩阵的这个最大特征值、也就是主特征值

关于幂法的说明,可以参考搜狗百科

幂法求矩阵特征值 - 搜狗百科​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 阶矩阵,幂法每次迭代需要计算

equation?tex=%5CTheta+%28n%5E2%2Bn%29 次,若迭代 k 次,那么总的计算次数近似为
equation?tex=O%28k+n%5E2%29 ,要减少计算量就需要减少迭代的次数。

幂法收敛速度取决于

equation?tex=%7C%5Cfrac%7B%5Clambda_2%7D%7B%5Clambda_1%7D%7C ,其中
equation?tex=%5Clambda_1 是主特征值,
equation?tex=%5Clambda_2 是除主特征值外第二大的特征值,当这个比值接近 1 的时候,收敛的速度是不够快的。

对幂法的改进,比较经典和易于理解的就是原点平移法。欲求矩阵A的特征值,转化为求矩阵

equation?tex=A+-+pI 的特征值,就有收敛速度
equation?tex=%7C%5Cfrac%7B%5Clambda_1+-+p%7D%7B%5Clambda_n+-+p%7D%7C ,如果这个数是远小于1的,那么就能有较快的收敛速度,当然这个 p 值的选取也是有考量的。

此外,实际应用中,幂法通常用来求稀疏矩阵的主特征值和对应的特征向量。

对于一个稀疏的马尔科夫矩阵,我们已经知道它必有一个最大的实特征值 1,且代数重数也是1,要求 特征值 1 对应的特征向量,就可以用这种办法!!

不知道大家有没有想到什么,一个非常经典的算法就要用到本文所说的幂法总之,欢迎大家转载我的文章并且附上链接哦~

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值