实验02 Matlab程序操作new_第1页
实验02 Matlab程序操作new_第2页
实验02 Matlab程序操作new_第3页
实验02 Matlab程序操作new_第4页
实验02 Matlab程序操作new_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、贵州师范大学数学学院 数学实验实验02 Matlab程序设计实验目的: 1掌握脚本式M文件和函数式M文件的编写、调试和运行;2掌握从分析问题到算法设计再到程序实现的全过程。实验内容:1编写求200,300之间第一个能被21整除的整数的脚本式M文件,并给出运行的方法和结果。2编写用5次多项式拟合函数y=sin(x),x0,2的脚本式M文件,要求绘图观察拟合的效果。3编写求多项式P(x)=anxn+an-1xn-1+a1x+a0的值的函数式M文件(不能调用函数polyval),要求通过实例调试通过。4编写计算第n个Fibonnaci数的函数式M文件,并应用它求第15个Fibonnaci数。5按“题

2、目分析程序设计实现算法的程序实例应用”的步骤解决下面的问题。救援问题:假设洪水把一个村庄淹没了,只有那些比较高的房屋的屋顶露出水面,人们已经爬上屋顶等待求援。如右图,在图的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。图中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。救生船每次从大本营出发,以速度50米/分钟驶向下一个屋顶,达到一个屋顶后,救下其上的所有人,每人上船1分钟,船原路返回,达到大本营,每人下船0.5分钟。假设原点与任意一个屋顶的连线不穿过其它屋顶。假设屋顶数为50,给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。并输出所有屋顶的坐

3、标和人数。6按“题目分析程序设计算法描述实现算法的程序实例应用”的步骤解决下面的问题。奖金问题:过年了,村里要庆祝一下。村长对村里的128个村民说:做一个游戏,让每个人把出生年+月+日得到一个数。例如:1968年10月28日=1968+10+28=2006。然后把这个数报上来。村里有一笔钱要作为游戏的奖金,数额为M元。如果有人报上来的数字与M相同,就把这笔钱发给这些人。如果只有一个人得奖,奖金都归这个人。如果有多于一个人得奖,则他们平分这笔钱。请写一个程序算算都有哪些人得到了奖金?得到多少?实验仪器与软件: 1CPU主频在2GHz以上,内存在512Mb以上的PC;2Matlab 2010a及以

4、上版本。实验讲评:实验成绩: 评阅教师:2011年 月 日实验02 Matlab程序设计一、求200,300之间第一个能被21整除的整数的脚本式M文件脚本式M文件如下:clc clearfor n=100:200 %生成100到200之间的整数if rem(n,21)=0 %如果n不能被21整除continueendbreakendn 二、用5次多项式拟合函数y=sin(x),x0,2的脚本式M文件脚本式M文件如下:clcclear x=0:pi/20:2*pi;y=sin(x);p=polyfit(x,y,5)x1=0:pi/30:pi*2;y1=sin(x1);y2=polyval(p,x

5、1);plot(x1,y1,k-,x1,y2,mv)legend(原曲线,拟合曲线)三、求多项式P(x)=anxn+an-1xn-1+a1x+a0的值的函数式M文件函数式M文件程序如下:%求多项式p(x)=anxn+an-1xn-1+a1x+a0的值%n代表多项式的次数function y=polynomial(n,x)n=input(请依次输入多项式的次数n:) y=0; coe=zeros(1,n+1) for i=1:n+1 coe(i)=input(请依次输入多项式的系数:); enddisp(你输入的多项式如下:)poly2sym(coe)x=input(请输入多项式中x的值:) d

6、isp(多项式的值为:) for i=1:n+1 y=y+coe(i)*x(n+1-i);end函数式M文件已保存在可搜索途径范围内四、计算第n个Fibonnaci数的函数式M文件函数式M文件程序如下:function F=Fb(n)%计算第n个Fibonnaci数列%n表示下标F(1)=1;F(2)=1;for i=3:n F(i)=F(i-1)+F(i-2);endend函数式M文件已保存在可搜索途径范围内。五、救援问题的解决1题目分析根据题目分析可以把这个问题转化为一个简单的求和问题。可以单独计算出每个屋顶上的人到达大本营的时间,然后把所有时间相加即可。计算公式如下:totalTime=

7、 totalTime+2*(sqrt(roofx(i)2+roofy(i)2)/speen)+roofp(i)*(up+down) 其中,totalTime是要求的总时间,N是屋顶数(本题中为50),speed是船行驶的速度(本题中为50(米/分钟),roof(i)是第i个屋顶的坐标,roofp(i) 是第i个屋顶上的人数。因为要在计算后输出所有屋顶位置和人数,所以需要保存所有屋顶和人数信息。2程序设计 定义一个结构类型数组存放屋顶信息。 依次读入屋顶及其上的人数信息,并保存起来。 计算所需营救时间。 输出营救时间和所有屋顶坐标及人数。3实现算法的程序%救援问题%假设原点与任意一个屋顶的连线不

8、穿过其它屋顶。假设屋顶数为50%给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。%并输出所有屋顶的坐标和人数。clearnum=50; %屋顶数speen=50; %船速(m/min) up=1; %上船时间down=0.5; %下船时间totalTime=0; %救援总时间disp(请依次输入屋顶横坐标:) roofx=zeros(1,num); %定义一个一维数组存放屋顶的横坐标for i=1:num roofx(i)=input(x(i):);enddisp(请依次输入屋顶纵坐标:)roofy=zeros(1,num); %定义一个一维数组存放屋顶的纵坐标fo

9、r i=1:num roofy(i)=input(y(i):);enddisp(请依次输入屋顶人数:)roofp=zeros(1,num); %定义一个一维数组存放屋顶人数for i=1:num roofp(i)=input(p(i):);enddisp(第i个屋顶坐标(x,y)和人数p(i)依次为:)for i=1:num %输出屋顶坐标及人数 fprintf(%g,%g)n,roofx(i),roofy(i) fprintf(%gn,roofp(i) fprintf(n)endfor i=1:num %计算总救援时间totalTime=totalTime+2*(sqrt(roofx(i)2

10、+roofy(i)2)/speen)+roofp(i)*(up+down);enddisp(总救援时间:) %输出救援时间totalTime4实例应用在上述程序中需要重复输入50个数据才能显示运行结果。太过繁琐。所以我们只计算3个屋顶的。令:num= 2; %屋顶数speen=5; %船速(m/min) 程序运行后,依次输入6个数:1、2、3、4、5、6程序运行结果如下:%救援问题%假设原点与任意一个屋顶的连线不穿过其它屋顶。假设屋顶数为50%给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。%并输出所有屋顶的坐标和人数。clearnum=2; %屋顶数speen=5

11、; %船速(m/min) up=1; %上船时间down=0.5; %下船时间totalTime=0; %救援总时间disp(请依次输入屋顶横坐标:) roofx=zeros(1,num); %定义一个一维数组存放屋顶的横坐标for i=1:num roofx(i)=input(x(i):);enddisp(请依次输入屋顶纵坐标:)roofy=zeros(1,num); %定义一个一维数组存放屋顶的纵坐标for i=1:num roofy(i)=input(y(i):);enddisp(请依次输入屋顶人数:)roofp=zeros(1,num); %定义一个一维数组存放屋顶人数for i=1:

12、num roofp(i)=input(p(i):);enddisp(第i个屋顶坐标(x,y)和人数p(i)依次为:)for i=1:num %输出屋顶坐标及人数 fprintf(%g,%g)n,roofx(i),roofy(i) fprintf(%gn,roofp(i) fprintf(n)endfor i=1:num %计算总救援时间totalTime=totalTime+2*(sqrt(roofx(i)2+roofy(i)2)/speen)+roofp(i)*(up+down);enddisp(总救援时间:) %输出救援时间totalTime 六、奖金问题的解决1题目分析首先会想到想要把1

13、28个村民报的数字读进来,本题其实就是要求一边读一边判断这128个村民报的数字是否与M相同,如果相同就记下这个村民的编号,并累积获奖村名个数,最后记下来的获奖个数去除M,得到每个人所得的奖金数。可是事先并不知道有多少人会获奖,那么用什么样的变量来存储获奖者编号呢?如果用128个变量来存储每个村民是否获奖就太繁琐了。所以要介绍一种称为数组的数据结构来帮助解决这个问题。2程序设计可以先把村民的编号,然后用一个称为数组的数据结构来存储所有村民报的赎回自。用另一个数组存储所报数字与M相同的村民的编号。再用一个整数来存储所报数字等于M的村民的人数。3算法描述 定义一个数组存放所有的村民上报的数据。 定义

14、一个数组存放获奖者的编号(幸运者数组)。 定义一个整数存放获奖者人数。 村民顺序上报数字,其相应编号就是存放数据的数组元素下标:0,2,3。 报上数字与幸运数相等,则a、记录编号到幸运者数组中。b、获奖者人数加1。 打印出获奖者编号和获得的奖金数额。4实现算法的程序%奖金问题。clear lucky_m=2006; %幸运数字population=128; %村民人数sum_nms=0;n=0;disp(请输入population个村民报的数字:)nms=zeros(1,population);for i=1:population nms(i)=input(输入数字:);endfor i=1:

15、population sum_nms=sum_nms+nms(i);endfor i=1:population if nms(i)=lucky_m n=n+1; %统计获奖村民人数 disp(获奖村民是第i个:) i %输出是第几个村民获奖 end enddisp(共有n个村民获奖:)n disp(获奖村民获得的奖金数:)ave=sum_nms/n %获奖村民获得的奖金数5实例应用在上述程序中需要重复输入128个数据才能显示运行结果。太过繁琐。所以我们只计算10个村民的。令:lucky_m=5; %幸运数字population=10; %村民人数程序运行后,依次在主窗口中输以下10个数:1、2

16、、5、6、7、5、8、9、6、5。程序运行结果如下:%奖金问题。clear lucky_m=5; %幸运数字population=10; %村民人数sum_nms=0;n=0;disp(请输入population个村民报的数字:)nms=zeros(1,population);for i=1:population nms(i)=input(输入数字:);endfor i=1:population sum_nms=sum_nms+nms(i);endfor i=1:population if nms(i)=lucky_m n=n+1; %统计获奖村民人数 disp(获奖村民是第i个:) i %输出是第几个村民获奖 end enddisp(共有n个村民获奖:)n disp(获奖村民获得的奖金数:)ave=sum_nms/n %获奖村民获

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论