【问题标题】:Getting eigenvalues from 3x3 matrix in Python using Power method使用Power方法从Python中的3x3矩阵获取特征值
【发布时间】:2018-01-22 15:59:52
【问题描述】:

我正在尝试通过在 Python 中使用幂法从 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()

PS。有没有更简单的方法可以从幂法而不是矩阵变形中获得第二个和第三个特征值?

【问题讨论】:

  • 除非你这样做是为了学习,否则numpy中已经有一个existing eigenvalue method
  • @Petar 我知道,但我这样做是为了学习。所以这种特征值方法对我来说不是一个选择。

标签: python numpy linear-algebra numerical-methods


【解决方案1】:

lamb = x_norm

你只计算特征值的绝对值。更好地将它们计算为

lamb = dot(x,x_1)

其中x 被假定为标准化。

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

【讨论】:

  • 你是对的。范数给了我特征值的绝对值,当我将第二个特征值乘以 (-1) 时,我的程序运行良好并给出了正确的结果。
【解决方案2】:

我不知道这个方法,所以我google了一下,在这里找到了:

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

它仅对查找前导(最大)特征值有效,因此,它似乎对您很有效,并且不能保证以下特征值是正确的。 顺便提一句。 numpy.linalg.eig() 的工作速度比你的这个矩阵的代码要快,但我猜你是把它作为练习来实现的。

【讨论】:

  • 是的,我将其作为一个练习来实现,Power Method 有一种方法可以使用此处描述的 Deflation 方法获取所有特征值:math.stackexchange.com/questions/768882/… 但我不知道,为什么它给了我错误的值。
  • 只是我注意到的一件事,它可能是查找错误的提示:在您的代码中,您缺少(关于 math.stack 接收)R = R/|v|^2 这无关紧要,因为在你的情况这个规范将永远等于统一。但是,为什么这个除法仍然列在 math.stack 配方中?也许那里不团结,您的v = x_1/la.norm(x_1) 行无效。只是一个观察。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2022-01-05
  • 2017-09-27
  • 2014-12-23
相关资源
最近更新 更多