基于MATLAB的偏微分方程差分解法学院:核工程与地球物理学院专业:勘查技术与工程班级:1120203学号:姓名:2014/6/111在科学技术各领域中,有很多问题都可以归结为偏微分方程问题。在物理专业的力学、热学、电学、光学、近代物理课程中都可遇见偏微分方程。偏微分方程,再加上边界条件、初始条件构成的数学模型,只有在很特殊情况下才可求得解析解。随着计算机技术的发展,采用数值计算方法,可以得到其数值解。近些年来,求解偏微分方程的数值方法取得进展,特别是有限差分区域分解算法,此类算法的特点是在内边界处设计不同于整体的格式,将全局的隐式计算化为局部的分段隐式计算。使人从感觉上认为这样得到的解会比全局隐式得到的解的精度差,但大量的数值实验表明事实正好相反,用区域分解算法求得的解的精度更好。差分方法又称为有限差分方法或网格法,是求偏微分方程定解问题的数值解中应用最广泛的方法之一。它的基本思想是:先对求解区域作网格剖分,将自变量的连续变化区域用有限离散点(网格点)集代替;将问题中出现的连续变量的函数用定义在网格点上离散变量的函数代替;通过用网格点上函数的差商代替导数,将含连续变量的偏微分方程定解问题化成只含有限个未知数的代数方程组(称为差分格式)。如果差分格式有解,且当网格无限变小时其解收敛于原微分方程定解问题的解,则差分格式的解就作为原问题的近似解(数值解)。因此,用差分方法求偏微分方程定解问题一般需要解决以下问题:(i)选取网格;(ii)对微分方程及定解条件选择差分近似,列出差分格式;(iii)求解差分格式;(iv)讨论差分格式解对于微分方程解的收敛性及误差估计。下面对偏微分方程具体例题的差分解法作一简要的介绍。§1双曲型方程中波动方程的有限差分解法。1.1双曲型的差分方程通过建立网格并求解中心差分方程结果为:22,1,1,1,,1(22)(),2,3,1ijijijijijururuuuin。其中为了保证上式的稳定性,必须使/1rckh。1.2初始值通过联立初始值及边界条件可以得到22223112(,)(2)()()()(1)2iiiiiickuxkfkgfffOhOkOkh代入/rckh,可简化并得到一个改进的对行2的近似值差分方程:22,211(1)()(2)2iiiiirurfkgff1.3双曲型方程中波动方程例题的差分解法结果及程序。题:(,)4(,)ttxxuxtuxt,其中01x且0t0.5,边界条件为:(0,)0(1,)0,00.5(,0)()sin(),01(,0)()0,01tututtuxfxxxuxgxx且2设0.2,0.1,1.hkr解:第一步:通过联立(1)、(2)编写MATLAB程序如下:%二维双曲型偏微分方程,使用D'Alembert方法functionU=hyperbolic(a,b,c,n,m)%a为x的取值范围%b为t的取值范围%c为系数%n为x方向上的节点数%m为t上的节点数h=a/(n-1);%x方向上的步长k=b/(m-1);%t上的步长r=c*k/h;r2=r^2;r22=r^2/2;s1=1-r^2;s2=2-2*r^2;U=zeros(n,m);fori=2:(n-1);U(i,1)=sin(pi*h*(i-1));U(i,2)=s1.*sin(pi*h*(i-1))+k*0...+r22.*(sin(pi*h.*(i-2))+sin(pi*h.*(i)));%P116(13)end%差分方程forj=3:m;fori=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);%P115(7)endendU=U';%画图figure(1);surf(U);figure(2);contour(U,40);第二步:输入数值并计算a=1;b=0.5;c=4n=11m=11执行hyperbolic(1,0.5,4,11,11);第三步:得出结果并画图入下31.等值线结果图2.三位结果图§1.4通过MATLAB语言提供了pdepe()函数,可以直接求解一般偏微分方程(组),它的调用格式为:sol=pdepe(m,@pdefun,@pdeic,@pdebc,x,t),具体程序见附录得出的结果为:1.等值线结果图42.三维结果图1.5结果对比通过编写MATLAB的差分方程程序求取结果和MATLAB自带函数求取结果进行对比,发现这两种方法求得到的结果是非常理想的。§2抛物线方程中热传导方程的有限差分解法。2.1抛物线方程的差分方程通过建立网格并求解显示前向差分方程结果为:,1,-1,+1,(12)()(3)ijijijijururuu其中为了保证上式前向差分方程稳定性,当且仅当r满足102r时。这意味着步长k必须满足222khc。2.2抛物线方程中热传导方程例题的差分解法结果及程序。题:,(,)tuxttxt其中01,00.1,xt初始条件为,0()121,uxfxx其中0,01,tx边界条件为:120,0,000.11,0,100.1ttutcxtutcxt且且解:第一步,分析并带入(3)并编写MATLAB求解程序如下:functionU=forwdif(c1,c2,a,b,c,n,m)clch=a/(n-1);k=b/(m-1);r=(c^2*k)/(h^2);s=1-2*r;U=zeros(n,m);U(1,1:m)=c1;U(n,1:m)=c2;fori=2:n-15U(I,1)=1-abs(2*(i-1)*h-1);%U(I,1)=4*(i-1)*h-4*((i-1)*h)^2;endforj=2:mfori=2:n-1U(I,j)=s*U(I,j-1)+r*(U(i-1,j-1)+U(i+1,j-1));endendU=U’;figure(1);surf(U);figure(2);contour(U,30);第二步,代入初始条件以及边界条件:c1=0;c2=0;a=1;b=0.5;c=1;n=6;m=11;执行forwdif(0,0,1,0.1,1,11,11);第三步:得出结果并画图入下1.等值线结果图2.三位结果图6§2.3通过MATLAB语言提供了pdepe()函数,可以直接求解一般偏微分方程(组),它的调用格式为:sol=pdepe(m,@pdefun,@pdeic,@pdebc,x,t),具体程序见附录得出的结果为:1.等值线结果图2.三维结果图2.4结果对比通过编写MATLAB的差分方程程序求取结果和MATLAB自带函数求取结果进行对比,发现这两种方法求得到的结果是非常相似的,差距不大证明程序编写是成功的。§3椭圆型方程的有限差分解法。3.1建立线型方程组11,1,1,,(,),21(),,21(),,21(),,21()jjiinjnjimimuxyujmuxyuinuxyujmuxyuin在左边在底边在右边在顶边3.2导数边界条件Neumann边界条件确定了(,)uxy边的法线的方向导数。这里使用零法线导数条件:7(,)0uxyN对于热传导而言,这表示边是热绝缘的而且经过边的热通量为零,从而得到:(,)(,)0njxnjuxyuxyx得出点(,)njxy的Laplace差分方程为:1,1,,1,10(4)njnjnjnjuuuu利用差分方程:1,1,(,)0(5)2njnjxniuuuxyh在(4)上式使用(5)式这个近似值,这结果为:1,,+1,-1,2-40(4)njnjnjnjuuuu这个公式讲函数1,,+1,1njnjnjuuu,和联系起来。则Neumann计算空格样板的4种情况如下所示:,21,11,1,1,11,1,,2,1,11,11,1,,1,1,2-40()2-40()(5)2-40()2-40()iiiiimimimimjjjjnjnjnjnjuuuuuuuuuuuuuuuu底部顶部左部右部3.3迭代方法根据(4)式和(5)式以如下形式进行迭代处理:,,,(6)ijijijuur式中:1,1,,1,1,,4(7)4ijijijijijijuuuuur这里211.xnjm且2通过迭代公式(6)右边对所有的内部结点连续执行迭代,直到该式右边余项,ijr“减少到零”(即,,||,2121ijrinjm且)。可以利用逐次超松弛法(SOR)提高所有余项,ijr减少到零的收敛速度。其中逐次超松弛法使用迭代公式:81,1,,1,1,,,,,4(8)4ijijijijijijijijijuuuuuuuur这里参数位于12范围内。对所有网格点应用上式(8)直到,ijr。其中:24(9)24coscos11nm3.4椭圆型方程中波动方程例题的差分解法结果及程序。题:用迭代法求解在区域,:04,04rxyxxLpalace方程的20近似解,这里边界值为:,020;,418004uxuxx解:第一步:通过联立差分方程及迭代方程编写MATLAB程序如下:functionU=dirich(a,b,h,tol,maxl)%设DX=DY=h,且存在m,是的a=nh和b=mhn=fix(a/h)+1;m=fix(b/h)+1;ave=(a*(20+180)+b*(80+0))/(2*a+2*b);U=ave*ones(n,m);U(1,1:m)=80;U(n,1:m)=0;U(1:n,1)=20;U(1:n,m)=180;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;w=4/(2+sqrt(4-(cos(pi/(n-1))+cos(pi/(m-1)))^2));err=1;cnt=0;while((errtol)&(cnt=maxl))err=0;forj=2:m-1fori=2:n-1relx=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);9endendendcnt=cnt+1;relx;endU=flipud(U');figure(1);surf(U);figure(2);contour(U,30);第二步:输入数值并计算a=4;b=4;h=0.5;tol=0.1;maxl=20;执行dirich(4,4,0.5,0.1,20);第三步:得出结果并画图入下1.等值线结果图2.三位结果图10§3附录双曲型及抛物线方程MATLAB语言提供的pdepe()函数程序。%写主函数clcx=linspace(0,1,50);t=linspace(0,0.1,50);m=0;sol=pdepe(m,@pdefun,@pdeic,@pdebc,x,t);u=sol(:,:,1);figure('numbertitle','off','name','PDEDemo——byMatlabsky')surf(x,t,u)title('TheSolutionofu_1')xlabel('X')ylabel('T')zlabel('U')figure(2);contour(u,40);%目标PDE函数function[c,f,s]=pdefun(x,t,u,du)%p141-4c=1;f=du