如何将 Aasen 算法的输出提取为可用形式?

计算科学 线性代数
2021-12-19 02:11:49

我尝试在Aasen 1971 年关于分解对称不定矩阵的论文中实现该算法。我已经将 Algol 中的代码逐字翻译成 Python,并使用了论文中给出的测试示例。他们从测试示例中打印出来的结果与我的相符。我尝试将输出提取为可用的形式:三对角矩阵T、下单位三角矩阵L和排列P问题是,当我执行时,pprint(L * T * L.T)我什么也得不到输入矩阵M如何将输出提取为可用的形式?

无论如何,输入是:

⎡ -1   -0.2  0.5   0.2   -0.7⎤
⎢                            ⎥
⎢-0.2   1    -0.8   0    0.8 ⎥
⎢                            ⎥
⎢0.5   -0.8  0.4   -0.9  0.9 ⎥
⎢                            ⎥
⎢0.2    0    -0.9   1    0.5 ⎥
⎢                            ⎥
⎣-0.7  0.8   0.9   0.5   0.8 ⎦

的最终状态与M论文中的相同:

⎡        -1                -0.2                0.5                0.2         
⎢                                                                             
⎢       -0.7                0.8               -0.8                 0          
⎢                                                                             
⎢-0.714285714285714  1.47142857142857   2.09387755102041          -0.9        
⎢                                                                             
⎢0.285714285714286   0.388349514563107  -1.4621359223301    1.42801395041946  
⎢                                                                             
⎣-0.285714285714286  0.495145631067961  0.792828685258964  -0.340239043824701 

       -0.7      ⎤
                 ⎥
       0.8       ⎥
                 ⎥
       0.9       ⎥
                 ⎥
       0.5       ⎥
                 ⎥
 1.62752019809209⎦

最后,我尝试将 的最终状态M转换为可用的形式:L变为

⎡        1                   0                  0          0  0⎤
⎢                                                              ⎥
⎢        0                   1                  0          0  0⎥
⎢                                                              ⎥
⎢-0.714285714285714          0                  1          0  0⎥
⎢                                                              ⎥
⎢0.285714285714286   0.388349514563107          0          1  0⎥
⎢                                                              ⎥
⎣-0.285714285714286  0.495145631067961  0.792828685258964  0  1⎦

T成为

⎡ -1         -0.7               0                  0                   0      
⎢                                                                             
⎢-0.7        0.8         1.47142857142857          0                   0      
⎢                                                                             
⎢ 0    1.47142857142857  2.09387755102041   -1.4621359223301           0      
⎢                                                                             
⎢ 0           0          -1.4621359223301   1.42801395041946   -0.340239043824
⎢                                                                             
⎣ 0           0                 0          -0.340239043824701   1.627520198092

   ⎤
   ⎥
   ⎥
   ⎥
   ⎥
   ⎥
701⎥
   ⎥
09 ⎦

[我删除了代码,因为我认为它会混淆事物。]

1个回答

L 的元素需要向右移动。也就是说,这个:

⎡        1                   0                  0          0  0⎤
⎢                                                              ⎥
⎢        0                   1                  0          0  0⎥
⎢                                                              ⎥
⎢-0.714285714285714          0                  1          0  0⎥
⎢                                                              ⎥
⎢0.285714285714286   0.388349514563107          0          1  0⎥
⎢                                                              ⎥
⎣-0.285714285714286  0.495145631067961  0.792828685258964  0  1⎦

需要变成这个

⎡1          0                   0                  0          0⎤
⎢                                                              ⎥
⎢0          1                   0                  0          0⎥
⎢                                                              ⎥
⎢0  -0.714285714285714          1                  0          0⎥
⎢                                                              ⎥
⎢0  0.285714285714286   0.388349514563107          1          0⎥
⎢                                                              ⎥
⎣0  -0.285714285714286  0.495145631067961  0.792828685258964  1⎦

这在原始论文中并不清楚。