1. 课程导入与选型问题定义
在科学计算与工程仿真中,偏微分方程(PDE)的离散化最终几乎都会归结为求解一个大型稀疏线性方程组 Ax = b。当网格规模达到百万甚至上亿自由度时,直接法(如 LU 分解)在内存与计算量上都难以承受,迭代求解器因此成为主力工具。但"用迭代法"并不是一个可以一劳永逸的决定——面对同一个 PDE,选择不同的迭代器,求解时间可能相差几个数量级,甚至出现"能收敛"与"完全不收敛"的分水岭。
本课程的核心问题可以概括为一句话:给定一个具体的 PDE 离散系统,如何在可接受的计算成本内,稳定地得到满足精度要求的解? 这个问题的难点不在于写出某个迭代格式,而在于理解"问题特性—算法特性—参数配置"三者之间的匹配关系。
为什么选型是真正的挑战
迭代求解器的选型困难,根源在于 PDE 离散系统本身携带了大量结构性信息,而这些信息并不会自动"告诉"你该用哪个求解器。考虑三个典型场景:
- 泊松方程经五点差分离散后得到对称正定(SPD)矩阵,共轭梯度法(CG)在理论上保证收敛,配合适当的预条件子可在数百次迭代内收敛;
- 对流扩散方程在强对流占优时,离散矩阵失去对称性,CG 不再适用,需要转向 GMRES 或 BiCGSTAB 这类非对称 Krylov 方法;
- 不可压缩 Navier-Stokes 方程的鞍点结构系统,矩阵不定且对角块为零,标准 Krylov 方法直接使用往往停滞,必须借助块预条件或物理型预条件(如 SIMPLE 类)才能奏效。
也就是说,矩阵的对称性、正定性、条件数、谱分布、是否不定、块结构如何,这些性质共同决定了候选算法的可行域。选型的第一步不是"挑算法",而是"读问题"。
选型的整体框架
本课程将选型问题组织为一条从问题诊断到参数调优的决策链,下图给出了整体框架与各环节之间的依赖关系:
这条决策链的关键在于:每一层都依赖上一层的输出,且存在回退路径。例如,若在验证阶段发现 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 方法族中筛选出可行候选;为候选设计或选择合适的预条件子;配置关键参数并通过残差曲线判断收敛质量;在多个可行方案之间依据"迭代次数 × 单步成本"做出工程决策。本课程不追求覆盖所有迭代算法的数学推导,而是聚焦于选型的判断逻辑与可复现的操作路径。
接下来的章节将沿着上述框架逐层展开:先建立矩阵结构与算法适用域的对应关系,再深入各类预条件子的构造与调参,最后通过完整案例把诊断、选型、调优、验证串成一条可复用的工作流。