首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用`numpy.linalg.eig`求取线性无关特征向量

如何利用`numpy.linalg.eig`求取线性无关特征向量
EN

Stack Overflow用户
提问于 2022-06-23 14:32:06
回答 1查看 126关注 0票数 4

从线性代数中我们知道,任何对称矩阵(我们称之为A)的特征向量都是正交的,也就是说,如果M是所有特征向量的矩阵,则应该得到|det(M)| = 1。我本希望在numpy.linalg.eig中看到这一点,但得到了以下行为:

代码语言:javascript
运行
复制
import numpy as np

def get_det(A, func, decimals=12):
    eigenvectors = func(A)[1]
    return np.round(np.absolute(np.linalg.det(eigenvectors)), decimals=decimals)

n = 100
x = np.meshgrid(* 2 * [np.linspace(0, 2 * np.pi, n)])
A = np.sin(x[0]) + np.sin(x[1])
A += A.T # This step is redundant; just to convince everyone that it's symmetric
print(get_det(A, np.linalg.eigh), get_det(A, np.linalg.eig))

输出

代码语言:javascript
运行
复制
>>> 1.0 0.0

正如您所看到的,numpy.linalg.eigh给出了正确的结果,而numpy.linalg.eig显然返回了一个几乎不可逆的矩阵。我认为这是因为它有一个退化的特征值(在这种情况下是0),对应的特征空间不是正交的,因此总行列式不是1。在下面的例子中,(通常)没有退化的特征值,结果确实是一样的:

代码语言:javascript
运行
复制
import numpy as np
n = 100
A = np.random.randn(n, n)
A += A.T

print(get_det(A, np.linalg.eigh), get_det(A, np.linalg.eig))

输出

代码语言:javascript
运行
复制
>>> 1.0 1.0

现在,不管我的猜测是否正确(即eigeigh之间的区别来自特征值的简并),我想知道是否有一种方法可以使用numpy.linalg.eig得到一个全维特征向量矩阵(也就是使行列式最大化的矩阵),因为我现在处理的是一个接近对称的矩阵,但不是完全对称的,如果特征向量矩阵不是可逆的,它给了我很多问题。谢谢你提前提供帮助!

EN

回答 1

Stack Overflow用户

发布于 2022-06-28 16:22:12

要找到线性独立的特征向量,可以尝试Matrix.rref(),它指定由特征向量形成的矩阵的简化行阶形式。

考虑一个不可对角的矩阵,即它的特征空间不是满秩的。

代码语言:javascript
运行
复制
array([[0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.]])

我们可以用rref()找到它的线性无关特征向量。

代码语言:javascript
运行
复制
A = np.diag(np.ones(2), 1) 
v = np.linalg.eig(A)[1]
result = sympy.Matrix(np.round(v, decimals=100)).rref()
v[:, result[1]]

回传

代码语言:javascript
运行
复制
array([[1.],
       [0.],
       [0.]])

另见:做矩阵约简的python内置函数

找到一个线性独立的向量集,它与所跨越的R^3的物质相同

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72731960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档