双步隐式位移QR算法计算实非对称矩阵特征值
字数 2218 2025-10-29 11:32:03
双步隐式位移QR算法计算实非对称矩阵特征值
题目描述
给定一个n×n的实非对称矩阵A,要求计算其全部特征值。由于矩阵是非对称的,其特征值可能是实数或共轭复数对。双步隐式位移QR算法是一种高效的方法,它通过将矩阵先化为上Hessenberg形式,然后应用带位移的QR迭代,并利用隐式Q定理避免直接处理复数运算,从而稳定地求出所有特征值。
解题过程
第一步:矩阵预处理——化为上Hessenberg形式
- 目标:通过相似变换将原矩阵A转化为一个特殊的上Hessenberg矩阵H(即当i > j+1时,h_ij = 0)。这大大减少了后续QR迭代的计算量。
- 方法:使用Householder反射子。
- 对于k从1到n-2进行迭代:
- 考虑A的第k列中从第k+1个元素到第n个元素组成的子向量。
- 计算一个Householder反射子P_k,使得该子向量除了第一个元素外,其余元素都变为零。
- 将P_k应用于A的右侧(即后乘P_k^T,因为P_k是对称正交矩阵),这会“清零”第k列中k+2行到n行的元素。
- 将P_k应用于A的左侧(即前乘P_k),这可能会在第k行中引入新的非零元,但不会破坏已产生的零元结构。
- 最终得到的矩阵H = P_{n-2} ... P_1 A P_1^T ... P_{n-2}^T 就是一个上Hessenberg矩阵,且与A相似(具有相同的特征值)。
第二步:双步隐式位移QR迭代
- 核心思想:标准的带位移QR迭代(例如,使用双重步位移以处理复特征值)在理论上有效,但显式使用位移会导致复数运算。双步隐式位移QR算法巧妙地避免了这一点。
- 位移选择:在一次迭代中,我们使用两个位移μ₁和μ₂。通常,它们取自当前上Hessenberg矩阵H右下角2x2子矩阵的特征值。即,求解 det([[h_{n-1,n-1}, h_{n-1,n}], [h_{n,n-1}, h_{n,n}]] - μI) = 0 得到的两个特征值。这两个位移可能是两个实数,或者一对共轭复数。
- 隐式Q定理的应用:算法的关键在于,我们并不直接计算 (H - μ₁I)(H - μ₂I) 的QR分解(这可能会引入复数),而是通过一个精心设计的初始变换,使得整个迭代过程完全在实数域内进行。
- 计算初始变换向量:计算矩阵M = (H - μ₁I)(H - μ₂I) 的第一列向量v。由于μ₁和μ₂可能是复数,但(H - μ₁I)(H - μ₂I)是一个实矩阵(如果μ₁和μ₂是共轭复数,其乘积是实的;如果都是实数,显然也是实的),所以v是一个实向量。
- 构造初始Householder反射子:构造一个Householder反射子P₀,使得P₀v平行于第一个标准基向量e₁。也就是说,P₀的作用是“清理”向量v,使其只有第一个分量非零。
- 执行相似变换(bulge chasing):
- 应用初始变换:将P₀应用于H的左侧:H ← P₀ H。这个操作会破坏H的上Hessenberg结构,通常只会在前几行和列引入一个小的“凸起”(bulge)。
- 恢复Hessenberg形式:接下来,我们的目标是通过一系列正交相似变换,将矩阵重新化为上Hessenberg形式,同时保证整个过程等价于完成了一次双步QR迭代。这个恢复过程称为“追赶凸起”(bulge chasing)。
- 从第一列开始,计算一个Householder反射子P₁,其作用是将第一列中第3行及以下的非Hessenberg结构的元素(即凸起)化为零。
- 将P₁应用于H的右侧和左侧(H ← P₁ H P₁^T)。应用在右侧时,可能会将凸起向右移动一列;应用在左侧时,可能会将凸起向下移动一行。
- 重复这个过程:沿着矩阵的主对角线,依次对每一列进行类似的Householder变换,每一步都将凸起向右下角方向“追赶”。当凸起被追赶出矩阵的右下角时,矩阵就恢复成了上Hessenberg形式。
第三步:收敛判断与降阶
- 判断收敛:在每次双步隐式位移QR迭代后,检查新的上Hessenberg矩阵。如果某个次对角线元素h_{i+1,i}的绝对值足够小(例如,小于一个预设的容差,如机器精度乘以(|h_{i,i}| + |h_{i+1,i+1}|)),我们就可以认为它实际上为零。
- 矩阵降阶:当发现一个可忽略的次对角线元素时,原特征值问题就“分裂”成两个更小的子问题。矩阵可以在这个元素处进行分块:
[H₁₁ H₁₂]
[ 0 H₂₂]
其中H₁₁是i×i的矩阵,H₂₂是(n-i)×(n-i)的矩阵。现在,矩阵H的特征值就是H₁₁和H₂₂的特征值的并集。 - 递归求解:算法然后分别对更小的上Hessenberg矩阵H₁₁和H₂₂递归地应用双步隐式位移QR算法。对于1x1的块,其元素本身就是一个特征值(实数)。对于2x2的块,可以直接计算其特征值(可能是两个实数或一对共轭复数)。
第四步:获取全部特征值
- 通过反复应用第二步和第三步,矩阵最终会被完全分解为1x1和2x2的对角块。
- 从这些块中直接读取或计算特征值:1x1块的值即为一个实特征值;2x2块的特征值通过求解二次方程得到,可能是一对实根或一对共轭复根。
- 收集所有块的特征值,就得到了原实非对称矩阵A的全部特征值。
这个算法高效且数值稳定,是计算一般实矩阵所有特征值的标准方法之一。