常微分方程数值解实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

常微分方程数值解实验报告

学院:数学与信息科学

专业:信息与计算科学

姓名:郑思义

学号: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)-1

y(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)-1

k1=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)-1

k1=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解y3

0、01、0000 1、0000 1、0000 1、0000

0、1 1、0048 1、00001、0000 1、00501、0048

0、2 1、0187 1、0100 1、0145 1、0190 1、0187

0、3 1、0408 1、0290 1、03711、0412 1、0408

0、4 1、0703 1、0561 1、0671 1、0708 1、0703

0、5 1、1065 1、09051、10371、10711、1065

0、6 1、1488 1、13141、1464 1、14941、1488

0、7 1、1966 1、1783 1、19451、1972 1、1966

0、81、2493 1、2305 1、2475 1、2500 1、2493

0、9 1、30661、28741、3050 1、3072 1、3066

1、0 1、3679 1、34871、3665 1、3685 1、3679

2、选取一种理论上收敛但就是不稳定得算法对问题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)

相关文档
最新文档