1. 课程导入与选型问题定义

在科学计算与工程仿真中,偏微分方程(PDE)的离散化最终几乎都会归结为求解一个大型稀疏线性方程组 Ax = b。当网格规模达到百万甚至上亿自由度时,直接法(如 LU 分解)在内存与计算量上都难以承受,迭代求解器因此成为主力工具。但"用迭代法"并不是一个可以一劳永逸的决定——面对同一个 PDE,选择不同的迭代器,求解时间可能相差几个数量级,甚至出现"能收敛"与"完全不收敛"的分水岭。

本课程的核心问题可以概括为一句话:给定一个具体的 PDE 离散系统,如何在可接受的计算成本内,稳定地得到满足精度要求的解? 这个问题的难点不在于写出某个迭代格式,而在于理解"问题特性—算法特性—参数配置"三者之间的匹配关系。

为什么选型是真正的挑战

迭代求解器的选型困难,根源在于 PDE 离散系统本身携带了大量结构性信息,而这些信息并不会自动"告诉"你该用哪个求解器。考虑三个典型场景:

  • 泊松方程经五点差分离散后得到对称正定(SPD)矩阵,共轭梯度法(CG)在理论上保证收敛,配合适当的预条件子可在数百次迭代内收敛;
  • 对流扩散方程在强对流占优时,离散矩阵失去对称性,CG 不再适用,需要转向 GMRES 或 BiCGSTAB 这类非对称 Krylov 方法;
  • 不可压缩 Navier-Stokes 方程的鞍点结构系统,矩阵不定且对角块为零,标准 Krylov 方法直接使用往往停滞,必须借助块预条件或物理型预条件(如 SIMPLE 类)才能奏效。

也就是说,矩阵的对称性、正定性、条件数、谱分布、是否不定、块结构如何,这些性质共同决定了候选算法的可行域。选型的第一步不是"挑算法",而是"读问题"。

选型的整体框架

本课程将选型问题组织为一条从问题诊断到参数调优的决策链,下图给出了整体框架与各环节之间的依赖关系:

PDE 迭代求解器选型决策框架 ① 问题诊断 PDE 类型 / 离散格式 对称性 · 正定性 · 块结构 规模 · 条件数估计 ② 算法族筛选 SPD → CG / MINRES 非对称 → GMRES / BiCGSTAB 不定/鞍点 → 块方法 ③ 预条件设计 Jacobi / ILU / AMG 块预条件 · 物理型预条件 近似精度 vs 每步成本 ④ 参数调优 容差 · 重启长度 · 填充等级 AMG 粗化策略 · 松弛因子 收敛判据与停机准则 ⑤ 验证与回退 残差下降曲线检查 停滞 / 发散 → 换预条件 迭代次数 vs 时间权衡 不满足则回退 真实工程场景:三维稳态热传导(示例参数) 网格:200×200×100 ≈ 4×10⁶ 节点,七点差分 矩阵:SPD,条件数随 h⁻² 增长,约 10⁶ 量级 候选:CG+Jacobi(迭代多) / CG+AMG(迭代少但每步贵) / GMRES+ILU(内存高) 判断依据:总耗时 = 迭代次数 × 单步成本,需实测残差曲线后决策

这条决策链的关键在于:每一层都依赖上一层的输出,且存在回退路径。例如,若在验证阶段发现 GMRES 残差长期停滞,问题往往不在 GMRES 本身,而在于预条件子与矩阵谱结构不匹配,此时应回退到预条件设计环节,而非盲目增加重启长度。

一个可操作的判断起点

为了让选型有据可依,实践中可以先做一次低成本的"矩阵体检"。以下是一段基于 Python/SciPy 的示例代码,用于快速获取矩阵的对称性、对角占优程度与粗略条件数估计(示例数据为合理假设,非实测结果):

import numpy as np
from scipy.sparse import random as sprandom
from scipy.sparse.linalg import eigsh

# 示例:构造一个 SPD 稀疏矩阵(模拟五点差分结构)
n = 10000
A = sprandom(n, n, density=5/n, format='csr')
A = A @ A.T + n * np.eye(n)   # 保证对称正定

# 1) 对称性检查
sym_err = abs(A - A.T).max()
print("对称性误差:", sym_err)          # 接近 0 则视为对称

# 2) 对角占优程度
diag = A.diagonal()
off = abs(A).sum(axis=1) - abs(diag)
print("最小对角/非对角比:", (abs(diag) / off).min())

# 3) 条件数粗估(最大/最小特征值)
lam_max = eigsh(A, k=1, which='LA', return_eigenvectors=False)[0]
lam_min = eigsh(A, k=1, which='SA', return_eigenvectors=False)[0]
print("条件数估计:", lam_max / lam_min)

这段代码的价值不在于精确计算,而在于用几秒钟的判断避免几小时的错误尝试。若对称性误差接近零且特征值同号,CG 是首选;若对角占优比很小,说明 Jacobi 预条件效果有限,应直接考虑 ILU 或 AMG。

学习目标与预期产出

完成本课程后,你应当能够独立完成以下任务:给定一个 PDE 离散系统,判断其矩阵结构类别;从 Krylov 方法族中筛选出可行候选;为候选设计或选择合适的预条件子;配置关键参数并通过残差曲线判断收敛质量;在多个可行方案之间依据"迭代次数 × 单步成本"做出工程决策。本课程不追求覆盖所有迭代算法的数学推导,而是聚焦于选型的判断逻辑与可复现的操作路径。

选型没有"万能最优解"。同一个矩阵,在内存充裕的工作站上 AMG 预条件的 CG 可能最快;在内存受限的环境里,轻量级 ILU 反而更实用。因此本课程强调:先明确约束条件(内存、时间、精度),再谈算法优劣。

接下来的章节将沿着上述框架逐层展开:先建立矩阵结构与算法适用域的对应关系,再深入各类预条件子的构造与调参,最后通过完整案例把诊断、选型、调优、验证串成一条可复用的工作流。