Sylvester方程求解的Bartels-Stewart算法
题目描述:
给定实数矩阵A(m×m)、B(n×n)、C(m×n),求解未知矩阵X(m×n),使其满足Sylvester方程:AX + XB = C。其中A和B通常是上三角矩阵(或可通过相似变换化为上三角形式)。Bartels-Stewart算法是求解该方程的经典直接法,其核心思想是通过Schur分解将方程转化为三角形式,然后通过前向/后向代入高效求解。
解题过程循序渐进讲解:
步骤1:问题转化与Schur分解
原始的Sylvester方程 AX + XB = C 中,若A和B是稠密的一般矩阵,直接求解效率低。Bartels-Stewart算法的第一步是利用实Schur分解(或复Schur分解,若矩阵有复特征值)将A和B转化为上三角形式。
- 对A进行实Schur分解:A = U R_A U^T,其中U是正交矩阵(m×m),R_A是拟上三角矩阵(实Schur形式,对角块为1×1或2×2,对应实特征值或共轭复特征值对)。
- 对B进行实Schur分解:B = V R_B V^T,其中V是正交矩阵(n×n),R_B是拟上三角矩阵。
将分解代入原方程:U R_A U^T X + X V R_B V^T = C。
左乘U^T,右乘V,并令 Y = U^T X V,C' = U^T C V,得到化简后的方程:
R_A Y + Y R_B = C'。
此时R_A和R_B都是拟上三角矩阵,方程结构更简单。
步骤2:分块化与元素递推求解
由于R_A和R_B是拟上三角矩阵,我们可以从最后一个行/列开始,逐块(或逐元素)求解Y。将矩阵分块,设R_A是m×m,R_B是n×n,Y和C'也相应分块。从最后一个块(右下角)开始求解。
具体地,将R_A、R_B、Y、C'进行分块。设R_A的最后一行/列为第m块(可能是1×1或2×2块),R_B的最后一行/列为第n块(同样可能是1×1或2×2块),Y和C'对应分块。则方程可写为:
R_A(1:m, 1:m) Y(1:m, 1:n) + Y(1:m, 1:n) R_B(1:n, 1:n) = C'(1:m, 1:n)。
但更有效的是聚焦于最后一行/列块,通过将Y按列分块(对应R_B的列分块)或按行分块(对应R_A的行分块)来递推。
通常采用按列分块:设R_B的最后一列块(第n列块)是1×1或2×2,记R_B的右下角块为R_B_nn(可能为标量或2×2矩阵),对应Y的最后一列块为Y_n(m×1或m×2矩阵)。从原方程中提取涉及Y_n的部分:
R_A Y_n + Y_n R_B_nn = C'n - Σ{k=n+1}^{n} (Y_k R_B_kn) (注意求和实际上只到n-1,因为R_B是上三角,R_B_kn对k<n可能非零)。
由于R_B是上三角,R_B_kn当k<n时可能非零,但R_B_kn已知,且Y_k对k>n尚未知(因为我们从最后一列开始求解),所以实际上我们需要从最后一列(n)开始,向前推进到第一列。对于第j列块(从n递减到1),方程变为:
R_A Y_j + Y_j R_B_jj = C'j - Σ{k=j+1}^{n} (Y_k R_B_kj)。
这里右边是已知的,因为Y_k(k>j)已经在前面的步骤中求出。R_B_jj是1×1或2×2块,R_A是m×m拟上三角矩阵。
步骤3:求解小规模Sylvester方程
对于每个列块j,我们需要解一个关于Y_j的矩阵方程:R_A Y_j + Y_j S = D,其中S = R_B_jj是小矩阵(1×1或2×2),D是已知的m×p矩阵(p=1或2,对应S的尺寸)。这是一个小规模的Sylvester方程,可以用直接法高效求解。
- 若S是1×1标量s,则方程变为 R_A Y_j + Y_j s = D,即 (R_A + s I) Y_j = D。这相当于求解一个线性方程组,系数矩阵是R_A + s I(拟上三角矩阵),可用前向代入法快速求解(因为拟上三角矩阵,但需注意2×2块可能使系统分块三角)。
- 若S是2×2矩阵,设S = [s11, s12; s21, s22],Y_j是m×2矩阵,记Y_j = [y1, y2]。则方程可写为两个方程:
R_A y1 + y1 s11 + y2 s21 = d1,
R_A y2 + y1 s12 + y2 s22 = d2。
这是一个关于y1和y2的耦合线性系统,可将其重写为一个大系统:将y1和y2堆叠为2m维向量,利用Kronecker积形式,但更高效的是直接利用R_A的拟上三角结构,通过类似前向代入的方法逐行求解(需处理2×2耦合)。
步骤4:恢复原变量X
当所有列块Y_j求解完毕后,得到完整的Y。最后通过逆变换恢复X:X = U Y V^T。因为U和V是正交矩阵,乘法可直接进行。
算法总结:
- 计算A和B的实Schur分解:A = U R_A U^T, B = V R_B V^T。
- 计算C' = U^T C V。
- 对j = n, n-1, ..., 1(按R_B的列块逆序):
a. 计算右端项 D = C'j - Σ{k=j+1}^{n} (Y_k R_B_kj)。
b. 求解小规模Sylvester方程:R_A Y_j + Y_j R_B_jj = D。 - 得到Y后,计算X = U Y V^T。
注意事项:
- 该算法需要O(m^3 + n^3)的Schur分解成本,以及O(m^2 n + m n^2)的求解成本,适合稠密矩阵。
- 若A和B有共同特征值使得R_A和-R_B有相同特征值,则方程可能奇异或无解。
- 对于大规模稀疏矩阵,通常使用迭代法(如Krylov子空间方法)而非Bartels-Stewart算法。