分块矩阵的Kronecker积求解Lyapunov方程算法
字数 4368 2025-12-10 16:04:47

分块矩阵的Kronecker积求解Lyapunov方程算法


1. 问题描述

Lyapunov方程 是控制论、系统理论和数值线性代数中的一个基本矩阵方程,形式通常为:

\[A X + X A^T = -C \]

其中 \(A, C \in \mathbb{R}^{n \times n}\) 是已知矩阵,且 \(C\) 通常对称(常为半正定),\(X \in \mathbb{R}^{n \times n}\) 是未知矩阵,需要求解。这个方程出现在线性时不变系统的稳定性分析、模型降阶、最优控制等场景中。

当矩阵规模 \(n\) 很大时,直接求解 \(n^2\) 维的线性系统计算量极大。本题目介绍一种利用 Kronecker 积和分块矩阵技术,将 Lyapunov 方程转化为结构化线性系统,并设计高效求解算法的过程。


2. 将 Lyapunov 方程转化为线性系统

2.1 Kronecker 积与向量化

  • 定义 向量化 操作 \(\text{vec}(X)\):将矩阵 \(X\) 按列堆叠成一个 \(n^2 \times 1\) 的列向量。
  • Kronecker 积 性质:对于适当维数的矩阵 \(A, B, X\),有

\[ \text{vec}(AXB) = (B^T \otimes A) \text{vec}(X) \]

  • 对 Lyapunov 方程 \(A X + X A^T = -C\) 两边同时向量化:

\[ \text{vec}(AXI) + \text{vec}(I X A^T) = -\text{vec}(C) \]

利用上述性质:

\[ (I \otimes A) \text{vec}(X) + (A \otimes I) \text{vec}(X) = -\text{vec}(C) \]

合并得:

\[ \big[ (I \otimes A) + (A \otimes I) \big] \text{vec}(X) = -\text{vec}(C) \]

记:

\[ \mathcal{A} = (I \otimes A) + (A \otimes I) \in \mathbb{R}^{n^2 \times n^2}, \quad b = -\text{vec}(C) \in \mathbb{R}^{n^2} \]

则原方程化为大型线性系统

\[ \mathcal{A} x = b, \quad x = \text{vec}(X) \]


3. 分块结构分析与求解难点

3.1 矩阵 \(\mathcal{A}\) 的分块特性

  • 因为 \(I \otimes A = \text{blockdiag}(A, A, \dots, A)\)(由 \(n\)\(A\) 块构成的分块对角矩阵)。
  • \(A \otimes I\) 是一个块矩阵,其第 \((i,j)\) 块是 \(a_{ij} I\)(其中 \(a_{ij}\)\(A\) 的元素)。
  • 因此 \(\mathcal{A}\) 是一个稀疏分块矩阵,但维度是 \(n^2 \times n^2\),直接存储和求解(如高斯消元)的复杂度为 \(O(n^6)\),不可接受。

3.2 利用 \(A\) 的特殊结构

如果 \(A\) 可对角化或可相似化为较简单形式(如 Schur 分解),则可大幅简化。


4. 基于 Schur 分解的 Bartels–Stewart 类算法思想

实际上,标准的快速 Lyapunov 求解算法(如 Bartels–Stewart 算法)是先对 \(A\) 进行实 Schur 分解,然后通过回代求解。但这里我们重点讲解如何利用分块 Kronecker 结构设计迭代法或直接法

4.1 转化为块三角系统(当 \(A\) 为上三角时)

  • 假设 \(A\) 已经是上三角矩阵(可通过 Schur 分解实现,但这里先假设,以展示分块求解思路)。
  • \(A = (a_{ij})\)\(a_{ij} = 0\)\(i > j\)
  • 将未知矩阵 \(X\) 也分块按列考虑:记 \(X = [x_1, x_2, \dots, x_n]\)\(C = [c_1, c_2, \dots, c_n]\)
  • Lyapunov 方程第 \(j\) 列为:

\[ A x_j + \sum_{i=1}^n x_i a_{ij} = -c_j \]

这里用到了 \(X A^T\) 的第 \(j\) 列为 \(\sum_{i=1}^n x_i a_{ij}\)

  • 由于 \(A\) 上三角,\(a_{ij} = 0\)\(i > j\),因此上式可重写为:

\[ A x_j + \sum_{i=1}^j x_i a_{ij} = -c_j, \quad j=1,\dots,n \]

移项:

\[ (A + a_{jj} I) x_j = -c_j - \sum_{i=1}^{j-1} a_{ij} x_i \]

  • 这是一个块上三角递归系统:当按 \(j=1,2,\dots,n\) 求解时,右边只依赖已求出的 \(x_1,\dots,x_{j-1}\)
  • 因此,只需顺序解 \(n\)\(n\times n\) 线性系统:

\[ (A + a_{jj} I) x_j = \text{已知向量} \]

复杂度从 \(O(n^6)\) 降至 \(O(n^4)\)(因为每个系统解需 \(O(n^3)\),共 \(n\) 个系统)。


5. 利用 Kronecker 积的分块迭代求解(当 \(A\) 为一般矩阵时)

如果 \(A\) 不是上三角,我们可以用分裂迭代法,利用 \(\mathcal{A} = I\otimes A + A\otimes I\) 的分裂。

5.1 分裂为

\[\mathcal{A} = M - N \]

其中一种自然选择:

\[M = I \otimes A, \quad N = -A \otimes I \]

但这样不收敛性好。更好的选择是对称分裂,例如当 \(A\) 稳定(特征值实部小于0)时,可用:

\[M = I \otimes A + A \otimes I_{\text{low}} \]

这里更实用的是用 Krylov 子空间方法(如 GMRES)直接求解 \(\mathcal{A}x = b\),并利用 \(\mathcal{A}\) 的 Kronecker 积结构快速计算矩阵-向量乘积,而不显式构造 \(\mathcal{A}\)

5.2 快速矩阵-向量乘积

对任意向量 \(y \in \mathbb{R}^{n^2}\),要计算 \(z = \mathcal{A} y\)

  • \(y\) 重组为 \(n\times n\) 矩阵 \(Y\),使得 \(y = \text{vec}(Y)\)
  • \(\mathcal{A} = I\otimes A + A\otimes I\) 的性质:

\[ z = \text{vec}(A Y + Y A^T) \]

  • 因此计算步骤为:
    1. \(y\) 得到矩阵 \(Y\)(reshape)。
    2. 计算 \(W_1 = A Y\)(矩阵乘,\(O(n^3)\) 但可优化如果 \(A\) 稀疏)。
    3. 计算 \(W_2 = Y A^T\)
    4. 计算 \(Z = W_1 + W_2\)
    5. \(Z\) 向量化得 \(z\)
  • 这样,每次矩阵-向量乘只需求两个 \(n\times n\) 矩阵乘法,无需构造 \(n^2\times n^2\) 大矩阵。

6. 算法步骤总结

结合上述思想,一个实用的基于分块 Kronecker 结构和 Krylov 子空间的算法步骤如下:

  1. 输入:矩阵 \(A, C \in \mathbb{R}^{n \times n}\)\(C\) 对称。
  2. 预处理:对 \(A\) 进行实 Schur 分解 \(A = Q T Q^T\),其中 \(Q\) 正交,\(T\) 上三角。将方程转换为:

\[ T \tilde{X} + \tilde{X} T^T = -\tilde{C}, \quad \tilde{C} = Q^T C Q, \quad \tilde{X} = Q^T X Q \]

求解后再回代 \(X = Q \tilde{X} Q^T\)
3. 解三角 Lyapunov 方程(此时 \(T\) 上三角):

  • \(j=1\)\(n\)

\[ (T + t_{jj} I) \tilde{x}_j = -\tilde{c}_j - \sum_{i=1}^{j-1} t_{ij} \tilde{x}_i \]

 解这个 $n$ 阶线性系统得 $\tilde{x}_j$。
  • 得到 \(\tilde{X} = [\tilde{x}_1, \dots, \tilde{x}_n]\)
  1. 回代\(X = Q \tilde{X} Q^T\)
  2. 输出:解矩阵 \(X\)

7. 复杂度与注意事项

  • 实 Schur 分解:\(O(n^3)\)
  • 解三角 Lyapunov 方程:每个 \(j\) 需解一个 \(n\times n\) 系统,用直接法(如 LU 分解)需 \(O(n^3)\),但注意系数矩阵 \(T + t_{jj}I\) 是上三角,可用前代回代法在 \(O(n^2)\) 内解出。因此总复杂度为 \(O(n^3)\)
  • \(A\) 是大型稀疏矩阵,可采用 Krylov 方法\(\mathcal{A}x = b\),配合前述快速矩阵-向量乘积,并利用预处理技术(例如基于 \(A\) 的近似 Schur 分解的预处理子)加速收敛。

8. 核心思想

本算法的核心是:

  1. 通过 Kronecker 积的向量化技巧 将 Lyapunov 方程转为大线性系统。
  2. 利用 矩阵乘法结构 快速实现矩阵-向量乘,避免大矩阵存储。
  3. 通过 Schur 分解 将一般问题转化为上三角问题,然后利用分块递归法高效求解。
  4. 整个算法将计算复杂度从 \(O(n^6)\) 降至 \(O(n^3)\),适合中等规模(\(n\) 几千以内)的稠密 Lyapunov 方程。对于更大规模或稀疏 \(A\),则采用迭代法(如 Krylov 方法)配合预处理。
分块矩阵的Kronecker积求解Lyapunov方程算法 1. 问题描述 Lyapunov方程 是控制论、系统理论和数值线性代数中的一个基本矩阵方程,形式通常为: \[ A X + X A^T = -C \] 其中 \(A, C \in \mathbb{R}^{n \times n}\) 是已知矩阵,且 \(C\) 通常对称(常为半正定),\(X \in \mathbb{R}^{n \times n}\) 是未知矩阵,需要求解。这个方程出现在线性时不变系统的稳定性分析、模型降阶、最优控制等场景中。 当矩阵规模 \(n\) 很大时,直接求解 \(n^2\) 维的线性系统计算量极大。本题目介绍一种 利用 Kronecker 积和分块矩阵技术 ,将 Lyapunov 方程转化为 结构化线性系统 ,并设计高效求解算法的过程。 2. 将 Lyapunov 方程转化为线性系统 2.1 Kronecker 积与向量化 定义 向量化 操作 \(\text{vec}(X)\):将矩阵 \(X\) 按列堆叠成一个 \(n^2 \times 1\) 的列向量。 Kronecker 积 性质:对于适当维数的矩阵 \(A, B, X\),有 \[ \text{vec}(AXB) = (B^T \otimes A) \text{vec}(X) \] 对 Lyapunov 方程 \(A X + X A^T = -C\) 两边同时向量化: \[ \text{vec}(AXI) + \text{vec}(I X A^T) = -\text{vec}(C) \] 利用上述性质: \[ (I \otimes A) \text{vec}(X) + (A \otimes I) \text{vec}(X) = -\text{vec}(C) \] 合并得: \[ \big[ (I \otimes A) + (A \otimes I) \big ] \text{vec}(X) = -\text{vec}(C) \] 记: \[ \mathcal{A} = (I \otimes A) + (A \otimes I) \in \mathbb{R}^{n^2 \times n^2}, \quad b = -\text{vec}(C) \in \mathbb{R}^{n^2} \] 则原方程化为 大型线性系统 : \[ \mathcal{A} x = b, \quad x = \text{vec}(X) \] 3. 分块结构分析与求解难点 3.1 矩阵 \(\mathcal{A}\) 的分块特性 因为 \(I \otimes A = \text{blockdiag}(A, A, \dots, A)\)(由 \(n\) 个 \(A\) 块构成的分块对角矩阵)。 而 \(A \otimes I\) 是一个 块矩阵 ,其第 \((i,j)\) 块是 \(a_ {ij} I\)(其中 \(a_ {ij}\) 是 \(A\) 的元素)。 因此 \(\mathcal{A}\) 是一个 稀疏分块矩阵 ,但维度是 \(n^2 \times n^2\),直接存储和求解(如高斯消元)的复杂度为 \(O(n^6)\),不可接受。 3.2 利用 \(A\) 的特殊结构 如果 \(A\) 可对角化或可相似化为较简单形式(如 Schur 分解),则可大幅简化。 4. 基于 Schur 分解的 Bartels–Stewart 类算法思想 实际上,标准的快速 Lyapunov 求解算法(如 Bartels–Stewart 算法)是 先对 \(A\) 进行实 Schur 分解 ,然后通过回代求解。但这里我们重点讲解 如何利用分块 Kronecker 结构设计迭代法或直接法 。 4.1 转化为块三角系统(当 \(A\) 为上三角时) 假设 \(A\) 已经是 上三角矩阵 (可通过 Schur 分解实现,但这里先假设,以展示分块求解思路)。 设 \(A = (a_ {ij})\),\(a_ {ij} = 0\) 当 \(i > j\)。 将未知矩阵 \(X\) 也分块按列考虑:记 \(X = [ x_ 1, x_ 2, \dots, x_ n]\),\(C = [ c_ 1, c_ 2, \dots, c_ n ]\)。 Lyapunov 方程第 \(j\) 列为: \[ A x_ j + \sum_ {i=1}^n x_ i a_ {ij} = -c_ j \] 这里用到了 \(X A^T\) 的第 \(j\) 列为 \(\sum_ {i=1}^n x_ i a_ {ij}\)。 由于 \(A\) 上三角,\(a_ {ij} = 0\) 对 \(i > j\),因此上式可重写为: \[ A x_ j + \sum_ {i=1}^j x_ i a_ {ij} = -c_ j, \quad j=1,\dots,n \] 移项: \[ (A + a_ {jj} I) x_ j = -c_ j - \sum_ {i=1}^{j-1} a_ {ij} x_ i \] 这是一个 块上三角递归系统 :当按 \(j=1,2,\dots,n\) 求解时,右边只依赖已求出的 \(x_ 1,\dots,x_ {j-1}\)。 因此,只需顺序解 \(n\) 个 \(n\times n\) 线性系统: \[ (A + a_ {jj} I) x_ j = \text{已知向量} \] 复杂度从 \(O(n^6)\) 降至 \(O(n^4)\)(因为每个系统解需 \(O(n^3)\),共 \(n\) 个系统)。 5. 利用 Kronecker 积的分块迭代求解(当 \(A\) 为一般矩阵时) 如果 \(A\) 不是上三角,我们可以用 分裂迭代法 ,利用 \(\mathcal{A} = I\otimes A + A\otimes I\) 的分裂。 5.1 分裂为 \[ \mathcal{A} = M - N \] 其中一种自然选择: \[ M = I \otimes A, \quad N = -A \otimes I \] 但这样不收敛性好。更好的选择是 对称分裂 ,例如当 \(A\) 稳定(特征值实部小于0)时,可用: \[ M = I \otimes A + A \otimes I_ {\text{low}} \] 这里更实用的是用 Krylov 子空间方法 (如 GMRES)直接求解 \(\mathcal{A}x = b\),并利用 \(\mathcal{A}\) 的 Kronecker 积结构 快速计算矩阵-向量乘积 ,而不显式构造 \(\mathcal{A}\)。 5.2 快速矩阵-向量乘积 对任意向量 \(y \in \mathbb{R}^{n^2}\),要计算 \(z = \mathcal{A} y\): 将 \(y\) 重组为 \(n\times n\) 矩阵 \(Y\),使得 \(y = \text{vec}(Y)\)。 由 \(\mathcal{A} = I\otimes A + A\otimes I\) 的性质: \[ z = \text{vec}(A Y + Y A^T) \] 因此计算步骤为: 从 \(y\) 得到矩阵 \(Y\)(reshape)。 计算 \(W_ 1 = A Y\)(矩阵乘,\(O(n^3)\) 但可优化如果 \(A\) 稀疏)。 计算 \(W_ 2 = Y A^T\)。 计算 \(Z = W_ 1 + W_ 2\)。 将 \(Z\) 向量化得 \(z\)。 这样, 每次矩阵-向量乘只需求两个 \(n\times n\) 矩阵乘法 ,无需构造 \(n^2\times n^2\) 大矩阵。 6. 算法步骤总结 结合上述思想,一个实用的 基于分块 Kronecker 结构和 Krylov 子空间的算法 步骤如下: 输入 :矩阵 \(A, C \in \mathbb{R}^{n \times n}\),\(C\) 对称。 预处理 :对 \(A\) 进行实 Schur 分解 \(A = Q T Q^T\),其中 \(Q\) 正交,\(T\) 上三角。将方程转换为: \[ T \tilde{X} + \tilde{X} T^T = -\tilde{C}, \quad \tilde{C} = Q^T C Q, \quad \tilde{X} = Q^T X Q \] 求解后再回代 \(X = Q \tilde{X} Q^T\)。 解三角 Lyapunov 方程 (此时 \(T\) 上三角): 对 \(j=1\) 到 \(n\): \[ (T + t_ {jj} I) \tilde{x} j = -\tilde{c} j - \sum {i=1}^{j-1} t {ij} \tilde{x}_ i \] 解这个 \(n\) 阶线性系统得 \(\tilde{x}_ j\)。 得到 \(\tilde{X} = [ \tilde{x}_ 1, \dots, \tilde{x}_ n ]\)。 回代 :\(X = Q \tilde{X} Q^T\)。 输出 :解矩阵 \(X\)。 7. 复杂度与注意事项 实 Schur 分解:\(O(n^3)\)。 解三角 Lyapunov 方程:每个 \(j\) 需解一个 \(n\times n\) 系统,用直接法(如 LU 分解)需 \(O(n^3)\),但注意系数矩阵 \(T + t_ {jj}I\) 是上三角,可用前代回代法在 \(O(n^2)\) 内解出。因此总复杂度为 \(O(n^3)\)。 若 \(A\) 是大型稀疏矩阵,可采用 Krylov 方法 解 \(\mathcal{A}x = b\),配合前述快速矩阵-向量乘积,并利用预处理技术(例如基于 \(A\) 的近似 Schur 分解的预处理子)加速收敛。 8. 核心思想 本算法的核心是: 通过 Kronecker 积的向量化技巧 将 Lyapunov 方程转为大线性系统。 利用 矩阵乘法结构 快速实现矩阵-向量乘,避免大矩阵存储。 通过 Schur 分解 将一般问题转化为上三角问题,然后利用 分块递归法 高效求解。 整个算法将计算复杂度从 \(O(n^6)\) 降至 \(O(n^3)\),适合中等规模(\(n\) 几千以内)的稠密 Lyapunov 方程。对于更大规模或稀疏 \(A\),则采用迭代法(如 Krylov 方法)配合预处理。