使用 Power 方法从 Python 中的 3x3 矩阵获取特征值



我正在尝试使用 Python 中的 Power Method 从 3x3 矩阵中获取所有特征值。但是,由于某种原因,我的方法返回的特征值与正确的特征值不同。

我的矩阵: A = [[1, 2, 3], [2, 4, 5]

, [3, 5,-1]]

正确的特征值: [ 8.54851285, -4.57408723, 0.02557437 ]

我的方法返回的特征值:[ 8.5485128481521926, 4.5740872291939381, 9.148174458392436 ]

所以第一个是正确的,第二个有错误的符号,第三个都是错误的。我不知道我做错了什么,我也看不出我在哪里犯了错误。

这是我的代码:

import numpy as np
import numpy.linalg as la
eps = 1e-8 # Precision of eigenvalue
def trans(v): # translates vector (v^T)
    v_1 = np.copy(v)
    return v_1.reshape((-1, 1))
def power(A):
    eig = []
    Ac = np.copy(A)
    lamb = 0
    for i in range(3):
        x = np.array([1, 1, 1])
        while True:
            x_1 = Ac.dot(x) # y_n = A*x_(n-1)
            x_norm = la.norm(x_1) 
            x_1 = x_1/x_norm # x_n = y_n/||y_n||
            if(abs(lamb - x_norm) <= eps): # If precision is reached, it returns eigenvalue
                break
            else:
                lamb = x_norm
                x = x_1
        eig.append(lamb)
        # Matrix Deflaction: A - Lambda * norm[V]*norm[V]^T
        v = x_1/la.norm(x_1)
        R = v * trans(v)
        R = eig[i]*R
        Ac = Ac - R
    return eig
def main():
    A = np.array([1, 2, 3, 2, 4, 5, 3, 5, -1]).reshape((3, 3))
    print(power(A))

if __name__ == '__main__':
    main()

附言。有没有更简单的方法可以从幂法而不是矩阵偏转中获取第二个和第三个特征值?

lamb = x_norm

您永远只能计算特征值的绝对值。更好地将它们计算为

lamb = dot(x,x_1)

其中假定x是规范化的。

由于您没有删除负特征值 -4.57408723,而是有效地将其相加,因此第三阶段的最大特征值将2*-4.574.. = -9.148..,您再次计算绝对值。

我不知道

这个方法,所以我用谷歌搜索它并在这里找到:

http://ergodic.ugr.es/cphys/LECCIONES/FORTRAN/power_method.pdf

仅适用于查找前导(最大(特征值,因此,它似乎对您有用,并且不能保证以下特征值是正确的。顺便说一句。 对于此矩阵,numpy.linalg.eig()比您的代码工作得更快,但我猜您将其作为练习实现。

相关内容

  • 没有找到相关文章

最新更新