偏微分方程数值解完整版本
第十章 偏微分方程数值解法
第十章 偏微分方程数值解法偏微分方程问题,其求解十分困难。
除少数特殊情况外,绝大多数情况均难以求出精确解。
因此,近似解法就显得更为重要。
本章仅介绍求解各类典型偏微分方程定解问题的差分方法。
§1 差分方法的基本概念1.1 几类偏微分方程的定解问题椭圆型方程:其最典型、最简单的形式是泊松(Poisson )方程),(2222y x f yu x u u =∂∂+∂∂=∆ 特别地,当0),(≡y x f 时,即为拉普拉斯(Laplace )方程,又称为调和方程2222=∂∂+∂∂=∆yux u u Poisson 方程的第一边值问题为⎪⎩⎪⎨⎧Ω∂=Γ=Ω∈=∂∂+∂∂Γ∈),(),(),(),(),(2222y x y x u y x y x f y ux u y x ϕ 其中Ω为以Γ为边界的有界区域,Γ为分段光滑曲线,ΓΩ称为定解区域,),(y x f ,),(y x ϕ分别为Ω,Γ上的已知连续函数。
第二类和第三类边界条件可统一表示为),(),(y x u u y x ϕα=⎪⎪⎭⎫ ⎝⎛+∂∂Γ∈n 其中n 为边界Γ的外法线方向。
当0=α时为第二类边界条件, 0≠α时为第三类边界条件。
抛物型方程:其最简单的形式为一维热传导方程220(0)u ua a t x∂∂-=>∂∂ 方程可以有两种不同类型的定解问题:初值问题⎪⎩⎪⎨⎧+∞<<∞-=+∞<<-∞>=∂∂-∂∂x x x u x t x u a tu )()0,(,0022ϕ初边值问题221200,0(,0)()0(0,)(),(,)()0u ua t T x l t x u x x x lu t g t u l t g t t Tϕ⎧∂∂-=<<<<⎪∂∂⎪⎪=≤≤⎨⎪==≤≤⎪⎪⎩其中)(x ϕ,)(1t g ,)(2t g 为已知函数,且满足连接条件)0()(),0()0(21g l g ==ϕϕ边界条件)(),(),(),0(21t g t l u t g t u ==称为第一类边界条件。
第6章_偏微分方程数值解法
u ( x, 0) = sin( x) , u (0, t ) = 0, u (π , t ) = 0
利用线上法数值求解 u ( x, t ) 随时间的演化关系 解:取 Δx = π /15 ,计算程序:demo_MOL.m,和结果见右图。
对于 a > 0 ,波从 k − 1 点过来, k − 1 点状态已变化, k + 1 点状态还未变化。差分只能 uk − uk −1 。同样意
n n
义可分析 a < 0 情况。见图 6.1.1。迎风格式的精度为 O(Δt , Δx) ,稳定性条件为 Δt < Δx / | a | 。
% Upwind_Method L = 15;dx = 0.1;dt = 0.05;a = -1.; x =[-L+dx:dx:0]';n=length(x); %Initial value u1=zeros(1,n-20);u2=ones(1,10);u3 = zeros(1,10); u = [u1 u2 u3]';r = a*dt/dx; u0 = u; plot(x,u','LineWidth',2);axis([-15 0 -1 2]);pause(1); for t=dt:dt:10. u(1:n-1) = (1+r)*u(1:n-1)-r*u(2:n); % u(2:n-1)=0.5*((1.-r)*u(3:n)… % +(1.+r)*u(1:n-2)); % Lax scheme hold off;plot(x,u,'LineWidth',2); axis([-15 0 -1 2]);pause(0.05) end hold on; plot(x,u0','r','LineWidth',2);axis([-15 0 -1 2]); xlabel('position');ylabel('u(x,t)'); legend('传播的波','初始方波'); title('Upwind')
第6章_偏微分方程数值解法(附录)
第6章附录6.1 对流方程例题6.1.2计算程序!ADVECT.F!!!! advect - Program to solve the advection equation! using the various hyperbolic PDE schemesprogram advectinteger*4 MAXN, MAXnplotsparameter( MAXN = 500, MAXnplots = 500 )integer*4 method, N, nStep, i, j, ip(MAXN), im(MAXN)integer*4 iplot, nplots, iStepreal*8 L, h, c, tau, coeff, coefflw, pi, sigma, k_wavereal*8 x(MAXN), a(MAXN), a_new(MAXN), plotStepreal*8 aplot(MAXN,MAXnplots+1), tplot(MAXnplots+1)!* Select numerical parameters (time step, grid spacing, etc.).write(*,*) 'Choose a numerical method: 'write(*,*) ' 1) FTCS, 2) Lax, 3) Lax-Wendroff : 'read(*,*) methodwrite(*,*) 'Enter number of grid points: 100'read(*,*) NL = 1. ! System sizeh = L/N ! Grid spacingc = 1 ! Wave speedwrite(*,*) 'Time for wave to move one grid spacing is ', h/cwrite(*,*) 'Enter time step: 0.001'read(*,*) taucoeff = -c*tau/(2.*h) ! Coefficient used by all schemescoefflw = 2*coeff*coeff ! Coefficient used by L-W schemewrite(*,*) 'Wave circles system in ', L/(c*tau), ' steps'write(*,*) 'Enter number of steps: 300'read(*,*) nStep!* Set initial and boundary conditions.pi = 3.141592654sigma = 0.1 ! Width of the Gaussian pulsek_wave = pi/sigma ! Wave number of the cosinedo i=1,Nx(i) = (i-0.5)*h - L/2 ! Coordinates of grid pointsa(i) = cos(k_wave*x(i)) * exp(-x(i)**2/(2*sigma**2))enddo! Use periodic boundary conditionsdo i=2,(N-1)ip(i) = i+1 ! ip(i) = i+1 with periodic b.c.im(i) = i-1 ! im(i) = i-1 with periodic b.c.enddoip(1) = 2ip(N) = 1im(1) = Nim(N) = N-1!* Initialize plotting variables.iplot = 1 ! Plot counternplots = 50 ! Desired number of plotsplotStep = float(nStep)/nplotstplot(1) = 0 ! Record the initial time (t=0)do i=1,Naplot(i,1) = a(i) ! Record the initial stateenddo!* Loop over desired number of steps.do iStep=1,nStep!* Compute new values of wave amplitude using FTCS,! Lax or Lax-Wendroff method.if( method .eq. 1 ) then !!! FTCS method !!!do i=1,Na_new(i) = a(i) + coeff*( a(ip(i))-a(im(i)) )enddoelse if( method .eq. 2 ) then !!! Lax method !!!do i=1,Na_new(i) = 0.5*( a(ip(i))+a(im(i)) ) +& coeff*( a(ip(i))-a(im(i)) )enddoelse !!! Lax-Wendroff method !!!do i=1,Na_new(i) = a(i) + coeff*( a(ip(i))-a(im(i)) ) +& coefflw*( a(ip(i))+a(im(i))-2*a(i) ) enddoendifa(i) = a_new(i) ! Reset with new amplitude valuesenddo!* Periodically record a(t) for plotting.if( (iStep-int(iStep/plotStep)*plotStep) .lt. 1 ) theniplot = iplot+1tplot(iplot) = tau*iStepdo i=1,Naplot(i,iplot) = a(i) ! Record a(i) for plotingenddowrite(*,*) iStep, ' out of ', nStep, ' steps completed'endifenddonplots = iplot ! Actual number of plots recorded!* Print out the plotting variables: x, a, tplot, aplotopen(11,file='x.txt',status='unknown')open(12,file='a.txt',status='unknown')open(13,file='tplot.txt',status='unknown')open(14,file='aplot.txt',status='unknown')do i=1,Nwrite(11,*) x(i)write(12,*) a(i)do j=1,(nplots-1)write(14,1001) aplot(i,j)enddowrite(14,*) aplot(i,nplots)enddodo i=1,nplotswrite(13,*) tplot(i)enddo1001 format(e12.6,', ',$) ! The $ suppresses the carriage return stopend!***** To plot in MATLAB; use the script below ******************** !load x.txt; load a.txt; load tplot.txt; load aplot.txt;!%* Plot the initial and final states.!figure(1); clf; % Clear figure 1 window and bring forward!plot(x,aplot(:,1),'-',x,a,'--');!legend('Initial','Final');!pause(1); % Pause 1 second between plots!%* Plot the wave amplitude versus position and time!figure(2); clf; % Clear figure 2 window and bring forward!mesh(tplot,x,aplot);!ylabel('Position'); xlabel('Time'); zlabel('Amplitude');!view([-70 50]); % Better view from this angle!****************************************************************** ================================================6.2 抛物形方程例题6.2.2计算程序!!!!dftcs.f!!!!!!!!!!! dftcs - Program to solve the diffusion equation! using the Forward Time Centered Space (FTCS) scheme.program dftcsinteger*4 MAXN, MAXnplotsparameter( MAXN = 300, MAXnplots = 500 )integer*4 N, i, j, iplot, nStep, plot_step, nplots, iStepreal*8 tau, L, h, kappa, coeff, tt(MAXN), tt_new(MAXN)real*8 xplot(MAXN), tplot(MAXnplots), ttplot(MAXN,MAXnplots)!* Initialize parameters (time step, grid spacing, etc.).write(*,*) 'Enter time step: 0.0001'read(*,*) tauwrite(*,*) 'Enter the number of grid points: 50 'read(*,*) NL = 1. ! The system extends from x=-L/2 to x=L/2h = L/(N-1) ! Grid sizekappa = 1. ! Diffusion coefficientcoeff = kappa*tau/h**2if( coeff .lt. 0.5 ) thenwrite(*,*) 'Solution is expected to be stable'elsewrite(*,*) 'WARNING: Solution is expected to be unstable'endif!* Set initial and boundary conditions.do i=1,Ntt(i) = 0.0 ! Initialize temperature to zero at all pointstt_new(i) = 0.0enddo!! The boundary conditions are tt(1) = tt(N) = 0!! End points are unchanged during iteration!* Set up loop and plot variables.iplot = 1 ! Counter used to count plotsnStep = 300 ! Maximum number of iterationsplot_step = 6 ! Number of time steps between plots nplots = nStep/plot_step + 1 ! Number of snapshots (plots)do i=1,Nxplot(i) = (i-1)*h - L/2 ! Record the x scale for plotsenddo!* Loop over the desired number of time steps.do iStep=1,nStep!* Compute new temperature using FTCS scheme.do i=2,(N-1)tt_new(i) = tt(i) + coeff*(tt(i+1) + tt(i-1) - 2*tt(i))enddodo i=2,(N-1)tt(i) = tt_new(i) ! Reset temperature to new valuesenddo!* Periodically record temperature for plotting.if( mod(iStep,plot_step) .lt. 1 ) then ! Every plot_step stepsdo i=1,N ! record tt(i) for plottingttplot(i,iplot) = tt(i)enddotplot(iplot) = iStep*tau ! Record time for plotsiplot = iplot+1endifenddonplots = iplot-1 ! Number of plots actually recorded!* Print out the plotting variables: tplot, xplot, ttplotopen(11,file='tplot.txt',status='unknown')open(12,file='xplot.txt',status='unknown')open(13,file='ttplot.txt',status='unknown')do i=1,nplotswrite(11,*) tplot(i)enddowrite(12,*) xplot(i)do j=1,(nplots-1)write(13,1001) ttplot(i,j)enddowrite(13,*) ttplot(i,nplots)enddo1001 format(e12.6,', ',$) ! The $ suppresses the carriage returnstopend!***** To plot in MATLAB; use the script below ********************!load tplot.txt; load xplot.txt; load ttplot.txt;!%* Plot temperature versus x and t as wire-mesh and contour plots.!figure(1); clf;!mesh(tplot,xplot,ttplot); % Wire-mesh surface plot!xlabel('Time'); ylabel('x'); zlabel('T(x,t)');!title('Diffusion of a delta spike');!pause(1);!figure(2); clf;!contourLevels = 0:0.5:10; contourLabels = 0:5;!cs = contour(tplot,xplot,ttplot,contourLevels); % Contour plot!clabel(cs,contourLabels); % Add labels to selected contour levels!xlabel('Time'); ylabel('x');!title('Temperature contour plot');!******************************************************************! program diffu_explicit.for! explicit methods for finite diffrencedimension T(51,51)real dx,dt,lamda,kp,Tmax,Tminopen(2,file='diffu_1.dat')dx=0.5dt=0.1kp=0.835lamda=kp*dt/dx/dxTmax=100.Tmin=0.imax=21write(*,*) 'lamda=',lamdado i=1,50do j=1,50T(i,j)=0.0do j=1,40T(1,j)=TmaxT(imax,j)=Tminend dodo j=1,40do i=2,20T(i,j+1)=T(i,j)+lamda*(T(i+1,j)-2.*T(i,j)+T(i-1,j)) end dowrite(2,222) (T(i,j),i=1,21)end do222 format(1x,21(2x,f18.10))end% diffu_explicit.mclc; clear all;nl = 20.; nt = 40;dx = 0.5; dt = 0.1; kp = 0.835;lamda = kp*dt/dx/dx;Tl = 0.; Tr = 100.;T = zeros(nl,nt);T(1,:) = Tl; T(nl,:)=Tr;for j=1:nt-1for i =2:nl-1T(i,j+1)=T(i,j)+lamda*(T(i+1,j)-2.*T(i,j)+T(i-1,j));endendsurf(T');xlabel('x');ylabel('time');zlabel('Temperature');title('explicit scheme');! diffu_implicit.for! implicit methods for finite diffrenceexternal tridparameter (imax=21,kmax=50)dimension t(imax),a(imax),b(imax),c(imax),r(imax),u(imax) real dx,dt,lamda,kp,tmax,tminopen(2,file='diffu_2.dat')dx=0.5lamda=kp*dt/dx/dxtmax=100.tmin=0.write(*,*) 'lamda=',lamdado i=2,imax-1! t(i)=tmax-(tmax-tmin)/(imax-1.)*(i-1.) t(i)=0.0end dot(1)=tmaxt(imax)=tmin! write(*,*) a(i),b(i),c(i)b(1)=1.c(1)=0.r(1)=t(1)a(imax)=0.b(imax)=1.r(imax)=t(imax)do i=2,imax-1a(i)=-lamdab(i)=1.+2.*lamdac(i)=-lamdar(i)=t(i)end dok=01 k=k+1call trid(a,b,c,r,u,imax)do i=1,imaxt(i)=u(i)r(i)=u(i)end dowrite(2,222) (t(i),i=1,imax)! write(*,222) (t(i),i=1,imax)if(k.lt.kmax) goto 1222 format(1x,21(2x,f18.12))endsubroutine trid(a,b,c,r,u,n)parameter (nmax=100)real gam(nmax),a(n),b(n),c(n),u(n),r(n)if (b(1)==0.) pause 'b(1)=0 in trid'bet=b(1)u(1)=r(1)/betdo j=2,ngam(j)=c(j-1)/betbet=b(j)-a(j)*gam(j)if (bet==0.) pause 'bet=0 in trid'u(j)=(r(j)-a(j)*u(j-1))/betend dodo j=n-1,1,-1u(j)=u(j)-gam(j+1)*u(j+1)end doend subroutine trid================================================== 6.3椭圆方程例题6.3.1计算程序! program overrelaxation.for! overrelaxation_iteration_methods for finite diffrence! of the 2d_Laplacian difference equationparameter(imax=25,jmax=25,pi=3.1415926)dimension T(imax,jmax),a(imax,jmax),& qx(imax,jmax),qy(imax,jmax),q(imax,jmax),an(imax,jmax) real lamda,Tu,Td,Tl,Tr,kpx,kpy,dx,dyopen(2,file='overrelaxation.dat')open(3,file='q.dat')lamda=1.5;Tu=100.;Tl=75.;Tr=50.;Td=0.;dx=1.;dy=1.;kmax=9 kpx=-0.49/2./dx;kpy=-0.49/2./dydo i=1,imaxdo j=1,jmaxT(i,j)=0.0end doend doT(1,1)=0.5*(Td+Tl) ;T(1,jmax)=0.5*(Tl+Tu)T(imax,jmax)=0.5*(Tu+Tr);T(imax,1)=0.5*(Tr+Td)do j=2,jmax-1T(1,j)=Tl; T(imax,j)=Trend dodo i=2, imax-1T(i,1)=Td; T(i,jmax)=Tuend dok=0do i=2,imax-1do j=2,jmax-1a(i,j)=T(i,j)T(i,j)=0.25*(T(i+1,j)+T(i-1,j)+T(i,j+1)+T(i,j-1))T(i,j)=lamda*T(i,j)+(1.-lamda)*a(i,j)end doend doep=abs((T(2,2)-a(2,2))/T(2,2))if(k.lt.kmax) goto 5write(*,*) 'ep=',epdo j=1,jmaxwrite(2,222) (T(i,j),i=1,imax)end do222 format(1x,25(2x,f14.10))do i=2,imax-1do j=2,jmax-1qx(i,j)=kpx*(T(i+1,j)-T(i-1,j))qy(i,j)=kpy*(T(i,j+1)-T(i,j-1))q(i,j)=sqrt(qx(i,j)*qx(i,j)+qy(i,j)*qy(i,j))if(qx(i,j).gt.0.) thenan(i,j)=atan(qy(i,j)/qx(i,j))elsean(i,j)=atan(qy(i,j)/qx(i,j))+piend ifend doend dodo j=2,jmax-1do i=2,imax-1! write(3,333) dx*(i-1),dy*(j-1),an(i,j),q(i,j)write(3,333) dx*(i-1),dy*(j-1),qx(i,j),qy(i,j)end doend do333 format(1x,4(2x,f18.12))End================================================= 例题6.3.2计算程序!!!!xadi.f90!!!!!program xadiuse AVDefuse DFLibparameter(n=19)real aj(n),bj(n),cj(n)integer statusreal T(0:n,0:n),TT(0:n,0:n)real lamda,Tu,Td,Tl,Tr,dx,dy,dt,kaopen(2,file='T3.dat')Tu=100.;Tl=75.;Tr=50.;Td=0.;dx=1.;dy=1.;kmax=10;dt=1.ka=0.835; lamda=ka*dt/(dx*dx)write(*,*) 'lamda=',lamdaT = 0.T(0,:) = Tl; T(n,:) =TrT(:,0) = Td; T(:,n) =TuT(0,0)=0.5*(Td+Tl);T(0,n)=0.5*(Tl+Tu)T(n,n)=0.5*(Tu+Tr);T(n,0)=0.5*(Tr+Td)! 系数矩阵赋值aj(:)=-lamda; ai(:)=lamdabj(:)= 2.*(1.+lamda); bi(:)=2.*(1-lamda)cj(:)=-lamda; ci(:)=lamdacall faglStartWatch(T, status)! 相当于随时间演化do k=1,kmaxdo i=1,n-1do j=1,n-1r(j)=ai(i)*T(i-1,j)+bi(i)*T(i,j)+ci(i)*T(i+1,j)end dor(1)=r(1)-aj(1)*T(i,0)r(n-1)=r(n-1)-cj(n-1)*T(i,n)call tridag(aj,bj,cj,r,u,n-1)do j=1,n-1T(i,j)=u(j)end doend do! 将矩阵T转置计算x方向call reverse(n,T,TT)do i=1,n-1do j=1,n-1r(j)=ai(i)*TT(i-1,j)+bi(i)*TT(i,j)+ci(i)*TT(i+1,j) end dor(1)=r(1)-aj(1)*TT(i,0)r(n-1)=r(n-1)-cj(n-1)*TT(i,n)call tridag(aj,bj,cj,r,u,n-1)do j=1,n-1TT(i,j)=u(j)end doend docall reverse(n,TT,T)call faglUpdate(T, status)call faglShow(T, status)end dopausecall faglClose(T, status)call faglEndWatch(T, status)do j=0,nwrite(2,222) (T(i,j),i=0,n)end do222 format(1x,20(2x,f14.10))endSUBROUTINE tridag(a,b,c,r,u,n)INTEGER n,NMAXREAL a(n),b(n),c(n),r(n),u(n)PARAMETER (NMAX=500)INTEGER jREAL bet,gam(NMAX)if(b(1).eq.0.)pause 'tridag: rewrite equations'bet=b(1)u(1)=r(1)/betdo 11 j=2,ngam(j)=c(j-1)/betbet=b(j)-a(j)*gam(j)if(bet.eq.0.)pause 'tridag failed'u(j)=(r(j)-a(j)*u(j-1))/bet11 continuedo 12 j=n-1,1,-1u(j)=u(j)-gam(j+1)*u(j+1)12 continuereturnENDSUBROUTINE REVERSE(n,T,TT) integer n,i,jreal T(0:n,0:n),TT(0:n,0:n)do i=0,ndo j=0,nTT(i,j)=T(j,i)end doend doreturnend================================================6.4 非线性偏微分方程% gasdynamincs_lw_1.mclc; clear all;xmin=-1.; xmax=1.; nx=101; h=(xmax-xmin)/(nx-1);r=0.9; cad=0.; time=0.; gamma=1.4; bcl=1.; bcr=1.;fprintf(' Space step - %f \n',h); fprintf(' \n');dd(1:nx)=zeros(1,nx); ud(1:nx)=zeros(1,nx); pd(1:nx)=zeros(1,nx);x(1:nx)=xmin+((1:nx)-1)*h;% Test 1te=' ( Test 1 )';rol=1.; ul=0.; pl=1.;ror=0.125; ur=0.; pr=0.1;tp=5.5;% Test 3%te=' ( Test 3 )';%rol=0.1; ul=0.; pl=1.;%ror=1.; ur=0.; pr=100.;%tp=0.05;% Initial conditionsdd(1:(nx-1)/2+1)=rol; ud(1:(nx-1)/2+1)=ul; pd(1:(nx-1)/2+1)=pl;dd((nx-1)/2+2:nx)=ror;ud((nx-1)/2+2:nx)=ur; pd((nx-1)/2+2:nx)=pr;[d,u,p,e,time]=lw_gasdynamics(dd,ud,pd,h,nx,r,cad,tp,gamma,bcl,bcr);% Exact solutionfor n=1:nx[density, velocity, pressure]=riemann(x(n),time,rol,ul,pl,ror,ur,pr,gamma);de(n)=density; ue(n)=velocity; pe(n)=pressure;ee(n)=pressure/((gamma-1.)*density);endfigure(1);plot(x,de,'k-',x,d,'k--');xlabel(' x ');ylabel(' density ');title([' Example 6.1 ',te]);figure(2);plot(x,ue,'k-',x,u,'k--');xlabel(' x ');ylabel(' velocity ');title([' Example 6.1 ',te]);figure(3);plot(x,pe,'k-',x,p,'k--');xlabel(' x ');ylabel(' pressure ');title([' Example 6.1 ',te]);figure(4);plot(x,ee,'k-',x,e,'k--');xlabel(' x ');ylabel(' internal energy ');title([' Example 6.1 ',te]);clear all;% Lax-Wendroff scheme (gasdynamics)function [d,u,p,e,time]=lw_gasdynamics(dd,ud,pd,h,nx,r,cad,tp,gamma,bcl,bcr)sd(1,1:nx)=dd(1:nx);sd(2,1:nx)=dd(1:nx).*ud(1:nx);sd(3,1:nx)=pd(1:nx)/(gamma-1.)+0.5*(dd(1:nx).*ud(1:nx)).*ud(1:nx);si(1:3,1:nx+1)=zeros(3,nx+1); av(1:3,1:nx)=zeros(3,nx);time=0.;while time <= tpsta=max(abs(sd(2,:)./sd(1,:))+...sqrt(gamma*(gamma-1)*(sd(3,:)./sd(1,:)-0.5*(sd(2,:).*sd(2,:))./(sd(1,:).*sd(1,:)))));tau=r*h*sqrt(1.-2.*cad)/sta;time=time+tau; %fprintf(' time - %f \n',time);% first stepif bcl == 0sl1=sd(1,2); sl2=-sd(2,2); sl3=sd(3,2);elsesl1=sd(1,2); sl2=sd(2,2); sl3=sd(3,2);endgl(1)=sl2;gl(2)=(gamma-1.)*sl3+0.5*(3.-gamma)*sl2^2/sl1;gl(3)=sl2*(gamma*sl3-0.5*(gamma-1.)*sl2^2/sl1)/sl1;for n=1:nxif (n == 1)|(n == nx)av(:,n)=[ 0.; 0.; 0.;];elseav(:,n)=cad*(sd(:,n+1)-2.*sd(:,n)+sd(:,n-1));endsr1=sd(1,n); sr2=sd(2,n); sr3=sd(3,n);gr(1)=sr2;gr(2)=(gamma-1.)*sr3+0.5*(3.-gamma)*sr2^2/sr1;gr(3)=sr2*(gamma*sr3-0.5*(gamma-1.)*sr2^2/sr1)/sr1;si(1,n)=0.5*(sl1+sr1)-(gr(1)-gl(1))*tau*0.5/h;si(2,n)=0.5*(sl2+sr2)-(gr(2)-gl(2))*tau*0.5/h;si(3,n)=0.5*(sl3+sr3)-(gr(3)-gl(3))*tau*0.5/h;gl(:)=gr(:);sl1=sr1; sl2=sr2; sl3=sr3;endif bcr == 0sr1=sd(1,nx-1); sr2=-sd(2,nx-1); sr3=sd(3,nx-1);elsesr1=sd(1,nx-1); sr2=sd(2,nx-1); sr3=sd(3,nx-1);endgr(1)=sr2;gr(2)=(gamma-1.)*sr3+0.5*(3.-gamma)*sr2^2/sr1;gr(3)=sr2*(gamma*sr3-0.5*(gamma-1.)*sr2^2/sr1)/sr1;si(1,nx+1)=0.5*(sl1+sr1)-(gr(1)-gl(1))*tau*0.5/h;si(2,nx+1)=0.5*(sl2+sr2)-(gr(2)-gl(2))*tau*0.5/h;si(3,nx+1)=0.5*(sl3+sr3)-(gr(3)-gl(3))*tau*0.5/h;% second stepfl(1)=si(2,1);fl(2)=(gamma-1.)*si(3,1)+0.5*(3.-gamma)*si(2,1)^2/si(1,1);fl(3)=si(2,1)*(gamma*si(3,1)-0.5*(gamma-1.)*si(2,1)^2/si(1,1))/si(1,1);for n=2:nx+1fr(1)=si(2,n);fr(2)=(gamma-1.)*si(3,n)+0.5*(3.-gamma)*si(2,n)^2/si(1,n);fr(3)=si(2,n)*(gamma*si(3,n)-0.5*(gamma-1.)*si(2,n)^2/si(1,n))/si(1,n);su(:,n-1)=sd(:,n-1)-(fr(:)-fl(:))*tau/h+av(:,n-1);fl(:)=fr(:);endsd(:,1:nx)=su(:,1:nx);endd(1:nx)=su(1,1:nx); u(1:nx)=su(2,1:nx)./su(1,1:nx);p(1:nx)=(gamma-1.)*(su(3,1:nx)-0.5*(su(2,1:nx).*su(2,1:nx))./su(1,1:nx));e(1:nx)=(su(3,1:nx)-0.5*(su(2,1:nx).*su(2,1:nx))./su(1,1:nx))./su(1,1:nx);return;% Solves Riemann problem for ideal gas% r1, u1, p1 initial parameters for x<0% r2, u2, p2 initial parameters for x>0% rf, uf, pf solution at the point (x,t)% c1, c2 sound speeds for x<0 and for x>0% s1, sr velocties of the fronts of S(hock)W(ave)s% shl, shr velocties of the fronts of the heads of R(arefaction)Ws% stl, str velocties of the tails of RWsfunction [rf,uf,pf]=riemann(x,t,r1,u1,p1,r2,u2,p2,gamma)g(1)=0.5*(gamma-1.)/gamma; g(2)=0.5*(gamma+1.)/gamma; g(3)=2.*gamma/(gamma-1.); g(4)=2./(gamma-1.); g(5)=2./(gamma+1.); g(6)=(gamma-1.)/(gamma+1.);g(7)=0.5*(gamma-1.); g(8)=1./gamma; g(9)=gamma-1.;s=x/t;c1 = sqrt(p1/(r1*g(8)));c2 = sqrt(p2/(r2*g(8)));du=u2-u1;% Vacuum solutionuvac=g(4)*(c1+c2)-du;if uvac <= 0.disp(' Vacuum generated by given data');return;end% Apply Newton method% Initial guessespv=0.5*(p1+p2)-0.125*du*(r1+r2)*(c1+c2);pmin=min(p1,p2); pmax=max(p1,p2); qrat=pmax/pmin;if ( qrat <= 2. ) & ( pmin <= pv & pv <= pmax )p=max(1.0e-6,pv);elseif pv < pminpnu=c1+c2-g(7)*du;pde=c1/(p1^g(1))+c2/(p2^g(1));p=(pnu/pde)^g(3);elsegel=sqrt((g(5)/r1)/(g(6)*p1+max(1.0e-6,pv)));ger=sqrt((g(5)/r2)/(g(6)*p2+max(1.0e-6,pv)));p=(gel*p1+ger*p2-du)/(gel+ger); p=max(1.0e-6,p);endendp0=p; err=1.;while err > 1.0e-5if p <= p1prat=p/p1; fl=g(4)*c1*(prat^g(1)-1.); ffl=1./(r1*c1*prat^g(2));elsea=g(5)/r1; b=g(6)*p1; qrt=sqrt(a/(b+p));fl=(p-p1)*qrt; ffl=(1.-0.5*(p-p1)/(b+p))*qrt;endif p <= p2prat=p/p2; fr=g(4)*c2*(prat^g(1)-1.); ffr=1./(r2*c2*prat^g(2));elsea=g(5)/r2; b=g(6)*p2; qrt=sqrt(a/(b+p));fr=(p-p2)*qrt; ffr=(1.-0.5*(p-p2)/(b+p))*qrt;endp=p-(fl+fr+du)/(ffl+ffr);err=2.*abs(p-p0)/(p+p0); p0=p;endif p0 < 0.p0=1.0e-6;end% Velocity of CDu0=0.5*(u1+u2+fr-fl);if s <= u0if p0 <= p1shl=u1-c1;if s <= shlrf=r1; uf=u1; pf=p1; return;elsecml=c1*(p0/p1)^g(1); stl=u0-cml;if s > stlrf=r1*(p0/p1)^g(8); uf=u0; pf=p0; return;elseuf=g(5)*(c1+g(7)*u1+s); c=g(5)*(c1+g(7)*(u1-s));rf=r1*(c/c1)^g(4); pf=p1*(c/c1)^g(3);return;endendelsepml=p0/p1; sl=u1-c1*sqrt(g(2)*pml+g(1));if s <= slrf=r1; uf=u1; pf=p1; return;elserf=r1*(pml+g(6))/(pml*g(6)+1.); uf=u0; pf=p0; return;endendelseif p0 > p2pmr=p0/p2; sr=u2+c2*sqrt(g(2)*pmr+g(1));if s >= srrf=r2; uf=u2; pf=p2; return;elserf=r2*(pmr+g(6))/(pmr*g(6)+1.); uf=u0; pf=p0; return;endelseshr=u2+c2;if s >= shrrf=r2; uf=u2; pf=p2; return;elsecmr=c2*(p0/p2)^g(1); str=u0+cmr;if s <= strrf=r2*(p0/p2)^g(8); uf=u0; pf=p0; return;elseuf=g(5)*(-c2+g(7)*u2+s); c=g(5)*(c2-g(7)*(u2-s));rf=r2*(c/c2)^g(4); pf=p2*(c/c2)^g(3);return;endendendendreturn;%%%%%%%%% gasdynamics_Godunov.m%%%%%%%%%%%%%clc; clear all;xmin=-1.; xmax=1.; nx=101; h=(xmax-xmin)/(nx-1);r=0.9; gamma=1.4; bcl=1.; bcr=1.;fprintf('gasdynamics_godunov \n'); fprintf(' Space step - %f \n',h); fprintf(' \n'); dd(1:nx-1)=zeros(1,nx-1); ud(1:nx-1)=zeros(1,nx-1); pd(1:nx-1)=zeros(1,nx-1);x(1:nx)=xmin+((1:nx)-1)*h; xa=xmin+((1:nx-1)-0.5)*h;% Test 1te=' ( Test 1 )';rol=1.; ul=0.; pl=1.;ror=0.125; ur=0.; pr=0.1;tp=15.5;% Test 2%te=' ( Test 2 )';%rol=1.; ul=0.; pl=1000.;%ror=1.; ur=0.; pr=1.;%tp=0.024;% Test 3%te=' ( Test 3 )';%rol=0.1; ul=0.; pl=1.;%ror=1.; ur=0.; pr=100.;%tp=0.05;% Test 4%te=' ( Test 4 )';%rol=5.99924; ul=19.5975; pl=460.894;%ror=5.99242; ur=-6.19633; pr=46.0950;%tp=0.05;% Test 5%te=' ( Test 5 )';%rol=3.86; ul=-0.81; pl=10.33;%ror=1.; ur=-3.44; pr=1.;%tp=0.5;% Initial conditionsdd(1:(nx-1)/2)=rol; ud(1:(nx-1)/2)=ul; pd(1:(nx-1)/2)=pl;dd((nx-1)/2+1:nx-1)=ror;ud((nx-1)/2+1:nx-1)=ur; pd((nx-1)/2+1:nx-1)=pr;[d,u,p,e,time]=godunov_gasdynamics(dd,ud,pd,h,nx,r,tp,gamma,bcl,bcr);% Exact solutionfor n=1:nx[density, velocity, pressure]=riemann(x(n),time,rol,ul,pl,ror,ur,pr,gamma);de(n)=density; ue(n)=velocity; pe(n)=pressure;ee(n)=pressure/((gamma-1.)*density);endfigure(1);plot(x,de,'k-',xa,d,'ko');xlabel(' x ');ylabel(' density ');title([' Example 6.3 ',te]);figure(2);plot(x,ue,'k-',xa,u,'ko');xlabel(' x ');ylabel(' velocity ');figure(3);plot(x,pe,'k-',xa,p,'ko');xlabel(' x ');ylabel(' pressure ');figure(4);plot(x,ee,'k-',xa,e,'ko');xlabel(' x ');ylabel(' internal energy ');clear all;% Method of S. K. Godunovfunction [d,u,p,e,time]=godunov_gasdynamics(dd,ud,pd,h,nx,r,tp,gamma,bcl,bcr)g(1)=0.5*(gamma-1.)/gamma; g(2)=0.5*(gamma+1.)/gamma; g(3)=2.*gamma/(gamma-1.); g(4)=2./(gamma-1.); g(5)=2./(gamma+1.); g(6)=(gamma-1.)/(gamma+1.);g(7)=0.5*(gamma-1.); g(8)=1./gamma; g(9)=gamma-1.;sd(1,1:nx-1)=dd(1:nx-1);sd(2,1:nx-1)=dd(1:nx-1).*ud(1:nx-1);sd(3,1:nx-1)=pd(1:nx-1)/(gamma-1.)+0.5*(dd(1:nx-1).*ud(1:nx-1)).*ud(1:nx-1);time=0.;while time <= tpsta=max(abs(sd(2,:)./sd(1,:))+...sqrt(gamma*(gamma-1)*(sd(3,:)./sd(1,:)-0.5*(sd(2,:).*sd(2,:))./(sd(1,:).*sd(1,:)))));tau=r*h/sta;time=time+tau; %fprintf(' %f \n',time);if bcl == 0[f1,f2,f3]=flux_godunov(sd(1,1),-sd(2,1),sd(3,1),sd(1,1),sd(2,1),sd(3,1),g(:));else[f1,f2,f3]=flux_godunov(sd(1,1),sd(2,1),sd(3,1),sd(1,1),sd(2,1),sd(3,1),g(:));endfleft(1)=f1; fleft(2)=f2; fleft(3)=f3;for n=1:nx-2[f1,f2,f3]=flux_godunov(sd(1,n),sd(2,n),sd(3,n),sd(1,n+1),sd(2,n+1),sd(3,n+1),g(:));fright(1)=f1; fright(2)=f2; fright(3)=f3;su(:,n)=sd(:,n)-(fright(:)-fleft(:))*tau/h;fleft(:)=fright(:);endif bcr == 0[f1,f2,f3]=flux_godunov(sd(1,nx-1),sd(2,nx-1),sd(3,nx-1),sd(1,nx-1),-sd(2,nx-1),...sd(3,nx-1),g(:));else[f1,f2,f3]=flux_godunov(sd(1,nx-1),sd(2,nx-1),sd(3,nx-1),sd(1,nx-1),sd(2,nx-1),...sd(3,nx-1),g(:));endfright(1)=f1; fright(2)=f2; fright(3)=f3;su(:,nx-1)=sd(:,nx-1)-(fright(:)-fleft(:))*tau/h;sd(:,1:nx-1)=su(:,1:nx-1);endd(1:nx-1)=su(1,1:nx-1); u(1:nx-1)=su(2,1:nx-1)./su(1,1:nx-1);p(1:nx-1)=(gamma-1.)*(su(3,1:nx-1)-0.5*(su(2,1:nx-1).*su(2,1:nx-1))./su(1,1:nx-1));e(1:nx-1)=(su(3,1:nx-1)-0.5*(su(2,1:nx-1).*su(2,1:nx-1))./su(1,1:nx-1))./su(1,1:nx-1); return;% Solves Riemann problem for ideal gas% r1, u1, p1 initial parameters for x<0% r2, u2, p2 initial parameters for x>0% rf, uf, pf solution at the point (x,t)% c1, c2 sound speeds for x<0 and for x>0% s1, sr velocties of the fronts of S(hock)W(ave)s% shl, shr velocties of the fronts of the heads of R(arefaction)Ws% stl, str velocties of the tails of RWsfunction [rf,uf,pf]=riemann(x,t,r1,u1,p1,r2,u2,p2,gamma)g(1)=0.5*(gamma-1.)/gamma; g(2)=0.5*(gamma+1.)/gamma; g(3)=2.*gamma/(gamma-1.);g(7)=0.5*(gamma-1.); g(8)=1./gamma; g(9)=gamma-1.;s=x/t;c1 = sqrt(p1/(r1*g(8)));c2 = sqrt(p2/(r2*g(8)));du=u2-u1;% Vacuum solutionuvac=g(4)*(c1+c2)-du;if uvac <= 0.disp(' Vacuum generated by given data');return;end% Apply Newton method% Initial guessespv=0.5*(p1+p2)-0.125*du*(r1+r2)*(c1+c2);pmin=min(p1,p2); pmax=max(p1,p2); qrat=pmax/pmin;if ( qrat <= 2. ) & ( pmin <= pv & pv <= pmax )p=max(1.0e-6,pv);elseif pv < pminpnu=c1+c2-g(7)*du;pde=c1/(p1^g(1))+c2/(p2^g(1));p=(pnu/pde)^g(3);elsegel=sqrt((g(5)/r1)/(g(6)*p1+max(1.0e-6,pv)));ger=sqrt((g(5)/r2)/(g(6)*p2+max(1.0e-6,pv)));p=(gel*p1+ger*p2-du)/(gel+ger); p=max(1.0e-6,p);endendp0=p; err=1.;while err > 1.0e-5if p <= p1prat=p/p1; fl=g(4)*c1*(prat^g(1)-1.); ffl=1./(r1*c1*prat^g(2));elsea=g(5)/r1; b=g(6)*p1; qrt=sqrt(a/(b+p));fl=(p-p1)*qrt; ffl=(1.-0.5*(p-p1)/(b+p))*qrt;endif p <= p2prat=p/p2; fr=g(4)*c2*(prat^g(1)-1.); ffr=1./(r2*c2*prat^g(2));a=g(5)/r2; b=g(6)*p2; qrt=sqrt(a/(b+p));fr=(p-p2)*qrt; ffr=(1.-0.5*(p-p2)/(b+p))*qrt;endp=p-(fl+fr+du)/(ffl+ffr);err=2.*abs(p-p0)/(p+p0); p0=p;endif p0 < 0.p0=1.0e-6;end% Velocity of CDu0=0.5*(u1+u2+fr-fl);if s <= u0if p0 <= p1shl=u1-c1;if s <= shlrf=r1; uf=u1; pf=p1; return;elsecml=c1*(p0/p1)^g(1); stl=u0-cml;if s > stlrf=r1*(p0/p1)^g(8); uf=u0; pf=p0; return;elseuf=g(5)*(c1+g(7)*u1+s); c=g(5)*(c1+g(7)*(u1-s));rf=r1*(c/c1)^g(4); pf=p1*(c/c1)^g(3);return;endendelsepml=p0/p1; sl=u1-c1*sqrt(g(2)*pml+g(1));if s <= slrf=r1; uf=u1; pf=p1; return;elserf=r1*(pml+g(6))/(pml*g(6)+1.); uf=u0; pf=p0; return;endendelseif p0 > p2pmr=p0/p2; sr=u2+c2*sqrt(g(2)*pmr+g(1));if s >= srrf=r2; uf=u2; pf=p2; return;rf=r2*(pmr+g(6))/(pmr*g(6)+1.); uf=u0; pf=p0; return;endelseshr=u2+c2;if s >= shrrf=r2; uf=u2; pf=p2; return;elsecmr=c2*(p0/p2)^g(1); str=u0+cmr;if s <= strrf=r2*(p0/p2)^g(8); uf=u0; pf=p0; return;elseuf=g(5)*(-c2+g(7)*u2+s); c=g(5)*(c2-g(7)*(u2-s));rf=r2*(c/c2)^g(4); pf=p2*(c/c2)^g(3);return;endendendendreturn;% Solves Riemann problem and computes fluxes for method of S. K. Godunov% r1, u1, p1 parameters in left cell% r2, u2, p2 parameters in right cell% rf, uf, pf parameters on the interface% c1, c2 sound speeds in left and right cells% s1, sr velocties of the fronts of S(hock)W(ave)s% shl, shr velocties of the fronts of the heads of R(arefaction)Ws% stl, str velocties of the tails of RWsfunction [f1,f2,f3]=flux_godunov(sl1,sl2,sl3,sr1,sr2,sr3,g)r1=sl1; u1=sl2/r1; p1=(1./g(8)-1.)*(sl3-0.5*sl2*u1);r2=sr1; u2=sr2/r2; p2=(1./g(8)-1.)*(sr3-0.5*sr2*u2);% sound speeds in left and right cellsc1 = sqrt(p1/(r1*g(8)));c2 = sqrt(p2/(r2*g(8)));du=u2-u1;% Vacuum solution。
第二十章 偏微分方程的数值解
第二十章 偏微分方程的数值解自然科学与工程技术中种种运动发展过程与平衡现象各自遵守一定的规律。
这些规律的定量表述一般地呈现为关于含有未知函数及其导数的方程。
我们将只含有未知多元函数及其偏导数的方程,称之为偏微分方程。
方程中出现的未知函数偏导数的最高阶数称为偏微分方程的阶。
如果方程中对于未知函数和它的所有偏导数都是线性的,这样的方程称为线性偏微分方程,否则称它为非线性偏微分方程。
初始条件和边界条件称为定解条件,未附加定解条件的偏微分方程称为泛定方程。
对于一个具体的问题,定解条件与泛定方程总是同时提出。
定解条件与泛定方程作为一个整体,称为定解问题。
§1 偏微分方程的定解问题各种物理性质的定常(即不随时间变化)过程,都可用椭圆型方程来描述。
其最典型、最简单的形式是泊松(Poisson)方程),(2222y x f y ux u u =∂∂+∂∂=∆ (1)特别地,当0),(≡y x f 时,即为拉普拉斯(Laplace)方程,又称为调和方程02222=∂∂+∂∂=∆yux u u (2)带有稳定热源或内部无热源的稳定温度场的温度分布,不可压缩流体的稳定无旋流动及静电场的电势等均满足这类方程。
Poisson 方程的第一边值问题为⎪⎩⎪⎨⎧Ω∂=Γ=Ω∈=∂∂+∂∂Γ∈),(|),(),(),(),(2222y x y x u y x y x f y uxu y x ϕ (3)其中Ω为以Γ为边界的有界区域,Γ为分段光滑曲线,ΓΩ 称为定解区域,),(),,(y x y x f ϕ分别为ΓΩ,上的已知连续函数。
第二类和第三类边界条件可统一表示成),(),(y x u n u y x ϕα=⎪⎭⎫⎝⎛+∂∂Γ∈ (4)其中n 为边界Γ的外法线方向。
当0=α时为第二类边界条件,0≠α时为第三类边界条件。
在研究热传导过程,气体扩散现象及电磁场的传播等随时间变化的非定常物理问题时,常常会遇到抛物型方程。
其最简单的形式为一维热传导方程)0(022>=∂∂-∂∂a xu a t u (5)方程(5)可以有两种不同类型的定解问题:初值问题(也称为Cauchy 问题)⎪⎩⎪⎨⎧+∞<<∞-=+∞<<∞->=∂∂-∂∂x x x u x t x u a t u )()0,(,0022ϕ (6)初边值问题⎪⎪⎪⎩⎪⎪⎪⎨⎧≤≤===<<<<=∂∂-∂∂Tt t g t l u t g t u x x u l x T t x ua t u 0),(),(),(),0()()0,(0,002122ϕ (7) 其中)(),(),(21t g t g x ϕ为已知函数,且满足连接条件)0()(),0()0(21g l g ==ϕϕ问题(7)中的边界条件)(),(),(),0(21t g t l u t g t u ==称为第一类边界条件。
偏微分方程的数值解
第二十章 偏微分方程的数值解自然科学与工程技术中种种运动发展过程与平衡现象各自遵守一定的规律。
这些规律的定量表述一般地呈现为关于含有未知函数及其导数的方程。
我们将只含有未知多元函数及其偏导数的方程,称之为偏微分方程。
方程中出现的未知函数偏导数的最高阶数称为偏微分方程的阶。
如果方程中对于未知函数和它的所有偏导数都是线性的,这样的方程称为线性偏微分方程,否则称它为非线性偏微分方程。
初始条件和边界条件称为定解条件,未附加定解条件的偏微分方程称为泛定方程。
对于一个具体的问题,定解条件与泛定方程总是同时提出。
定解条件与泛定方程作为一个整体,称为定解问题。
§1 偏微分方程的定解问题各种物理性质的定常(即不随时间变化)过程,都可用椭圆型方程来描述。
其最典型、最简单的形式是泊松(Poisson)方程),(2222y x f y ux u u =∂∂+∂∂=∆ (1)特别地,当0),(≡y x f 时,即为拉普拉斯(Laplace)方程,又称为调和方程02222=∂∂+∂∂=∆yux u u (2)带有稳定热源或内部无热源的稳定温度场的温度分布,不可压缩流体的稳定无旋流动及静电场的电势等均满足这类方程。
Poisson 方程的第一边值问题为⎪⎩⎪⎨⎧Ω∂=Γ=Ω∈=∂∂+∂∂Γ∈),(|),(),(),(),(2222y x y x u y x y x f y uxu y x ϕ (3)其中Ω为以Γ为边界的有界区域,Γ为分段光滑曲线,ΓΩ 称为定解区域,),(),,(y x y x f ϕ分别为ΓΩ,上的已知连续函数。
第二类和第三类边界条件可统一表示成),(),(y x u n u y x ϕα=⎪⎭⎫⎝⎛+∂∂Γ∈ (4)其中n 为边界Γ的外法线方向。
当0=α时为第二类边界条件,0≠α时为第三类边界条件。
在研究热传导过程,气体扩散现象及电磁场的传播等随时间变化的非定常物理问题时,常常会遇到抛物型方程。
其最简单的形式为一维热传导方程)0(022>=∂∂-∂∂a xu a t u (5)方程(5)可以有两种不同类型的定解问题:初值问题(也称为Cauchy 问题)⎪⎩⎪⎨⎧+∞<<∞-=+∞<<∞->=∂∂-∂∂x x x u x t x u a t u )()0,(,0022ϕ (6)初边值问题⎪⎪⎪⎩⎪⎪⎪⎨⎧≤≤===<<<<=∂∂-∂∂Tt t g t l u t g t u x x u l x T t x ua t u 0),(),(),(),0()()0,(0,002122ϕ (7) 其中)(),(),(21t g t g x ϕ为已知函数,且满足连接条件)0()(),0()0(21g l g ==ϕϕ问题(7)中的边界条件)(),(),(),0(21t g t l u t g t u ==称为第一类边界条件。
偏微分方程数值解法2014.11.05
u
jm
1 4
ax0
)(1
1 4
by0
)u
n jm
增长因子,
G( , k)
(1 (1
i i
a
2
a
2
sin sin
k1h)(1 k1h)(1
i i
b
2
b
2
sin sin
k2h) k2h)
G( , k) 2 1
该格式为二阶精度,无条件稳定。
另一个ADI格式:
2a2
2h2
2b2
2h2
x
xu
n jm
y
yu
n jm
1 2
这里,x方向定义的算子有 x0u jm u j1,m u j1,m xu jm u j,m u j1,m
y方向定义的算子有 y0u jm u j,m1 u j,m1 yu jm u j,m u j,m1
也可直接求解: 4.3.1 Lax-Friedrichs格式
u n1 j
2u
n j
u
n1 j
a2
un j 1
2u
n j
u
n j 1
2
h2
截断误差为 O( 2 h2 )
稳定性条件为 a 1
3 二维问题
u a u b u 0 t x y u(x, y,0) g(x, y) ,
1 4
ax0
1 4
by0
)u
n1 jm
(1
1 4
ax0
1 4
by0
偏微分方程数值解法题解
偏微分方程数值解法(带程序)例1 求解初边值问题22,(0,1),012,(0,]2(,0)12(1),[,1)2(0,)(1,)0,0u ux t t x x x u x x x u t u t t ⎧⎪⎪⎪⎧⎨⎪⎪⎪⎨⎪⎪⎪⎪⎩⎩∂∂=∈>∂∂∈=-∈==>要求采用树脂格式 111(2)n n n n nj j j j j u u u u u λ++-=+-+,2()tx λ∆=∆,完成下列计算: (1) 取0.1,0.1,x λ∆==分别计算0.01,0.02,0.1,t =时刻的数值解。
(2) 取0.1,0.5,x λ∆==分别计算0.01,0.02,0.1,t =时刻的数值解。
(3) 取0.1, 1.0,x λ∆==分别计算0.01,0.02,0.1,t =时刻的数值解。
并与解析解22()22181(,)sin()sin()2n t n u n x t n x e n ππππ∞-==∑进行比较。
解:程序function A=zhongxinchafen(x,y,la) U=zeros(length(x),length(y)); for i=1:size(x,2)if x(i)>0&x(i)<=0.5 U(i,1)=2*x(i); elseif x(i)>0.5&x(i)<1 U(i,1)=2*(1-x(i)); end endfor j=1:length(y)-1for i=1:length(x)-2U(i+1,j+1)=U(i+1,j)+la*(U(i+2,j)-2*U(i+1,j)+U(i,j)); end endA=U(:,size(U,2))function u=jiexijie1(x,t) for i=1:size(x,2) k=3;a1=(1/(1^2)*sin(1*pi/2)*sin(1*pi*x(i))*exp(-1^2*pi^2*t));a2=a1+(1/(2^2)*sin(2*pi/2)*sin(2*pi*x(i))*exp(-2^2*pi^2*t));while abs(a2-a1)>0.00001a1=a2;a2=a1+(1/(k^2)*sin(k*pi/2)*sin(k*pi*x(i))*exp(-k^2*pi^2*t));k=k+1;endu(i)=8/(pi^2)*a2;endclc; %第1题第1问clear;t1=0.01;t2=0.02;t3=0.1;x=[0:0.1:1];y1=[0:0.001:t1];y2=[0:0.001:t2];y3=[0:0.001:t3];la=0.1;subplot(131)A1=zhongxinchafen(x,y1,la);u1=jiexijie1(x,t1)line(x,A1,'color','r','linestyle',':','linewidth',1.5);hold online(x,u1,'color','b','linewidth',1);A2=zhongxinchafen(x,y2,la);u2=jiexijie1(x,t2)line(x,A2,'color','r','linestyle',':','linewidth',1.5);line(x,u2,'color','b','linewidth',1);A3=zhongxinchafen(x,y3,la);u3=jiexijie1(x,t3)line(x,A3,'color','r','linestyle',':','linewidth',1.5);line(x,u3,'color','b','linewidth',1); title('例1(1)');subplot(132);line(x,u1,'color','b','linewidth',1);line(x,u2,'color','b','linewidth',1);line(x,u3,'color','b','linewidth',1);title('解析解');subplot(133);line(x,A1,'color','r','linestyle',':','linewidth',1.5);line(x,A2,'color','r','linestyle',':','linewidth',1.5);line(x,A3,'color','r','linestyle',':','linewidth',1.5);title('数值解');clc; %第1题第2问clear;t1=0.01;t2=0.02;t3=0.1;x=[0:0.1:1];y1=[0:0.005:t1];y2=[0:0.005:t2];y3=[0:0.005:t3];la=0.5;subplot(131);A1=zhongxinchafen(x,y1,la);u1=jiexijie1(x,t1)line(x,A1,'color','r','linestyle',':','linewidth',1.5);hold online(x,u1,'color','b','linewidth',1);A2=zhongxinchafen(x,y2,la);u2=jiexijie1(x,t2)line(x,A2,'color','r','linestyle',':','linewidth',1.5);line(x,u2,'color','b','linewidth',1);A3=zhongxinchafen(x,y3,la);u3=jiexijie1(x,t3)line(x,A3,'color','r','linestyle',':','linewidth',1.5); line(x,u3,'color','b','linewidth',1);title('例1(2)'); subplot(132);line(x,u1,'color','b','linewidth',1); line(x,u2,'color','b','linewidth',1);line(x,u3,'color','b','linewidth',1);title('解析解'); subplot(133);line(x,A1,'color','r','linestyle',':','linewidth',1.5); line(x,A2,'color','r','linestyle',':','linewidth',1.5);line(x,A3,'color','r','linestyle',':','linewidth',1.5);title('数值解');clc; %第1题第3问 clear;t1=0.01;t2=0.02;t3=0.1;x=[0:0.1:1];y1=[0:0.01:t1];y2=[0:0.01:t2];y3=[0:0.01:t3];la=1.0; subplot(131);A1=zhongxinchafen(x,y1,la);u1=jiexijie1(x,t1)line(x,A1,'color','r','linestyle',':','linewidth',1.5);hold on line(x,u1,'color','b','linewidth',1);A2=zhongxinchafen(x,y2,la);u2=jiexijie1(x,t2) line(x,A2,'color','r','linestyle',':','linewidth',1.5); line(x,u2,'color','b','linewidth',1);A3=zhongxinchafen(x,y3,la);u3=jiexijie1(x,t3) line(x,A3,'color','r','linestyle',':','linewidth',1.5); line(x,u3,'color','b','linewidth',1);title('例1(3)'); subplot(132);line(x,u1,'color','b','linewidth',1); line(x,u2,'color','b','linewidth',1);line(x,u3,'color','b','linewidth',1);title('解析解'); subplot(133);line(x,A1,'color','r','linestyle',':','linewidth',1.5); line(x,A2,'color','r','linestyle',':','linewidth',1.5);line(x,A3,'color','r','linestyle',':','linewidth',1.5);title('数值解'); 运行结果:表1:取0.1,0.1,x λ∆==0.01,0.02,0.1,t =时刻的解析解与数值解表2:取0.1,0.5,x λ∆==0.01,0.02,0.1,t =时刻的解析解与数值解表3:取0.1, 1.0,x λ∆==0.01,0.02,0.1,t =时刻的解析解与数值解图1:取0.1,0.1,x λ∆==0.01,0.02,0.1,t =时刻的解析解与数值解图2:取0.1,0.5,x λ∆==0.01,0.02,0.1,t =时刻的解析解与数值解图3:取0.1, 1.0,x λ∆==0.01,0.02,0.1,t =时刻的解析解与数值解例2 用Crank-Nicolson 格式完成例1的所有任务。
第十四章SECTION4偏微分方程的数值解法
§4 偏微分方程的数值解法一、 差分法差分法是常用的一种数值解法.它是在微分方程中用差商代替偏导数,得到相应的差分方程,通过解差分方程得到微分方程解的近似值. 1. 网格与差商在平面 (x ,y )上的一以S 为边界的有界区域D 上考虑定解问题.为了用差分法求解,分别作平行于x 轴和y 轴的直线族.⎩⎨⎧====jhy y ihx x i i (i ,j =0,±1,±2,…,±n ) 作成一个正方形网格,这里h 为事先指定的正数,称为步长;网格的交点称为节点,简记为(i ,j ).取一些与边界S 接近的网格节点,用它们连成折线S h ,S h 所围成的区域记作D h .称D h 内的节点为内节点,位于S h 上的节点称为边界节点(图14.7).下面都在网格D h + S h 上考虑问题:寻求各个节点上解的近似值.在边界节点上取与它最接近的边界点上的边值作为解的近似值,而在内节点上,用以下的差商代替偏导数:()()[]()()[]()()()[]()()()[]()()()[]y x u h y x u y h x u h y x u hy x u h y x u y x u h y x u hy u y h x u y x u y h x u h x u y x u h y x u hyu y x u y h x u h x u ,),(,,1,,2,1,,2,1,,1,,122222222++-+-+≈∂∂∂-+-+≈∂∂-+-+≈∂∂-+≈∂∂-+≈∂∂注意, 1︒ 式中的差商()()[]y x u y h x u h ,,1-+称为向后差商,而()()[]y h x u y x u h,,1--称为向前差商,()()[]y h x u y h x u h,,21--+称为中心差商.也可用向前差商或中心差商代替一阶偏导数.2︒ x 轴与y 轴也可分别采用不同的步长h ,l ,即用直线族⎩⎨⎧====jhy y ihx x j i (i,j =0, ±1, ±2 , ) 作一个矩形网格.图14.72. 椭圆型方程的差分方法[五点格式] 考虑拉普拉斯方程的第一边值问题()()⎪⎪⎩⎪⎪⎨⎧=∈=∂∂+∂∂y x u D y x y ux u S ,,02222μ式中μ(x ,y )为定义在D 的边界S 上的已知函数.采用正方形网格,记u (x i ,y j )=u ij ,在节点(i ,j )上分别用差商 u u u h u u u h i j ij i j i j ij i j -+-+-+-+11211222,,,,,代替2222,yux u ∂∂∂∂,对应的差分方程为u u u h u u u hi j ij i j i j ij i j -+-+-++-+=112112220,,,, (1) 或u u u u u ij i j i j i j i j =+++-+-+141111,,,,即任一节点(i ,j )上u ij 的值等于周围相邻节点上解的值的算术平均,这种形式的差分方程称为五点格式,在边界节点上取()()()h j i ij S j i y x u ∈=,,**μ(2) 式中(x i *,y j *)是与节点(i ,j )最接近的S 上的点.于是得到了以所有内节点上的u ij 值为未知量的若干个线性代数方程,由于每一个节点都可列出一个方程,所以未知量的个数与方程的个数都等于节点的总数,于是,可用通常的方法(如高斯消去法)解此线性代数方程组,但当步长不很大时,用高斯消去法将会遇到很大困难,可用下面介绍的其他方法求解. 若h →0时,差分方程的解收敛于微分方程的解,则称差分方程为收敛的.在计算过程中,由于进行四则运算引起舍入误差,每一步计算的舍入误差都会影响以后的计算结果,如果这种影响所产生的计算偏差可以控制,而不至于随着计算次数的增加而无限增大,则称差分方程是稳定的.[迭代法解差分方程] 在五点格式的差分方程中,任意取一组初值{u ij },只要求它们在边界节点(i ,j )上取以已知值μ(x i *,y j *),然后用逐次逼近法(也称迭代法)解五点格式:()()()()()[]() ,2,1,0411,1,,1,11=+++=+-+-+n u u u u u n j i n j i n j i n j i n ij 逐次求出{u ij (n )}.当(i+1,j ),(i -1,j ),(i ,j -1),(i ,j+1)中有一点是边界节点时,每次迭代时,都要在这一点上取最接近的边界点的值.当n →∞时,u ij (n )收敛于差分方程的解,因此n 充分大时,{u ij (n )}可作差分方程的近似解,迭代次数越多,近似解越接近差分方程的解.[用调节余数法求节点上解的近似值] 以差商代替Δu 时,用节点(i+1,j ),(i -1,j ),(i ,j+1),(i ,j -1)上u 的近似值来表示u 在节点(i ,j )的值将产生的误差,称此误差为余数R ij ,即()()()()()ij j i j i j i j i j i R y x u h y x u h y x u y h x u y h x u =--+++-++,4,,,,设在(i ,j )上给u ij 以改变量δu ij ,从上式可见R ij 将减少4δu ij ,而其余含有u (x i ,y j )的差分方程中的余数将增加δu ij ,多次调整δu ij 的值就可将余数调整到许可的有效数字的范围内,这样可获得各节点上u (x ,y )的近似值.这种方法比较简单,特别在对称区域中计算更简捷.例 求Δu =0在内节点A ,B ,C ,D 上解的近似值.设在边界节点1,2,3,4上分别取值为1,2,3,4(图14.8) 解 记u (A )=u A ,点A ,B ,C ,D 的余数分别为-4u A + u B + u c +5=R A u A -4 u B + u D +7=R Bu A-4 u c + u D +3=R Cu B + u c -4u D +5=R D以边界节点的边值的算术平均值作为初次近似值,即u A (0)=u B (0)=u C (0)=u D (0)=2.5则相应的余数为:R A =0, R B =2, R C = -2, R D =0最大余数为±2.先用δu C =-0.5把R C 缩减为零,u C 相应地变为2,这时R A , R D 也同时缩减(-0.5),新余数是R A =-0.5,R B =2,0=C R , R D =-0.5.类似地再变更δu B =0.5,从而 u B 变为3,则得新余数为0====D C B A R R R R .这样便可消去各节点的余数,于是u 在各节点的近似值为:u A =2.5, u B =3, u C =2, u D =2.5现将各次近似值及余数列表如下:次数调 整 值第n 次近似值及余数u A R A u B R B u C R C u D R D 0 1 2δu C = -0.5 δu B = 0.5 2.5 2.5 2.5 0 -0.5 0 2.5 2.5 3 2 2 0 2.5 2 2 -2 0 0 2.5 2.5 2.5 0 -0.5 0 结果近似值2.5322.5[解重调和方程的差分方法] 在矩形D (x 0≤x ≤x 0+a ,y 0≤y ≤y 0+a )中考虑重调和方程024*******=∂∂+∂∂∂+∂∂=yuy x u x u u ∆取步长h an=,引直线族图14.8⎩⎨⎧+=+=jh y y ihx x 00 (i , j = 0, 1, 2,, n ) 作成一个正方形网格.用差商代替偏导数()()()()()[]{()()()()[]()()()()[]}h y x u h y x u y h x u y h x u h y h x u h y h x u h y h x u h y h x u h y x u h y x u y h x u y h x u y x u 2,2,,2,2,,,,2,,,,8201,-+++-++---++-+-++++--+++-++=上式表明了以(x ,y )为中心时,u (x ,y )的函数值与周围各点函数值的关系,但对于邻近边界节点的点(x ,y ),如图14.9中的A ,就不能直接使用上式,此时将划分网格的直线族延伸,在延伸线上定出与边界距离为h 的点,称这些点为外邻边界节点,如图14.9以A 为中心时,点E ,C 为边界节点,点J ,K 为E ,C 的外邻边界节点,用下法补充定义外邻边界节点J 处函数的近似值u J ,便可应用上面的公式.1︒ 边界条件为()()()S P P x uP u SS ∈==21,μ∂∂μ 时,定义u J =u A -2μ2(E )h .2︒ 边界条件为()()()S P P xuP u SS ∈=∂∂=2221,μμ时,定义u J =2μ1(E )-u A -h 2μ2(E ). [其他与Δu 有关的网格] 1︒ 三角网格(图14.10(a ))取P 0(x ,y )为中心,它的周围6个邻近节点分别为:()()⎪⎪⎭⎫⎝⎛-+⎪⎪⎭⎫ ⎝⎛---⎪⎪⎭⎫⎝⎛+-⎪⎪⎭⎫⎝⎛+++h y h x P h y h x P y h x P h y h x P h y h x P y h x P 23,2,23,2,,23,223,2,,654321则 R u h u u u h i i +∆+∆=⎪⎭⎫⎝⎛-∑=226102161632式中u i =u (P i ), u 0=u (P 0),R 表示余项. 2︒ 六角网格(图14.10(b ))取P 0(x ,y )为中心,它的三个邻近节点分别为图14.9()⎪⎪⎭⎫ ⎝⎛-+-⎪⎪⎭⎫ ⎝⎛++h y h x P y h x P h y h x P 23,2,,23,2321则 R u u u h i i +∆=⎪⎭⎫⎝⎛-∑=0312334.图14.103︒ 极坐标系中的网格(图14.10(c ))取P 0(r ,θ)为中心,它的四个邻近节点分别为()()()()l r P h r P l r P h r P ++--θθθθ,,,,,,4321而拉普拉斯方程01122222=∂∂+∂∂+∂∂=θ∆u r r u r ru u的相应的差分方程为()()()011221110222134222312=⎪⎭⎫ ⎝⎛+--++++u l r h u u rh u u l r u u h 3. 抛物型方程的差分方法 考虑热传导方程的边值问题()()()()()()⎪⎪⎪⎩⎪⎪⎪⎨⎧≥==<<=><<=∂∂-∂∂0,,,,00,0,0,0,021222t t t b u t t u bx x x u t b x x u a t u μμϕ 将[0,b ]分为n 等份,每段长为∆x bn=.引两族平行线(图14.11)图14.11x =x i =i ∆x (i =0,1,2,, n )y =y j =j ∆t (j =0,1,2,, ∆t 取值见后)作成一个长方形的网格,记u (x i ,t j )为u ij ,节点(x i ,t j )为(i ,j ),在节点(i ,j )上分别用(),2,1,1,,2,1Δ2,Δ2,1,11,=-=+---++j n i x u u u t u u ji ij j i ij j i 代替22,xut u ∂∂∂∂,于是边值问题化为差分方程()()()()⎪⎪⎪⎩⎪⎪⎪⎨⎧===-===-==+----++ ,2,1,0,Δ,Δ1,,2,1,Δ,2,1,0,1,,2,10Δ2Δ21002,1,121,j t j u t j u n i x i u j n i x u u u a tu u nj j i j i ij j i ijj i μμϕ 记()22x ta ∆∆=λ,差分方程可写成 () ,2,1,1,,2,121,1,11,=-=+-+=-++j n i u u u u ji ij j i j i λλλ (1)由此可按t 增加的方向逐排求解.在第0排上u i 0的值由初值ϕ(i ∆x )确定,j +1排u i ,j +1的值可由第j 排的三点(i +1,j ),(i ,j ),(i -1,j )上的值u i +1,j , u ij ,u i -1,j 确定,而u 0,j +1,u n ,j +1已由边界条件μ1((j +1)∆t )及μ2((j +1)∆t )给定,于是可逐排计算一切节点上的u ij 值.当ϕ(x ), μ1(x )和μ2(x )充分光滑,且λ≤12时,差分方程收敛而且稳定.所以利用差分方程(1)计算时,必须使λ≤12,即()22Δ21Δx at ≤.热传导方程还可用差分方程()0Δ2Δ21,11,1,121,=+---+-++++x u u u a t u u j i j i j i ij j i 代替,此时如已知前j 排u ij 的值,为求第j +1排的u i ,j +1 必须解包含n -1个未知量u u j n j 1111,,,,+-+ 的线性代数方程组,这种差分方程称为隐式格式的差分方程,前面所提的差分方程称为显式格式差分方程.隐式格式差分方程对任意的λ都是稳定的.4. 双曲型方程的差分方法 考虑弦振动方程的第一边值问题()()()()()()⎪⎪⎪⎩⎪⎪⎪⎨⎧≥==<<=∂∂=><<=∂∂-∂∂0,,,,00),()0,(,0,0,0,02122222t t t b u t t u b x x t x u x x u t b x x u a tu μμψϕ 用矩形网格,列出对应的差分方程:()()()()⎪⎪⎪⎩⎪⎪⎪⎨⎧===-=∆=∆-==-==+--+--+-+ ,2,1,0,Δ,Δ1,,2,1),(,Δ,2,1,1,,2,1,0Δ2)(Δ22100102,1,1221,1,j t j u t j u n i x i t u u x i u j n i x u u u a t u u u nj j i i i j i ij j i j i ij j i μμψϕ 记ω=a tx∆∆与上段一样,利用u u n 022,和在第0排及第1排的已知数值(初始条件)u i 0 , u i 1可计算u i 2,然后用已知的u i 1 , u i 2及u u n 033,可计算u i 3,类似地可确定一切节点上的u ij 值.当ϕ(x ),ψ(x ),μ1(x )和μ2(x )充分光滑,且ω≤1时,差分方程收敛且稳定,所以要取∆∆t ax ≤1.二、 变分方法1. 自共轭边值问题将§3定义的共轭微分算子的概念推广到一般方程.设D 是n E 中的有界区域,S 为其边界,在D 上考虑2k 阶线性微分方程()x f x x uaLu km mi i i ni m m i i n n n=∂∂≡∑∑==++201111 ∂ 的齐次边值问题()r j u l Sj ,,2,10==式中f (x )是D 内的已知函数,l j u 是线性微分算子. 将 ⎰DvLud Ω分部积分k 次得()⎰∑⎰⎪⎪⎭⎫ ⎝⎛+=Ω=S j j j D S v R u R v u vLu d ~,Λd k 1 式中Λ(u ,v )是一个D 上的积分,其被积函数包含u ,v 的k 阶导数;R j 和 R j 是定义在边界S 上的两个线性微分算子.再将Λ(u ,v )分部积分k 次得()()⎰∑⎰⎪⎪⎭⎫⎝⎛-Ω=Λ=S k j j j D S u R v R v uL v u d ~d ,1***式中L*是一个2k 阶的微分算子,称为L 的共轭微分算子.若L=L*,则称L 为自共轭微分算子.从上面可推出格林公式()()⎰∑⎰=-=Ω-Skj jjjjDS u R v R v R u R v uL vLu 1***d ~~d 如从l j u |S =l j v |S =0可推出在边界S 上()∑==-kj jjjju R v R v R u R 1**0~~ 则称l j u |S =0为自共轭边界条件.如果微分算子及边界条件都是自共轭的,则称相应的边值问题为自共轭边值问题,此时有()0d ][=Ω-⎰DuLv vLu每个边值问题对应于某希尔伯特空间H (例如L 2(D ),见第九章§7)中的一个算子A ,其定义域M A 是H 中一线性稠密集合,它由足够次连续可微且满足边界条件的函数组成,在M A 上,Au 的数值与Lu 的数值相同,从而求解边值问题化为解算子方程Au f = 的问题.设A 为定义在实的希尔伯特空间H 中的某线性稠密集合M A 上的线性算子.若对于M A 的任意非零元素,,v u 成立(Au ,v )=(u ,Av )则称A 为对称算子.若对任意非零元素u 成立()0,>u Au 则称A 为正算子.如成立更强的不等式(Au ,u )≥r ||u ||2 (r>0)则称A 为正定算子.此处(u ,v )表示希尔伯特空间的内积,||u ||2=(u ,u ). 2. 变分原理与广义解定理 设A 是正定算子,u 是方程Au =f 在M A 上的解的充分必要条件是: u 使泛函F (u )=(Au ,u )-2(f ,u )取极小值.上述将边值问题化为等价的求泛函极值问题的方法称为能量法.在算子的定义域不够大时,泛函F (u )的极值问题可能无解.不过对于正定算子,可以开拓集合M A ,使在开拓了的集合上,泛函的极值问题有解.为开拓M A ,在M A 上引进新的内积[u ,v ]=(Au ,v ),定义模||u ||2=[u ,u ]=(Au ,u ),在模||u ||的意义下,补充极限元素,得到一个新的完备希尔伯特空间H 0,在H 0上,泛函F (u )仍然有意义,而泛函的极值问题有解.但必须注意,此时使泛函F (u )取极小的元素u 0不一定属于M A ,因此它不一定在原来的意义下满足方程Au=f 及边界条件.称u 0为广义解. 3. 极小化序列与里兹方法在处理变分问题中,极小化序列起着重要的作用.考虑泛函F (u )=(Au ,u )-2(f ,u )以d 表示泛函的极小值.设在希尔伯特空间中存在一列元素{u n } (n =1,2 ,),使()d u F n n =∞→lim则称{u n }为极小化序列.定理 若算子A 是正定的,则F (u )的每一个极小化序列既按H 空间的模也按H 0的模收敛于使泛函F (u )取极小的元素.这个定理不但指出利用极小化序列可求问题的解,而且提供一种近似解的求法,即把极小化序列中的每一个元素当作问题的近似解.设算子A 是正定的,构造极小化序列的里兹方法的主要步骤是:(1) 在线性集合M A 中选取H 0中完备的元素序列{ϕi } , (i =1,2 ,) 并要求对任意的n ,ϕ1,ϕ2,…,ϕn 线性无关.称这样的元素为坐标元素.(2) 令u a n k k k n==∑ϕ1 ,其中a k 为待定系数.代入泛函F (u ),得自变量a 1,a 2,…,a n 的函数()()()∑∑==-=nj jjn k j kjkj n f a A a a u F 11,,2,ϕϕϕ(3) 为使函数F (u n )取极小,必须()()n j a u F jn ,,2,10 ==∂∂,从而求出a k (k =1,2,…,n ).序列{u n }即为极小化序列,u n 可作为问题的近似解. 4. 里兹方法在特征值问题上的应用 算子方程Au -λu =0的非零解λ称为算子A 的特征值,对应的非零解u 称为λ所对应的特征函数. 对线性算子A ,若存在常数K ,使对任何M A 的元素ϕ成立(A ϕ,ϕ)≥K ||ϕ||2则称A 为下有界算子,正定算子是下有界的(此时K =0).记(A ϕ,ϕ)/||ϕ||2的下确界为d . 定理1 设A 为下有界对称算子,若存在不为零的元素ϕ0∈M A ,使()d A =200,ϕϕϕ则d 就是A 的最小特征值,ϕ0为对应的特征函数.于是求下有界对称算子的最小特征值问题化为变分问题,即在希尔伯特空间中求使泛函(A ϕ,ϕ)/||ϕ||2取极小的元素,或在||ϕ||=1的条件下求使泛函(A ϕ,ϕ)取极小的元素.定理2 设A 是下有界对称算子,λ1≤λ2≤…≤λn 是它的前n 个特征值,ϕ1,ϕ2,…,ϕn 是对应的标准正交特征函数,如果存在不为零的元素1+n ϕ,在附加条件(ϕ,ϕ)=1, (ϕ,ϕ1)=0, (ϕ,ϕ2)=0, …, (ϕ,ϕn )=0下使泛函(A ϕ,ϕ)取极小,则ϕn +1是算子A 的特征函数,对应的特征值()11,++=n n A ϕϕλ就是除λ1 ,,λn 外的最小的一个特征值.于是求第n +1个特征值就化为变分问题,即在附加条件(ϕ,ϕ)=1, (ϕ,ϕ1)=0, (ϕ,ϕ2)=0 ,, (ϕ,ϕn )=0 下求使泛函(A ϕ,ϕ)取极小的元素.为了利用里兹方法求特征值,在M A 中选取一列在H 0中完备的坐标元素序列{ϕi },(i =1,2 ,), 令u a n k k k n==∑ϕ1,确定a k ,使在条件 (u n ,u n )=1下,(Au n ,u n )取极小,这个问题化为求n个变元a 1,a 2,…,a n 的函数()()∑==nm k m k k m n n a a A u Au 1,,,ϕϕ在条件()()∑===nm k m k m k n n a a u u 1,1,,ϕϕ下的极值问题,一般可用拉格朗日乘数法解(见第九章§3,t ),此时()()()()()()()()()()()()0,,,,,,,,,,,,11222121111111=------n n n n n n n n n n A A A A A A ϕϕλϕϕϕϕλϕϕϕϕλϕϕϕϕλϕϕϕϕλϕϕϕϕλϕϕ的最小的根即为特征值的近似值,如果将上式的根按大小排列,就依次得后面的特征值的近似值,但精确度较差. 对一般算子方程Au -λBu=0如果A 为下有界对称算子,B 为正定算子,则()()()()()()()()()()()()0,,,,,,,,,,,,11222121111111=------n n n n n n n n n n B A B A B A B A B A B A ϕϕλϕϕϕϕλϕϕϕϕλϕϕϕϕλϕϕϕϕλϕϕϕϕλϕϕ的根就是特征值的近似值. 5. 迦辽金方法用里兹方法解数学物理问题有很多限制,最主要的限制是要求算子正定,但很多问题不一定满足这个条件,迦辽金方法弥补了这个缺陷. 迦辽金方法的主要步骤是:(1) 在M A 中选取在空间H 中完备的元素序列{ϕi } (i =1,2 ,),其中任意n 个元素线性无关,称{ϕi } (i =1,2,…)为坐标元素序列. (2) 把方程的近似解表示为u a n k k k n==∑ϕ1式中a k 是待定常数,把u n 代入方程Au=f 中的u ,两端与ϕj (j =1,2,…,n )求内积,得 a k 的n 个代数方程()()()n j f A a j n k j k k,,2,1,,1 ==∑=ϕϕϕ(3) 求出a k ,代回u n 的表达式,便得方程的近似解u n .在自共轭边值问题中,当算子是正定时,由迦辽金方法和里兹方法得到的关于a k 的代数方程组是相同的.。
算法大全第20章_偏微分方程的数值解
( x, y ) ∈ Ω Γ = ∂Ω
1 。 3 当 h = τ 时,利用点 ( k , j ), ( k ± 1, j − 1), ( k ± 1, j + 1) 构造的差分格式 1 (u k +1, j +1 + u k +1, j −1 + u k −1, j +1 + u k −1, j −1 − 4u k , j ) = f k , j 2h 2
∂ u ∂y 2
2
=
(k , j)
u (k , j + 1) − 2u (k , j ) + u (k , j − 1)
τ
2
+ O(τ 2 )
Poisson 方程(1)在点 ( k , j ) 处可表示为
u (k + 1, j ) − 2u (k , j ) + u (k − 1, j ) u (k , j + 1) − 2u (k , j ) + u (k , j − 1) + τ2 h2 = f k , j + O(h 2 + τ 2 )
(k , j = 0,±1,±2, L) 将 定 解 区 域 剖 分 成 矩 形 网 格 。 节 点 的 全 体 记 为 R = {( x k , y j ) | x k = kh, y j = jτ , i, j为整数} 。定解区域内部的节点称为内点,记内点
集 R I Ω 为 Ω hτ 。边界 Γ 与网格线的交点称为边界点,边界点全体记为 Γhτ 。与节点
(7)
ϕ (0) = g1 (0), ϕ (l ) = g 2 (0)
(完整word版)偏微分方程数值解法答案
1. 课本2p 有证明2. 课本812,p p 有说明3. 课本1520,p p 有说明4. Rit2法,设n u 是u 的n 维子空间,12,...n ϕϕϕ是n u 的一组基底,n u 中的任一元素n u 可表为1nn i i i u c ϕ==∑,则,1111()(,)(,)(,)(,)22j nnn n n n i j i j j i j j J u a u u f u a c c c f ϕϕϕ===-=-∑∑是12,...n c c c 的二次函数,(,)(,)i j j i a a ϕϕϕϕ=,令()0n jJ u c ∂=∂,从而得到12,...n c c c 满足1(,)(,),1,2...niji j i a c f j n ϕϕϕ===∑,通过解线性方程组,求的i c ,代入1nn i i i u c ϕ==∑,从而得到近似解n u 的过程称为Rit2法简而言之,Rit2法:为得到偏微分方程的有穷维解,构造了一个近似解,1nn i ii u c ϕ==∑,利用,1111()(,)(,)(,)(,)22j nnn n n n i j i j j i j j J u a u u f u a c c c f ϕϕϕ===-=-∑∑确定i c ,求得近似解n u 的过程Galerkin 法:为求得1nn i ii u c ϕ==∑形式的近似解,在系数i c 使n u 关于n V u ∈,满足(,)(,)n a u V f V =,对任意nV u ∈或(取,1j V j nϕ=≤≤)1(,)(,),1,2...nijij i a cf j n ϕϕϕ===∑的情况下确定i c ,从而得到近似解1nn i i i u c ϕ==∑的过程称Galerkin 法为 Rit2-Galerkin 法方程:1(,)(,)nijij i a cf ϕϕϕ==∑5. 有限元法:将偏微分方程转化为变分形式,选定单元的形状,对求解域作剖分,进而构造基函数或单元形状函数,形成有限元空间,将偏微分方程转化成了有限元方程,利用有效的有限元方程的解法,给出偏微分方程近似解的过程称为有限元法。
偏微分方程数值解
02
常用的数值解法包括有限差分法、有限元法、 谱方法等。
03
数值解法的精度和稳定性是衡量其好坏的重要 指标。
非线性偏微分方程的有限差分法
有限差分法是一种将偏微分方程转化为差分方程的方法,通过在离散点上逼近偏导数,得到离散化的 数值解。
有限差分法的优点是简单直观,易于实现,适用于规则区域。
有限差分法的缺点是对不规则区域适应性较差,且精度较低。
波动问题
谱方法在求解波动问题中也有广泛应用,如 Helmholtz方程、Wave equation等。
固体力学问题
谱方法在求解固体力学问题中也有应用,如 Elasticity equations等。
05
非线性偏微分方程的数值解 法
非线性偏微分方程的解析解法难度
01
非线性偏微分方程的解析解法通常非常复杂,需要深
02
有限差分法的基本思想是将连 续的偏微分方程转化为离散的 差分方程,通过求解差分方程 得到偏微分方程的近似解。
03
有限差分法的精度取决于离散 点之间的间距,间距越小,精 度越高。
一阶偏微分方程的有限差分法
一阶偏微分方程的有限差分法有 多种形式,如向前差分法、向后 差分法和中心差分法等。
中心差分法是向前差分法和向后 差分法的平均值,具有二阶精度 。
通过将微分转化为差分,将原方程转化为离散的差分方程,然后求解差分方程得到近似解。
有限元法
将连续问题离散化,将微分方程转化为线性方程组,通过求解线性方程组得到近似解。
谱方法
利用函数的谱展开来求解偏微分方程,具有高精度和低数值弥散性的优点。
02
有限差分法
有限差分法的原理
01
有限差分法是一种将偏微分方 程转化为差分方程的方法,通 过在离散点上逼近偏微分方程 的解,得到数值解。
偏微分方程的数值解法
偏微分方程的数值解法1.peEllip5 用五点差分格式解拉普拉斯方程function u = peEllip5(nx,minx,maxx,ny,miny,maxy) format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);u0 = zeros(nx,ny);for j=1:nyu0(j,1) = EllIni2Uxl(minx,miny+(j-1)*hy);u0(j,nx) = EllIni2Uxr(maxx,miny+(j-1)*hy);endfor j=1:nxu0(1,j) = EllIni2Uyl(minx+(j-1)*hx,miny);u0(ny,j) = EllIni2Uyr(minx+(j-1)*hx,maxy);endA = -4*eye((nx-2)*(ny-2),(nx-2)*(ny-2));b = zeros((nx-2)*(ny-2),1);for i=1:(nx-2)*(ny-2)if mod(i,nx-2) == 1if i==1A(1,2) = 1;A(1,nx-1) = 1;b(1) = - u0(1,2) - u0(2,1);elseif i == (ny-3)*(nx-2)+1A(i,i+1) = 1;A(i,i-nx+2) = 1;b(i) = - u0(ny-1,1) - u0(ny,2);elseA(i,i+1) = 1;A(i,i-nx+2) = 1;A(i,i+nx-2) = 1;b(i) = - u0(floor(i/(nx-2))+2,1);endendelseif mod(i,nx-2) == 0if i == nx-2A(i,i-1) = 1;A(i,i+nx-2) = 1;b(i) = - u0(1,nx-1) - u0(2,nx);elseif i == (ny-2)*(nx-2)A(i,i-1) = 1;A(i,i-nx+2) = 1;b(i) = - u0(ny-1,nx) - u0(ny,nx-1);elseA(i,i-1) = 1;A(i,i-nx+2) = 1;A(i,i+nx-2) = 1;b(i) = - u0(floor(i/(nx-2))+1,nx);endendelseif i>1 && i< nx-2A(i,i-1) = 1;A(i,i+nx-2) = 1;A(i,i+1) = 1;b(i) = - u0(1,i+1);elseif i > (ny-3)*(nx-2) && i < (ny-2)*(nx-2)A(i,i-1) = 1;A(i,i-nx+2) = 1;A(i,i+1) = 1;b(i) = - u0(ny,mod(i,(nx-2))+1);elseA(i,i-1) = 1;A(i,i+1) = 1;A(i,i+nx-2) = 1;A(i,i-nx+2) = 1;endendendendendul = A\b;for i=1:(ny-2)for j=1:(nx-2)u(i,j) = ul((i-1)*(nx-2)+j);endendformat short;2.peEllip5m 用工字型差分格式解拉普拉斯方程function u = peEllip5m(nx,minx,maxx,ny,miny,maxy) format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);u0 = zeros(nx,ny);for j=1:nyu0(j,1) = EllIni2Uxl(minx,miny+(j-1)*hy);u0(j,nx) = EllIni2Uxr(maxx,miny+(j-1)*hy);endfor j=1:nxu0(1,j) = EllIni2Uyl(minx+(j-1)*hx,miny);u0(ny,j) = EllIni2Uyr(minx+(j-1)*hx,maxy);endA = -4*eye((nx-2)*(ny-2),(nx-2)*(ny-2));b = zeros((nx-2)*(ny-2),1);for i=1:(nx-2)*(ny-2)if mod(i,nx-2) == 1if i==1A(1,nx) = 1;b(1) = - u0(1,1) - u0(3,1) - u0(1,3);elseif i == (ny-3)*(nx-2)+1A(i,i-nx+1) = 1;b(i) = - u0(ny,1) - u0(ny,3) - u0(ny-2,1);elseA(i,i-nx+3) = 1;A(i,i+nx-1) = 1;b(i) = - u0(floor(i/(nx-2))+1,1) - u0(floor(i/(nx-2))+3,1);endendelseif mod(i,nx-2) == 0if i == nx-2A(i,i+nx-1) = 1;b(i) = - u0(1,nx-2) - u0(1,nx) - u0(3,nx);elseif i == (ny-2)*(nx-2)A(i,i-nx+1) = 1;b(i) = - u0(ny,nx) - u0(ny,nx-2) - u0(ny-2,nx);elseA(i,i-nx+1) = 1;A(i,i+nx-3) = 1;b(i) = - u0(floor(i/(nx-2)),nx) - u0(floor(i/(nx-2))+2,nx);endendelseif i>1 && i< nx-2A(i,i+nx-1) = 1;A(i,i+nx-3) = 1;b(i) = - u0(1,i) - u0(1,i+2);elseif i > (ny-3)*(nx-2) && i < (ny-2)*(nx-2)A(i,i-nx+3) = 1;A(i,i-nx+1) = 1;b(i) = - u0(ny,mod(i,(nx-2))) -u0(ny,mod(i,(nx-2))+2);elseA(i,i-nx+3) = 1;A(i,i+nx-1) = 1;A(i,i+nx-3) = 1;A(i,i-nx+1) = 1;endendendendendul = A\b;for i=1:(ny-2)for j=1:(nx-2)u(i,j) = ul((i-1)*(nx-2)+j);endendformat short;3.peHypbYF 用迎风格式解对流方程function u = peYF(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);if a>0for j=1:(n+M)u0(j) = IniU(minx+(j-M-1)*h);endelsefor j=1:(n+M)u0(j) = IniU(minx+(j-1)*h);endendu1 = u0;for k=1:Mif a>0for i=(k+1):n+Mu1(i) = -dt*a*(u0(i)-u0(i-1))/h+u0(i);endelsefor i=1:n+M-ku1(i) = -dt*a*(u0(i+1)-u0(i))/h+u0(i);endendu0 = u1;endif a>0u = u1((M+1):M+n);elseu = u1(1:n);endformat long;4.peHypbLax 用拉克斯-弗里德里希斯格式解对流方程function u = peHypbLax(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ku1(i) = -dt*a*(u0(i+1)-u0(i-1))/h/2+(u0(i+1)+u0(i-1))/2;endu0 = u1;endu = u1((M+1):(M+n));format short;4.peHypbLaxW 用拉克斯-温德洛夫格式解对流方程function u = peLaxW(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ku1(i) = dt*dt*a*a*(u0(i+1)-2*u0(i)+u0(i-1))/2/h/h - ...dt*a*(u0(i+1)-u0(i-1))/h/2+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;6.peHypbBW 用比姆-沃明格式解对流方程function u = peBW(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-2*M-1)*h);endu1 = u0;for k=1:Mfor i=2*k+1:n+2*Mu1(i) = u0(i)-dt*a*(u0(i)-u0(i-1))/h-a*dt*(1-a*dt/h)* ...(u0(i)-2*u0(i-1)+u0(i-2))/2/h;endu0 = u1;endu = u1((2*M+1):(2*M+n));format short;7.peHypbRich 用Richtmyer多步格式解对流方程function u = peRich(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+4*M)u0(j) = IniU(minx+(j-2*M-1)*h);endfor k=1:Mfor i=2*k+1:n+4*M-2*ktmpU1 = -dt*a*(u0(i+2)-u0(i))/h/4+(u0(i+2)+u0(i))/2;tmpU2 = -dt*a*(u0(i)-u0(i-2))/h/4+(u0(i)+u0(i-2))/2;u1(i) = -dt*a*(tmpU1-tmpU2)/h/2+u0(i);endu0 = u1;endu = u1((2*M+1):(2*M+n));format short;8.peHypbMLW 用拉克斯-温德洛夫多步格式解对流方程function u = peMLW(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ktmpU1 = -dt*a*(u0(i+1)-u0(i))/h/2+(u0(i+1)+u0(i))/2;tmpU2 = -dt*a*(u0(i)-u0(i-1))/h/2+(u0(i)+u0(i-1))/2;u1(i) = -dt*a*(tmpU1-tmpU2)/h+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;9.peHypbMC 用MacCormack多步格式解对流方程function u = peMC(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endfor k=1:Mfor i=k+1:n+2*M-ktmpU1 = -dt*a*(u0(i+1)-u0(i))/h+u0(i);tmpU2 = -dt*a*(u0(i)-u0(i-1))/h+u0(i-1);u1(i) = -dt*a*(tmpU1-tmpU2)/h/2+(u0(i)+tmpU1)/2;endu0 = u1;endu = u1((M+1):(M+n));format short;10.peHypb2LF 用拉克斯-弗里德里希斯格式解二维对流方程的初值问题function u = pe2LF(a,b,dt,nx,minx,maxx,ny,miny,maxy,M)%啦-佛format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);for i=1:nx+2*Mfor j=1:(ny+2*M)u0(i,j) = Ini2U(minx+(i-M-1)*hx,miny+(j-M-1)*hy);endendu1 = u0;for k=1:Mfor i=k+1:nx+2*M-kfor j=k+1:ny+2*M-ku1(i,j) = (u0(i+1,j)+u0(i-1,j)+u0(i,j+1)+u0(i,j-1))/4 ...-a*dt*(u0(i+1,j)-u0(i-1,j))/2/hx ...-b*dt*(u0(i,j+1)-u0(i,j-1))/2/hy;endendu0 = u1;endu = u1((M+1):(M+nx),(M+1):(M+ny));format short;11.peHypb2FL 用拉克斯-弗里德里希斯格式解二维对流方程的初值问题function u = pe2FL(a,b,dt,nx,minx,maxx,ny,miny,maxy,M)format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);for i=1:nx+4*Mfor j=1:(ny+4*M)u0(i,j) = Ini2U(minx+(i-2*M-1)*hx,miny+(j-2*M-1)*hy);endendu1 = u0;for k=1:Mfor i=2*k+1:nx+4*M-2*kfor j=2*k-1:ny+4*M-2*k+2tmpU(i,j) = u0(i,j) - a*dt*(u0(i+1,j)-u0(i-1,j))/2/hx + ...(a*dt/hx)^2*(u0(i+1,j)-2*u0(i,j)+u0(i-1,j))/2;endendfor i=2*k+1:nx+4*M-2*kfor j=2*k+1:nx+4*M-2*ku1(i,j) = tmpU(i,j) - b*dt*(tmpU(i,j+1)-tmpU(i,j-1))/2/hy + ...(b*dt/hy)^2*(tmpU(i,j+1)-2*tmpU(i,j)+tmpU(i,j-1))/2;endendu0 = u1;endu = u1((2*M+1):(2*M+nx),(2*M+1):(2*M+ny));format short;12.peParabExp 用显式格式解扩散方程的初值问题function u = peParabExp(c,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = PrIniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ku1(i) = dt*c*(u0(i+1)-2*u0(i)+u0(i-1))/h/h+u0(i);endendu = u1((M+1):(M+n));format short;13.peParabTD 用跳点格式解扩散方程的初值问题function u = peParabTD(c,dt,n,minx,maxx,M)%跳点format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = PrIniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-kif mod(n+i,2) == 0u1(i) = u0(i) + c*dt*(u0(i+1) - 2*u0(i) + u0(i-1))/h/h;if i > 2u1(i-1) =(u0(i-1) + c*dt*(u1(i) + u1(i-2))/h/h)/(1 + 2*c*dt/h/h);endendendu0 = u1;endu = u1((M+1):(M+n));format short;14.peParabImp 用隐式格式解扩散方程的初边值问题function u = peParabImp(c,dt,n,minx,maxx,lbu,rbu,M)format long;h = (maxx-minx)/(n-1);u0(1) = lbu;u0(n) = rbu;for j=2:n-1u0(j) = PrIniU(minx+(j-1)*h);endu1 = u0;for k=1:MA = zeros(n-2,n-2);cb = - transpose(u0(2:(n-1)));cb(1) = cb(1) - dt*c*lbu/h/h;cb(n-2) = cb(n-2) - dt*c*rbu/h/h;A(1,1) = -2*dt*c/h/h -1;A(1,2) = dt*c/h/h ;for i=2:n-3A(i,i-1) = dt*c/h/h ;A(i,i) = - 2*dt*c/h/h -1 ;A(i,i+1) = dt*c/h/h ;endA(n-2,n-2) = -2*dt*c/h/h -1;A(n-2,n-3) = dt*c/h/h;u1(2:(n-1)) = A\cb;u0 = u1;endu = u1;format short;15.peParabKN 用克拉克-尼科尔森格式解扩散方程的初边值问题function u = peParabKN(c,dt,n,minx,maxx,lbu,rbu,M)format long;h = (maxx-minx)/(n-1);u0(1) = lbu;u0(n) = rbu;for j=2:n-1u0(j) = PrIniU(minx+(j-1)*h);endu1 = u0;for k=1:MA = zeros(n-2,n-2);cb = zeros(n-2,1);cb(1) = -u0(2) -(u0(3)-2*u0(2)+u0(1))*dt*c*lbu/h/h/2 - dt*c*lbu/h/h/2;cb(n-2) = -u0(n-1) -(u0(n)-2*u0(n-1)+u0(n-2))*dt*c*lbu/h/h/2 - dt*c*rbu/h/h/2;for i=2:n-3cb(i) = -u0(i+1) -(u0(i+2)-2*u0(i+1)+u0(i))*dt*c*lbu/h/h/2;endA(1,1) = -dt*c/h/h -1;A(1,2) = dt*c/h/h/2 ;for i=2:n-3A(i,i-1) = dt*c/h/h/2 ;A(i,i) = - dt*c/h/h -1 ;A(i,i+1) = dt*c/h/h/2 ;endA(n-2,n-2) = -dt*c/h/h -1;A(n-2,n-3) = dt*c/h/h/2;u1(2:(n-1)) = A\cb;u0 = u1;endu = u1;format short;16.peParabWegImp 用加权隐式格式解扩散方程的初边值问题function u = peParabWegImp(c,sita,dt,n,minx,maxx,lbu,rbu,M)format long;h = (maxx-minx)/(n-1);u0(1) = lbu;u0(n) = rbu;for j=2:n-1u0(j) = PrIniU(minx+(j-1)*h);endu1 = u0;for k=1:MA = zeros(n-2,n-2);cb = zeros(n-2,1);cb(1) = -u0(2) -(1 - sita)*(u0(3)-2*u0(2)+u0(1))*dt*c*lbu/h/h/2 ...- sita*dt*c*lbu/h/h;cb(n-2) = -u0(n-1) -(1 - sita)*(u0(n)-2*u0(n-1)+u0(n-2))*dt*c*lbu/h/h/2 ...- sita*dt*c*rbu/h/h;for i=2:n-3cb(i) = -u0(i+1) -(1 - sita)*(u0(i+2)-2*u0(i+1)+u0(i))*dt*c*lbu/h/h;endA(1,1) = -2*sita*dt*c/h/h -1;A(1,2) = sita*dt*c/h/h ;for i=2:n-3A(i,i-1) = sita*dt*c/h/h ;A(i,i) = - 2*sita*dt*c/h/h -1 ;A(i,i+1) = sita*dt*c/h/h ;endA(n-2,n-2) = - 2*sita*dt*c/h/h -1;A(n-2,n-3) = sita*dt*c/h/h;u1(2:(n-1)) = A\cb;u0 = u1;endu = u1;format short;17.peDKExp 用指数型格式解对流扩散方程的初值问题function u = peDKExp(a,b,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = DKIniU(minx+(j-M-1)*h);endu1 = u0;coff = (exp(a*h/2/b)+exp(-a*h/2/b))/(exp(a*h/2/b)-exp(-a*h/2/b));coff = dt*coff*a*h/2;for k=1:Mfor i=k+1:n+2*M-ku1(i) = coff*(u0(i+1)-2*u0(i)+u0(i-1))+a*dt*(u0(i+1)-u0(i-1))/h/2+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;18.peDKSam 用萨马尔斯基格式解对流扩散方程的初值问题function u = peDKSam(a,b,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = DKIniU(minx+(j-M-1)*h);endu1 = u0;coff = dt*b/(1+a*h/b/2);for k=1:Mfor i=k+1:n+2*M-ku1(i) = coff*(u0(i+1)-2*u0(i)+u0(i-1))+a*dt*(u0(i)-u0(i-1))/h+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;。
偏微分方程的数值解(差分法)
数值天气预报尝试。1922年,他在《Weather Prediction
by Numerical Process 》中,论述了数值预报的原理和可
能性,并且应用原始方程组,对欧洲地面气压场进行
了6小时预报。但结果很不理想:他预报气压在 6小
ijkvxyzuvwwuuwvu????????????????????????????????????????????wuuwvuijkyzzxxx????????????????????????????????????????????????????????????????21uvwvwudfuvwfvtxyzxyxzyzdypppxyyx????????????????????????????????????????????????????????????????????????????????????????????????????????????????????一
y f ( x x) f ( x) x x
y f ( x) f ( x x) 一阶向后差商为: x x
一阶中心差商为: y f ( x x) f ( x x)
x
2x
二阶差商多取中心式,即
2 y f ( x x) 2 f ( x) f ( x x) 2 x (x) 2
§2 差分原理
一.基本概念: 1.将连续求解域划分成差分网格(最简单的
差分网格是矩形网格),用有限个节点代
替原连续求解域;
2.用差商代替控制微分方程中的导数;
3.建立含有限个未知数的节点差分方程组; 4.代入初始和边界条件后求解差分方程组。
第5章偏微分方程数值解
5.1
5.2
5.3
5.4
总目录
5.2 基本离散化公式
在偏微分方程中,自变量都在两个或两个以上,应变量随两个或两 个以上的自变量变化而变化。在化工或化学动态模拟方程中,常常有一个 自变量是时间,其它的自变量为空间位置。如果只考虑一维空间,则只有 两个自变量;如果考虑两维空间,则有3个自变量。一般我们将自变量在 时间和空间以一定的间隔进行离散化,则应变量就变成了这些离散变量的 函数,以3维空间为例,我们将离散化的应变量表示成,它所表示的真正 n 含义如下 : u i , j , k = u ( t , x , y , z ) t = n ∆ t , x = i ∆ x , y = j ∆ y , z = k ∆ z 有了以上的定义,对于一阶偏 u in, +1k − u in, j ,k ∂u j, = 导我们可以利用第四章的欧拉 ∂ t t = n ∆ t , x = i ∆ x , y = j ∆ y , z = k∆ z ∆t 公式直接得出向前欧拉公式: u in+1, j , k − u in, j ,k ∂u 对于时间偏导而言,有时我们 = ∂ x t = n ∆ t , x = i ∆ x , y = j ∆ y , z = k∆ z ∆x 常常采用向后欧拉公式,时间的 u in, j +1, k − u in, j ,k ∂u 向后欧拉公式如下: = ∂ y t = n ∆ t , x = i ∆ x , y = j ∆ y , z = k∆ z ∆y u in, +,1k − u in, j ,k ∂u j = u in, j ,k +1 − u in, j ,k ∂u ∂t t =( n +1) ∆t , x =i∆x , y = j∆y , z = k∆z ∆t = ∂ z t = n ∆ t , x = i ∆ x , y = j ∆ y , z = k∆ z ∆x
偏微分方程数值解
通过数值计算方法,在计算机上对偏微分方程的近似求解。
科学和工程中的大多数实际问题都归结为偏微分方程的定解问题,由于很难求得这些定解问题的解析解(在经典意义下甚至没有解),人们转向求解它们的数值近似解。
通常先对问题的求解区域进行网格剖分,然后基于有限元法、有限差分法和有限体积法等数值方法,对原定解问题或其等价形式离散,并归结为一个线性代数方程组,最终在计算机上求得精确解在离散网格点上的近似值。
求解涉及数值方法及其理论分析(稳定性、收敛性、误差估计)、计算机上的实现等一系列问题。
目录第1章椭圆型偏微分方程的差分方法1.1 引言1.2 模型问题的差分逼近1.3 一般问题的差分逼近1.3.1 网格、网格函数及其范数1.3.2 差分格式的构造1.3.3 截断误差、相容性、稳定性与收敛性1.3.4 边界条件的处理1.4 基于最大值原理的误差分析1.4.1 最大值原理与差分方程解的存在唯一性1.4.2 比较定理与差分方程的稳定性和误差估计1.5 渐近误差分析与外推1.6 补充与注记习题1第2章抛物型偏微分方程的差分方法2.1 引言2.2 模型问题及其差分逼近2.2.1 模型问题的显式格式及其稳定性和收敛性2.2.2 模型问题的隐式格式及其稳定性和收敛性2.3 一维抛物型偏微分方程的差分逼近2.3.1 直接差分离散化方法2.3.2 基于半离散化方法的差分格式2.3.3 一般边界条件的处理2.3.4 耗散与守恒性质2.4 高维抛物型偏微分方程的差分逼近2.4.1 高维盒形区域上的显式格式和隐式格式2.4.2 二维和三维交替方向隐式格式及局部一维格式2.4.3 更一般的高维抛物型问题的差分逼近2.5 补充与注记习题2第3章双曲型偏微分方程的差分方法3.1 引言3.2 一维一阶线性双曲型偏微分方程的差分方法3.2.1 特征线与CFL条件3.2.2 迎风格式3.2.3 15ax-Wendroff格式和Beam-Warming格式3.2.4 :蛙跳格式3.2.5 差分格式的耗散与色散3.2.6 初边值问题与边界条件的处理3.3 一阶双曲守恒律方程与守恒型格式3.3.1 有限体积格式3.3.2 初始条件与边界条件的处理3.4 对流扩散方程的差分方法3.4.1 对流扩散方程的中心显式格式与修正中心显式格式3.4.2 对流扩散方程的迎风格式3.4.3 对流扩散方程的隐式格式3.4.4 对流扩散方程的特征差分格式3.5 波动方程的差分方法3.5.1 波动方程的显式格式3.5.2 波动方程的隐式格式3.5.3 变系数波动方程隐式格式的能量不等式和稳定性3.5.4 基于等价一阶方程组的差分格式3.5.5 交错型蛙跳格式与局部能量守恒性质3.6 补充与注记习题3第4章再论差分方程的相容性、稳定性与收敛性4.1 发展方程初边值问题及其差分逼近4.2 截断误差与逼近精度的阶,相容性与收敛性4.3 稳定性与Lax等价定理4.4 稳定性的von Neumann条件和强稳定性4.5 修正方程分析4.6 能量分析方法第5章椭圆边值问题的变分形式5.1 抽象变分问题5.1.1 抽象变分问题5.1.2 Lax-Milgram引理5.2 变分形式与弱解5.2.1 椭圆边值问题的例子5.2.2 Sobolev空间初步5.2.3 椭圆边值问题的变分形式与弱解5.3 补充与注记习题5第6章椭圆边值问题的有限元方法6.1 Galerkin方法与Ritz方法6.2 有限元方法6.2.1 有限元方法的一个典型例子6.2.2 有限元的一般定义6.2.3 有限元与有限元空间的例子6.2.4 有限元方程与有限元解6.3 补充与注记习题6第7章椭圆边值问题有限元解的误差估计7.1 Cea引理与有限元解的抽象误差估计7.2 Sobolev空间插值理论7.2.1 Sobolev空间的多项式商空间与等价商范数7.2.2 仿射等价开集上Sobolev半范数的关系7.2.3 多项式不变算子的误差估计7.2.4 有限元函数的反估计7.3 多角形区域上二阶问题有限元解的误差估计7.3.1 H1范数意义下的误差估计7.3.2 Aubin—Nische技巧与L2范数意义下的误差估计7.4 非协调性与相容性误差7.4.1 第一和第二:Strang引理7.4.2 Bramble-Hilbert,引理和双线性引理7.4.3 数值积分引起的相容性误差7.5 补充与注记习题7第8章有限元解的误差控制与自适应方法8.1 有限元解的后验误差估计8.2 后验误差估计子的可靠性与有效性8.3 自适应方法8.3.1 h型、p型与h-p型自适应方法8.3.2 网格重分布型自适应方法8.4 补充与注记习题8部分习题答案和提示符号说明参考文献名词索引。
(完整版)偏微分方程数值解
在常微分方程差分法中最简单的方法是 Euler方法,尽管在计算中不会使用,但从 中可领悟到建立差分格式的技术路线,下 面将对其作详细介绍:
13
差分方法的基本思想“就是以差商 代替微商”
考虑如下两个Taylor公式:
u(t h) u(t) u(t)h 1 u(t)h2 1 u(t)h3 L 1 u(n) (t)hn O(hn1) (1)
6
50 40 30 20 10
0 -10 -20 -30
0
5 10 15 20 25 30 35 40 45 50
7
50 40 30 20 10
0 20
0
-20 30
20
10
0
-10
-20
-30
8
9
10
Franceshini 将Navier-Stokes方程截断为五维的
截谱模型如下:
ìïïïïïïïïïíïïïïïïïïî
Meteorology(2nd Edition), the United States of America, 1979. 2. Curtis F.Gerald and Patrick O., Applied Numerical Analysis, Person Education,
Inc., 2004. 3. Eugenia Kalnay, Atmospheric Modeling, Data Assimilation and Predictability,
• 建立差分算法的两个基本的步骤: 1. 建立差分格式,包括:a. 对解的存在域剖分; b. 采用不同的算法可得到不同的逼近误差—截断 误差(相容性);c.数值解对真解的精度—整体 截断误差(收敛性);d.数值解收敛于真解的速 度;e. 差分算法—舍人误差(稳定性).
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
the press Syndicate of the University of Cambridge,2003. 4. Arieh Iserles, A First Course in the Numerical Analysis of Differential Equations,
4
常微分方程的数值解
大气科学中 常微分方程和偏微分方程的关系 1. 大气行星边界层(近地面具有湍流运动特性的大
气薄层,1—1.5km), 埃克曼(V.W.Ekman)(瑞典) 螺线的导出; 2. 1963年,美国气象学家Lorenz在研究热对流的 不稳定问题时,使用高截断的谱方法,由 Boussinesq流体的闭合方程组得到了一个完全确 定的三阶常微分方程组,即著名的Lorenz系统。
3. Charney, Fjortoft, and Von Neumann(1950), 借助于Princeton大学的的计算机(ENIAC),利 用一个简单的正压涡度方程 (C.G.Rossby,1940)对500mb的天气形式作
3
了24小时预报---成功;
The Electronic Numerical Integrator and Computer (ENIAC).
12
2.差分格式求解 将积分方程通过差分方程转化为代数方程求
解,一般常用递推算法。
在常微分方程差分法中最简单的方法是 Euler方法,尽管在计算中不会使用,但从 中可领悟到建立差分格式的技术路线,下 面将对其作详细介绍:
13
差分方法的基本思想“就是以差商 代替微商”
考虑如下两个Taylor公式:
从(1)得到:
u(ti)u(ti1)hu(ti)O(h)
14
从(2)得到:
u(ti)u(ti1)hu(ti)O(h)
从(1)-(2)得到:
u(ti)u(ti1)2 hu(ti1)O (h2)
从(1)+(2)得到:
u (ti)u (ti 1) 2 u h (2 ti) u (ti 1 ) O (h 2)
Cambridge University Press,1996. 5. 李荣华,冯国忱. 微分方程数值解. 北京:人民教育出版社,1980. 6. 徐长发,李红. 实用偏微分方程数值解法. 华中科技大学出版社,2003. 7. 沈桐立,田永祥等. 数值天气预报. 北京:气象出版社,2007.2数值天气预报—PDE数值解
x1¢=
x
¢
2
=
x
¢
3
=
x
¢
4
=
x
¢
5
=
-
2 x1 + 4 x2 x3 + 9 x2 + 3 x1x3 5 x3 - 7 x1x2 + 5 x4 - x1x6 x5 - 3 x1x4
4 x4x5 Re
11
欧拉法—折线法
• 常微分方程能直接进行积分的是少数,而多数是 借助于计算机来求常微分方程的近似解;
偏微分方程数值解 (Numerical Solution of
Partial Differential Equations)
主讲:王曰朋
eduwyp@
1
参考数目 1. George J. Haltiner, Roger Terry Williams, Numerical Prediction and Dynamic 2. Meteorology(2nd Edition), the United States of America, 1979. 2. Curtis F.Gerald and Patrick O., Applied Numerical Analysis, Person Education,
u ( t h ) u ( t ) u ( t ) h 1 u ( t ) h 2 1 u ( t ) h 3 L 1 u ( n ) ( t ) h n O ( h n 1 ) (1)
2 ! 3 !
n !
u ( t h ) u ( t ) u ( t ) h 2 1 ! u ( t ) h 2 3 1 ! u ( t ) h 3 L n 1 ! u ( n ) ( t ) h n O ( h n 1 ) (2)
15
对经典的初值问题
du
dt
f (t,u )
u ( 0 ) u 0
t (0,T)
满足Lipschitz条件
f(t,u 1 )f(t,u 2)Lu 1 u 2
• 有限差分法是常微分方程中数值解法中通 常有效 的方法;
• 建立差分算法的两个基本的步骤: 1. 建立差分格式,包括:a. 对解的存在域剖分; b. 采用不同的算法可得到不同的逼近误差—截断 误差(相容性);c.数值解对真解的精度—整体 截断误差(收敛性);d.数值解收敛于真解的速 度;e. 差分算法—舍人误差(稳定性).
1. 挪威气象学家V.Bjerknes(1904)提出数值预 报的思想:通过求解一组方程的初值问题可以 预报将来某个时刻的天气—思想;
2. L.F.Richardson(1922):开创了利用数值积分 进行预报天气的先例,由于一些原因(如,计 算稳定性问题“Courant,1928”)并没有取得预 期的效果—尝试;
5
Lorenz系统
dx / dt = a (y - x) dy / dt = x (b - z) - y dz / dt = xy - c z
其中,a=10,(Prandtl number); b=28(Rayleigh number); c=8/3; (x,y,z)_0=(0.01;0.01;1e-10)
6
50 40 30 20 10
0 -10 -20 -30
0
5 10 15 20 25 30 35 40 45 50
7
50 40 30 20 10
0 20
0
-20 30
20
10
0
-10
-20
-30
8
9
10
Franceshini 将Navier-Stokes方程截断为五维的
截谱模型如下:
ìïïïïïïïïïíïïïïïïïïî