应用于实矩阵的 QR 算法如何返回复特征值?

计算科学 线性代数 特征值 迭代法
2021-11-28 09:23:43

我是特征值算法的菜鸟,但有些东西引起了我的注意。QR 算法适用于产生实数/复数特征值的实数/复数矩阵。但是,它不能从实数矩阵中产生复特征值这是一个用 Julia 编写的简单示例,源自此处此处

using LinearAlgebra
A = [7 3 4 11 -9 -2;
    -6 4 -5 7 1 12;
    -1 -9 2 2 9 1;
    -8 0 -1 5 0 8;
    -4 3 -5 7 2 10;
    6 1 4 -11 -7 -1]
M = copy(A)

for i=1:100
    global M
    Q,R = LinearAlgebra.qr(M);
    M=R*Q;
end

display(diag(M))
display(eigvals(A))

6-element Array{Float64,1}:
 -2.8415406888480472
  8.675063708533656
  3.658872985794657
  6.3411270142053695
  0.12201942568224483
  3.0444575546321087
6-element Array{Complex{Float64},1}:
  2.916761509842819 + 13.248032079355992im
  2.916761509842819 - 13.248032079355992im
  5.000000000000005 + 6.000000000000003im
  5.000000000000005 - 6.000000000000003im
 1.5832384901571723 + 1.4155521348117128im
 1.5832384901571723 - 1.4155521348117128im

将矩阵A定义为复数,只有实部,没有区别。

我的问题是:

  • 我对这个主题的概念误解是什么?
  • 我做错了什么?
  • 以及如何解决?

谢谢

3个回答

简而言之,QR 算法应用于矩阵A是收敛到实 Schur 分解的迭代过程:酉矩阵Q和一个矩阵R块上三角形形式(见下文),使得A=QRQT. 由此可见,列Q是特征向量(这是计算的主要对象!)并且R具有相同的特征值A.

关键点是块上三角形式,这意味着

R=(R110Rmm),
在哪里Rii真正的

  • 尺寸1×1, 在这种情况下Rii是(实)特征值A, 或者
  • 尺寸2×2, 在这种情况下Rii有一对复共轭特征值A(如2+i2i)。

因为你可以计算特征值2×2分析矩阵(作为二次多项式的根),从计算的(近似值)中提取复杂的特征值是一个便宜的步骤R最后——这就是eigvals它的作用。

所以你的概念误解如下:每一个真实的n×n矩阵有n特征值,但它们不必是真实的(或不同的)——看看 Richard Zhang 现在删除的例子,A=(0110), 具有特征值±i. 只有当矩阵对称时,特征值才能保证为实数(并且矩阵R对角线) - 所以你的代码只适用于对称矩阵。如果输入矩阵是非对称的,您还必须通过识别2×2块(例如,通过检查下对角元素是否大于容差),如果是,则通过公式计算特征值。

这有点乏味,但是如果您愿意作弊并eigenvalues使用2×2块,您的代码的以下修改将做到这一点:

using LinearAlgebra
A = [7 3 4 11 -9 -2;
    -6 4 -5 7 1 12;
    -1 -9 2 2 9 1;
    -8 0 -1 5 0 8;
    -4 3 -5 7 2 10;
    6 1 4 -11 -7 -1]
M = copy(A)

for i=1:100
    global M
    Q,R = LinearAlgebra.qr(M);
    M=R*Q;
end

eig = Complex{Float64}[]
let
    i=1
    N=size(M,1)
    while i<N   
        if abs(M[i+1,i])<1e-10             
            append!(eig,M[i,i])         
            i+=1         
        else             
            append!(eig,eigvals(M[i:i+1,i:i+1]))         
            i+=2         
        end                 
    end
    if length(eig)<N
       append!(eig,M[N:N,N:N])
    end                 
end       

忘记 QR 算法,记住什么是特征值 - 它们是矩阵特征多项式的根(参见例如https://en.wikipedia.org/wiki/Characteristic_polynomial)。对于 N 阶实数矩阵,这是具有实系数的 N 阶多项式。但实系数并不一定意味着实根,你可能有复共轭对。因此,一般实矩阵可能具有复特征值。

我已经多次使用这个方程来测试收敛性。第一行的 11 应该是 -11。运行 QR 算法而不移动,就像矩阵一样,大约 60 次迭代会产生一个矩阵,其特征值几乎完全显示在对角线上,即使是复杂的。5+-6i 在前两行,4 和 3 在接下来的两行,最后是 1+-21 在右下角。不要认为在不计算 2x2 矩阵特征值的情况下,复杂值通常会如此清晰地显示。