SciPy QZ广义特征向量

ttvkxqim  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(198)

我使用SciPy的linalg.qz函数来生成病态广义特征值问题的特征值,该问题使用两个输入矩阵A、B。
函数的SciPy documentation给出了4个要拆包的数量:

AA, BB, Q, Z = linalg.qz(A,B)

AA和BB分别表示A和B的广义Schur形式。
Q和Z分别表示左和右Schur向量。
当查看该函数的Matlab实现时,存在两个额外的返回V和W,其列是广义特征向量:

[AA,BB,Q,Z,V,W] = qz(A,B)

由于这两个返回值不可能直接从linalg.qz函数中得到,那么从左、右舒尔向量中提取广义特征向量的最有效方法是什么?

fxnxkyjh

fxnxkyjh1#

答案就在qz算法的原始论文中,你可以参考https://epubs.siam.org/doi/abs/10.1137/0710024?journalCode=sjnaam第251页的第5步,Fortran代码也可以在这篇论文的旧版本中找到。

yeotifhr

yeotifhr2#

我遇到了同样的问题,最终转向了scipy提供的低级LAPACK函数。
在matlab中,这些量可以被找到为

[AA,BB,Q,Z,V,W] = qz(A,B)

在python中,同样的结果可以通过

from scipy.linalg import qz
from scipy.linalg.lapack import zggev

# matlab uses complex output by default

# python uses real

AA, BB, Q, Z = qz(A, B, 'complex')
_, _, V, W, _, _ = zggev(A, B)

不同版本的LAPACK ggev函数取决于数据类型(真实的与复数,单精度与双精度)。文档here以及其他许多地方。

相关问题