Python中的eig(a,b)给出错误“接受1个位置参数,但给出2个”

时间:2019-01-15 00:47:17

标签: python matlab numpy eigenvalue eigenvector

根据https://docs.scipy.org/doc/numpy-1.15.0/user/numpy-for-matlab-users.html,MATLAB [V,D]=eig(a,b)的等效numpy表达式为V,D = np.linalg.eig(a,b)

但是当我尝试这样做时,我得到了错误:

TypeError: eig() takes 1 positional argument but 2 were given

我很困惑,文档说np.linalg.eig可以接受两个参数?

奇怪的是,当我查看https://docs.scipy.org/doc/numpy-1.15.1/reference/routines.linalg.htmllinalg文档时,在“矩阵特征值”标题下没有提到linalg.eig带有两个参数吗?

如何让eig像在MATLAB中一样接受两个参数?

这在MATLAB中有效

a = diag(ones(3,1));
b = diag(2*ones(3,1));
[V,D] = eig(a,b)

输出:

V =

    0.7071         0         0
         0    0.7071         0
         0         0    0.7071


D =

    0.5000         0         0
         0    0.5000         0
         0         0    0.5000

这在Python中不起作用

import numpy as np

a = np.diag(np.ones(3))
b = np.diag(2*np.ones(3))

V,D = np.linalg.eig(a,b)

错误:

TypeError: eig() takes 1 positional argument but 2 were given

1 个答案:

答案 0 :(得分:2)

正如您在numpy.linalg.eig的文档中看到的那样,它仅接受单个数组参数,因此它不计算广义特征值问题。

幸运的是,我们有scipy.linalg.eig

scipy.linalg.eig(a, b=None, left=False, right=True, overwrite_a=False, overwrite_b=False, check_finite=True, homogeneous_eigvals=False)

    Solve an ordinary or generalized eigenvalue problem of a square matrix.

这是您的示例案例:

import numpy as np 
import scipy.linalg 

a = np.diag(np.ones(3)) 
b = np.diag(2*np.ones(3)) 
eigvals,eigvects = scipy.linalg.eig(a, b) 

现在我们有

>>> eigvals
array([0.5+0.j, 0.5+0.j, 0.5+0.j])

>>> eigvects
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

特征向量的差异可能是由于特征值归一化的选择不同。我将检查两个非平凡矩阵,看看结果是否彼此对应(当然,比较对应的特征值-特征向量对)。