我试图在Matlab中简单实现确定矩阵主特征向量的幂方法。如果你反复将任何向量与矩阵相乘,将其归一化,再次相乘并重复,它应该收敛于矩阵的特征向量,对应于最大绝对值的特征值。
这就是我所尝试的:
A1=[13 6;-12 -5]
x=[1;1]
y=(1/norm(x))*x
powerMethod(A1,y,4)
function yn=powerMethod(A,y0,n)
if n>0
x1=A*y0
y1=(1/norm(x1))*x1
powerMethod(A,y1,n-1)
else
yn=y0
end
end
一开始我以为它工作得很好。当x=[-1;1]
时,它收敛到[-0.7071;0.7071]
,这是正确的。矩阵的实际特征向量是(-1,1)
和(-1,2)
。但是当我将x
改为[1;1]
时,现在它收敛到[0.7072;-0.7070]
,这根本不是矩阵的特征向量。x=[1;1]
,[1;10]
,和[1;1000]
都收敛到基本相同的向量。我做错了什么,使x
的不同值收敛到一个甚至不是特征向量的向量?我没有太多的Matlab经验,所以我不知道是因为我误解了幂方法的工作原理还是Matlab的工作原理。
1条答案
按热度按时间tf7tbtn21#
特征向量的任何非零倍数也是特征向量。所以你的答案只有在非零标量倍数以下才是唯一的。特别是,如果e是特征向量,那么-e也是。你的两个答案是正确的,它们只是因为你的出发点而收敛到相反的方向。你可以手工做乘法来证明这一点:
另外,你的函数不需要递归。只要把计算放在一个循环中。例如,