在Numpy中解决广义特征值问题

16

我希望解决的问题是这样的:Aw = xBw,其中x是一个标量(特征值),w是一个特征向量,AB是对称、方正的numpy矩阵,维度相等。如果ABd x d,那么我应该能够找到d个x/w对。我应该如何在numpy中解决这个问题?我在Scipy文档中查找并没有找到我想要的内容。


请查看https://dev59.com/JmnWa4cB1Zd3GeqPwg-Z中的广义特征向量。 - emesday
这正是我想做的,但是用 Python。 - Andrew Latham
2个回答

20

对于实对称或复共轭的密集矩阵,您可以使用scipy.linalg.eigh()来解决广义特征值问题。通过使用subset_by_index,您可以指定仅要提取所需的特征值:

from scipy.linalg import eigh

eigvals, eigvecs = eigh(A, B, eigvals_only=False, subset_by_index=[0, 1, 2])

你可以使用 eigvals_only=True 来仅获得特征值。


感谢您澄清这个问题!一开始看这个函数文档中的例子非常不清晰。 - Andrew Latham
这对我的目的来说很令人放心,@Saullo,但我遇到了问题。据我估算,eigh是eig的一种专业化。然而,如果我使用相同的输入使用eigh和eig,我会得到完全不同的答案。是否有其他区别? - Mike Sadler
@MikeSadler,你是使用对称矩阵作为输入吗? - Saullo G. P. Castro
2
@SaulloG.P.Castro,我在我的测试用例中检查它们,发现它们都是对称的和正定的。我现在已经绕过了这个问题,但是eig和eigh返回的结果顺序可能不同吗? - Mike Sadler
3
@MikeSadler 确实。 根据文档,numpy.linalg.eigh返回“按升序排列的特征值,每个特征值重复出现其重数次。” numpy.linalg.eig没有预定义的特征值顺序。 - EA304GT

13

你看过scipy.linalg.eig吗?根据文档

解决一个正常或广义的方阵特征值问题。

这个方法有可选参数b

scipy.linalg.eig(a, b=None, ...
b : (M, M) array_like, optional
Right-hand side matrix in a generalized eigenvalue problem. 
          Default is None, identity matrix is assumed.

OP中的问题是Aw = xBw - emesday
5
那么,问题是什么?scipy.linalg.eig(a, b=None,...: 参数 b:广义特征值问题中的右手边矩阵。默认值为None,假定为单位矩阵。 - RomanHotsiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接