偏微分方程数值解完整版本
第十章 偏微分方程数值解法

第十章 偏微分方程数值解法偏微分方程问题,其求解十分困难。
除少数特殊情况外,绝大多数情况均难以求出精确解。
因此,近似解法就显得更为重要。
本章仅介绍求解各类典型偏微分方程定解问题的差分方法。
§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 的代数方程组是相同的.。
- 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方程截断为五维的
截谱模型如下:
ìïïïïïïïïïíïïïïïïïïî