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

Getting eigenvalues from 3x3 matrix in Python using Power method

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

我的矩阵: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()

PS。有没有更简单的方法从幂法而不是矩阵偏转得到第二个和第三个特征值?

我不知道这个方法,所以我用谷歌搜索了一下,在这里找到了:

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

它只对找到前导(最大)特征值有效,因此,它似乎对你有用,但不保证后面的特征值是正确的。 顺便提一句。 numpy.linalg.eig() 比这个矩阵的代码运行得更快,但我猜你是将它作为练习来实现的。

lamb = x_norm

你永远只计算特征值的绝对值。最好将它们计算为

lamb = dot(x,x_1)

其中 x 被假定为标准化。

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