1、福建农林大学计算机与信息学院(数学类课程)课程实习报告课程名称:常微分方程课程实习实习题目:常微分方程数值求解问题的实习姓 名:系:信息与计算科学专 业:信息与计算科学年 级:2010学 号:指导教师:职 称:讲师2011 年 12 月 1 日 福建农林大学计算机与信息学院数学类课程实习报告结果评定评语:成绩:指导教师签字:评定日期:1目 录1.实习的目的和任务12.实习要求13.实习地点14.主要仪器设备15.实习内容15.1 用不同格式对同一个初值问题的数值求解及其分析.15.1.1求精确解15.1.2用欧拉法求解35.1.3用改进欧拉法求解55.1.4用4级4阶龙格库塔法求解7 5.1.
2、5 问题讨论与分析105.2 一个算法不同不长求解同一个初值问题及其分析.135.3 洛伦茨方程 模拟混沌现象186.结束语21参考文献21常微分方程课程实习1. 实习的目的和任务目的:通过课程实习能够应用MATLAB软来计算微分方程(组)的数值解;了解常微分方程数值解。任务:通过具体的问题,利用MATLAB软件来计算问题的结果,分析问题的结论。2. 实习要求能够从案例的自然语言描述中,抽象出其中的数学模型;能够熟练应用所学的数值解计算方法;能够熟练使用MATLAB软件;对常微分方程数值解有所认识,包括对不同算法有所认识和对步长有所认识。3. 实习地点南2#4254. 主要仪器设备计算机Mic
3、rosoft Windows 7Matlab R2009a5. 实习内容5.1 用欧拉方法,改进欧拉方法,4阶龙格库塔方法分别求下面微分方程的初值dy/dx=y*cos(2*x) y(0)=1 x0,25.1 .1求精确解变量分离方程情形:形如的方程,这里分别是的连续函数.如果,我们可将方程改写成,这样,变量就”分离”开来了,两边同时积分即可:为任意常数.用变量分离法可求出其精确为:y=exp(0.5*sin(2*x)5.1.1 程序代码: x=0:0.1:2; y=exp(0.5*sin(2*x) plot(x,y,rs-); Data=x,y结果及图像:y = Columns 1 thro
4、ugh 6 1.0000 1.1044 1.2150 1.3262 1.4314 1.5231 Columns 7 through 12 1.5936 1.6368 1.6484 1.6273 1.5756 1.4982 Columns 13 through 18 1.4018 1.2940 1.1823 1.0731 0.9712 0.8801 Columns 19 through 21 0.8015 0.7364 0.6850Data = 0 1.0000 0.1000 1.1044 0.2000 1.2150 0.3000 1.3262 0.4000 1.4314 0.5000 1.52
5、31 0.6000 1.5936 0.7000 1.6368 0.8000 1.6484 0.9000 1.6273 1.0000 1.5756 1.1000 1.4982 1.2000 1.4018 1.3000 1.2940 1.4000 1.1823 1.5000 1.0731 1.6000 0.9712 1.7000 0.8801 1.8000 0.8015 1.9000 0.7364 2.0000 0.68505.1.2 用欧拉法求解设常微分方程的初始问题 有唯一解。则由欧拉法求初值问题(1),(2)的数值解的计算公式为: ( )程序如下:建立函数文件cwf1.mfunction x
6、,y=cwf1(fun,x_span,y0,h)x=x_span(1):h:x_span(2);y(1)=y0;for n=1:length(x)-1 y(n+1)=y(n)+h*feval(fun,x(n),y(n);endx=x;y=y;在MATLAB输入以下程序: clear all fun=inline( y*cos(2*x) ); x,y=cwf1(fun,0,2,1,0.1); x,y plot(x,y,r*-)结果及图像:ans = 0 1.0000 0.1000 1.1000 0.2000 1.2078 0.3000 1.3191 0.4000 1.4279 0.5000 1.
7、5274 0.6000 1.6099 0.7000 1.6683 0.8000 1.6966 0.9000 1.6917 1.0000 1.6532 1.1000 1.5844 1.2000 1.4912 1.3000 1.3812 1.4000 1.2629 1.5000 1.1439 1.6000 1.0306 1.7000 0.9278 1.8000 0.8381 1.9000 0.76292.0000 0.70265.1.3用改进欧拉法求解:计算公式为:当然也可以迭代多次:程序如下:建立函数文件cwf2.mfunction x,y=cwf2(fun,x_span,y0,h)x=x_sp
8、an(1):h:x_span(2);y(1)=y0;for n=1:length(x)-1 k1=feval(fun,x(n),y(n); y(n+1)=y(n)+h*k1; k2=feval(fun,x(n+1),y(n+1); y(n+1)=y(n)+h*(k1+k2)/2;endx=x;y=y;在MATLAB输入以下程序: clear all fun=inline( y*cos(2*x); x,y=cwf2(fun,0,2,1,0.1); x,y plot(x,y,b+-)结果及图像:ans = 0 1.0000 0.1000 1.1039 0.2000 1.2138 0.3000 1.
9、3244 0.4000 1.4290 0.5000 1.5201 0.6000 1.5902 0.7000 1.6330 0.8000 1.6445 0.9000 1.6234 1.0000 1.5720 1.1000 1.4949 1.2000 1.3991 1.3000 1.2920 1.4000 1.1810 1.5000 1.0724 1.6000 0.9711 1.7000 0.8803 1.8000 0.8021 1.9000 0.73732.0000 0.68595.1.4 用4阶龙格库塔求解四级四阶的龙格库塔的一般算式 公式的截断误差阶为。经典四级四阶龙格库塔格式取定,则得这是
10、最为著名的经典四级四阶龙格库塔格式。程序如下:建立函数文件cwf3.mfunction x,y=cwf3(fun,x_span,y0,h)x=x_span(1):h:x_span(2);y(1)=y0;for n=1:length(x)-1 k1=feval(fun,x(n),y(n); k2=feval(fun,x(n)+h/2,y(n)+h/2*k1); k3=feval(fun,x(n)+h/2,y(n)+h/2*k2); k4=feval(fun,x(n+1),y(n)+h*k3); y(n+1)=y(n)+h*(k1+2*k2+2*k3+k4)/6;endx=x;y=y;在MATLA
11、B输入以下程序: clear all; fun=inline( y*cos(2*x); x,y=cwf3(fun,0,2,1,0.1); x,y plot(x,y, b+-)结果及其图象:ans = 0 1.0000 0.1000 1.1044 0.2000 1.2150 0.3000 1.3262 0.4000 1.4314 0.5000 1.5231 0.6000 1.5936 0.7000 1.6368 0.8000 1.6484 0.9000 1.6273 1.0000 1.5756 1.1000 1.4982 1.2000 1.4018 1.3000 1.2940 1.4000 1.
12、1823 1.5000 1.0731 1.6000 0.9712 1.7000 0.8801 1.8000 0.8015 1.9000 0.7364 2.0000 0.68505.1.5 问题讨论与分析由以上数值分析结果绘制表格:精确解欧拉方法改进的欧拉方法四阶龙格-库塔方法xiyiyi误差yi误差yi误差011010100.11.10441.10.00441.10390.00051.104400.21.2151.20780.00721.21380.00121.21500.31.32621.31910.00711.32440.00181.326200.41.43141.42790.00351.
13、4290.00241.431400.51.52311.5274-0.00431.52010.0031.523100.61.59361.6099-0.01631.59020.00341.593600.71.63681.6683-0.03151.6330.00381.636800.81.64841.6966-0.04821.64450.00391.648400.91.62731.6917-0.06441.62340.00391.627301.01.57561.6532-0.07761.5720.00361.575601.11.49821.5844-0.08621.49490.00331.49820
14、1.21.40181.4912-0.08941.39910.00271.401801.31.2941.3812-0.08721.2920.0021.29401.41.18231.2629-0.08061.1810.00131.182301.51.07311.1439-0.07081.07240.00071.073101.60.97121.0306-0.05940.97110.00010.971201.70.88010.9278-0.04770.8803-0.00020.880101.80.80150.8381-0.03660.8021-0.00060.801501.90.73640.7629-
15、0.02650.7373-0.00090.7364020.6850.7026-0.01760.6859-0.00090.6850在MATLAB输入以下程序: x=0:0.1:2; y1=1.0000 1.1044 1.2150 1.3262 1.4314 1.5231 1.5936 1.6368 1.6484 1.6273 1.5756 1.4982 1.4018 1.2940 1.1823 1.0731 0.9712 0.8801 0.8015 0.7364 0.6850; y2=1.0000 1.1000 1.2078 1.3191 1.4279 1.5274 1.6099 1.6683
16、1.6966 1.6917 1.6532 1.5844 1.4912 1.3812 1.2629 1.1439 1.0306 0.9278 0.8381 0.7629 0.7026; y3=1.0000 1.1039 1.2138 1.3244 1.4290 1.5201 1.5902 1.6330 1.6445 1.6234 1.5720 1.4949 1.3991 1.2920 1.1810 1.0724 0.9711 0.8803 0.8021 0.7373 0.6859; y4=1.0000 1.1044 1.2150 1.3262 1.4314 1.5231 1.5936 1.636
17、8 1.6484 1.6273 1.5756 1.4982 1.4018 1.2940 1.1823 1.0731 0.9712 0.8801 0.8015 0.7364 0.6850; plot(x,y1,r+-) hold on,plot(x,y2,b-) plot(x,y1,r+-) hold on,plot(x,y3,b-) plot(x,y1,r+-) hold on,plot(x,y4,b-)结果如下:精确解与欧拉方法的比较 精确解与改进欧拉方法的比较 精确解与4阶龙格库塔方法比较 结果分析:由上表和图可以看出欧拉法误差最大,而改进欧拉和龙格库塔方法误差相对较小,并且龙格库塔方法误
18、差最小且大部分值都跟精确值相同。由欧拉图与精确图相比可清晰看到,随着x的增加,函数值与精确值的偏差越来越大。5.2 选择用欧拉方法取不同步长分别求下面微分方程的初值dy/dx=y*cos(2*x )y(0)=1, x0,2。程序如下:建立函数文件cwf1.mfunction x,y=cwf1(fun,x_span,y0,h)x=x_span(1):h:x_span(2);y(1)=y0;for n=1:length(x)-1 y(n+1)=y(n)+h*feval(fun,x(n),y(n);endx=x;y=y;当h=0.05时在MATLAB输入以下程序: clear all fun=inl
19、ine( y*cos(2*x) ); x,y=cwf1(fun,0,2,1,0.05); x,y plot(x,y,r*-)结果及图像:ans =0 1.0000 0.0500 1.0500 0.1000 1.1022 0.1500 1.1563 0.2000 1.2115 0.2500 1.2673 0.3000 1.3229 0.3500 1.3775 0.4000 1.4301 0.4500 1.4800 0.5000 1.5260 0.5500 1.5672 0.6000 1.6027 0.6500 1.6318 0.7000 1.6536 0.7500 1.6677 0.8000 1
20、.6735 0.8500 1.6711 0.9000 1.6603 0.9500 1.6415 1.0000 1.6149 1.0500 1.5813 1.1000 1.5414 1.1500 1.4961 1.2000 1.4462 1.2500 1.3929 1.3000 1.3371 1.3500 1.2798 1.4000 1.2220 1.4500 1.1644 1.5000 1.1079 1.5500 1.0530 1.6000 1.0004 1.6500 0.9505 1.7000 0.9036 1.7500 0.8599 1.8000 0.8196 1.8500 0.7829
21、1.9000 0.7497 1.9500 0.72002.0000 0.6939当h=0.1时在MATLAB输入以下程序: clear all fun=inline( y*cos(2*x) ); x,y=cwf1(fun,0,2,1,0.1); x,y plot(x,y,r*-)结果及图像:ans = 0 1.0000 0.1000 1.1000 0.2000 1.2078 0.3000 1.3191 0.4000 1.4279 0.5000 1.5274 0.6000 1.6099 0.7000 1.6683 0.8000 1.6966 0.9000 1.6917 1.0000 1.6532
22、 1.1000 1.5844 1.2000 1.4912 1.3000 1.3812 1.4000 1.2629 1.5000 1.1439 1.6000 1.0306 1.7000 0.9278 1.8000 0.8381 1.9000 0.76292.0000 0.7026当h=0.5时在MATLAB输入以下程序: clear all fun=inline( y*cos(2*x) ); x,y=cwf1(fun,0,2,1,0.5); x,y plot(x,y,r*-)结果及图像:ans = 0 1.0000 0.5000 1.5000 1.0000 1.9052 1.5000 1.508
23、8 2.0000 0.7619 结果分析:根据以上的结果和图像与精确解的比较可知,步长越小,用欧拉方法所求的值就越接近精确解。5.3数值求解Lorenz方程,模拟混沌现象洛伦茨方程如下:将x,y,z表示y(1),y(2),y(3),即列向量y中三个分量。程序如下:(1)建立自定义函数用edit命令建立自定义函数名为lorenz.m的内容为:function dy=lorenz(t,y)dy=zeros(3,1); %建立一个三维列向量dy(1)=10*(-y(1)+y(2);dy(2)=28*y(1)-y(2)-y(1)*y(3);dy(3)=y(1)*y(2)-8/3*y(3)(2)用edi
24、t命令建立一个命令文件xian.m的内容为t,y=ode45(lorenz,0,30,12,2,9);%表示在030秒内求解,在零时刻设y(1)为12,y(2)为2,y(3)为9.plot(t,y(:,1) %显示y(1)即x与时间的关系图pause %暂停plot(t,y(:,2) %显示y(2)即y与时间的关系图pauseplot(t,y(:,3) %显示y(3)即z与时间的关系图pauseplot3(y(:,1),y(:,2),y(:,3); %显示三分量的关系图view(20,42); %设定一个较好的观察角度(3)求解结果在matlab窗口中执行xian.m文件,数据偏多就不显示了,
25、其图像如下:y(1)即x与时间的关系图y(2)即y与时间的关系图y(3)即z与时间的关系图显示三分量的关系图(4)用edit命令建立一个命令文件wea.m的内容为t,y=ode45(lorenz,0,30,3,7,18);%表示在030秒内求解,在零时刻设y(1)为12,y(2)为2,y(3)为9.plot(t,y(:,1) %显示y(1)即x与时间的关系图pause %暂停plot(t,y(:,2) %显示y(2)即y与时间的关系图pauseplot(t,y(:,3) %显示y(3)即z与时间的关系图pauseplot3(y(:,1),y(:,2),y(:,3); %显示三分量的关系图vie
26、w(20,42); %设定一个较好的观察角度在matlab窗口中执行wea.m文件,其图像如下: 显示三分量的关系图结果分析:当参数特定选定时,初值稍有变化,函数图像的绕法就会发生变化,也就是说微分系统对初值的敏感度相当的大,这就形成了所谓的“混沌”。6、结束语 通过这段期间的实习,我基本掌握了MATLAB语言的一些基本操作,特别是绘图功能及编程能力.由于有些知识以前没接触过,通过实习提高了我的临时自学能力,同时提高了自己抽象思维的能力和从数学模型中理解问题所在。在这次的实习中,让我明白了网络的方便与简洁,对于不懂的问题可以及时得到解决,同时我也知道了学校的图书馆原来有那么多的学习资源,以后要多去图书馆吸收知识,充实自己。参考文献:1 张圣勤.MATLAB7.0实用教程. 北京: 机械工业出版社,20042 姜健飞、胡良剑、唐俭.数值分析及其MATLAB实验上海:科学出版社,20043许波,刘征.MATLAB 工程数学应用M.北京:清华大学出版社,20004刘华杰. 分形艺术(电子版M.长沙:湖南电子音像出版社,199722