分块矩阵的Krylov子空间投影方法在求解多重右端项Sylvester方程中的应用
题目描述:
考虑如下形式的Sylvester方程:
\[A X + X B = C \]
其中 \(A \in \mathbb{R}^{m \times m}\), \(B \in \mathbb{R}^{n \times n}\), \(C \in \mathbb{R}^{m \times n}\) 是已知矩阵,我们需要求解未知矩阵 \(X \in \mathbb{R}^{m \times n}\)。在许多科学与工程问题中(如控制系统的李雅普诺夫方程、图像处理等),矩阵 \(C\) 可能具有多重右端项的结构,即 \(C = [C_1, C_2, \dots, C_p]\),其中每个 \(C_i \in \mathbb{R}^{m \times q}\),且 \(n = p \times q\)。传统的向量化方法(将矩阵方程转化为大型线性系统)在 \(m, n\) 很大时计算和存储成本极高。本题目要求利用分块矩阵的Krylov子空间投影方法,为多重右端项的Sylvester方程设计一个高效、低存储的数值算法,并解释其逐步推导过程、算法步骤及关键数值技巧。
解题过程:
第一步:问题转化与分块结构分析
- 将多重右端项结构明确写出:设 \(C = [C_1, C_2, \dots, C_p]\),其中每个 \(C_i \in \mathbb{R}^{m \times q}\),且对应的解 \(X = [X_1, X_2, \dots, X_p]\),其中 \(X_i \in \mathbb{R}^{m \times q}\)。原方程可写为:
\[ A [X_1, \dots, X_p] + [X_1, \dots, X_p] B = [C_1, \dots, C_p] \]
注意这里 \(B \in \mathbb{R}^{n \times n}\),而 \(n = p \times q\)。为了处理多重右端项,将 \(B\) 视为分块矩阵,与 \(X\) 的右乘需对应分块乘法。
- 更实用的视角:将原方程视为多重右端项线性矩阵方程的集合。实际上,Sylvester方程可重写为:
\[ (I_n \otimes A + B^\top \otimes I_m) \text{vec}(X) = \text{vec}(C) \]
其中 \(\otimes\) 是Kronecker积,\(\text{vec}(\cdot)\) 是将矩阵按列堆叠成向量的操作。当 \(C\) 有 \(p\) 个块列时,\(\text{vec}(C)\) 对应地由 \(p\) 个长度为 \(m\) 的子向量块组成。但直接向量化会破坏多重右端项的结构优势,因此我们寻求直接在矩阵形式下利用Krylov子空间投影。
第二步:构建块Krylov子空间
- 对于单个右端项 \(C \in \mathbb{R}^{m \times n}\),标准的Krylov子空间方法是针对线性算子 \(\mathcal{L}(X) = A X + X B\) 构建子空间。由于我们有多个右端项块 \(C_1, \dots, C_p\),很自然地使用块Krylov子空间:
\[ \mathcal{K}_k(A, C) = \text{colspan}\{ C, A C, A^2 C, \dots, A^{k-1} C \} \]
但这里 \(C\) 是矩阵而非向量,因此上述实际上是块Krylov子空间,其中每个“向量”是一个矩阵块列。更精确地,我们分别对每个右端项块 \(C_i\) 构建Krylov子空间,然后联合。
- 更高效的做法是:将多重右端项整体视为一个块向量,并利用块Arnoldi过程(或块Lanczos,若 \(A\) 对称)生成一组标准正交的块基矩阵 \(V_1, V_2, \dots, V_k \in \mathbb{R}^{m \times q}\),使得它们的列张成空间:
\[ \mathcal{K}_k^{\text{block}}(A, \{C_i\}) = \text{colspan}\{ C_1, \dots, C_p, A C_1, \dots, A C_p, \dots, A^{k-1} C_1, \dots, A^{k-1} C_p \} \]
这个空间的维数最多为 \(k \times p \times q\),但通过块正交化可控制基的规模。
- 构造过程(简化版块Arnoldi):
- 输入:矩阵 \(A\),初始块矩阵 \(R_0 = [C_1, \dots, C_p] \in \mathbb{R}^{m \times (p q)}\)。
- 对 \(R_0\) 进行“经济型”QR分解:\(R_0 = V_1 H_0\),其中 \(V_1 \in \mathbb{R}^{m \times s}\) 列正交,\(s \leq p q\),\(H_0\) 是上三角矩阵。
- 对 \(j = 1, 2, \dots, k\) 循环:
a. 计算 \(W = A V_j\)。
b. 对 \(W\) 与之前的所有 \(V_i\) 进行块正交化(利用修正的Gram-Schmidt):
\[ H_{i,j} = V_i^\top W, \quad W := W - V_i H_{i,j} \]
c. 对 $ W $ 做QR分解:$ W = V_{j+1} H_{j+1,j} $,其中 $ H_{j+1,j} $ 是上三角矩阵。
- 最终得到块Arnoldi关系:\(A \mathcal{V}_k = \mathcal{V}_{k+1} \bar{H}_k\),其中 \(\mathcal{V}_k = [V_1, \dots, V_k]\) 是列正交矩阵,\(\bar{H}_k\) 是块上Hessenberg矩阵。
第三步:在块Krylov子空间中投影求解
- 设近似解 \(X_k\) 在子空间 \(\mathcal{V}_k\) 中表示为:
\[ X_k = \mathcal{V}_k Y_k \]
其中 \(Y_k \in \mathbb{R}^{(k s) \times n}\) 是待求的系数矩阵。注意这里 \(n = p q\),而 \(Y_k\) 的每一列对应 \(X\) 的一个列向量的系数。
- 将 \(X_k\) 代入原方程,并利用块Arnoldi关系:
\[ A X_k + X_k B = A \mathcal{V}_k Y_k + \mathcal{V}_k Y_k B = \mathcal{V}_{k+1} \bar{H}_k Y_k + \mathcal{V}_k Y_k B \]
我们希望残差 \(R_k = C - (A X_k + X_k B)\) 与子空间 \(\mathcal{V}_k\) 正交(Galerkin条件)或与另一个适当子空间正交(Petrov-Galerkin)。对于多重右端项,常用块Galerkin条件:残差的每一列与 \(\mathcal{V}_k\) 的列正交。
- 由于初始残差块 \(R_0 = C - (A X_0 + X_0 B)\),若取 \(X_0 = 0\),则 \(R_0 = C\)。在块Arnoldi过程中,我们已使 \(\mathcal{V}_1\) 张成 \(C\) 的列空间,因此有 \(C = \mathcal{V}_1 H_0\)。于是残差可写为:
\[ R_k = \mathcal{V}_1 H_0 - \mathcal{V}_{k+1} \bar{H}_k Y_k - \mathcal{V}_k Y_k B \]
施加Galerkin条件:\(\mathcal{V}_k^\top R_k = 0\)。利用 \(\mathcal{V}_k^\top \mathcal{V}_{k+1} = [I_{k s}, 0]\) 和 \(\mathcal{V}_k^\top \mathcal{V}_k = I_{k s}\),得到投影方程:
\[ H_0 \text{(的前 $k s$ 行)} - \bar{H}_k^{(k)} Y_k - Y_k B = 0 \]
其中 \(\bar{H}_k^{(k)}\) 是 \(\bar{H}_k\) 的前 \(k s\) 行(即去掉最后一块行)。
- 上述是一个关于 \(Y_k\) 的小型Sylvester方程,维度为 \((k s) \times n\),相比原问题规模大大减小。可用直接法(如Bartels-Stewart算法)求解。
第四步:算法步骤总结
-
初始化:
- 输入 \(A, B, C = [C_1, \dots, C_p]\),设定容忍误差 \(\epsilon\) 和最大子空间维数 \(k_{\max}\)。
- 令 \(X_0 = 0\),\(R_0 = C\)。对 \(R_0\) 做经济型QR分解:\(R_0 = V_1 H_0\),其中 \(V_1 \in \mathbb{R}^{m \times s}\),\(s = \text{rank}(R_0)\)。
- 构造 \(\mathcal{V}_1 = V_1\),\(\bar{H}_0\) 为空矩阵。
-
块Arnoldi过程生成子空间(对 \(j = 1, 2, \dots, k_{\max}\)):
a. 计算 \(W = A V_j\)。
b. 对 \(i = 1\) 到 \(j\) 进行正交化:\(H_{i,j} = V_i^\top W\),\(W := W - V_i H_{i,j}\)。
c. 对 \(W\) 做QR分解:\(W = V_{j+1} H_{j+1,j}\)。
d. 更新 \(\mathcal{V}_{j+1} = [\mathcal{V}_j, V_{j+1}]\),\(\bar{H}_j = \begin{bmatrix} \bar{H}_{j-1} \\ H_{j,1:j} \end{bmatrix}\) 并添加新块行 \([0, \dots, 0, H_{j+1,j}]\)。
e. 求解小型Sylvester方程:\(\bar{H}_j^{(j)} Y_j + Y_j B = H_0^{(j)}\),其中 \(H_0^{(j)}\) 是 \(H_0\) 的前 \(j s\) 行,\(\bar{H}_j^{(j)}\) 是 \(\bar{H}_j\) 的前 \(j s\) 行。
f. 计算近似解 \(X_j = \mathcal{V}_j Y_j\) 和残差范数 \(\|R_j\|_F = \|C - (A X_j + X_j B)\|_F\)。
g. 若 \(\|R_j\|_F < \epsilon\),则停止并输出 \(X_j\)。 -
若未收敛,可考虑隐式重启或增加子空间维数。
第五步:关键细节与数值技巧
- 内存效率:子空间基 \(\mathcal{V}_k\) 的存储量为 \(O(m \cdot k s)\),当 \(k s \ll m, n\) 时可行。多重右端项使得初始子空间维数 \(s\) 可能大于1,但块正交化可减少冗余。
- 小型Sylvester方程求解:投影方程中的 \(\bar{H}_j^{(j)}\) 是上块Hessenberg矩阵,\(B\) 是原矩阵,但维度小。可用专门的Sylvester求解器高效处理。
- 停止准则:残差范数 \(\|R_j\|_F\) 可借助投影关系简化计算,无需显式形成 \(A X_j + X_j B\)。
- 预处理:若 \(A\) 或 \(B\) 的条件数大,可引入预处理算子(例如,用 \(P_A \approx A\), \(P_B \approx B\) 的逆的Kronecker近似)加速收敛。
总结:该方法充分利用了多重右端项的结构,通过块Krylov子空间投影将大规模Sylvester方程降维为小型稠密Sylvester方程,显著降低了计算与存储成本,适用于 \(A, B\) 稀疏或结构特殊的大规模问题。