第 8 章里,我们已经按“上一层的三个温度算下一层的一个温度”推进过热方程。那个公式很短,真正需要花时间的却是公式之外的判断:空间网格变细,为什么计算反而可能爆掉?隐式方法不爆掉,为什么图像仍可能离真实解很远?
这一章把这些判断接起来。我们从导数近似的误差出发,写出实际需要求解的方程组,再看每一步的误差怎样传播。读完以后,你应该能够同时检查网格、边界、时间步和误差,而不只认出一个差分模板。

网格值与精确取样分开记
在 0≤x≤L 上取
xj=jh,j=0,1,…,N,h=L/N,
时间节点为 tn=nΔt。本章用大写 Ujn 表示计算机得到的数值,用
vjn=u(xj,tn)
表示精确解在同一节点上的取样。两者通常不同;它们的差才是我们想控制的离散误差。
j=0,N 是边界点,1≤j≤N−1 是内部点。若给的是 Dirichlet 条件,端点值已经由题目规定,通常只把内部值列为未知数。如果边界随时间变化,每一层都要使用相应时刻的端点值,不能只在初始时刻设置一次。
对称取样为什么能消掉低阶误差
先离开时间变量,只看一个光滑函数 v(x)。在 x 附近展开 v(x+h) 与 v(x−h)。为明确下面余项的阶数,暂假设 在邻域内有连续且有界的六阶导数。于是
v(x±h)=v(x)
相减时,偶数次项消失。除以 2h 后得到
Dxv(x):=2h
相加后再减去 2v(x),消掉的则是奇数次项:
Dxxv(x):=
两个近似都是二阶精度,但一个近似一阶导数,一个近似二阶导数。“二阶精度”说的是 h 缩小时误差的阶,并不是所求导数的阶数。

例如 v(x)=x4,在 x=1/2 处有 v′′=3,而
Dxxv=3+2h2.
h=0.2 时得到 3.08,误差 0.08;h=0.1 时得到 3.02,误差 0.02。步长减半,误差成为四分之一。这次结论还是精确等式,因为更高次导数已经为零。
换成 v(x)=∣x∣,在原点却有
Dxv(0)=0,Dxxv(0)=2/h.
第一个数不是原点的导数,因为原点根本不可导;第二个数还会随 h↓0 发散。对称公式照样可以算出数字,是否近似了一个存在的导数,需要另外检查。
实验:误差缩小的规律什么时候失效
从四次函数预设开始,把 h 连续减半,核对误差比是否接近 4。切换到尖角,比较“差分算出了值”和“导数存在”这两句话。指数函数的极小步长预设展示另一种困难:相近浮点数相减会丢失有效数字,再除以 h2,舍入误差可能被放大。因此减小 h 不能无限改善结果。
离散 Laplacian 与边界方程组
一维中,二阶差分还可以写成
ΔhUj=h2
它比较的是当前点与邻居平均值。当前点高于平均值时,离散 Laplacian 为负;低于平均值时为正。这与热方程中局部峰顶下降、谷底上升的方向一致。
二维正方形网格的五点模板来自两个方向相加:
ΔhUi,j=
四个邻点在上下左右,对角点并不参与这个模板。若两个方向的步长不同,则应分别除以各自的平方:
Δhx,h

例题:先把三个内部未知量算出来
求 −u′′=1、u(0)=u(1)=0 的差分近似,取 h=。内部未知量为 。
方程是负的二阶导数,因此内部行应写成
−Uj−1+2Uj
若端点改为 u(0)=a0、u(1)=b0,第一行出现 ,移到右侧变成 ;最后一行同理加上 。对一般源项,右端为
h
例如 a0=1,b0=3,f=1 时,右端为 ,解为
(U1,U2,U3)=
它们也正好等于 1+2x+x(1−x)/2 的取样值。端点不是被丢掉了,而是进入右端,影响所有内部未知量。

这个线性系统为什么有唯一解
记 T 为对角线 2、上下副对角线 −1 的矩阵。对内部向量 z=(z1,…,z,补上 ,整理有限求和可得
zTTz=j=0∑N−1(z
若右侧为零,相邻值全部相同,再由两端为零得到 z=0。所以非零向量都有 zTTz>0,T 正定,从而可逆。这与上一章用梯度平方积分证明唯一性的思路相近,只是积分变成了有限求和。
实验:残差为零,为什么还有误差
在二次解预设中核对三行方程,再改动端点,观察右端改变了哪几行。实验会实际求解三对角系统。
换成四次解,离散方程残差仍接近零,但数值节点开始偏离精确曲线。选择“求解 N 与 2N,比较误差”,比较同一源项、同一边界下的两组结果。这里有两种不同的检查:线性系统残差检验方程有没有解对,离散误差检验所解的离散方程与连续问题相差多少。
显式热格式:全部读取旧时间层
对 ut=κuxx,前向时间差分和中心空间差分给出
ΔtUjn+1−U
令 r=κΔt/h2,则
Ujn+1=rUj
所有右端值都来自第 n 层。实际写程序时,用一个新数组保存下一层;不要算完 U1n+1 后,马上拿它去代替第二行所需的 U1n。那样就改变了算法。
当 0≤r≤1/2 时,三个权重非负且和为 1,新值落在三个旧值的最小值与最大值之间。若边界值也在固定区间 [m,M] 内,逐层归纳可知所有数值都留在 [m,M]。这就是该格式的离散最大值性质。
对具有相同边界的两次计算,差向量端点为零。同一个凸组合还给出
∥en+1∥∞≤∥en∥∞,
其中 ∥e∥∞=maxj∣ej∣。它说明初始误差不会因为时间推进而被放大,是本章将使用的一种稳定性。
例题:算出比值,还要把权重代对
设 κ=0.2、h=0.1。采用与网格无关的充分条件 r≤1/2,时间步应满足
r=20Δt≤21,Δt≤0.025.
取 Δt=0.02,有 r=0.4,所以更新式为
Ujn+1=0.4Uj−1
若三个旧值依次为 1,4,2,新值是 0.4+0.8+0.8=2。用 0.2,0.6,0.2 虽然也得到一个加权平均,却对应 r,已经不是这道题给出的步长。
若把 Δt 改成 0.04,则 r=0.8,中心权重变成负值,不能再使用上述最大值论证。网格减半而时间步不变,也会让 r 增大到原来的四倍。要维持同一个 r,h 减半时应把 缩为四分之一。
用一个误差模态检查放大因子
在无限均匀网格或周期网格上,考虑误差模态
ejn=Gneijθ.
这里 θ 是相邻节点之间的相位增量。代入显式格式并消去公共因子,得到
GFE(θ)=1−2r+r(e
每推进一步,该模态就乘一次 G。在这里的常系数、正交模态分析中,要求所有 θ 都有 ∣G∣≤1,便得到不放大误差的条件:
−1≤1−4r,0≤r≤21.
最危险的是 θ=π 的交错模态:相邻点正负交替。r>1/2 时,其放大因子小于 −1,于是它既翻转符号,又逐步增长。
有限区间的端点会改变可用波数
零 Dirichlet 端点下,不能把处处交错的 (−1)j 当作满足边界的误差向量。真正的离散模态是
zj(m)=sinNmπj,
利用正弦加法公式,
Tz(m)=4sin22Nmπ
这些向量是实对称矩阵 T 的一组正交基;不同的特征值保证正交,N−1 个非零独立向量正好覆盖全部内部空间。因此显式推进矩阵 I−rT 对每个模态的因子为
Gm=1−4rsin22Nmπ
固定 N 时,所有模态均不放大的准确条件是
0≤r≤2cos2(π/(2N))1.
右端略大于 1/2,但随 N→∞ 趋向 1/2。因此 r≤1/2 是适用于所有这些网格的充分条件,而且还保证非负权重与最大值性质。不要把“某个固定网格上的平方范数不增长”和“更新是凸组合”当成完全相同的要求。
r=1/2 也有值得留意的现象:周期网格的交错模态满足 G=−1,幅度完全不衰减;连续热方程中的高频却应快速衰减。稳定只保证不增长,没有保证把衰减速度算准。有限 Dirichlet 网格没有恰好这个 θ=π 模态,但最高模态在细网格上同样可能缓慢翻转衰减。

隐式 Euler:新时间层要一起求
把空间差分放在第 n+1 层,得到
ΔtUjn+1−U
即
−rUj−1n+1+(1+2r)U
相邻新值同时未知,不能像显式格式那样直接扫一遍代入。每一步要解
(I+rT)Un+1=bn.
对零端点,bn 就是旧的内部向量。如果两端在新时刻的值为 a(tn+1) 和 b(tn+1),右端首行要加 ,末行加 。这次使用的是的边界,因为被移项的邻居来自新层。
矩阵可逆也有直接理由:
zT(I+rT)z=j=1
对所有非零 z、r≥0 成立。因此每一步的内部值唯一确定。
三对角系统怎样解
这里不必每次对一个稠密大矩阵做通用消元。记三对角方程为
ℓjXj−1+djX
第一行没有左邻未知量。由上一行消去当前行的 Xj−1 时,乘数是
mj=ℓj/d
并更新
dj=d
消到最后一行后,从 XN−1=bN−1 开始向前回代:
Xj=d
这就是三对角追赶法,每一步只需与内部节点数成正比的运算。在当前隐式热系统中,dj=1+2r、ℓj=c,消元主元满足
d1=1+2r,
r>0 时可归纳得到 dj>1+r:若上一主元大于 ,减掉的 就小于 。因此这里不会遇到零主元。 则是单位矩阵,直接保留旧值。
无条件稳定的两个检查
代入同一个 Fourier 模态,空间新层多出一个 G,所以
G=1−4rGsin2(θ/2),
只要 r≥0,就有 0<GBE≤1。在有限区间上,只需换成前面允许的离散波数,结论仍成立。
最大范数也能直接检查。若 (I+rT)z=b、端点补零,取 ∣zj∣ 最大的那一行:
(1+2r)∣zj∣≤∣b
移项得 ∥z∥∞≤∥b∥∞。因此这个隐式求解操作不会放大差向量的最大范数,不需要 r≤1/2。
但稳定不代表准确。对一个连续模态 sin(kx),真实的一步衰减因子是 e−κk2Δt;数值因子使用的却是离散波数和 Euler 时间近似。时间步很大时,两者可能相差明显。隐式 Euler 还会有自己的耗散误差,不能只凭曲线没有爆炸就认定它可信。
实验:同一时刻比较显式、隐式和精确解
实验中两种算法使用同一个网格和同一个时间步。隐式曲线通过真正求解三对角方程组得到;精确曲线只用来验算,没有拿来替代算法。
从稳定步长开始推进,比较三条曲线。然后使用不稳定预设,留意很小的最高模态如何在显式结果中增长。大步长预设则用来检查另一面:隐式结果保持有界,却可能明显偏离精确解。改为非零端点时,检查边界是否在每一层都保持正确,以及隐式方程组残差是否仍然很小。
从截断误差到固定时刻的总误差
现在把精确取样 vjn=u(xj,tn) 代入显式格式,通常会留下一个残差:
τjn=Δtvj
在固定时空范围内,若所需的时间、空间导数连续有界,Taylor 展开给出
τjn=2
因此存在与小步长无关的常数 C,使 ∥τn∥∞≤C(Δt+h2。这里把除过 的方程残差称为截断误差;。把这两个量混淆,会在累积误差时多算或少算一个时间步。
把相同边界产生的已知向量记为 qn。精确取样满足
vn+1=Avn+qn+Δtτ
数值解满足 Un+1=AUn+qn,其中 A=。向量 在首行含 、末行含 ,零边界时为零;相同边界的这些已知项在相减后消失。于是 满足
en+1=Aen−Δtτn.
当 r≤1/2 时,前面的最大范数收缩性给出
∥en+1∥∞≤∥en∥
连续使用 n 次,并限制在同一个物理终点 nΔt≤T,得到
∥en∥∞≤∥e0∥
初值精确取样时 e0=0。因此在光滑性、正确边界与稳定步长等条件下,随着 Δt,h→0,数值解确实趋向精确解,典型全局误差是 O(Δt+h。这个结论是由一致性和稳定性共同得到的,不能只从 Taylor 展开的一行局部公式直接宣布。

对隐式格式,也可以在新时刻定义
τjn+1=Δtv
展开后时间首误差是 −Δtutt(xj,tn+1)/2,空间项仍为 ,所以同样是 。差方程为
(I+rT)en+1=en−Δtτ
使用刚证明的逆矩阵最大范数界,又得到同样形式的累积估计。这次不受 r≤1/2 限制,但要让误差趋零,时间步仍必须趋零。
网格加密必须比较同一道题
比较 h 与 h/2 时,应固定方程、初值、边界和观察终点 T。若显式格式保持 r 不变,时间步同时缩为四分之一,步数则约增为四倍,时间和空间的典型误差都会降到原来的四分之一。若只保持步数不变,较细网格实际走过的物理时间变短,就不是同一时刻的收敛比较。
误差比例也有适用边界。二次多项式的稳态例子在节点上本来就精确,剩下的浮点误差可能让两个极小数的比值毫无意义。更合适的检验是 −u′′=12x2、零端点,此时精确解为
u(x)=x−x4.
因为 Dxx(x4)=12x2+2h2,代入可得
−Dxxu=12x2+2h2.
离散解 U 满足 −DxxU=12x2,所以误差 e=U− 满足 、零端点。二次函数的差分精确,因而
ej=−h2xj(1−
偶数 N 的网格包含中点,最大节点误差恰为 h2/4。这就给出一个可以独立验算的二阶收敛实验,同时说明残差接近零与离散误差不为零完全可以并存。
2三对角方程组的残差接近零,就说明数值节点与连续方程精确解的节点值完全相同。
练习
1. 步长限制
对 ut=0.5uxx,取 h=0.2。采用 r≤ 的显式步长条件时, 中哪些满足要求?
r=0.5Δt/0.04=12.5Δt,所以 Δt≤0.04。前两个步长满足要求,0.05 不满足。这里检查的是适用于所有网格的标准充分条件;具体有限网格的谱界需要另带入 N。
2. 稳定而不衰减的高频
在含偶数个节点的周期网格上,r=1/2,初始误差为 ej0=(−1)j。写出 。这说明“稳定”和“正确模拟扩散”有什么区别?
该模态 θ=π,所以 G=1−4r=−1,得到 ej。误差幅度不增长,因此满足这里的不放大要求,却也不衰减;连续热方程会迅速削弱高频。故稳定并不保证衰减过程算得准确。周期与偶数节点条件使这个交错模态确实符合边界,不能直接把它当成有限零 Dirichlet 网格的模态。
3. 二维的步长条件
对二维热方程,用五点 Laplacian 与显式 Euler。若两个方向的网格步长分别为 hx,hy,令 rx=κ、。求适用于所有 Fourier 波数的不放大条件,并给出 时的结果。
代入 Gnei(iθx+jθy),得到
4. 改用隐式后还需要检查什么
空间网格很细,显式稳定性要求的时间步小到无法接受。提出一个本章学过的替代办法,并说明它解决了什么问题、还留下什么问题。
可用隐式 Euler 配合空间中心差分。对本章常系数线性热问题,它不再要求 r≤1/2,但每步要解线性系统;一维是三对角,二维则有更大的稀疏系统。仍要检查时间精度、边界层和短时间变化,以及每个新时刻的边界值是否正确进入右端。它放宽了稳定性限制,没有消除离散误差。
5. 手算差分误差
令 v(x)=x4。在 x=1 处求 Dxv、 与精确导数的差。若把 减半,两项误差分别怎样变化?
直接展开 (1±h)4,有
Dxv(1)=
6. 换源项与非零端点
求 −u′′=2、u(0)=1,u(1)=3 的 h 差分系统,并解出三个内部值。
矩阵仍为 T,右端是 (9,1,25)T/8。连续二次解 u=1+2x+ 在节点上精确满足差分式,给出
7. 一步显式与一步隐式
零端点下,N=4,r=1/2,旧内部向量为 (0,1,0)T。分别计算一步显式和隐式结果。
显式格式的中心权重为零,邻点权重各为 1/2,所以得到 (1/2,0,1/2)T。
隐式矩阵对角为 2、副对角为 −1/2。由对称性写新值为 ,第一行 ,中间行 。解得 。两种算法都保持有界,但一步得到的形状并不相同;稳定性并未要求两种近似完全一致。
8. 比较同一终点
取 κ=1,r=0.4,希望模拟到 T=0.1。h=0.1 时需要多少步?改为 h=0.05 并保持 不变后,需要多少步?
原时间步为 Δt=rh2/κ=0.004,需要 25 步。新时间步为 0.001,需要 100 步。若细网格也只运行 步,它只到达 ;此时把两条曲线直接相减,不是在测同一物理时刻的网格误差。
9. 用四次解验证收敛阶
对 −u′′=12x2、零端点,计算 N=8 与 N=16 时的最大节点误差。为什么不能改用正文的常数源二次解,再把几乎为零的误差相除来估计阶数?
由 ej=−h2xj(1−x,两张网格都包含中点,最大误差分别为 与 ,比值恰为 。常数源问题的二次解本来就被中心差分精确表示,节点误差只剩有限精度求解等因素;两个这样的极小误差之比不能代表一般离散方法的收敛阶。
10. 新时刻的边界进入哪一层
隐式热格式取 N=4,κ=1,Δt=1/32,初始内部值全为零,左边界为零,右边界为 u(1,t)=t。写出第一步的矩阵与右端向量。
h=1/4,所以 r=(1/32)/(1/16)=1/2。矩阵对角为 2、副对角为 −1/2。第一步的右边界是 ,因此右端为 ;不能仍代入旧时刻的零边界。这个题的初始角点满足值的兼容,但初始二阶空间导数与边界时间导数不兼容,不能直接用覆盖初始角点的高阶光滑性来宣称前述误差界。
11. 负的中心权重会发生什么
显式更新取 r=0.6,某内部点的左邻点、当前点、右邻点的旧值依次为 0,1,0。求新值,并说明它破坏了哪条性质。
新值为 0.6⋅0+(1−1.2)⋅1+0.6⋅0=−0.2。三个旧值均在 [0, 中,新值却落到区间之外,说明凸组合与离散最大值性质已经失效。这个单步例子直接说明非负性被破坏;长期是否存在增长模态,还可进一步用实际网格的谱条件判断。