RGW*_*ton 6 python numpy matrix linear-algebra lapack
任何斜对称矩阵 ( A^T = -A ) 都可以转换为埃尔米特矩阵 ( iA ) 并用复数对角化。但也可以通过特殊的正交变换将其转化为块对角形式,并仅使用实数算术找到其特征值。这是在 numpy 中的任何地方实现的吗?
我们来看看dgeev()LAPACK库的功能。该例程计算任何实数双精度方阵的特征值。而且,这个例程就在numpy.linalg.eigvals()numpy 库的 python 函数后面。
LAPACK 的文档dgeev()中描述了所使用的方法。它需要将矩阵简化为其实 Schur 形式。A S
任何实数方阵都A可以表示为:
A=QSQ^t
在哪里:
\n\nQ是实正交矩阵:QQ^t=IS是实块上三角矩阵。S 对角线上的块的大小为 1\xc3\x971 或 2\xc3\x972。事实上,如果A是斜对称的,则这种分解似乎非常接近 通过 的特殊正交变换获得的块对角形式A。而且,确实看到S斜对称矩阵的Schur 形式A是……斜对称的!
事实上,让我们计算 的转置S:
S^t=(Q^tAQ)^t\nS^t=Q^t(Q^tA)^t\nS^t=Q^tA^tQ\nS^t=Q^t(-A)Q\nS^t=-Q^tAQ\nS^t=-S\nRun Code Online (Sandbox Code Playgroud)\n\n因此,如果Q是特殊正交 ( det(Q)=1),S是通过特殊正交变换获得的块对角形式。P另外,可以通过排列 的前两列来计算特殊的正交矩阵,并且通过改变和 的符号获得该矩阵的Q另一个 Schur 形式。的确,。那么,是通过特殊的正交变换得到的块对角形式。SdAS_{12}S_{21}A=PSdP^tSdA
最后,即使numpy.linalg.eigvals()应用于实矩阵返回复数,该过程中也几乎不涉及复杂的计算!
如果您只想计算真实的 Schur 形式,请使用scipy.linalg.schur()带参数的函数output=\'real\'。
只需一段代码即可检查:
\n\nS^t=(Q^tAQ)^t\nS^t=Q^t(Q^tA)^t\nS^t=Q^tA^tQ\nS^t=Q^t(-A)Q\nS^t=-Q^tAQ\nS^t=-S\nRun Code Online (Sandbox Code Playgroud)\n