我已经实现了 ETH Zurich 的这份报告中介绍的双班次 QR 算法的一个版本(从第 77 页开始)。该算法通过对我们的原始矩阵(以 Hessenberg 格式)应用正交相似变换来利用隐式 Q 定理。这引入了一个“凸起”,然后我们通过应用连续的户主反射器将其赶出矩阵。最终目标是将原始矩阵转换为实 schur 形式(虽然不是真的,因为复杂的特征值形成为沿对角线的块)。该算法的伪代码如下:
(我已经在 C 中实现了这个特定的算法)
然而,当试图解决伴随矩阵来检索特征值时,我发现它经常出错。甚至他们的示例结果无法解决所有特征值:
将此与我的结果进行比较,它们有很多相同的错误:
5.000000 6.000000 0.390635 -1.005053 -7.905002 7.702966
-6.000000 5.000000 -10.791799 -2.710116 -14.579765 -19.663045
0.000000 0.000000 3.491643 -2.656106 -4.440683 9.373136
0.000000 0.000000 3.843327 -1.491643 -10.829108 -5.067750
0.000000 0.000000 -0.000000 0.000000 4.000000 4.922432
-0.000000 -0.000000 0.000000 0.000000 0.000000 3.000000
即使是较小的矩阵也会带来容差非常低的问题(尽管它们很接近):
输入:(特征值为:4、-3、2、-1)
2.000000 13.000000 -14.000000 -24.000000
1.000000 0.000000 0.000000 0.000000
0.000000 1.000000 0.000000 0.000000
0.000000 0.000000 1.000000 0.000000
输出:
2.968869 11.491388 21.498124 17.801229
0.535591 -1.968869 -3.241184 -2.692433
-0.000000 0.000000 2.000000 1.078408
0.000000 -0.000000 -0.000000 -1.000000
有人可以建议可以进行哪些改进以获得更好的结果?我已经尝试实现我发现的另一种算法,但它提供了更糟糕的结果。即使我通过 Matlab 而不是我自己的 C 版本软件运行它。