常微分方程数值解实验报告学院:数学与信息科学专业:信息与计算科学姓名:郑思义学号:201216524课程:常微分方程数值解实验一:常微分方程得数值解法1、分别用Euler法、改进得Euler法(预报校正格式)与S—K法求解初值问题。
(h=0、1)并与真解作比较。
1、1实验代码:%欧拉法function [x,y]=naeuler(dyfun,xspan,y0,h)%dyfun就是常微分方程,xspan就是x得取值范围,y0就是初值,h就是步长x=xspan(1):h:xspan(2);y(1)=y0;forn=1:length(x)-1y(n+1)=y(n)+h*feval(dyfun,x(n),y(n));end%改进得欧拉法function [x,m,y]=naeuler2(dyfun,xspan,y0,h)%dyfun就是常微分方程,xspan就是x得取值范围,y0就是初值,h就是步长。
%返回值x为x取值,m为预报解,y为校正解x=xspan(1):h:xspan(2);y(1)=y0;m=zeros(length(x)-1,1);forn=1:length(x)-1k1=feval(dyfun,x(n),y(n));y(n+1)=y(n)+h*k1;m(n)=y(n+1);k2=feval(dyfun,x(n+1),y(n+1));y(n+1)=y(n)+h*(k1+k2)/2;end%四阶S—K法function [x,y]=rk(dyfun,xspan,y0,h)%dyfun就是常微分方程,xspan就是x得取值范围,y0就是初值,h就是步长。
x=xspan(1):h:xspan(2);y(1)=y0;for n=1:length(x)-1k1=feval(dyfun,x(n),y(n));k2=feval(dyfun,x(n)+h/2,y(n)+(h*k1)/2);k3=feval(dyfun,x(n)+h/2,y(n)+(h*k2)/2);k4=feval(dyfun,x(n)+h,y(n)+h*k3);y(n+1)=y(n)+(h/6)*(k1+2*k2+2*k3+k4);end%主程序x=[0:0、1:1];y=exp(-x)+x;dyfun=inline('-y+x+1');[x1,y1]=naeuler(dyfun,[0,1],1,0、1);[x2,m,y2]=naeuler2(dyfun,[0,1],1,0、1);[x3,y3]=rk(dyfun,[0,1],1,0、1);plot(x,y,'r',x1,y1,'+',x2,y2,'*',x3,y3,'o');xlabel('x');ylabel('y');legend('y为真解','y1为欧拉解','y2为改进欧拉解','y3为S—K解','Location','NorthWest');1、2实验结果:x 真解y 欧拉解y1 预报值m校正值y2 S—K解y30、01、0000 1、0000 1、0000 1、00000、1 1、0048 1、00001、0000 1、00501、00480、2 1、0187 1、0100 1、0145 1、0190 1、01870、3 1、0408 1、0290 1、03711、0412 1、04080、4 1、0703 1、0561 1、0671 1、0708 1、07030、5 1、1065 1、09051、10371、10711、10650、6 1、1488 1、13141、1464 1、14941、14880、7 1、1966 1、1783 1、19451、1972 1、19660、81、2493 1、2305 1、2475 1、2500 1、24930、9 1、30661、28741、3050 1、3072 1、30661、0 1、3679 1、34871、3665 1、3685 1、36792、选取一种理论上收敛但就是不稳定得算法对问题1进行计算,并与真解作比较。
(选改进得欧拉法)2、1实验思路:算法得稳定性就是与步长h密切相关得。
而对于问题一而言,取定步长h=0、1不论就是单步法或低阶多步法都就是稳定得算法。
所以考虑改变h取值范围,借此分析不同步长会对结果造成什么影响。
故依次采用h=2、0、2、2、2、4、2、6得改进欧拉法。
2、2实验代码:%%主程序x=[0:3:30];y=exp(-x)+x;dyfun=inline('-y+x+1');[x1,m1,y1]=naeuler2(dyfun,[0,20],1,2);[x2,m2,y2]=naeuler2(dyfun,[0,22],1,2、2);[x3,m3,y3]=naeuler2(dyfun,[0,24],1,2、4);[x4,m4,y4]=naeuler2(dyfun,[0,26],1,2、6);subplot(2,2,1)plot(x,y,'r',x1,y1,'+');xlabel('h=2、0');subplot(2,2,2)plot(x,y,'r',x2,y2,'+');xlabel('h=2、2');subplot(2,2,3)plot(x,y,'r',x3,y3,'+');xlabel('h=2、4');subplot(2,2,4)plot(x,y,'r',x4,y4,'+');xlabel('h=2、6');2、3实验结果:x h=2、0 h=2、2 h=2、4 h=2、60、01、0000 1、0000 1、0000 1、00000、13、0000 3、4200 3、8800 4、38000、2 5、00005、8884 6、99048、36840、3 7、0000 8、4158 10、4418 13、43980、4 9、000011、0153 14、3979 20、43880、5 11、0000 13、7027 19、1008 30、86900、6 13、0000 16、4973 24、909247、40680、715、0000 19、4227 32、3536 74、81610、8 17、0000 22、507742、2194 121、57670、919、000025、7874 55、6687 202、78251、0 21、0000 29、3046 74、4217 345、3008实验结果分析:从实验1结果可以瞧出,在算法满足收敛性与稳定性得前提下,Eluer法虽然计算并不复杂,凡就是精度不足,反观改进得Eluer法与S—K法虽然计算略微复杂但就是结果很精确。
实验2改变了步长,导致算法理论上收敛但就是不满足稳定性。
结果表示步长h越大,结果越失真。
对于同一个问题,步长h得选取变得尤为重要,这三种单步法得绝对稳定区间并不一样,所以并没有一种方法就是万能得,我们应该根据不同得步长来选取合适得方法。
实验二:Ritz-Galerkin方法与有限差分法1、用中心差分格式求解边值问题取步长h=0、1,并与真解作比较。
1、1实验代码:%中心差分法function U=fdm(xspan,y0,y1,h)%xspan为x取值范围,y0,y1为边界条件,h为步长N=1/h;d=zeros(1,N-1);for i=1:Nx(i)=xspan(1)+i*h;q(i)=1;f(i)=x(i);endfori=1:N-1d(i)=q(i)*h*h+2;enda=diag(d);b=zeros(N-1);c=zeros(N-1);for i=1:N-2b(i+1,i)=-1;endfori=1:N-2c(i,i+1)=-1;endA=a+b+c;fori=2:N-2B(i,1)=f(i)*h*h;endB(1,1)=f(1)*h*h+y0;B(N-1,1)=f(N-1)*h*h+y1;U= inv(A)*B;%主程序x=0:0、1:1;y=x+(exp(1)*exp(-x))/(exp(2)-1)-(exp(1)*exp(x))/(exp(2)-1); y1=fdm([0,1],0,0,0、1);y1=[0,y1',0];plot(x,y,'r',x,y1,'+')xlabel('x');ylabel('y');legend('y真解','y1中心差分法','Location','NorthWest');1、2实验结果:x y真解y1中心差分法0、0 0、0000 0、00000、1 0、01480、01480、20、02870、02870、3 0、04090、04080、4 0、0505 0、05040、5 0、05660、05650、6 0、0583 0、05820、7 0、0545 0、05450、8 0、0443 0、04430、9 0、0265 0、02651、00、0000 0、00002、用Ritz-Galerkin方法求解上述问题,并与真值作比较,列表画图。
2、1实验代码:%Ritz_Galerkin法function vu=Ritz_Galerkin(x0,y0,x1,y1,h)%x0,x1为x取值范围,y0,y1为边界条件,h为步长N=1/h;syms x;for i=1:Nfai(i)=x*(1-x)*(x^(i-1));dfai(i)=diff(x*(1-x)*(x^(i-1)));endfori=1:Nfor j=1:Nfun=dfai(i)*dfai(j)+fai(i)*fai(j);A(i,j)=int(fun,x,0,1);endfun=x*fai(i)+dfai(i);f(i)=int(fun,x,0,1);endc=inv(A)*f';product=c、*fai';sum=0;for i=1:Nsum=sum+product(i);endvu=[];for y=0:h:1v=subs(sum,x,y);vu=[vu,v];endy=0:h:1;yy=0:0、1:1;u=sin(yy)/sin(1)-yy;u=vpa(u,5);vu=vpa(vu,5);%主程序x=0:0、1:1;y=x+(exp(1)*exp(-x))/(exp(2)-1)-(exp(1)*exp(x))/(exp(2)-1); y1=Ritz_Galerkin(0,0,1,0,0、1);y1=double(y1);plot(x,y,'r',x,y1,'+')xlabel('x');ylabel('y');legend('y为真解','y1为R—G法','Location','NorthWest');2、2实验结果:x y真解y1R—G法0、0 0、0000 0、00000、10、0148 0、01480、20、02870、02870、3 0、0409 0、04090、4 0、0505 0、05050、5 0、0566 0、05660、6 0、0583 0、05830、7 0、05450、05450、80、0443 0、04430、9 0、0265 0、02651、0 0、0000 0、00003、若边值条件为y(0)=0,y(1)=1;则上述问题得数值解法怎样变化?结果如何?程序运算出来真解与数值解完全一样。