常微分方程初值问题的数值解法

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

贵州师范大学数学与计算机科学学院学生实验报告

课程名称: 数值分析 班级: 实验日期: 年 月 日 学 号: 姓名: 指导教师: 实验成绩: 一、实验名称

实验六: 常微分方程初值问题数值解法 二、实验目的及要求

1. 让学生掌握用Euler 法, Runge-Kutta 法求解常微分方程初值问题.

2. 培养Matlab 编程与上机调试能力. 三、实验环境

每人一台计算机,要求安装Windows XP 操作系统,Microsoft office2003、MATLAB6.5(或7.0). 四、实验内容

1. 取步长h=0.1,0.05,0.01, ,用Euler 法及经典4阶Runge-Kutta 法求解初值

问题

⎩⎨

⎧=≤≤++-=1

)0()

10(2222'y t t t y y 要求:

1) 画出准确解(准确解22t e y t +=-)的曲线,近似解折线;

2) 把节点0.1和0.5上的精确解与近似解比较,观察误差变化情况.

2. 用 Euler 法,隐式Euler 法和经典4阶R-K 法取不同步长解初值问题

⎪⎩

⎨⎧=

∈-=21

)0(],1,0[,50'y x y y 并画出曲线观察稳定性. 注:题1必须写实验报告

五、算法描述及实验步骤

Euler 法:

输入 000),(,,,),,(y a x x h b a y x f = 输出 Euler 解y 步1 ),,2,1(;m n h n a x h

a

b m n =⨯+=-⇐

步2 对1,,2,1,0-=m n 执行),(1n n n n y x f h y y ⨯+⇐+

步3 输出T m y y y y ),,,(21 = 经典4阶R-K 法:

输入 000),(,,,),,(y a x x h b a y x f = 输出 4阶R-K 解y 步1 ),,2,1(;m n h n a x h

a

b m n =⨯+=-⇐

步2 对1,,2,1,0-=m n 执行),(1n n y x f K ⇐,)5.0,(15.02hK y x f K n n +⇐+, )5.0,(25.03hK y x f K n n +⇐+,),(314hK y x f K n n +⇐+ )22(6

43211K K K K h

y y n n ++++⇐+ 步3 输出T m y y y y ),,,(21 =

六、调试过程及实验结果

>> shiyan6 Y1 =

0.8000 0.6620 0.5776 0.5401 0.5441 0.5853 0.6602 0.7662 0.9009 1.0627 Y2 =

0.8287 0.7103 0.6388 0.6093 0.6179 0.6612 0.7366 0.8419 0.9753 1.1353

e1 =

0.0287

e2 =

4.2469e-006 e1 =

0.0738

e2 =

1.1609e-005

注:至于h=0.05、0.01的情况将程序中的h值作相应的改动即可得。

七、总结

在1阶的Euler法解初值问题时,若步长过大的话,误差将会较大,其解不可靠,只有控制步长,在一定误差范围内才可用。

就精度阶而言经典4阶Runge-Kutta法最可取,但并不是阶高的方法就一定可用,还必须考虑初值问题的性态、数值方法的计算量稳定性等因素。因此在实际计算中,应根据问题的具体情况来选择合适的方法。

八、附录(源程序清单)

图像、计算、误差比较程序:

x=0:0.001:1;

y=exp(-2*x)+x.^2;

plot(x,y,'r')

axis([0,1,0.5,1.2])

hold on

a=0;b=1;y0=1;h=0.1;d=y0; Y1=Euler('fun',a,b,y0,h) u1=0:0.001:h;

v1=Y1(1)+0*u1;

plot(u1,v1,'g--')

hold on

u2=0:0.001:5*h;

v2=Y1(5)+0*u2;

plot(u2,v2,'g--')

hold on

Y1=[d,Y1];

t=0:h:1;

scatter(t,Y1,'r')

hold on

plot(t,Y1)

hold on

Y2=RK('fun',a,b,y0,h)

u3=0:0.001:h;

v3=Y2(1)+0*u3;

plot(u3,v3,'y--')

hold on

u4=0:0.001:5*h; v4=Y2(5)+0*u4;

plot(u4,v4,'y--')

hold on

v5=0:0.001:Y2(1);

u5=h+0*v5;

plot(u5,v5,'k--')

hold on

v6=0:0.001:Y2(5);

u6=5*h+0*v6;

plot(u6,v6,'k--')

hold on

Y2=[d,Y2];

scatter(t,Y2,'r')

hold on

plot(t,Y2)

title('¾«È·½âÇúÏßÓë½üËƽâÕÛÏß','fonts ize',10,'fontweight','bold')

text(0.735,0.7,'\leftarrowy=Euler·¨½üËƽâÕÛÏß','fontsize',8)

text(0.15,0.775,'\leftarrowy=¾-µä4½×R unge-Kutta·¨½üËƽâÕÛÏß','fontsize',8) x=[0.1,0.5];

y=exp(-2*x)+x.^2;

e1=abs(y(1)-Y1(2))

e2=abs(y(1)-Y2(2))

e1=abs(y(2)-Y1(6))

e2=abs(y(2)-Y2(6))

相关文档
最新文档