Skip to main content

差分法

有限差分法(Finite Difference Method,FDM)是一种求解微分方程数值解的近似方法,其主要原理是对微分方程中的微分项进行直接差分近似,从而将微分方程转化为代数方程组求解。有限差分法和有限元法是求微分方程近似解的两种重要的数值方法,它们的共同特点将连续的问题和区域进行各种形式的离散,最后化为有限形式的线性代数方程组。有限差分法与有限元法的最大区别在于前者的处理直接施加于所给的微分方程本身,而后者则需要先把微分方程化成其他形式的数学问题再加以处理。它们的共同点决定了这两种方法在总的处理思路和大的步骤上有不少相同或类似之处,而它们的不同点又导致了这两种方法的具体操作实施具有无法比拟的各自的特殊性。

先从比较简单的两点边值问题的差分法讲起。

解两点边值问题的差分方法

考虑最简单的常微分方程边值问题

Lud2u dx2+qu=f,x(a,b),(1){\rm L} u \equiv-\frac{\mathrm{d}^{2} u}{\mathrm{~d} x^{2}}+q u=f, \quad x \in(a, b), \tag{1} u(a)=α0,u(b)+βu(b)=α1,(2)u(a)=\alpha_{0}, u^{\prime}(b)+\beta u(b)=\alpha_{1},\tag{2}

其中, q,fC0([a,b]),q0,α0,α1,βq, f \in C^{0}([a, b]), q \geqslant 0, \alpha_{0}, \alpha_{1}, \beta 为给定常数 (β>0)(\beta>0) 。(1)式中 L\rm L 为微分算子( L\rm L 用白正体字母表示,今后同)。

用差分法求解边值问题(1)的过程可以分成 5 步。本小节先讨论前三步,其后的两步不太相同。

第一步,区域的离散

将区间 [a,b][a, b] 分成 NN 等分,分点为

xi=a+ih,i=0,1,,N,x_{i}=a+i h, \quad i=0,1, \cdots, N,

这里,h=baN,xih=\frac{b-a}{N}, x_{i} 被称为网格上的结点,hh 称为步长。 第二步,微分方程离散。 由 Taylor 展开公式,在结点 xix_{i} 处,成立

u(xi)=1h2[u(xi+1)2u(xi)+u(xi1)]h212u(4)(ξi)xi1ξixi+1.(3)\begin{array}{c} u^{\prime \prime}\left(x_{i}\right)=\frac{1}{h^{2}}\left[u\left(x_{i+1}\right)-2 u\left(x_{i}\right)+u\left(x_{i-1}\right)\right]-\frac{h^{2}}{12} u^{(4)}\left(\xi_{i}\right) \\ x_{i-1} \leqslant \xi_{i} \leqslant x_{i+1}.\tag{3} \end{array}

记余项

Ri(u)=h212u(t)(ξi),(4)R_{i}(u)=-\frac{h^{2}}{12} u^{(t)}\left(\xi_{i}\right),\tag{4}

则在 xix_{i} 处可将方程(1)写成

u(xi+1)2u(xi)+u(xi1)h2+q(xi)u(xi)=f(xi)+Ri,(5)-\frac{u\left(x_{i+1}\right)-2 u\left(x_{i}\right)+u\left(x_{i-1}\right)}{h^{2}}+q\left(x_{i}\right) u\left(x_{i}\right)=f\left(x_{i}\right)+R_{i},\tag{5}

舍去余项,便得到逼近方程(1)的差分方程:

Lhuiui+12ui+ui1h2+qiui=fi,i=1,2,,N=1,(6)\begin{array}{r} L_{\mathrm{h}} u_{i} \equiv-\frac{u_{i+1}-2 u_{i}+u_{i-1}}{h^{2}}+q_{i} u_{i}=f_{i}, \\ i=1,2, \cdots, N=1,\tag{6} \end{array}

其中, qi=q(xi),fi=f(xi)q_{i}=q\left(x_{i}\right), f_{i}=f\left(x_{i}\right) ,而 uiu_{i}u(x)u(x)xix_{i} 处的近似值,也就是所要寻找的差分解。(6)式中 Lh\mathrm{L}_{\mathrm{h}} 为差分算子( Lh\mathrm{L}_{\mathrm{h}} 用白正体字母表示,今后同)。

利用差分算子 Lh\mathrm{L}_{\mathrm{h}} ,(5)可写成:

Lhu(xi)=f(xi)+Ri,{\rm L_{h}} u\left(x_{i}\right)=f\left(x_{i}\right)+R_{i},

所以, RiR*{i} 就是差分算子 Lh\mathrm{L}*{\mathrm{h}} 代替微分算子 L\rm L 所引起的截断误差,它的阶是 O(h2)O\left(h^{2}\right)

第三步,边界条件的处理。 在(6)式中出现了 N+1N+1 个未知量 u0,u1,,uN1,uNu_{0}, u_{1}, \cdots, u_{N-1}, u_{N} ,但只有 N-1 个方程,所缺的两个方程可以通过对边界条件的处理来获得。

对于第一类边界条件,如在左端 x=ax=a 处,只要直接将函数值代入就行了,即取

u0=u(a)=α0u_{0}=u(a)=\alpha_{0}

对于第三类边界条件,如在右端 x=bx=b 处,就需要处理 u(x)u(x) 的导数值。容易想到的是取它的一阶差商,如取

u(b)uNuN1h,u^{\prime}(b) \approx \frac{u_{N}-u_{N-1}}{h},

但这样做将使得边界点上的截断误差(为 O(h)O(h) )低于内点的截断误差;而由于 xNx_{N} 是端点,又不能采取具有 O(h2)O\left(h^{2}\right) 精度的中心差分,所以在实际中常常采用二阶 Gear 公式。由前面章节,有

u(x+2h)43u(x+h)+13u(x)=2h3u(x+2h)+O(h2).(7)u(x+2 h)-\frac{4}{3} u(x+h)+\frac{1}{3} u(x)=\frac{2 h}{3} u^{\prime}(x+2 h)+O\left(h^{2}\right) .\tag{7}

x+2h=x_Nx+2 h=x\_{N} ,舍去余项,即有近似式:

u(b)12h(3uN4uN1+uN2),u^{\prime}(b) \approx \frac{1}{2 h}\left(3 u_{N}-4 u_{N-1}+u_{N-2}\right),

于是,(2)式的后一个条件可处理成

12h(3uN4uN1+uN2)+βuN=α1.(8)\frac{1}{2 h}\left(3 u_{N}-4 u_{N-1}+u_{N-2}\right)+\beta u_{N}=\alpha_1.\tag{8}

区间的剖分和边界条件的处理可采取多种多样的形式。比如,若 u(x)u(x) 能够被光滑地延拓到区间 [a,b][a, b] 之外,则可取分点

x_j=a+(j12)h,j=0,1,2,,N,(9)x\_{j}=a+\left(j-\frac{1}{2}\right) h, \quad j=0,1,2, \cdots, N,\tag{9}

其中 h=baN1h=\frac{b-a}{N-1} ,这时分点 x0=ah2x_{0}=a-\frac{h}{2}xN=b+N2x_{N}=b+\frac{N}{2} 将在 [a,b][a, b] 之外。

对于结点 x0,x1,,xNx_{0}, x_{1}, \cdots, x_{N} ,同样可以列出(3.6)式所示的 N1N-1 个方程,不足的两个方程可由边界条件来提供。利用

12[u(x1)+u(x0)]=u(a)+h28u(ξ),x0<ξ<x1,\frac{1}{2}\left[u\left(x_{1}\right)+u\left(x_{0}\right)\right]=u(a)+\frac{h^{2}}{8} u^{\prime \prime}(\xi), \quad x_{0}<\xi<x_{1},

u(b)=1h[u(xN)u(xN1)]h224u(η),xN1<η<xN,u^{\prime}(b)=\frac{1}{h}\left[u\left(x_{N}\right)-u\left(x_{N-1}\right)\right]-\frac{h^{2}}{24} u^{\prime \prime \prime}(\eta), \quad x_{N-1}<\eta<x_{N},

可给出两个方程:

{u1+u0=2α0,1h(uNuN1)+β2(uN+uN1)=α1.(10)\left\{\begin{array}{l} u_{1}+u_{0}=2 \alpha_{0}, \\ \frac{1}{h}\left(u_{N}-u_{N-1}\right)+\frac{\beta}{2}\left(u_{N}+u_{N-1}\right)=\alpha_{1} . \end{array}\right.\tag{10}

将(10)式与(6)式联立就可以得到一个由 N+1N+1 个方程组成的含有 n+1n+1 个未知量的线性方程组,其中每一个方程所略去的余项都是 O(h2)O\left(h^{2}\right)

通常遇到的方程当然要比方程(1)复杂得多,然而不管怎样,导出线性方程组的思想是类似的。如对二阶自共轭方程

d dx(p du dx)+q(x)u(x)=f(x),a<x<b,(11)-\frac{\mathrm{d}}{\mathrm{~d} x}\left(p \frac{\mathrm{~d} u}{\mathrm{~d} x}\right)+q(x) u(x)=f(x), \quad a<x<b,\tag{11}

其中, p(x)C1([a,b]),p(x)pmin>0,q,fC0([a,b])q(x)0p(x) \in C^{1}([a, b]), p(x) \geqslant p_ {min}>0, q, f \in C^{0}([a, b]) 且 q(x) \geqslant 0 。取结点为

a=x0<x1<<xi<<xN=b,a=x_{0}<x_{1}<\cdots<x_{i}<\cdots<x_{N}=b,

记小区间

Ii=[xi1,xi],i=1,2,,N,I_{i}=\left[x_{i-1}, x_{i}\right], \quad i=1,2, \cdots, N,

hi=xixi1h_{i}=x_{i}-x_{i-1}IiI_{i} 的长度, h=maxihih=\max_i h_{i} 为最大步长。 取相邻结点的中点 12(xi1+xi)\frac{1}{2}\left(x_{i-1}+x_{i}\right) ,将它记为 xi12x_{i-\frac{1}{2}} ,这些点被称为半整数点,由这些半整数点全体和端点

a=x0<x12<x32<<xi12<<xN12<xN=ba=x_{0}<x_{\frac{1}{2}}<x_{\frac{3}{2}}<\cdots<x_{i-\frac{1}{2}}<\cdots<x_{N-\frac{1}{2}}<x_{N}=b

又作成了 [a,b][a, b] 的一个网格剖分,它被称为原剖分的对偶剖分。如图 1 所示,打"-"号的是原剖分结点,打"×\times"号的是对偶剖分结点。

1

图 1 对区间 [a,b][a, b] 的剖分

接着用差商代替微商的方法将方程(1)在内点 xix_{i} 处离散。

d dx(p du dx)xi=(p du dx)xi12(p du dx)xi+12(hi+1+hi)/2+O(h),(p du dx)xi12=p(xi12)uiui1hi+hi224(p d3u dx3)zi\begin{aligned} -\left.\frac{\mathrm{d}}{\mathrm{~d} x}\left(p \frac{\mathrm{~d} u}{\mathrm{~d} x}\right)\right|_{x_{i}} & =\frac{\left.\left(p \frac{\mathrm{~d} u}{\mathrm{~d} x}\right)\right|_{x_{i}-\frac{1}{2}}-\left.\left(p \frac{\mathrm{~d} u}{\mathrm{~d} x}\right)\right|_{x_{i}+\frac{1}{2}}}{\left(h_{i+1}+h_{i}\right) / 2}+O(h), \\ \left.\left(p \frac{\mathrm{~d} u}{\mathrm{~d} x}\right)\right|_{x_{i-\frac{1}{2}}} & =p\left(x_{i-\frac{1}{2}}\right) \frac{u_{i}-u_{i-1}}{h_{i}}+\left.\frac{h_{i}^{2}}{24}\left(p \frac{\mathrm{~d}^{3} u}{\mathrm{~d} x^{3}}\right)\right|_{z_{i}} \end{aligned}

pi12=p(xi12),qi=q(xi),fi=f(xi)p_{i-\frac{1}{2}}=p\left(x_{i-\frac{1}{2}}\right), q_{i}=q\left(x_{i}\right), f_{i}=f\left(x_{i}\right) ,可得方程

2hi+hi+1[pi+12ui+1uihi+1pi12uiui1hi]+qiui=fii=1,2,,N1,(12)\begin{array}{r} -\frac{2}{h_{i}+h_{i+1}}\left[p_{i+\frac{1}{2}} \frac{u_{i+1}-u_{i}}{h_{i+1}}-p_{i-\frac{1}{2}} \frac{u_{i}-u_{i-1}}{h_{i}}\right]+q_{i} u_{i}=f_{i} \\ i=1,2, \cdots, N-1,\tag{12} \end{array}

用(12)式代替(11)式的截断误差的阶为 O(h)O(h)。而所缺的两个方程同样可由边界条件得到。 Step4: 是研究这个线性代数方程组的性态,即解的存在性、唯一性以及当 h0h \rightarrow 0 时差分解的极限性质,也就是收敛性。(略)

Step5:求解得到的线性代数方程组。

在差分方程组中,将由两个边界条件得到的等式代入 i=1i=1i=N1i=N-1 两个方程中消去 u0u_{0}uNu_{N} ,便得到了关于 u=(u1,u2,uN1)T\boldsymbol{u}=\left(u_{1}, u_{2}, \cdots\right. , \left.u_{N-1}\right)^{T}N1N-1 维的线性代数方程组

Au=fAu=f

这里 AA 是一个三对角矩阵:

A=[b1c1a2b2c2aN1bN2]A=\left[\begin{array}{ccccc} b_{1} & c_{1} & & & \\ a_{2} & b_{2} & c_{2} & & \\ & \ddots & \ddots & \ddots & \\ & & & a_{N-1} & b_{N-2} \end{array}\right]

f=(f1,f2,,fN1)Tf=\left(f*{1}, f*{2}, \cdots, f*{N-1}\right)^{T}(这里的 fN1 f*{N-1} 不同于方程组(3.13)中的 fN1f_{N-1} ),我们来考察它的解法。

它的第一个方程是 u1u_{1}u2u_{2} 的相互关系,最后一个方程是 uN2u_{N-2}uN1u_{N-1} 的相互关系,而其他方程是 ui1,ui,ui1u_{i-1}, u_{i}, u_{i-1} 三者之间的关系。于是,从第一个方程可得到 u1u_{1}u2u_{2} 的表示,代入第二个方程,消去 u1u_{1} ,则可得到 u2u_{2}u3u_{3} 的表示,如此等等,直到第 N2N-2 个方程,可得到 uN2u_{N-2}uN1u_{N-1} 的表示,将这个表示关系代入最后一个方程中消去 uN2u_{N-2} ,便可求出 uN1u^{N-1} 。然后,利用已经建立的 uN2u_{N-2}uN1u_{N-1} 的表示式求出 uN2u_{N-2} ,这样逐个上溯,求出 uN3,uN1,,u2u_{N-3}, u_{N-1}, \cdots, u_{2} ,最后可通过 u1u_{1}u2u_{2} 的表示式算出 u1u_{1} ,从而解出全部 uiu_{i}

现在来推导计算的具体步骤。设

uj=sjuj+1+tj,u_{j}=s_{j} u_{j+1}+t_{j},

将它代入第 j+1j+1 个方程 (j1j \geqslant 1) ,有

aj+1(sjuj+1+tj)+bj+1uj+1+cj+1uj+2=fj+1,a_{j+1}\left(s_{j} u_{j+1}+t_{j}\right)+b_{j+1} u_{j+1}+c_{j+1} u_{j+2}=f_{j+1},

从而

uj+1=cj+1bj+1+aj+1sjuj+2+fj+1aj+1tjbj+1+aj+1sjsj+1uj+2+t_j+1,\begin{aligned} u_{j+1} & =-\frac{c_{j+1}}{b_{j+1}+a_{j+1} s_{j}} u_{j+2}+\frac{f_{j+1}-a_{j+1} t_{j}}{b_{j+1}+a_{j+1} s_{j}} \\ & \equiv s_{j+1} u_{j+2}+t\_{j+1}, \end{aligned}

于是可知

{sj+1=cj+1bj+1+aj+1sj,j=1,2,3,,N3,tj+1=fj+1aj+1tjbj+1+aj+1sj,\left\{\begin{array}{l} s_{j+1}=-\frac{c_{j+1}}{b_{j+1}+a_{j+1} s_{j}}, \quad j=1,2,3, \cdots, N-3, \\ t_{j+1}=\frac{f_{j+1}-a_{j+1} t_{j}}{b_{j+1}+a_{j+1} s_{j}}, \end{array}\right.

显然,当 j=0 时,有

s1=c1b1,t1=f1b1,s_{1}=-\frac{c_{1}}{b_{1}}, \quad t_{1}=\frac{f_{1}}{b_{1}},

j=N2j=N-2 时,即可视上面式中 cN1=0c_{N-1}=0 ,于是

uN1=fN1aN1tN2bN1+aN1sN2=tN1u_{N-1}=\frac{f_{N-1}-a_{N-1} t_{N-2}}{b_{N-1}+a_{N-1} s_{N-2}}=t_{N-1}

这样,整个计算公式可归结为

{a1=0,s0,t0 任意, sj+1=cj+1bj+1+aj+1sj,j=0,1,,N3tj+1=fj+1aj+1tjbj+1+aj+1sj,j=0,1,2,,N2uN1=t_N1,j=N2,N3,,1.(13)\left\{\begin{array}{ll} a_{1}=0, s_{0}, t_{0} \text { 任意, } & \\ s_{j+1}=-\frac{c_{j+1}}{b_{j+1}+a_{j+1} s_{j}}, & j=0,1, \cdots, N-3 \\ t_{j+1}=\frac{f_{j+1}-a_{j+1} t_{j}}{b_{j+1}+a_{j+1} s_{j}}, & j=0,1,2, \cdots, N-2 \\ u_{N-1}=t\_{N-1}, & j=N-2, N-3, \cdots, 1 .\tag{13} \end{array}\right.

sjs_{j}tjt_{j} 时的下标由小到大,这被称为"追"的过程;求 uju_{j} 时恰恰相反,下标由大到小,这被称为"赶"的过程,所以(13)式被称为解三对角方程组的追赶法

算例

算例 1

{d2u dx2=(1x)u+1(1+x)2,x(0,1),u(0)=1,u(1)=0.5,\left\{\begin{array}{l} \frac{\mathrm{d}^{2} u}{\mathrm{~d} x^{2}} = \frac{(1-x)u+1}{(1+x)^2}, \quad x \in(0, 1), \\ u(0)=1, u(1)=0.5, \end{array}\right.

真实解为

u=11+xu=\frac{1}{1+x}

我们设置时间步长为 164,1128,1256\frac{1}{64},\frac{1}{128},\frac{1}{256},我们可以得到如下实验结果:

Adams-Bashforth方法数值解比较

图 1:算例1差分法不同步长与精确解的比较

Adams-Moulton方法数值解比较

图 2:算例1差分法不同步长绝对误差的比较

算例 2

{d2u dx2du dx+u=ex3sinx,x(0,π),u(0)=2,u(π)=eπ+3,\left\{\begin{array}{l} \frac{\mathrm{d}^{2} u}{\mathrm{~d} x^{2}} -\frac{\mathrm{d}u}{\mathrm{~d}x} + u = e^x - 3sinx, \quad x \in(0, \pi), \\ u(0)=-2, u(\pi)=e^{\pi} +3, \end{array}\right.

真实解为

u=ex3cosx.u=e^x-3cosx.

我们设置时间步长为 164,1128,1256\frac{1}{64},\frac{1}{128},\frac{1}{256},我们可以得到如下实验结果:

Adams-Bashforth方法数值解比较

图 3:算例2差分法不同步长与精确解的比较

Adams-Moulton方法数值解比较

图 4:算例2差分法不同步长绝对误差的比较

算例 3

{d2u dx2xdu dx+u=2xcosx+x,x(0,π),u(0)=0,u(π)=π,\left\{\begin{array}{l} \frac{\mathrm{d}^{2} u}{\mathrm{~d} x^{2}} -x\frac{\mathrm{d}u}{\mathrm{~d}x} + u = -2xcosx +x, \quad x \in(0, \pi), \\ u(0)=0, u(\pi)=\pi, \end{array}\right.

真实解为

u=x+2sinx.u=x+2sinx.

我们设置时间步长为 164,1128,1256\frac{1}{64},\frac{1}{128},\frac{1}{256},我们可以得到如下实验结果:

Adams-Bashforth方法数值解比较

图 5:算例3差分法不同步长与精确解的比较

Adams-Moulton方法数值解比较

图 6:算例3差分法不同步长绝对误差的比较

解椭圆边值问题的差分方法

矩形网格

这里以 Poisson 方程

Δu=f(x,y),(x,y)G,(3.20)-\Delta u=f(x, y), \quad(x, y) \in G,\tag{3.20}

的边值问题为例来讨论如何构造相应的差分方程组。

为简单起见,设 GGOxyO-xy 平面上的一个有界单连通区域,其边界 Γ\Gamma 是分段光滑曲线,方程(3.20)的定解条件通常有以下三类:

  • (1)第一类边值条件: uΓ=α(x,y)\left.u\right|_{\Gamma}=\alpha(x, y);
  • (2)第二类边值条件: unΓ=β(x,y)\left.\frac{\partial u}{\partial n}\right|_{\Gamma}=\beta(x, y);
  • (3)第三类边值条件: (un+ku)_Γ=γ(x,y)\left.\left(\frac{\partial u}{\partial n}+k u\right)\right|\_{\Gamma}=\gamma(x, y) ,

其中 α(x,y),β(x,y),γ(x,y),k(x,y)\alpha(x, y), \beta(x, y), \gamma(x, y), k(x, y) 是定义在 Γ\Gamma 上的已知函数, k(x,y)0k(x, y) \geqslant 0 且不恒为零, nn 表示 Γ\Gamma 的单位外法线方向(但习惯上,在方向导数中它就表示为标量形式)。求方程(3.20)满足边值条件(3.21)、 (3.22)、(3.23)的解相应地称为解第一、第二、第三边值问题。

用差分法求解椭圆型方程边值问题与前面叙述的用差分方法解常微分方程边值问题一样,在于构造一个含有若干个未知数的线性方程组,这个方程组的唯一解是所求的微分方程定解问题的解函数 u(x,y)u(x, y) 在某个点集 {(xi,yj)}\left\{\left(x_{i}, y_{j}\right)\right\} 处的值 {u(xi,yj)}\left\{u\left(x_{i}, y_{j}\right)\right\} 的近似值。

因此,边值问题离散化的第一步是用一个离散的点集来代替有界区域 Gˉ=GΓ\bar{G}=G \cup \Gamma ,这里先介绍矩形网格。

取定沿 xx 方向和 yy 方向的步长分别为 h1h_{1}h2h_{2} ,记 h=h12+h22h=\sqrt{h_{1}^{2}+h_{2}^{2}} ,从某个定点 (x0,y0)\left(x_{0}, y_{0}\right) 开始作两族与坐标轴平行的直线

x=x0+ih1,i=0,1,2,,N1y=y0+jh2,j=0,1,2,,N2\begin{array}{ll} x=x_{0}+i h_{1}, & i=0,1,2, \cdots, N_{1} \\ y=y_{0}+j h_{2}, & j=0,1,2, \cdots, N_{2} \end{array}

让区域 Gˉ\bar{G} 包含在区域 {(x,y)x0xx0+N1h1,y0yy0+N2h2}\left\{(x, y) \mid x_{0} \leqslant x \leqslant x_{0}+N_{1} h_{1}, y_{0} \leqslant y \leqslant\right. \left.y_{0}+N_{2} h_{2}\right\} 中。两族直线的交点 (x0+ih1,y0+jh2)\left(x_{0}+i h_{1}, y_{0}+j h_{2}\right) 称为网格结点,记为 (xi,yj)\left(x_{i}, y_{j}\right)(i,j)(i, j) 。属于 GG 的结点称为内点,用 Gh={(xi,yj)G}G_{h}=\left\{\left(x_{i}, y_{j}\right) \in G\right\} 表示内点全体组成的集合。网线与 Γ\Gamma 的交点称为界点,用 Γn\Gamma_{n} 来记界点全体所组成的集合。若两个结点 (xi1,yj1),(xi2,yj2)\left(x_{i_{1}}, y_{j_{1}}\right),\left(x_{i_{2}}, y_{j_{2}}\right) 满足

i1i2+j1j2=1,(3.24)\left|i_{1}-i_{2}\right|+\left|j_{1}-j_{2}\right|=1,\tag{3.24}

图 3.2 界点、非正则内点、正则内点

则称这两个结点是相邻的。于是, GhG_{h} 中的点又可以分成两类:一类是其四个邻点都属于 GhG_{h} ,这种点称为正则内点,其全体组成的集合记为 GhG_{h}^{\prime} ;另一类是其四个邻点中至少有一个不属于 GhG_{h} ,这种点被称为非正则内点,其全体组成的集合记为 GhG_{h}^{\prime \prime} (如图 3.2 所示)。于是有

Gh=GhGh,GhGh=.G_{h}^{\prime}=G_{h}^{\prime} \cup G_{h}^{\prime \prime}, \quad G_{h}^{\prime} \cap G_{h}^{\prime \prime}=\varnothing .

此外,用 Gˉh\bar{G}_{h} 表示内点与界点的并集,即

Gˉh=GhΓh=GhGhΓh\bar{G}_{h}=G_{h} \cup \Gamma_{h}=G_{h}^{\prime} \cup G_{h}^{\prime \prime} \cup \Gamma_{h}

uh(x,y)u_{h}(x, y) 是定义在 Gˉh\bar{G}_{h} 上的网函数uh(xi,yj)=uiju_{h}\left(x_{i}, y_{j}\right)=u_{i j}u(x,y)u(x, y)(xi,yj)\left(x_{i}, y_{j}\right) 处的近似值,下面先就 (xi,yj)\left(x_{i}, y_{j}\right) 是正则内点时导出 uiju_{i j} 所满足的方程。

沿 x,yx, y 方向分别用两阶中心差商代替两阶偏导数,得到

Δhuij[ui+1,j2uij+ui1,jh12+ui,j+12ui,j+ui,j1h22]=fij(3.25)\begin{aligned} -\Delta_{h} u_{i j} & \triangleq-\left[\frac{u_{i+1, j}-2 u_{i j}+u_{i-1, j}}{h_{1}^{2}}+\frac{u_{i, j+1}-2 u_{i, j}+u_{i, j-1}}{h_{2}^{2}}\right] \\ & =f_{i j} \end{aligned} \tag{3.25}

这里 fij=f(xi,yj)f_{i j}=f\left(x_{i}, y_{j}\right), f 是 Gˉ\bar{G} 上的连续函数。由于差分方程(3.25)式中出现的只是结点 (xi,yj)\left(x_{i}, y_{j}\right) 及其四个邻点上的网函数值,故通常称之为 "五点差分格式"。

利用 Taylor 展式,当 u(x,y)u(x, y) 充分光滑时,有

u(xi+1,yj)2u(xi,yj)+u(xi1,yj)h12=2u(xi,yj)x2+h12124u(xi,yj)x4+h143606u(xi,yj)x6+O(h16),(3.26)\begin{aligned} & \frac{u\left(x_{i+1}, y_{j}\right)-2 u\left(x_{i}, y_{j}\right)+u\left(x_{i-1}, y_{j}\right)}{h_{1}^{2}} \\ = & \frac{\partial^{2} u\left(x_{i}, y_{j}\right)}{\partial x^{2}}+\frac{h_{1}^{2}}{12} \frac{\partial^{4} u\left(x_{i}, y_{j}\right)}{\partial x^{4}}+\frac{h_{1}^{4}}{360} \frac{\partial^{6} u\left(x_{i}, y_{j}\right)}{\partial x^{6}}+O\left(h_{1}^{6}\right), \end{aligned} \tag{3.26}

u(xi,yj+1)2u(xi,yj)+u(xi,yj1)h22=2u(xi,yj)y2+h22124u(xi,yj)y4+h243606u(xi,yj)y6+O(h26),(3.27)\begin{aligned} & \frac{u\left(x_{i}, y_{j+1}\right)-2 u\left(x_{i}, y_{j}\right)+u\left(x_{i}, y_{j-1}\right)}{h_{2}^{2}} \\ = & \frac{\partial^{2} u\left(x_{i}, y_{j}\right)}{\partial y^{2}}+\frac{h_{2}^{2}}{12} \frac{\partial^{4} u\left(x_{i}, y_{j}\right)}{\partial y^{4}}+\frac{h_{2}^{4}}{360} \frac{\partial^{6} u\left(x_{i}, y_{j}\right)}{\partial y^{6}}+O\left(h_{2}^{6}\right), \end{aligned} \tag{3.27}

因而五点差分格式的截断误差为

Rij(u)=Δu(xi,yj)Δhu(xi,yj)=112(h12+ux4+h22+uy4)_(i,j)+O(h4)(3.28)\begin{aligned} R_{i j}(u) & =\Delta u\left(x_{i}, y_{j}\right)-\Delta_{h} u\left(x_{i}, y_{j}\right) \\ & =-\left.\frac{1}{12}\left(h_{1}^{2} \frac{\partial^{+} u}{\partial x^{4}}+h_{2}^{2} \frac{\partial^{+} u}{\partial y^{4}}\right)\right|\_{(i, j)}+O\left(h^{4}\right) \end{aligned} \tag{3.28}

特别,若取正方形网格, h1=h2=hh_{1}=h_{2}=h ,则差分方程(3.25)化为

uij=fij,(3.29)-\diamond u_{i j}=f_{i j},\tag{3.29}

这里

uij1h2(ui+1,j+ui1,j+ui,j+1+ui,j14uij).(3.30)\diamond u_{i j} \triangleq \frac{1}{h^{2}}\left(u_{i+1, j}+u_{i-1, j}+u_{i, j+1}+u_{i, j-1}-4 u_{i j}\right).\tag{3.30}

表示用网格结点 (i,j)(i, j) 及其四个邻点(在菱形的端点)的 uu 的值的线性组合来表示 (Δu)ij(\Delta u)_{i j} 的差分逼近。

很自然地会想到,是否可以用其他点上的 uu 值的线性组合(比如矩形的端点)来表示 (Δu)ij(\Delta u)_{i j} 的差分逼近?进一步,能否利用更多的结点上的 uu 的值的线性组合去得到 (Δu)ij(\Delta u)_{i j} 的具有更高精度的差分逼近?在一定条件下,对上述问题的回答是肯定的。

比如,对正方形网格,只要把网格旋转 4545^{\circ} 就可以得到近似代替㥕分方程 (3.20)(3.20) 的另一种差分形式:

uij=fij,(3.31)-\square u_{i j}=f_{i j}, \tag{3.31}

这里

uij=12h2(ui+1,j+1+ui+1,j1+ui1,j+1+ui1,j14uij)0(3.32)\begin{aligned} \square u_{i j}= & \frac{1}{2 h^{2}}\left(u_{i+1, j+1}+u_{i+1, j-1}+u_{i-1, j+1}\right. \\ & \left.+u_{i-1, j-1}-4 u_{i j}\right)_{0} \end{aligned} \tag{3.32}

容易知道,其对于方程 (3.20)(3.20) 的截断误差为

Rij(u)=h212(4ux4+64ux2y2+4uy4)ij+O(h4).(3.33)R_{i j}^*(u)=-\frac{h^{2}}{12}\left(\frac{\partial^{4} u}{\partial x^{4}}+6 \frac{\partial^{4} u}{\partial x^{2} \partial y^{2}}+\frac{\partial^{4} u}{\partial y^{4}}\right)_{i j}+O\left(h^{4}\right) . \tag{3.33}

(329)(3.29) 式与 (3.31)(3.31) 式结合起来,可以得到逼近 Δu\Delta u 的差分算子

uij=23uij+13uij=16h2[ui+1,j+1+ui+1,j1+ui1,j+1+ui1,j1+4(ui+1,j+ui1,j+ui,j+1+ui,j1)20uij](3.34)\begin{aligned} \boxplus u_{i j}= & \frac{2}{3} \diamond u_{i j}+\frac{1}{3} \square u_{i j} \\ = & \frac{1}{6 h^{2}}\left[u_{i+1, j+1}+u_{i+1, j-1}+u_{i-1, j+1}+u_{i-1, j-1}\right. \\ & \left.+4\left(u_{i+1, j}+u_{i-1, j}+u_{i, j+1}+u_{i, j-1}\right)-20 u_{i j}\right] \end{aligned} \tag{3.34}

(3.24)(3.24) 式用到了以 (i,j)(i, j) 为中心的上下左右共九个结点上的 uu 的值,所以称为"九点差分格式"。如果 u(x,y)u(x, y) 足够光滑,可以用 Taylor 展开式证明其截断误差为

Rij(u)=Δu(xi,yi)uij=[24!h2(Δ2u)+26!h4(Δ3u+2(Δu)x(xyy))]ij+O(h5),\begin{aligned} R_{i j}(u) & =\Delta u\left(x_{i}, y_{i}\right)-\boxplus u_{i j} \\ & =-\left[\frac{2}{4!} h^{2}\left(\Delta^{2} u\right)+\frac{2}{6!} h^{4}\left(\Delta^{3} u+2(\Delta u)_{x(x y y)}\right)\right]_{i j}+O\left(h^{5}\right), \end{aligned}

因此,用差分方程

uij23uij+13uij=fij+h212(Δf)ij+h4360(Δ2f+2fxxyy)ij\begin{aligned} -\boxplus u_{i j} & \triangleq-\frac{2}{3} \diamond u_{i j}+\frac{1}{3} \square u_{i j} \\ & =f_{i j}+\frac{h^{2}}{12}(\Delta f)_{i j}+\frac{h^{4}}{360}\left(\Delta^{2} f+2 f_{x x y y}\right)_{i j} \end{aligned}

近似代替一 Δu=f\Delta u=f ,逼近的阶为 O(h6)O\left(h^{6}\right) ,若舍去右边的第三项,逼近的误差也可达到 O(h4)O\left(h^{4}\right)

五点差分格式也可以通过方程(3.20)的积分守恒形式

Γun ds=DΔu dx dy=Df dx dy,DG-\oint_{\Gamma} \frac{\partial u}{\partial n} \mathrm{~d} s=-\iint_{D} \Delta u \mathrm{~d} x \mathrm{~d} y=\iint_{D} f \mathrm{~d} x \mathrm{~d} y, \quad \forall D \subset G

来导出。推导(3.37)式时利用了 Green 公式, nnΓ\Gamma 上单位外法线方向。

在图 3.2 所示的网格上引进"半线"(图 3.3 中的虚线):

图 3.3 对偶剖分

x=xi+12=x0+(i+12)h1,i=0,1,2,,N11,y=yj+12=y0+(j+12)h2,j=0,1,2,,N21,\begin{array}{l} x=x_{i+\frac{1}{2}}=x_{0}+\left(i+\frac{1}{2}\right) h_{1}, \quad i=0,1,2, \cdots, N_{1}-1, \\ y=y_{j+\frac{1}{2}}=y_{0}+\left(j+\frac{1}{2}\right) h_{2}, \quad j=0,1,2, \cdots, N_{2}-1, \end{array}

这些"半线"形成了另一套网格,与原网格相辅相成,它们被称为原网格的对偶剖分。对任一正则内点 (i,j)(i,j) ,取(3.37)式中的区域 DDijD \equiv D_{i j}(i,j)(i, j) 四周的四个对偶结点 ABCD 所组成的正方形区域,由(3.37)式,有

ABCDAun ds=Dijf dx dy(3.38)-\int_{\overbrace{ABCDA}} \frac{\partial u}{\partial n} \mathrm{~d} s=\iint_{D_{i j}} f \mathrm{~d} x \mathrm{~d} y \tag{3.38}

用中矩形公式代替沿四边的线积分,再用中心差商代替外法向导数,则

AB^un ds=xi12xi+12uy dx(uy)i,j+12h1ui,j+1ui,jh2h1\begin{aligned} \int*{\hat{A B}} \frac{\partial u}{\partial n} \mathrm{~d} s & =\int*{x*{i-\frac{1}{2}}}^{x*{i+\frac{1}{2}}} \frac{\partial u}{\partial y} \mathrm{~d} x \approx\left(\frac{\partial u}{\partial y}\right)_{i, j+\frac{1}{2}} \cdot h_{1} \\ & \approx \frac{u*{i, j+1}-u*{i, j}}{h*{2}} h*{1} \end{aligned}

同理可得沿其他三边的线积分,所以

ABCD.^un dsui,j1uijh2h1+ui+1,juijh1h2+ui,j+1uijh2h1+ui1,juijh1h2\begin{aligned} \int \widehat{A B C D .} \frac{\partial u}{\partial n} \mathrm{~d} s \doteq & \frac{u*{i, j-1}-u*{i j}}{h*{2}} h*{1}+\frac{u*{i+1, j}-u*{i j}}{h*{1}} h*{2} \\ & +\frac{u*{i, j+1}-u*{i j}}{h*{2}} h*{1}+\frac{u*{i-1, j}-u*{i j}}{h*{1}} h*{2} \end{aligned}

代入(3.38)式,即有差分格式:

Δhuij=1h1h2Dijf dx dy_0(3.39)-\Delta*{h} u*{i j}=\frac{1}{h*{1} h*{2}} \iint*{D*{i j}} f \mathrm{~d} x \mathrm{~d} y\_{0} \tag{3.39}

若右边的二重积分用中矩形公式代替,则它与(3.25)式完全一致。

边界条件处理

Gˉh\bar{G}_{h} 中正则内点的个数为 M1M_{1} ,非正则内点的个数为 M2M_{2} ,则对于第一类边值问题,未知量共有 M1+M2M_{1}+M_{2} 个,而对于第二、三类边值问题,未知量一般也是 M1+M2M_{1}+M_{2} 个。前面已在正则内点上建立了 M1M_{1} 个方程,因此还必须补充若干个方程。

第一类边值条件

显然,需要对非正则内点集合 GhG_{h}^{\prime \prime} 中的每一个点补充一个方程,这样正好增加了 M2M_{2} 个方程。

为了保证计算的精度,需要根据不同情况采用不同的近似处理方法,通常有如下三种。

  • (1)零次插值:

由于 u(x,y)u(x, y)Γ\Gamma 上的值是已知的,因此对点 P=(xi,yi)GhP=\left(x_{i}, y_{i}\right) \in G_{h}^{\prime \prime} ,取距 PP 最近的 Γ\Gamma 上的点 P=(xi,yj)P^{\prime}=\left(x_{i}^{\prime}, y_{j}^{\prime}\right) ,令

uij=α(xi,yj)u_{i j}=\alpha\left(x_{i}^{\prime}, y_{j}^{\prime}\right)

也就是点 P 用点 PP^{\prime} 处的值作零次插值。对光滑函数,这么做的误差是 O(h)O(h) 。实际应用中,由于最近的点 PP^{\prime} 不易获得,常用 x (或 y )方向上处于同一条网线上的点 Q1Q_{1} (或 Q2Q_{2} )来代替(图 3.4)。

  • (2)一次插值:这是一种较为精确的方法。设 P=(xi,yj)GhP=\left(x_{i}, y_{j}\right) \in G_{h}^{\prime \prime}

图 3.4 零次插值点的选取邻点 N, E 在区域 G 之外,记 NN^{\prime}EE^{\prime} 分别是线段 PN\overline{P N}PE\overline{P E}Γ\Gamma 的交点(即界点), S 和 W 是内点,于是可以利用 NN^{\prime} 和 S (或 EE^{\prime} 和 W )沿 y 方向(或 x 方向)作线性插值。例如,沿 y 方向的插值公式为

uij=h2u(N)+h2u(S)h2+h2u_{i j}=\frac{h_{2} u\left(N^{\prime}\right)+h_{2}^{\prime} u(S)}{h_{2}+h_{2}^{\prime}}

这里 h2h_{2}^{\prime} 表示 P 与 NN^{\prime} 的距离。这么做的误差是 O(h2)O\left(h^{2}\right) (图 3.5)。

Adams-Bashforth方法数值解比较

图 3.4:零次插值点的选取

Adams-Moulton方法数值解比较

图 6:沿y方向(或x方向)的插值

第二、三类边值条件

第二、三类边值条件可统一写成

(un+ku)r=γ(x,y),k(x,y)0,\left( \frac{ \partial u}{ \partial n}+ku \right) \left| \right._{r}= \gamma \left( x,y \right),k \left( x,y \right) \geq 0,

k(x,y)0k(x,y)\equiv 0 时即为第二类边值条件。

对于非正则内点 P ,可在 Γ\Gamma 上取一点 PP^* 使之与 PP 的距离最近,然后利用 PP^{*} 处的边界条件来列出点 PP 的方程。从图 3.6 可以看到(下面讨论 h1=h2=hh_{1}=h_{2}=h 的情形):

unPunPu(P)u(Q)hcosα+u(P)u(R)hcosβ, \left.\quad \frac{\partial u}{\partial n}\right|_{P^*}\left.\doteq \frac{\partial u}{\partial n}\right|_{P} \doteq \frac{u(P)-u(Q)}{h} \cos \alpha+\frac{u(P)-u(R)}{h} \cos \beta ,

这里 α\alphaβ\beta 分别是 PP^{\prime} 处的外法线方向与 xxyy 轴的夹角,于是点 PP 的线性方程可以写成

uPuQhcosα+uPuRhcosβ+k(P)uP=γ(P).\frac{u_{P}-u_{Q}}{h} \cos \alpha+\frac{u_{P}-u_{R}}{h} \cos \beta+k\left(P^*\right) u_{P}=\gamma\left(P^*\right) .

图 3.6 PP^* 点外法向

图 3.7 曲边三角形 ~ABC\widetilde{\triangle}ABC

PP 恰为界点时,只要将上式看成 P=PP^{*}=P 就可以了(这时方程组的阶数将大于 M1+M2M_{1}+M_{2} )。

点 P 的方程也可以利用微分方程的积分守恒形式 (3.37) 式来导出。利用前述的“对偶剖分”的思想,在点 P 周围截出由线段 ABAB, BCBCΓ\Gamma 上的一段弧 AC^\hat{AC} 所围成的曲边三角形 ABC~\widetilde{\triangle ABC} (图 3.7),记它的边界为 Δ~\partial \widetilde{\Delta},对这个小区域使用 Green 公式,得

Δ~un d=Δ~ABCdxdy-\int_{\partial \widetilde{\Delta}} \frac{\partial u}{\partial n} \mathrm{~d} = \int_{\widetilde{\Delta} \cdot A B C} d x d y

用差商代替外法向导数,得

ABun dsuQuPhAB,\int_{\overline{A B}} \frac{\partial u}{\partial n} \mathrm{~d} s \doteq \frac{u_{Q}-u_{P}}{h} \cdot|\overline{A B}|,

算例

算例 1

设 G 是以原点为中心的单位正六边形的内部,用 h=18h=\frac{1}{8} 的正方形网格进行剖分,用五点差分格式求方程:

{Δu=1,(x,y)G,u=0,(x,y)Γ.\left\{\begin{matrix} -\Delta u=1, (x,y) \in G, \\ u=0, (x,y) \in \Gamma. \end{matrix}\right.

既然是 Poisson 方程进行离散之后就按照前面的格式,因为 Δu=f=1\Delta u = f =1,就离散为

ui+1,j+ui1,j+ui,j+1+ui,j14ui,jh2=fi,j=1\frac{u_{i+1,j}+u_{i-1,j}+u_{i,j+1}+u_{i,j-1}-4u_{i,j}}{h^2} = f_{i,j} =1

我们给出 h=13h=\frac{1}{3} 时的情况,一个一个方程写出来,首先我们给所有的未知点编个号如 7 图所示,我们还取了不同步长,包括h=18h=\frac{1}{8}h=1100h=\frac{1}{100} 的情况如图所示,我们发现网格越密集效果就越好,但是我们不知道真实解,所以不能给出误差。

Adams-Bashforth方法数值解比较

图 7:内部点编号

Adams-Moulton方法数值解比较

图 8:当步长取 h=13h=\frac{1}{3} 的情况

Adams-Bashforth方法数值解比较

图 9:内部点编号

Adams-Moulton方法数值解比较

图 10:当步长取 h=13h=\frac{1}{3} 的情况

总结

我们可以看到边界处都能够算好,中间好像不能算好,算例 3 不知道怎么回事反正是照着书上照抄出来的,好像该方法并没有考虑时间上的变化,就是一个瞬态方程。