【问题标题】:How to find eigenvectors and eigenvalues without numpy and scipy?如何在没有 numpy 和 scipy 的情况下找到特征向量和特征值?
【发布时间】:2013-11-04 02:53:33
【问题描述】:

我需要在 python 中计算特征值和特征向量。 numpy 和 scipy 不起作用。他们都写Illegal instruction (core dumped)。我发现要解决问题,我需要检查我的 blas/lapack。所以,我认为可能更简单的方法是编写/找到一个小函数来解决特征值问题。有谁知道这样的解决方案是否存在?

【问题讨论】:

  • 有不止一种方法,但大多数时候你最终会执行矩阵分解/对角化,并且没有合适的数值计算库,很难以简洁的方式完成。此外,每一种直接的方法都是病态的,如果不进行一些优化,就无法保证您会得到与实际解决方案相距甚远的东西。
  • 我也想要一个解决方案。我必须计算小矩阵(4x4)的特征值,所以速度不是大问题。我不能使用 numpy/scipy (不能安装它,出于我无法控制的技术原因),但只能使用纯 python。我宁愿自己不实现算法(我不妨在纸上解决它并实现结果方程!)。一定有一个简单的sn-p!

标签: python linear-algebra


【解决方案1】:

任何有效的解决方案都将在内部使用相同的 blas/lapack 库。我仍然认为修复你的库不会那么难。

但如果您发现它更容易,您可以自己实现这些http://en.wikipedia.org/wiki/List_of_numerical_analysis_topics#Eigenvalue_algorithms 中的任何一个。

我想最容易实现的是power algorithm,但怀疑它是否有效。

【讨论】:

    【解决方案2】:

    编写程序来解决特征值问题的工作量大约是修复库不匹配问题的 100 倍。

    【讨论】:

      【解决方案3】:

      您可以使用 sympy,python 计算机代数系统,使用 Berkowitz 方法在没有本机库的情况下解决特征值问题。它并不快,但如果你有少量的小矩阵,那将不是问题。

      例子:

      >>> from sympy import Matrix
      >>> m = Matrix([[10,2,3], [3,12,5], [5,5,8]])
      >>> print m.eigenvals()
      # this gets the eigenvalues along with their multiplicity
      {10 - (-77/2 + sqrt(1019751)*I/18)**(1/3) - 50/(3*(-77/2 + sqrt(1019751)*I/18)**(1/3)): 1,
       10 - (-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 + sqrt(3)*I/2) - 50/(3*(-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 + sqrt(3)*I/2)): 1,
       10 - 50/(3*(-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 - sqrt(3)*I/2)) - (-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 - sqrt(3)*I/2): 1}
      >>> print map(complex, m.eigenvals().keys())
      [(8.374025140524024+2.117582368135751e-22j), (3.8835463038416105-2.117582368135751e-22j), (17.742428555634365-1.0587911840678754e-22j)]
      
      # check with numpy
      >>> import numpy as np
      >>> print np.linalg.eigvals(np.array(m.tolist(), dtype=float))
      array([ 17.74242856,   8.37402514,   3.8835463 ])
      

      【讨论】:

      • 谢谢,它有效!毕竟我实际上设法安装了 numpy(在我必须处理的过时的 python 和库版本的混乱中),但是下次这可能会很方便。
      猜你喜欢
      • 2021-01-26
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2014-05-11
      • 2011-12-11
      相关资源
      最近更新 更多