数值方法一章从"动手前的清单"开始。把一条连续的偏微分方程搬上计算机,本质上是一次降维投影:从无穷维的函数空间落到有限维的向量空间。投影怎么做,三个决定说了算——网格怎么铺、未知量放在哪、格式怎么写。这三要素配上相容、稳定、收敛的三角关系,构成全部数值方法共同的地基;本章后面四种方法,只是三要素的四种不同取法。
第一个决定是网格:把区域切分成有限个单元。一维区间均匀切成 N 段,二维可以矩形、三角形、任意多边形,三维同理。网格的职责是把连续的空间坐标 x 替换成离散下标 i,把"处处有定义的函数"换成"格点上的数值表"。第二个决定是未知量:解在网格上的存放方式。可以在格点存放函数值(有限差分的做法),可以在单元内存放分片多项式(有限元的做法),可以在控制体内存放平均值(有限体积的做法),也可以存放全局基函数的展开系数(谱方法的做法)。第三个决定是格式:把导数算子翻译成代数运算的规则——差商、单元积分、谱系数乘法。三要素合起来,把微分方程变成代数方程组:常微分的初值问题变成递推数列,椭圆边值问题变成大型稀疏线性系统。
降维不可逆:真解 u 通常不落在离散空间里,格式算出的是离散空间里"最近"的那个向量。全部误差理论都在回答同一个问题——"最近"有多近,以及什么条件下越来越近。

三要素定了之后,三个性质层层把关。相容性:格式在光滑解处的截断误差(把真解代入格式后产生的残差)随网格加密趋于零——它保证格式是方程的忠实近似,验收工具是泰勒展开。稳定性:格式的迭代不会放大误差——初始数据或舍入带来的扰动在演化中保持有界,验收工具是冯·诺依曼分析(4.2 正式推导)或能量估计。收敛性:网格加密时离散解逼近真解——这是最终目的。三者的关系由拉克斯等价定理钉死:对线性适定问题,相容加稳定等价于收敛。这条定理的工程含义是分工:相容性用纸笔验证(一次性的泰勒展开),稳定性用分析验证(每个格式做一次),收敛性则不必单独证明——前两条立住,第三条自动兑现。
第二章的适定性三重契约在此有了离散回声:离散问题同样存在(线性系统可解)、同样可能不唯一(纯诺伊曼问题的离散版本差一个常数向量)、同样可能不稳定(刚性矩阵或违反 CFL 条件的显式格式)。所谓"数值问题适定",翻译过来就是矩阵条件数不失控、迭代格式谱半径有界——第七章求解器调参的全部理论依据都在这条线上。
"最近有多近"需要一本误差分类账。截断误差:格式对导数的近似本身带来的偏差,阶数由泰勒展开的最低未消项决定(一阶格式 O(dx)、二阶 O(dx²))。舍入误差:浮点运算的固有噪声,随运算次数累积;步长减半让截断误差降四倍的同时,步数翻倍让舍入误差涨一倍——网格不是越密越好,总误差存在下坠后回升的 bathtub 曲线,双精度下谷底通常远低于工程需求。色散与耗散:格式对不同波数分量的系统性处理偏差——数值耗散让波幅虚假衰减,数值色散让不同波长的分量跑出不同的相速度。两者是"格式性格":迎风格式强耗散,中心格式零耗散强色散,高阶格式把两者都推迟到更高波数。各向异性:网格方向性带来的误差方向偏好,三角网格与矩形网格的误差玫瑰图不同。
💡 关键直觉:报告数值精度时,先问误差在什么范数下、什么网格族上度量。同一格式在最大范数与平均范数下的收敛阶可以不同,均匀网格与自适应网格更不可比——没有度量的精度声明没有意义。
理论说显式格式对热传导方程时间一阶、空间二阶,实测验收。设计:固定 r = a²·dt/dx² = 0.4(稳定域内),把 dx 减半、dt 按比例缩小,与精确解对表,看误差是否按二阶下降。
import numpy as np L, a, T_end = 1.0, 1.0, 0.1 phi = lambda x: x*(L-x) u_exact = lambda x, t: np.zeros_like(x) # 占位:真实精确解见下方构造 def solve(dx_ratio, r=0.4): nx = 10 * dx_ratio + 1 x = np.linspace(0, L, nx); dx = x[1]-x[0]; dt = r*dx**2/a**2 u = phi(x).astype(float) for _ in range(int(round(T_end/dt))): u[1:-1] = u[1:-1] + r*(u[2:]-2*u[1:-1]+u[:-2]) return x, u # 精确解:把初值展开成正弦级数逐项演化(3.1 的公式,项数取足) def series_exact(x, t, N=4000): s = np.zeros_like(x) for n in range(1, N, 2): bn = 8/(n**3*np.pi**3) s += bn*np.sin(n*np.pi*x/L)*np.exp(-a**2*(n*np.pi/L)**2*t) return s for nx in [11, 21, 41, 81]: x, u = solve((nx-1)//10) err = np.abs(u - series_exact(x, T_end)).max() print(f"nx={nx:3d} 最大误差 = {err:.3e}")
典型输出:nx 翻倍,误差约降为四分之一(一倍到两个量级之间的规律性 4 倍下降)——二阶收敛实测兑现。这张表是第七章验证活动的最小单元:代码声称二阶,表格必须示出二阶;阶数对不上(比如只有一阶)通常意味着边界处理把精度拖低了,这是工程调试里最高频的"隐藏一阶陷阱"。
把本章后面四节预告成一张三要素对照表,选型逻辑一目了然:
| 方法 | 网格 | 未知量 | 格式核心 | 看家本领 |
|---|---|---|---|---|
| 有限差分 | 规则结构网格 | 格点函数值 | 差商逼近导数 | 简单直接,万能起点 |
| 有限元 | 任意单元剖分 | 节点系数 | 弱形式加分片多项式 | 复杂几何、变分正统 |
| 有限体积 | 控制体剖分 | 体平均值 | 通量平衡 | 守恒律、激波与流动 |
| 谱方法 | 无网格或全局配点 | 展开系数 | 基函数导数 | 光滑问题指数精度 |
⚠️ 常见坑:把"程序能跑"当成"格式相容"。截断误差分析必须包含边界格式——内部二阶、边界一阶的格式整体只有一阶,这条规律击穿过大量"看起来没问题"的代码。
三要素齐备,可以开工了。下一节把"杆冷却"实验做成一份完整复盘:泰勒展开推格式、冯·诺依曼推稳定域、违反条件亲眼看爆炸、三套网格验阶数——一条龙走完。