有限差分法(Finite Difference Method,FDM)是一种求解微分方程数值解的近似方法,其主要原理是对微分方程中的微分项进行直接差分近似,从而将微分方程转化为代数方程组求解。有限差分法和有限元法是求微分方程近似解的两种重要的数值方法,它们的共同特点是将连续的问题和区域进行各种形式的离散,最后化为有限形式的线性代数方程组。有限差分法与有限元法的最大区别在于前者的处理直接施加于所给的微分方程本身,而后者则需要先把微分方程化成其他形式的数学问题再加以处理。它们的共同点决定了这两种方法在总的处理思路和大的步骤上有不少相同或类似之处, 而它们的不同点又导致了这两种方法的具体操作实施具有无法比拟的各自的特殊性。
先从比较简单的两点边值问题的差分法讲起。
解两点边值问题的差分方法
考虑最简单的常微分方程边值问题
Lu≡− dx2d2u+qu=f,x∈(a,b),(1)
u(a)=α0,u′(b)+βu(b)=α1,(2)
其中, q,f∈C0([a,b]),q⩾0,α0,α1,β 为给定常数 (β>0) 。(1)式中 L 为微分算子( L 用白正体字母表示,今后同)。
用差分法求解边值问题(1)的过程可以分成 5 步。本小节先讨论前三步,其后的两步不太相同。
第一步,区域的离散
将区间 [a,b] 分成 N 等分,分点为
xi=a+ih,i=0,1,⋯,N,
这里,h=Nb−a,xi 被称为网格上的结点,h 称为步长。
第二步,微分方程离散。
由 Taylor 展开公式,在结点 xi 处,成立
u′′(xi)=h21[u(xi+1)−2u(xi)+u(xi−1)]−12h2u(4)(ξi)xi−1⩽ξi⩽xi+1.(3)
记余项
Ri(u)=−12h2u(t)(ξi),(4)
则在 xi 处可将方程(1)写成
−h2u(xi+1)−2u(xi)+u(xi−1)+q(xi)u(xi)=f(xi)+Ri,(5)
舍去余项,便得到逼近方程(1)的差分方程:
Lhui≡−h2ui+1−2ui+ui−1+qiui=fi,i=1,2,⋯,N=1,(6)
其中, qi=q(xi),fi=f(xi) ,而 ui 是 u(x) 在 xi 处的近似值,也就是所要寻找的差分解。(6)式中 Lh 为差分算 子( Lh 用白正体字母表示,今后同)。
利用差分算子 Lh ,(5)可写成:
Lhu(xi)=f(xi)+Ri,
所以, R∗i 就是差分算子 L∗h 代替微分算子 L 所引起的截断误差,它的阶是 O(h2) 。
第三步,边界条件的处理。
在(6)式中出现了 N+1 个未知量 u0,u1,⋯,uN−1,uN ,但只有 N-1 个方程,所缺的两个方程可以通过对边界条件的处理来获得。
对于第一类边界条件,如在左端 x=a 处,只要直接将函数值代入就行了,即取
u0=u(a)=α0
对于第三类边界条件,如在右端 x=b 处,就需要处理 u(x) 的导数值。容易想到的是取它的一阶差商,如取
u′(b)≈huN−uN−1,
但这样做将使得边界点上的截断误差(为 O(h) )低于内点的截断误差;而由于 xN 是端点,又不能采取具有 O(h2) 精度的中心差分,所以在实际中常常采用二阶 Gear 公式。由前面章节,有
u(x+2h)−34u(x+h)+31u(x)=32hu′(x+2h)+O(h2).(7)
令 x+2h=x_N ,舍去余项,即有近似式:
u′(b)≈2h1(3uN−4uN−1+uN−2),
于是,(2)式的后一个条件可处理成
2h1(3uN−4uN−1+uN−2)+βuN=α1.(8)
区间的剖分和边界条件的处理可采取多种多样的形式。比如,若 u(x) 能够被光滑地延拓到区间 [a,b] 之外,则可取分点
x_j=a+(j−21)h,j=0,1,2,⋯,N,(9)
其中 h=N−1b−a ,这时分点 x0=a−2h 和 xN=b+2N 将在 [a,b] 之外。
对于结点 x0,x1,⋯,xN ,同样可以列出(3.6)式所示的 N−1 个方程,不足的 两个方程可由边界条件来提供。利用
21[u(x1)+u(x0)]=u(a)+8h2u′′(ξ),x0<ξ<x1,
和
u′(b)=h1[u(xN)−u(xN−1)]−24h2u′′′(η),xN−1<η<xN,
可给出两个方程:
{u1+u0=2α0,h1(uN−uN−1)+2β(uN+uN−1)=α1.(10)
将(10)式与(6)式联立就可以得到一个由 N+1 个方程组成的含有 n+1 个未知量的线性方程组,其中每一个方程所略去的余项都是 O(h2) 。
通常遇到的方程当然要比方程(1)复杂得多,然而不管怎样,导出线性方程组的思想是类似的。如对二阶自共轭方程
− dxd(p dx du)+q(x)u(x)=f(x),a<x<b,(11)
其中, p(x)∈C1([a,b]),p(x)⩾pmin>0,q,f∈C0([a,b])且q(x)⩾0 。取结点为
a=x0<x1<⋯<xi<⋯<xN=b,
记小区间
Ii=[xi−1,xi],i=1,2,⋯,N,
记 hi=xi−xi−1 是 Ii 的长度, h=maxihi 为最大步长。
取相邻结点的中点 21(xi−1+xi) ,将它记为 xi−21 ,这些点被称为半整数点,由这些半整数点全体和端点
a=x0<x21<x23<⋯<xi−21<⋯<xN−21<xN=b
又作成了 [a,b] 的一个网格剖分,它被称为原剖分的对偶剖分。如图 1 所示,打"-"号的是原剖分结点,打"×"号的是对偶剖分结点。

图 1 对区间 [a,b] 的剖分
接着用差商代替微商的方法将方程(1)在内点 xi 处离散。
− dxd(p dx du)xi(p dx du)xi−21=(hi+1+hi)/2(p dx du)xi−21−(p dx du)xi+21+O(h),=p(xi−21)hiui−ui−1+24hi2(p dx3 d3u)zi
记 pi−21=p(xi−21),qi=q(xi),fi=f(xi) ,可得方程
−hi+hi+12[pi+21hi+1ui+1−ui−pi−21hiui−ui−1]+qiui=fii=1,2,⋯,N−1,(12)
用(12)式代替(11)式的截断误差的阶为 O(h)。而所缺的两个方程同样可由边界条件得到。
Step4: 是研究这个线性代数方程组的性态,即解的存在性、唯一性以及当 h→0 时差分解的极限性质,也就是收敛性。(略)
Step5:求解得到的线性代数方程组。
在差分方程组中,将由两个边界条件得到的等式代入 i=1 和 i=N−1 两个方程中消去 u0 和 uN ,便得到了关于 u=(u1,u2,⋯,uN−1)T 的 N−1 维的线性代数方程组
Au=f
这里 A 是一个三对角矩阵:
A=b1a2c1b2⋱c2⋱⋱aN−1bN−2
而 f=(f∗1,f∗2,⋯,f∗N−1)T(这里的 f∗N−1 不同于方程组(3.13)中的 fN−1 ),我们来考察它的解法。
它的第一个方程是 u1 与 u2 的相互关系,最后一个方程是 uN−2 和 uN−1 的相互关系,而其他方程是 ui−1,ui,ui−1 三者之间的关系。于是,从第一个方程可得到 u1 用 u2 的表示,代入第二个方程,消去 u1 ,则可得到 u2 用 u3 的表示,如此等等,直到第 N−2 个方程,可得到 uN−2 用 uN−1 的表示,将这个表示关系代入最后一个方程中消去 uN−2 ,便可求出 uN−1 。然后,利用已经建立的 uN−2 用 uN−1 的表示式求出 uN−2 ,这样逐个上溯,求出 uN−3,uN−1,⋯,u2 ,最后可通过 u1 用 u2 的表示式算出 u1 ,从而解出全部 ui 。
现在来推导计算的具体步骤。设
uj=sjuj+1+tj,
将它代入第 j+1 个方程 (j⩾1) ,有
aj+1(sjuj+1+tj)+bj+1uj+1+cj+1uj+2=fj+1,
从而
uj+1=−bj+1+aj+1sjcj+1uj+2+bj+1+aj+1sjfj+1−aj+1tj≡sj+1uj+2+t_j+1,