Matlab中的幂方法给出不一致的结果

flmtquvp  于 2023-04-06  发布在  Matlab
关注(0)|答案(1)|浏览(182)

我试图在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的工作原理。

tf7tbtn2

tf7tbtn21#

特征向量的任何非零倍数也是特征向量。所以你的答案只有在非零标量倍数以下才是唯一的。特别是,如果e是特征向量,那么-e也是。你的两个答案是正确的,它们只是因为你的出发点而收敛到相反的方向。你可以手工做乘法来证明这一点:

>> A1 * [-0.7071;0.7071]
ans =
  -4.949700000000000
   4.949699999999999
>> ans/norm(ans)
ans =
  -0.707106781186548
   0.707106781186547
>> A1 * [0.7072;-0.7070]
ans =
   4.951600000000000
  -4.951400000000000
>> ans/norm(ans)
ans =
   0.707121061700346
  -0.707092500384339

另外,你的函数不需要递归。只要把计算放在一个循环中。例如,

A1=[13 6;-12 -5]
x=[-1;1]
y=(1/norm(x))*x

e = powerMethod(A1,y,20)

function yn = powerMethod(A,y0,n)
yn = y0 / norm(y0);
for k=1:n
    yn = A * yn;
    yn = yn / norm(yn);
end
return
end

相关问题