Matlab解微分方程.doc
第十六章 偏微分方程的数值解法
科学研究和工程技术中的许多问题可建立偏微分方程的数学模型。包含多个自变量的微
分方程称为偏微分方程(partial differential equation),简称PDE。偏微分方程问题,其求解是
。除少数特殊情况外,绝大多数情况均难以求出精确解。因此,近似解法就显得十分困难的
更为重要。本章仅介绍求解各类典型偏微分方程定解问题的差分方法。
16.1 几类偏微分方程的定解问题
一个偏微分方程的表示通常如下:
ABCfxy,,,,,,,,,(,,,,) (16.1.1) xxxyyyxy
式中,是常数,称为拟线性(quasilinear)数。通常,存在3种拟线性方程: ABC,,
2 双曲型(hyperbolic)方程:; BAC,,40
2 抛物线型(parabolic)方程:; BAC,,40
2 椭圆型(ellliptic)方程:。 BAC,,40
16.1.2 双曲型方程
最简单形式为一阶双曲型方程:
,,uu (16.1.2) ,,a0,,tx
物理中常见的一维振动与波动问题可用二阶波动方程:
22,,uu2,a (16.1.3) 22,,tx
描述,它是双曲型方程的典型形式。方程的初值问题为:
22,,,uu2,,,,,,,,atx0,,22,,tx,,uxx,(,0)() (16.1.4) ,,
,,u,,,,,,,,xx(),,,t0,t,
边界条件一般有三类,最简单的初边值问题为:
22,,,uu2,,,,,,atTxl00,0,22,,tx,
,,uxl(,0),,, (16.1.5) ,utgtultgttT(0,)(),(,)()0,,,,12,
,,u,,,,,,,()xx,,,t,t,0,
16.1.3 抛物型方程
其最简单的形式为一维热传导方程:
2,,uu,,,aa0(0) (16.1.8) 2,,tx
方程可以有两种不同类型的定解问题:
(1) 初值问题:
2,uu,,atx00,,,,,,,,,,,2 (16.1.6) tx,,,
,,uxxx(,0)(),,,,,,,,
(2) 初边值问题:
2,uu,,atTxl00,0,,,,,,,2tx,,,,,uxxxl(,0)()0,,, (16.1.7) ,
,utgtultgttT(0,)(),(,)()0,,,,12,
,,
其中,()x,,为已知函数,且满足连接条件: gt()gt()12
(16.1.8) ,,(0)(0),()(0),,glg12边界条件为第一类边界条件。 utgtultgt(0,)(),(,)(),,12
第二类和第三类边界条件为:
,,,u,,,()()tugt101x,,,,x,, (16.1.9) 0,,tT
,,,u,,()()tugt,22xl,,,,x,,
其中,。当时,为第二类边界条件,否则称为第三类边界条,()0t,,()0t,,,()()0tt,,1212
件。
16.1.4 椭圆型方程
其最典型、最简单的形式是泊松(Poisson)方程
22,,uu,,,,ufxy(,) (16.1.10) 22,,xy
特别地,当时,即为拉普拉斯(Laplace)方程,又称为调和方程: fxy(,)0,
22,u,u,u,,,0 (16.1.11) 22,x,y
Poisson方程的第一边值问题为:
22,,,uu,,,,fxyxy(,)(,),22xy,, (16.1.12) ,
,,uxyxy(,)(,),,,,,(,)xy,,,
,,其中为以为边界的有界区域,为分段光滑曲线,称为定解区域,,,fxy(,),(,)xy,,
,分别为,上的已知连续函数。 ,
第二类和第三类边界条件可统一表示为:
,,,u (16.1.13) ,,(,),,uxy,,(,)xy,,,n,,
,其中n为边界的外法线方向。当,,0时为第二类边界条件,,,0时为第三类边界条件。
16.2 差分方法的基本概念
差分方法又称为有限差分方法或网格法,是求偏微分方程定解问题的数值解中应用最广
泛的方法之一。
它的基本思想是:先对求解区域作网格剖分,将自变量的连续变化区域用有限离散点(网格点)集代替;将问题中出现的连续变量的函数用定义在网格点上离散变量的函数代替;通过用网格点上函数的差商代替导数,将含连续变量的偏微分方程定解问题化成只含有限个未知数的代数方程组(称为差分格式)。如果差分格式有解,且当网格无限变小时其解收敛于原微分方程定解问题的解,则差分格式的解就作为原问题的近似解(数值解)。
因此,用差分方法求偏微分方程定解问题一般需要解决以下问题:
(1) 选取网格;
(2) 对微分方程及定解条件选择差分近似,列出差分格式;
(3) 求解差分格式;
(4) 讨论差分格式解对于微分方程解的收敛性及误差估计。
下面,用一个简单的例子来说明用差分方法求解偏微分方程问题的一般过程及差分方法的基本概念。
设有一阶双曲型方程初值问题。
,,uu,,,,,,,,,,atx00,,tx,, (16.2.1) ,
,,uxx(,0)(),,
选取网格:
图16.2.1 差分示意图
Dxtxt,,,,,,,,{(,),0}首先对定解区域作网格剖分,最简单常用一种网格是用两族
t分别平行于轴与轴的等距直线: x
ttjkj,,,,,,,(0,1,2,0,1,2,) , (16.2.2) xxkh,,jk
将分成许多小矩形区域。这些直线称为网格线,其交点称为网格点,也称为节点,和分Dh,
别称作方向和t方向的步长。这种网格称为矩形网格。 x
(1) 对微分方程及定解条件选择差分近似,列出差分格式。如果用向前差商表示一阶偏
导数,即:
uxtuxt(,)(,),,uhkjkj,1,,,,,,uxht(,)2kj1x,xh2(,)xtkj (16.2.3) uxtuxt(,)(,),,ukjkj,1,,,,,,uxt(,)2,,kj2t,t2,(,)xtkj
其中。 0,1,,,,12
方程:
,,uu,,a0 (16.2.4) ,,tx
在节点(,)xt处可表示为: kj
uxtuxtuxtuxt(,)(,)(,)(,),,kjkjkjkj,,11,a,h
ah,,,,,,,,,uxtuxht(,)(,) (16.2.5) ,,,22kjkj21tx22
,,,,,Rxtkj(,)(0,1,2,,0,1,2,)kj
其中:。由于当足够小时,在式中略去Rxt(,),就得到h,,uxxk(,0)()(0,1,2,),,,,,kjkk
一个与方程相近似的差分方程:
uuuu,,,kjkjkjkj,,1,1,,,,a0 (16.2.6) ,h
u(,)xt此处,可看作是问题的解在节点处的近似值。同初值条件: kj,kj
uxk,,,,,()(0,1,2,) (16.2.7) kk,0
结合,就得到求问题的数值解的差分格式。式:
,ah,,,,(,)(,)(,)(),,,,,,RxtuxtuxhtOh (16.2.8) ,,,,22kjkjkj21tx22
qp称为差分方程的截断误差。如果一个差分方程的截断误差为,则称差分方程对ROh,,(),
t是阶精度,对x是阶精度的。显然,截断误差的阶数越大,差分方程对微分方程的逼近pq
越好。
若网格步长趋于0时,差分方程的截断误差也趋于0,则称差分方程与相应的微分方程
是相容的。这是用差分方法求解偏微分方程问题的必要条件。
如果当网格步长趋于0时,差分格式的解收敛到相应微分方程定解问题的解,则称这种
差分格式是收敛的。
16.3 双曲型方程的差分解法
16.3.1 一阶双曲型方程的差分格式
考虑一阶双曲型方程的初值问题:
,,uu,,,,,,,,,,atx00,,tx,, (16.3.1) ,
,,uxxx(,0)(),,,,,,,,
xt,将平面剖分成矩形网格,取方向步长为方向步长为,网格线为: ht,x,
, ttjj,,,,(0,1,2) xxkhk,,,,,(0,1,2,)jk
为简便,记:
(,)(,)kjxt,, ukjuxtx(,)(,),(),,,, kjkjkk
以不同的差商近似偏导数,可以得到方程的不同的差分近似
uuuu,,kjkjkjkj,1,1,,,,0,,a (16.3.2) ,h
uuuu,,kjkjkjkj,1,,1,,,0,,a (16.3.3) ,h
uuuu,,kjkjkjkj,1,1,1,,,,0,,a (16.3.4) ,2h
2截断误差分别为Oh(),,Oh(),与。结合离散化的初始条件,可以得到几种简单,,Oh(),,
的差分格式:
uuaruu,,,(),kjkjkjkj,1,1,,,,, (16.3.5) (0,1,2,,0,1,2,)kj,,,,,,u,,kk,0,
uuaruu,,,(),kjkjkjkj,1,,1,,,, (16.3.6) (0,1,2,,0,1,2,)kj,,,,,,u,,kk,0,
ar,()uuuu,,,,kjkjkjkj,1,1,1,,,, (16.3.7) (0,1,2,,0,1,2,)kj,,,,2,
,,u,kk,0,
,r,其中:。如果已知第层节点上的值,按上面三种格式就可求出第层上的值。uuj,1jkj,kj,1,h
因此,这三种格式都是显式格式。
,u,u如果对采用向后差商,采用向前差商,则方程可化成: ,t,x
ukjukjukjukj(,)(,1)(1,)(,),,,,,,,,,aOh()0 (16.3.8) h,
相应的差分格式为:
uuaruu,,,(),kjkjkjkj,1,1,1,1,,,,, (16.3.9) (0,1,2,,0,1,2,)kj,,,,,,u,,kk,0,
此差分格式是一种隐式格式,必须通过解方程组才能由第层节点上的值求出第层节uj,1jkj,
点上的值。 ukj,1,
10x,,,,uu,,00,tx,,,,,,,,,1,,tx,,,例16.3.1 对初值问题: 其中:()0xx,,, ,,2,,,uxxx(,0)(),,,,,,,,00x,,,
,1r,,uj(1,2,3,4),用差分格式求其数值解,取。 kj,h2
解:记,由初始条件: xkhk,,,,(0,1,2,)k
11,2,k,,,,
,1,,,,,,()0xk ,kk2,
01,2,k,,,
按差分格式:
uuaruu,,,(),kjkjkjkj,1,1,,,,, (0,1,2,,0,1,2,)kj,,,,,,u,,kk,0,
31uuu,,计算公式为:。计算结果略。 kjkjkj,1,1,,,22
如果用差分格式:
uuaruu,,,(),kjkjkjkj,1,,1,,,, (0,1,2,,0,1,2,)kj,,,,,,u,,kk,0,
求解,计算公式为:
1uuu,,() kjkjkj,1,1,,,2
计算结果略。与准确解:
1xt,,
,1, uxtxt(,),,,2,
00x,,,
比较知,按前一个差分格式所求得的数值解不收敛到初值问题的解,而后一个差分格式的解
收敛到原问题的解。
16.3.2 波动方程的差分格式
对二阶波动方程:
22,,uu2,a (16.3.1) 22,,tx
,u,u如果令,,则方程可化成一阶线性双曲型方程组: v,v,12,x,t
,,vv,212,a,,,tx, (16.3.2) ,,,vv21,,,,,tx,
Tv(,),vv记,则方程组可表成矩阵形式: 12
2,,0a,,,vvv (16.3.3) ,,A,,,,,txx10,,
AP矩阵有两个不同的特征值,,,a,故存在非奇异矩阵,使得:
a0,,,1PAP,,, (16.3.4) ,,0,a,,
Twv(,),,Pww作变换,方程组可化为: 12
,,ww (16.3.5) ,,,,tx
方程组由二个独立的一阶双曲型方程联立而成。因此本节主要讨论一阶双曲型方程的差分解
法。
下面给出如下波动方程和边界条件的差分格式:
2 (16.3.6) uxtcuxyxatb(,)(,)0,0,,,,,ttxx
utuattb(0,)0,(,)00,,,,,
, (16.3.7) uxftxa(,0)()0,,,,
,uxgxxa(,0)()0,,,t,
将矩形划分成个小矩形,长宽分别为:,,,xhRxtxatb,,,,,{(,):0,0}(1)(1)nm,,,
,形成一个网格,如图16.3.1所示。 ,,tk
图16.3.1 网格图
可通过差分方程的方法计算近似值:
{:1,2,,}uin, 在连续行内,jm,2,3,, ij,
网格点的真实值为。 uxt(,)ii
求和的中心差分为: uxt(,)uxt(,)ttxx
uxtkuxtuxtk(,)2(,)(,),,,,2uxtOk(,)(),, (16.3.8) tt2k
uxhtuxtuxht(,)2(,)(,),,,,2uxtOh(,)(),, (16.3.9) xx2h
在每一行的网格间距是均匀的:,而且。同时,它在每一列也是均xxh,,xxh,,ii,1ii,1
22匀的,,。接下来,将和去掉,用(16.3.8)和(16.3.9)中的近uttk,,ttk,,Ok()Oh()ij,ii,1ii,1
似,并按顺序代入(16.3.6)式,可得到差分方程: uxt(,)ij
uuuuuu,,,,22ijijijijijij,1,,11,,1,,,,,2 ,c (16.3.10) 22kh
可用它来近似(16.3.6)式。为方便起见,可将代入上式,可得: rckh,/
2uuuruuu,,,,,2(2) (16.3.11) ijijijijijij,,,,,1,,11,,1,
设行和的近似值已知,可用上式求网格的行: j,1j,1j
22ururuuu,,,,,(22)() (16.3.12) ijijijijij,,,,,1,1,1,,1
式中,。根据上式左边的4个已知值可得到近似值u,如图16.3.2所示。 in,,2,3,,1ij,1,
图16.3.2 波动方程的空格样板
用上式时,必须注意,如果计算的某个阶段带来的误差最终会越来越小,则方法是稳定的。为了保证上式的稳定性,必然使rckh,,/1。还存在其他一些差分方程方法以,称为隐格式法,它们更难实现,但对无限制。 r
16.3.3 差分方法求解波动方程的MATLAB程序
求解区间Rxtxatb,,,,,{(,):0,0},以(16.3.7)为边界条件的波动方程的差分方法程序。
**********************************************************
function U = finedif(f,g,a,b,c,n,m)
%Input - f=u(x,0) as a string 'f'
% - g=ut(x,0) as a string 'g'
% - a and b right endpoints of [0,a] and [0,b] % - c the constant in the wave equation
% - n and m number of grid points over [0,a] and [0,b] %Output - U solution matrix; analogous to Table 10.1
%Initialize parameters and U
h = a/(n-1);
k = b/(m-1);
r = c*k/h;
r2=r^2;
r22=r^2/2;
s1 = 1 - r^2;
s2 = 2 - 2*r^2;
U = zeros(n,m);
%Comput first and second rows
for i=2:n-1
U(i,1)=feval(f,h*(i-1));
U(i,2)=s1*feval(f,h*(i-1))+k*feval(g,h*(i-1)) ...
+r22*(feval(f,h*i)+feval(f,h*(i-2)));
end
%Compute remaining rows of U
for j=3:m,
for i=2:(n-1),
U(i,j) = s2*U(i,j-1)+r2*(U(i-1,j-1)+U(i+1,j-1))-U(i,j-2);
end
end
U=U';
*******************************************************************
16.4 抛物型方程的差分解法
以一维热传导方程:
2,,uu (16.4.1) ,,,aa0(0)2,,tx
为基本模型讨论适用于抛物型方程定解问题的几种差分格式。
16.4.1 差分格式的建立
首先对xt,平面进行网格剖分。分别取为方向与t方向的步长,用两族平行直线h,,x
,ttjj,,,,(0,1,2),将xt,平面剖分成矩形网格,节点为:xxkhk,,,,,(0,1,2,)jk
(,)(0,1,2,,0,1,2)xtkj,,,,。为简便,记: kj
(,)(,)kjxt, ,ukjuxt(,)(,),,,,ggt,(),,,,()t,,,,()x,,,()xkjkj22jj11jjkkkk
,,,()t。 22jj
16.4.2 微分方程的差分近似
,u在网格内点处,对分别采用向前、向后及中心差商公式: (,)kj,t
,,,uukjukj(,1)(,),,O(),,t,(,)kj
,,,uukjukj(,)(,1),,O() (16.4.2) ,,t,(,)kj
,,,,uukjukj(,1)(,1)2,,O(),,t2(,)kj,
一维热传导方程可分别表示为:
ukjukjukjukjukj(,1)(,)(1,)2(,)(1,),,,,,,2,,,,aOh() (16.4.3) 2h,
ukjukjukjukjukj(,1)(,1)(1,)2(,)(1,),,,,,,,2,,,,aOh() (16.4.4) 2h,
ukjukjukjukjukj(,1)(,1)(1,)2(,)(1,),,,,,,,22,,,,aOh() (16.4.5) 22h,
由此得到一维热传导方程的不同差分近似:
uuuuu,,,2kjkjkjkjkj,1,1,,1,,,, (16.4.6) ,,a02,h
uuuuu,,,2kjkjkjkjkj,,11,,1,,,, (16.4.7) ,,a02,h
uuuuu,,,2kjkjkjkjkj,1,11,,1,,,,, (16.4.8) ,,a02,h
22上述差分方程所用到的节点各不相同。其截断误差分别为,和Oh(),,Oh(),,
22。因此,它们都与一维热传导方程相容。 Oh(),,
ukjukjukjukjukj(,1)(,1)(1,)2(,)(1,),,,,,,,22,,,,aOh()如果将式:中的用ukj,22h,
1uu,()代替,则可得到又一种差分近似: kjkj,1,1,,2
uuuuuu,,,,kjkjkjkjkjkj,1,11,,1,11,,,,,,,0 ,,a (16.4.9) 2,2h
差分方程用到四个节点。由Taylor公式容易得出:
12uuuO,,,,()() (16.4.10) kjkjkj,,1,1,,2
2,,,22故其的截断误差为。因而不是对任意的,此差分方程都能逼近热h,0,,OhO(),,,,,2h,,
2,,uu,,,aa0,(0)传导方程:,仅当时,才成立。 ,,oh()2,,tx
综上可知,用不同的差商公式可以得到微分方程的不同的差分近似。构造差分格式的关
键在于使其具有相容性、收敛性和稳定性。前面三个方程都具有相容性,而此方程则要在一
定条件下才具有相容性。
16.4.3 初、边值条件的处理
为用差分方法求解定解问题初值问题:
2,,,uuatx00,,,,,,,,,,,2 (16.4.11) tx,,,
,,uxxx(,0)(),,,,,,,,
初边值问题:
2,,,uuatTxl00,0,,,,,,,2,,tx,, (16.4.12) ,uxxxl(,0)()0,,,,
,utgtultgttT(0,)(),(,)()0,,,,12,
,,
还需对定解条件进行离散化。
对初始条件及第一类边界条件,可直接得到:
(0,1, 0,1,,)kkn,,,或 uux,,(,0),, kkk,0
uutg,,(0,)0,1jjj , (0,1,,1)jm,,uultg,,(,)njjj,2
lTnm,,,式中:。 h,
对第二、三类边界条件:
,,,u,,,()()tugt101x,,,,x,, (16.4.13) 0,,tT
,,,u,,()()tugt,22xl,,,,x,,
需用差分近似。下面介绍两种较简单的处理方法。
,u,u在左边界处用向前差商近似偏导数,在右边界处用向后差商近似,(0)x,()xl,,x,x
即:
,,uujuj(1,)(0,),,Oh(),xh(0,)j , (16.4.14) (0,1,,)jm,
,,,uunjunj(,)(1,),,Oh(),xh(,)nj
则得边界条件的差分近似为:
uu,,1,0,jj,,,ug10,1jjj,,h ,(0,1,,)jm, (16.4.15) ,uu,,njnj,1,,,,ug,2,2jnjj,h,
其截断误差为Oh()。
,u(2) 用中心差商近似,即: ,x
,,,uujuj(1,)(1,)2,,Oh(),xh2j(0,) , (16.4.16) (0,1,,)jm,
,,,,uunjunj(1,)(1,)2,,Oh(),xh2nj(,)
则得边界条件的差分近似为:
uu,,1,1,jj,,,,ug10,1jjj,,2h , (16.4.17) (0,1,,)jm,,uu,njnj,,1,1,,,,ug,2,2jnjj,h,
2其截断误差为。误差的阶数提高了,但出现定解区域外的节点和,这就(1,),j(1,)nj,Oh()
需要将解拓展到定解区域外。可以通过用内节点上的值插值求出u和u,也可以假定u,1,jnj,1,
u热传导方程在边界上也成立,将差分方程扩展到边界节点上,由此消去和。 un,1,j,1,j
16.4.4 几种常用的差分格式
以热传导方程的初边值问题:
2,,,uuatTxl00,0,,,,,,,2,,tx,, , (16.4.18) uxxxl(,0)()0,,,,
,utgtultgttT(0,)(),(,)()0,,,,12,
,,
为例给出几种常用的差分格式。
) 古典显式格式 (1
a,r,令,则: 2h
uuuuu,,,2kjkjkjkjkj,1,1,,1,,,,,,a0 (16.4.19) 2,h
urururu,,,,(12)可改写成: 。将其与初始条件及第一类边界条件: kjkjkjkj,11,,1,,,,
(0,1, 0,1,,)kkn,,,或uux,,(,0), , kkk,0
uutg,,(0,)0,1jjj , (0,1,,1)jm,,uultg,,(,)njjj,2
结合,我们得到求解此问题的一种差分格式:
,urururuknjm,,,,,,,,(12)(1,2,,1,0,1,,1kjkjkjkj,11,,1,,,,, (16.4.20) ,ukn,,(0,1,,),kk,0
,ugugjm,,,,(0,1,,)0,1,2jjnjj,
(u,,)由于第0层上节点处的值已知,由此即可算出在第一层上节点处(0)j,uu(1)j,k,0k的近似值u。重复使用此式,可以逐层计算出所有的,因此此差分格式称为典显式格式。uk,1kj,又因式中只出现相邻两个时间层的节点,故此式是二层显式格式。
(2) 古典隐式格式
将式:
uuuuu,,,2kjkjkjkjkj,,11,,1,,,, ,,a0 (16.4.21) 2,h
整理并与初始条件及第一类边界条件式联立,得差分格式如下:
,uuruuuknjm,,,,,,,,(2)(1,2,,1,0,1,,1)kjkjkjkjkj,1,1,1,11,1,,,,,,, (16.4.22) ,ukn,,(0,1,,),kk,0
,ugugjm,,,,(0,1,,)0,1,2jjnjj,
a,r,其中:。虽然第0层上的值仍为已知,但不能由上式直接计算以上各层节点上的值u,ukj,2h
必须通过解下列线性方程组:
120,,rr,,
,,uurg,,,,rrr120,,,,1,11,11jjj,,,,,,,,uu,,2,12,jj,,,,,,,,,,, (16.4.23) ,,,,,,,,,uunjnj,,,2,12,,,,,,,,,,,uurg,012,,,rrrnjnjj,,,,1,11,21,,,,,,
,,,,rr12,,
uu式中,(0,1,,1)jm,,。 才能由计算,故此差分格式称为古典隐式格式。此方程组kj,kj,1,是三对角方程组,且系数矩阵严格对角占优,故解存在唯一。
(3) Richardson格式
Richardson格式是将式:
uuuuu,,,2kjkjkjkjkj,1,11,,1,,,,, ,,a02,h
整理后与初始条件及第一类边界条件式联立。其计算公式为:
,uuruuuknjm,,,,,,,,2(2)(1,2,,1,1,2,,1kjkjkjkjkj,1,11,,1,,,,,, 6.4.24) ,ukn,,(0,1,,),kk,0
,ugugjm,,,,(0,1,,)0,1,2jjnjj,
j,1,j,j,1这种差分格式中所涉及的节点出现在三层上,故为三层显式格式。Richardson格
式是一种完全不稳定的差分格式,因此它在实际计算中是不能采用的。
(4) 杜福特-弗兰克尔 (DoFort-Frankel) 格式
DoFort-Frankel格式也是三层显式格式,它是由式:
uuuuuu,,,,kjkjkjkjkjkj,1,11,,1,11,,,,,,,0 ,,a 2,2h
与初始条件及第一类边界条件式结合得到的。具体形式如下:
212rr,,uuuuknjm,,,,,,,()(1,2,,1,1,2,,1)kjkjkjkj,11,1,,1,,,,,1212,,rr, (16.4.25) ,ukn,,(0,1,,),kk,0
,ugugjm,,,,(0,1,,)0,1,2jjnjj,
,
用这种格式求解时,除了第0层上的值u由初值条件得到,必须先用二层格式求出第1层上k,0
ujm(2,3,,),的值u,然后再按上式逐层计算。 k,1kj,
(5) 六点隐式格式
对二阶中心差商公式:
2,,,,,uukjukjukj(1,)2(,)(1,) ,22,xhkj(,)
221,u,u(,)kj,如果用在(,1)kj,与(,)kj处的二阶中心差商的平均值近似在处的值,即: 222,x,x
2uuuuuu,,,,,2,2,ukjkjkjkjkjkj,,,,,,,1,1,11,11,,1,2 ,,Oh()221,xh2(,)kj,2
,u1(k,j,)同时在点处的值也用中心差商: ,t2
,,,,uukjukj(,1)(,1) ,,,O(),t2,(,)kj
近似,即:
2uu,,ukjkj,1,, ,2,,x1(,)kj,2
这样又得到热传导方程的一种差分近似:
uu,akjkj,1,,(2,2)0 ,,,,,,,uuuuuu (16.4.26) kjkjkjkjkjkj,,,,,,,1,1,11,11,,1,2,2h
22其截断误差为,将上式与初始条件及第一类边界条件式联立并整理,得差分格式: O(,h),
rr,uuuuuuuu,,,,,,,(2)(2)kjkjkjkjkjkjkjkj,1,1,1,11,11,,1,,,,,,,,,,22,,(1,2,,1,0,1,,1)knjm,,,, (14.5.27) ,
,ukn,,,(0,1,,)kk,0,ugugjm,,,,(0,1,,),0,1,2jjnjj,
此格式涉及到六个节点,它又是隐式格式,故称为六点隐式格式。与古典隐式格式类似,
用六点格式由第层的值u计算第层的值u时,需求解三对角方程组: j,1jkj,kj,1,
1/20,,rr,,
,,u,,,,,rrr/21/201,1j,,,,,u,,2,1j,,,,,,,,,,,,,unj,,2,1,,,,,,u0/21/2,,,rrrnj,,1,1,,,,
,,,,rr/21,,
rr,,uuuuu,,,,(2)1,0,12,1,0,jjjjj,,,22,,r,,uuuu,,,(2)2,3,2,1,jjjj,,2,,,,,
,,ruuuu,,,(2)njnjnjnj,2,1,2,3,,,,,,2,,
rr,,u,,,,uuuu(2)n,1,,1,1,2,jnjnjnjnj,,,,, (16.4.28) ,,22
式中,(0,1,,1)jm,,。此方程组的系数矩阵严格对角占优,故仍可用追赶法求解。
例16.4.1 用古典显式格式求初边值问题。
2,,,uu,,,,,,003,03tx,2,,tx,,2 uxxx(,0)03,,,,
,ututt(0,)0,(3,)903,,,,,
,,
。 的数值解,取h,,1,0.5,
a,2ar,,,1,0.5解:这里:,,。 gtgt()0,()9,,()xx,,122h
由格式:
,urururuknjm,,,,,,,,(12)(1,2,,1,0,1,,1kjkjkjkj,11,,1,,,,, ,ukn,,(0,1,,),kk,0
,ugugjm,,,,(0,1,,)0,1,2jjnjj,
可得到:
uuukj,,,,0.5()(1,2,0,1,,5),kjkjkj,11,1,,,,,22 uxkk,,,(0,1,2,3),kk,0
,uuj,,,0,9(0,1,,6)0,3,jj,
将初值u代入上式,即可算出: k,0
uuu,,,,,,,0.5()0.5(40)2 1,12,00,0
uuu,,,,,,,0.5()0.5(91)5 2,13,01,0
u,9将边界条件u,0,及上述结果代入又可求得: 0,13,1
uuuu,,,,0,2.5,5.5,9 0,21,22,23,2
如此逐层计算,得全部节点上的数值解为:
uuuu,,,,0,2.75,5.75,9,0,31,32,33,3 u,0,0,4
16.4.5 前向差分法求解热传导方程的MATLAB程序
0,,xa0,,tb 设uxfx(,0)(),,其中,,而且,,其中,求解区utcuatc(0,),(,),,12
2uxtcuxt(,)(,),Rxtxatb,,,,,{(,):0,0}间内的近似解。 txx
*****************************************************
function U=forwdif(f,c1,c2,a,b,c,n,m)
%Input - f=u(x,0) as a string 'f'
% - c1=u(0,t) and c2=u(a,t)
% - a and b right endpoints of [0,a] and [0,b] % - c the constant in the heat equation
% - n and m number of grid points over [0,a] and [0,b] %Output - U solution matrix; analogous to Table 10.4
%Initialize parameters and U
h=a/(n-1);
k=b/(m-1);
r=c^2*k/h^2;
s=1-2*r;
U=zeros(n,m);
%Boundary conditions
U(1,1:m)=c1;
U(n,1:m)=c2;
%Generate first row
U(2:n-1,1)=feval(f,h:h:(n-2)*h)';
%Generate remaining rows of U
for j=2:m
for i=2:n-1
U(i,j)=s*U(i,j-1)+r*(U(i-1,j-1)+U(i+1,j-1));
end
end
U=U';
*****************************************************
16.4.6 Crank-Nicholson求解热传导方程的MATLAB程序
设uxfx(,0)(),,其中,0,,xa,而且,,其中0,,tb,求解区utcuatc(0,),(,),,12
2uxtcuxt(,)(,),间Rxtxatb,,,,,{(,):0,0}内的近似解。 txx
*****************************************************
function U=crnich(f,c1,c2,a,b,c,n,m)
%Input - f=u(x,0) as a string 'f'
% - c1=u(0,t) and c2=u(a,t)
% - a and b right endpoints of [0,a] and [0,b] % - c the constant in the heat equation % - n and m number of grid points over [0,a] and [0,b] %Output - U solution matrix; analogous to Table 10.5
%Initialize parameters and U
h=a/(n-1);
k=b/(m-1);
r=c^2*k/h^2;
s1=2+2/r;
s2=2/r-2;
U=zeros(n,m);
%Boundary conditions
U(1,1:m)=c1;
U(n,1:m)=c2;
%Generate first row
U(2:n-1,1)=feval(f,h:h:(n-2)*h)';
%Form the diagonal and off-diagonal elemnts of A and %the constant vector B and solve tridiagonal system AX=B
Vd(1,1:n)=s1*ones(1,n);
Vd(1)=1;
Vd(n)=1;
Va=-ones(1,n-1);
Va(n-1)=0;
Vc=-ones(1,n-1);
Vc(1)=0;
Vb(1)=c1;
Vb(n)=c2;
for j=2:m
for i=2:n-1
Vb(i)=U(i-1,j-1)+U(i+1,j-1)+s2*U(i,j-1);
end
X=trisys(Va,Vd,Vc,Vb);
U(1:n,j)=X';
end
U=U'
*****************************************************
16.5 椭圆型方程第一边值问题的差分解法
本节以Poisson方程为基本模型讨论第一边值问题的差分方法。
16.5.1 差分格式的建立
考虑Poisson方程的第一边值问题:
22,,,uu,,,,fxyxy(,)(,),22xy,, (16.5.1) ,
,,uxyxy(,)(,),,,,,(,)xy,,,
图16.5.1
取分别为方向和方向的步长,如图所示,以两族平行线: h,,xy
yyjkj,,,,,,(,0,1,2,), xxkh,,jk
将定解区域剖分成矩形网格。节点的全体记为:
Rxyxkhyjkj,,,{(,),,,},为整数 。 kjkj
,定解区域内部的节点称为内点,记内点集为。边界与网格线的交点称为边界点,,R,h,
(,)xy(,)xy(,)xy边界点全体记为。与节点沿x方向或方向只差一个步长的点和,ykjkj,1kj,1h,
称为节点的相邻节点。如果一个内点的四个相邻节点均属于,称为正则内点,(,)xy,,kj
(1)正内点的全体记为,至少有一个相邻节点不属于的内点称为非正则内点,非正则内,,,
(2)点的全体记为。问题是要求出第一边值问题在全体内点上的数值解。 ,
为简便,记:
(1) ,,。对正则内点,由二(,)(,)kjxy,ukjuxy(,)(,),ffxy,(,)(,)kj,,kjkjkjkj,
阶中心差商公式:
22,,,,,uukjukjukjh(1,)2(,)(1,)(4),,,,uxhy(,)4kj122x,xh12kj(,) (16.5.2) 22,,,,,uukjukjukj(,1)2(,)(,1),(4),,,uxy(,)4,,kj222y,y12,kj(,)
22,,uu,,fxy(,)Poisson方程在点处可表示为: (,)kj22,,xy
ukjukjukjukjukjukj(1,)2(,)(1,)(,1)2(,)(,1),,,,,,,,,,,fRkj(,) (16.5.3) kj,22,h
其中:
22h,(4)(4)Rkjuxhyuxy(,)(,)(,),,,,,,,44kjkj12xx (16.5.4) 1212
22,,,,()(0,1)Oh,,,12
R(k,j) 为其截断误差表示式,略去,即得与方程相近似的差分方程:
uuuuuu,,,,22kjkjkjkjkjkj,,,,1,,1,,1,,1,,f (16.5.5) kj,22,h
u式中方程的个数等于正则内点的个数,而未知数则除了包含正则内点处解的近似值外,ukj,
还包含一些非正则内点处的近似值,因而方程个数少于未知数个数。在非正则内点处Poissonu
方程的差分近似不能按上式给出,需要利用边界条件得到。
边界条件的处理可以有各种
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,下面介绍较简单的两种。
(1) 直接转移。用最接近非正则内点的边界点上的u值作为该点上u值的近似,这就是边
界条件的直接转移。例如,点Pkj(,)为非正则内点,其最接近的边界点为Q点,则有:
(2)uuQQkj,,,,()()(,), (16.3.6) kj,
u上式可以看作是用零次插值得到非正则内点处的近似值,容易求出,其截断误差为O(h,,)。将上式代入,方程个数即与未知数个数相等。
(2) 线性插值。这种方案是通过用同一条网格线上与点相邻的边界点与内点作线性插P
值得到非正则内点处值的近似。由点与的线性插值确定的近似值,得: uPkj(,)uP()uRTkj,
hd,,,,()()uRT (16.5.7) kj,,,hdhd
2dRP,其中,其截断误差为。将其与方程相近似的差分方程联立,得到方程个数与未Oh()
知数个数相等的方程组,求解此方程组可得Poisson方程第一边值问题的数值解。
上面所给出的差分格式称为五点菱形格式,
uuuuuu,,,,22kjkjkjkjkjkj,,,,1,,1,,1,,1,,f (16.5.8) kj,22,h
,此时五点菱形格式可化为: 实际计算时经常取h,,
1uuuuuf,,,,,(4) (16.5.9) kjkjkjkjkjkj,,,,1,1,,1,1,,2h
简记为:
1uf, (16.5.10) kjkj,,2h
uuuuuu,,,,,4其中:。 kjkjkjkjkjkj,1,1,,1,1,,,,,
例16.5.1 用五点菱形格式求解拉普拉斯(Laplace)方程第一边值问题。
22,,,uu,,,,fxyxy(,)(,),22,,xy ,
22,uxyxy(,)lg[(1)],,,,,,,,,
1,,,,{(,)0,1}xyxyh,,,其中:。取。 3
解:网格中有四个内点,均为正则内点。由五点菱形格式,得方程组:
1,(4)0uuuuu,,,,,2,10,11,21,01,12,h,1,(4)0uuuuu,,,,,3,11,12,22,02,12,h ,1,(4)0uuuuu,,,,,2,20,21,31,11,22,h
,1,(4)0uuuuu,,,,,3,21,22,32,12,22h,
代入边界条件:
1625,uu,,lg,lg1,02,0,99,1013,uu,,lg,lg0,10,2,99 ,2534,uu,,lg,lg1,32,3,99
,3740,uu,,lg,lg3,13,299,
其解为:
u,0.2756919u,0.5080467,u,0.4603488,u,0.3467842, 1,12,11,22,2
1uuuuuf,,,,,(4)当时,对利用点,,h,,(,)kj(1,1)kj,,(1,1)kj,,kjkjkjkjkjkj,,,,1,1,,1,1,,2h
构造的差分格式,称为五点矩形格式,简记为:
1uf, (16.5.11) kjkj,,2h2
uuuuuu,,,,,4其中:,其截断误差为: kjkjkjkjkjkj,1,11,11,11,1,,,,,,,,,
2444,,huuu,,,42 (,)6()() (16.5.12) RkjOhOh,,,,,,,424412,,,,xxyy,,kj(,)
2五点菱形格式与矩形格式的截断误差均为,称它们具有二阶精度。如果用更多的点构Oh()
造差分格式,其截断误差的阶数可以提高,如利用菱形格式及矩形格式所涉及的所有节点构
造出的九点格式就是具有四阶精度的差分格式。
16.5.2 用Dirichlet法求解Laplace方程的MATLAB程序
求解区间内的近似解。而且满足条件:uxtuxt(,)(,)0,,Rxyxayb,,,,,{(,):0,0}xxyy
,其中,,而且,,其中0,,xauxfxuxbfx(,0)(),(,)(),,uyfyuayfy(0,)(),(,)(),,1234
,而且存在整数和,使得:。 0,,ybanhbmh,,,nm
*****************************************************
function U=dirich(f1,f2,f3,f4,a,b,h,tol,max1)
%Input - f1,f2,f3,f4 are boundary functions input as strings % - a and b right endpoints of [0,a] and [0,b] % - h step size
% - tol is the tolerance
%Output - U solution matrix; analogous to Table 10.6
%Initialize parameters and U
n=fix(a/h)+1;
m=fix(b/h)+1;
ave=(a*(feval(f1,0)+feval(f2,0)) ...
+b*(feval(f3,0)+feval(f4,0)))/(2*a+2*b); U=ave*ones(n,m);
%Boundary conditions
U(1,1:m)=feval(f3,0:h:(m-1)*h)'; U(n,1:m)=feval(f4,0:h:(m-1)*h)'; U(1:n,1)=feval(f1,0:h:(n-1)*h); U(1:n,m)=feval(f2,0:h:(n-1)*h); U(1,1)=(U(1,2)+U(2,1))/2;
U(1,m)=(U(1,m-1)+U(2,m))/2;
U(n,1)=(U(n-1,1)+U(n,2))/2;
U(n,m)=(U(n-1,m)+U(n,m-1))/2;
%SOR parameter
w=4/(2+sqrt(4-(cos(pi/(n-1))+cos(pi/(m-1)))^2));
%Refine approximations and sweep operator throughout the grid
err=1;
cnt=0;
while((err>tol)&(cnt<=max1))
err=0;
for j=2:m-1
for i=2:n-1
relx=w*(U(i,j+1)+U(i,j-1)+U(i+1,j)+U(i-1,j)-4*U(i,j))/4;
U(i,j)=U(i,j)+relx;
if (err<=abs(relx))
err=abs(relx);
end
end
end
cnt=cnt+1;
end
U=flipud(U');
*****************************************************