我无法理解为什么不同的语言会为 Schur(QZ) 分解产生不同的答案。我正在努力将 Matlab 中的一些旧东西写到 Julia 和 Python 中,并且遇到了一些与 Matlab qz
、 Juliaschurfact
和 Scipy 之间的差异的问题qz
(Julia 和 Scipy 同意,Matlab 是不同的)。经过一番挖掘,问题的根源似乎是Matlabzgges
默认使用LAPACK(甚至不确定你是否可以使用dgges
,但看起来并不难)而Julia和Scipy都默认为LAPACKdgges
并且可以zgges
通过请求来访问事情要复杂。我可以得到我正在“寻找”的答案,但对简单地“到达”答案有点不满意。
Matlab坚持有理由zgges
吗?对于实数,为什么会zgges
产生dgges
不同的答案(答案仅在几个不一定按行或列相关的数字上的符号不同)?
这是我正在谈论的一个例子(为了完整性和方便查看,使用所有三种语言)。
朱莉娅
A = reshape(1:9, 3, 3)
B = [ 0.47143516 -1.19097569 1.43270697
-0.3126519 -0.72058873 0.88716294
0.85958841 -0.6365235 0.01569637]
# This is the answer without using complex numbers
Freal = schurfact(A, B)
AAreal, BBreal = Freal[:S], Freal[:T]
Qreal, Zreal = Freal[:Q], Freal[:Z]
# This is the complex answer turned into reals
# and matches Matlab's answer
Fcomplex = schurfact(A+0im, B+0im)
AAcomplex, BBcomplex = real(Fcomplex[:S]), real(Fcomplex[:T])
Qcomplex, Zcomplex = real(Fcomplex[:Q]), real(Fcomplex[:Z])
Python
import numpy as np
import scipy.linalg as la
A = np.arange(1, 10).reshape(3, 3).T
B = np.array([[ 0.47143516, -1.19097569, 1.43270697],
[-0.3126519 , -0.72058873, 0.88716294],
[ 0.85958841, -0.6365235 , 0.01569637]])
# Answer without using complex
AAreal, BBreal, Qreal, Zreal = la.qz(A, B)
# Answer using complex and
# matches Matlab's answer
Fcomplex = la.qz(A, B, output="complex")
AAcomplex, BBcomplex, Qcomplex, Zcomplex = map(np.real, Fcomplex)
MATLAB
A = reshape(1:9, 3, 3)
B = [ 0.47143516 -1.19097569 1.43270697
-0.3126519 -0.72058873 0.88716294
0.85958841 -0.6365235 0.01569637]
[AAm, BBm, Qm, Zm] = qz(A, B)
抱歉有点长,但我对为什么会发生这种情况感兴趣。