幂法
含义
幂法是计算矩阵的按模最大的特征值和相应特征向量的一种向量迭代法
适用于大型稀疏矩阵
基础知识
求矩阵A特征值问题等价于求A的特征方程。
∣λE−A∣=⎣⎢⎢⎡λ−a11−a21⋯λ−an1−a12λ−a22⋯−an2⋯⋯⋯⋯−a1n−a2n⋯λ−ann⎦⎥⎥⎤=0
求A的属于特征值\lambda的特征向量等价求
(λE−A)x=0 的非零解
设λ为A∈Rx∗n的特征值,x称为A的与特征值λ相对应的一个特征向量,即Ax=λx,(x̸=0),则有:
(1)cx(c̸=0)也是A的与特征值λ相对应的一个特征向量,即Acx=λcx
(2)λk为Ak的特征值,Akx=λkx
思想
设n阶矩阵A的特征值和特征向量为
λ1,λ2,...,λn v1,v2,...vn
v1,v2,...vn线性无关,且
∣λ1∣>∣λ2∣>...>∣λn∣
称λ1为A的按模最大特征值(主特征值)
任取非零向量x0=(x1(0),xx(0),⋯,xn(0))
特征向量构成n维空间的一组基.任取的初始向量X(0)由它们的线性组合给出
x0=a1v1+a2v2+…+anvn
假设a1̸=0,由此构造向量序列xk=Axk−1,k=1,2,3...
其中,x1=Ax0=a1Av1+a2Av2+...+anAvn=
=a1λ1v1+a2λ2v2+...+anλnvn
x2=Ax1=a1λ1Av1+a2λ2Av2+...+anλnAvn=
=a1λ12v1+a2λ22v2+...+anλn2vn
得到向量序列:
x1=a1λ1v1+a2λ2v2+...+anλnvn
x2=a1λ12v1+a2λ22v2+...+anλn2vn
…
xk=a1λ1kv1+a2λ2kv2+...+anλnkvn
下面按模最大特征值λ1是单根的情况讨论:
xk=a1λ1kv1+a2λ2kv2+...+anλnkvn=λ1k[a1v1+a2(λ1λ2)kv2+...+an(λ1λn)2vn]=λ1k(a1v1+εk)
εk=a2(λ1λ2)kv2+...+an(λ1λn)2vn
由于∣λ1∣>∣λ2∣>...>∣λn∣ 故∣λ1λj∣<1(j=2,3,...n),故:
k→+∞limεk=0 则有k→+∞limλ1k1xk=k→+∞limλ1kλ1k(a1v1+εk)=a1v1
k→+∞limλ1k1xk=a1v1就是λ1对应的特征向量
用向量xk+1的第i个分量与向量xk的第i个分量之比的极限:
k→+∞lim(xk)i(xk+1)i=k→+∞limλ1k(a1v1+εk)iλ1k+1(a1v1+εk+1)i=k→+∞lima1(v1)i+(εk)iλ1[a1(v1)i+(εk+1)i]=λ1
得到两个极限:
k→+∞limλ1k1xk=a1v1 k→+∞lim(xk)i(xk+1)i=λ1
因此当k趋近无穷时,就能近似得到按模最大的特征值和对应的特征向量:
λ1≈(xk)i(xk+1)i xk≈λ1ka1v1
因此得幂方法的迭代公式:xk=Axk−1 k=1,2,...
当k充分大时,有:
{λ1≈(xk)i(xk+1)ixk≈λ1ka1v1
存在的问题是:当∣λ1∣>1时,xk中不为0的分量会随着k→∞而趋于∞,计算机计算时会造成溢出,当|\lambda_1|<1时,x_k中的分量会随着k\rightarrow \infty而趋于0$,
实际计算时,为了避免计算过程中出现绝对值过大或过小的数参加运算,通常在每步迭代时,将向量“归一化”即用的按模最大的分量 。
修改计算公式:
⎩⎪⎨⎪⎧yk=Axk−1mk=max(yk)xk=yk/mk(k=1,2,...)
上式中mk是向量yk中绝对值最大的一个分量,这时xk分量的模最大为1
当k充分大时,有:
{λ1≈mkv1≈xk
实例
求矩阵
⎣⎡2103336241⎦⎤的主特征值和其对应的特征向量
根据迭代公式:
⎩⎪⎨⎪⎧yk=Axk−1mk=max(yk)xk=yk/mk(k=1,2,...)
取x0=(0,0,1)T,则有:
y1=(2,4,1)T,m1=4,x1=m11y1=(0.5,1,0.25)T
直到k=8
![幂法求解矩阵特征值及特征向量 幂法求解矩阵特征值及特征向量](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg4OS82YjM5YTA5MDg2MzdkYWNkNjUyZWRlNjMxYTI2YmNmOS5wbmc=)
Python实现
#-*- coding:utf-8 -*-
#@author:whs
#@time: 2019/3/2111:25
import numpy as np
def Solve(mat, max_itrs, min_delta):
"""
mat 表示矩阵
max_itrs 表示最大迭代次数
min_delta 表示停止迭代阈值
"""
itrs_num = 0
delta = float('inf')
N = np.shape(mat)[0]
# 所有分量都为1的列向量
x = np.ones(shape=(N, 1))
#x = np.array([[0],[0],[1]])
while itrs_num < max_itrs and delta > min_delta:
itrs_num += 1
y = np.dot(mat, x)
#print(y)
m = y.max()
#print("m={0}".format(m))
x = y / m
print("***********第{}次迭代*************".format(itrs_num))
print("y = ",y)
print("m={0}".format(m))
print("x^T为:",x)
print(
"===================================")
IOS = np.array([[2, 3, 2],
[10, 3, 4],
[3, 6, 1]], dtype=float)
Solve(IOS, 10, 1e-10)
输出:
***********第1次迭代*************
y = [[ 7.]
[17.]
[10.]]
m=17.0
x^T为: [[0.41176471]
[1. ]
[0.58823529]]
===================================
***********第2次迭代*************
y = [[5. ]
[9.47058824]
[7.82352941]]
m=9.470588235294118
x^T为: [[0.52795031]
[1. ]
[0.82608696]]
===================================
***********第3次迭代*************
y = [[ 5.70807453]
[11.58385093]
[ 8.40993789]]
m=11.58385093167702
x^T为: [[0.49276139]
[1. ]
[0.72600536]]
===================================
***********第4次迭代*************
y = [[ 5.43753351]
[10.83163539]
[ 8.20428954]]
m=10.831635388739945
x^T为: [[0.50200485]
[1. ]
[0.75743775]]
===================================
***********第5次迭代*************
y = [[ 5.5188852 ]
[11.04979951]
[ 8.2634523 ]]
m=11.049799514875502
x^T为: [[0.49945569]
[1. ]
[0.74783731]]
===================================
***********第6次迭代*************
y = [[ 5.49458599]
[10.98590609]
[ 8.24620437]]
m=10.985906091381928
x^T为: [[0.50014864]
[1. ]
[0.75061668]]
===================================
***********第7次迭代*************
y = [[ 5.50153064]
[11.00395312]
[ 8.2510626 ]]
m=11.003953118800313
x^T为: [[0.49995948]
[1. ]
[0.74982713]]
===================================
***********第8次迭代*************
y = [[ 5.49957322]
[10.99890329]
[ 8.24970556]]
m=10.998903290037243
x^T为: [[0.50001105]
[1. ]
[0.75004801]]
===================================
***********第9次迭代*************
y = [[ 5.50011813]
[11.00030258]
[ 8.25008117]]
m=11.000302582696586
x^T为: [[0.49999699]
[1. ]
[0.74998675]]
===================================
***********第10次迭代*************
y = [[ 5.49996747]
[10.99991685]
[ 8.24997771]]
m=10.999916852432536
x^T为: [[0.50000082]
[1. ]
[0.75000364]]
===================================