实验02 Matlab程序操作

更新时间:2024-03-11 13:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

贵州师范大学数学学院 数学实验

实验02 Matlab程序设计

实验目的:

1.掌握脚本式M文件和函数式M文件的编写、调试和运行;

2.掌握从分析问题到算法设计再到程序实现的全过程。

实验内容:

1.编写求[200,300]之间第一个能被21整除的整数的脚本式M文件,并给出运行的方法和结果。

2.编写用5次多项式拟合函数y=sin(x),x∈[0,2π]的脚本式M文件,要求绘图观察拟合的效果。

3.编写求多项式P(x)=anxn+an-1xn-1+…+a1x+a0的值的函数式M文件(不能调用函数polyval),要求通过实例调试通过。

4.编写计算第n个Fibonnaci数的函数式M文件,并应用它求第15个Fibonnaci数。

5.按“题目分析→程序设计→实现算法的程序→实例应用”的步骤解决下面的问题。

救援问题:假设洪水把一个村庄淹没了,只有那些比较高的房屋的屋顶露出水面,人们已经爬上屋顶等待求援。如右图,在图的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。图中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。救生船每次从大本营出发,以速度50米/分钟驶向下一个屋

顶,达到一个屋顶后,救下其上的所有人,每人上船1分钟,船原路返回,达到大本营,每人下船0.5分钟。假设原点与任意一个屋顶的连线不穿过其它屋顶。假设屋顶数为50,给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。并输出所有屋顶的坐标和人数。

班级:数用(2班) 姓名:李锦标 学号: 53 - 1 -

贵州师范大学数学学院 数学实验

6.按“题目分析→程序设计→算法描述→实现算法的程序→实例应用”的步骤解决下面的问题。

奖金问题:过年了,村里要庆祝一下。村长对村里的128个村民说:做一个游戏,让每个人把出生年+月+日得到一个数。例如:1968年10月28日=1968+10+28=2006。然后把这个数报上来。村里有一笔钱要作为游戏的奖金,数额为M元。如果有人报上来的数字与M相同,就把这笔钱发给这些人。如果只有一个人得奖,奖金都归这个人。如果有多于一个人得奖,则他们平分这笔钱。请写一个程序算算都有哪些人得到了奖金?得到多少?实验仪器与软件:

1.CPU主频在2GHz以上,内存在512Mb以上的PC;

2.Matlab 2010a及以上版本。 实验讲评:

实验成绩:

评阅教师: 2011年 月

班级:数用(2班) 姓名:李锦标 学号: 53 - 2 -

日贵州师范大学数学学院 数学实验

实验02 Matlab程序设计

一、求[200,300]之间第一个能被21整除的整数的脚本式M文件 脚本式M文件如下: clc clear

for n=100:200 %生成100到200之间的整数 if rem(n,21)~=0 %如果n不能被21整除 continue end break end n

二、用5次多项式拟合函数y=sin(x),x∈[0,2π]的脚本式M文件 脚本式M文件如下: clc clear

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,x1);

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

班级:数用(2班) 姓名:李锦标 学号: 53 - 3 -

贵州师范大学数学学院 数学实验

coe(i)=input('请依次输入多项式的系数:'); end

disp('你输入的多项式如下:') poly2sym(coe)

x=input('请输入多项式中x的值:') disp('多项式的值为:') 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);

end end

函数式M文件已保存在可搜索途径范围内。 五、救援问题的解决 1.题目分析

根据题目分析可以把这个问题转化为一个简单的求和问题。可以单独计算出每个屋顶上的人到达大本营的时间,然后把所有时间相加即可。计算公式如下: totalTime=

totalTime+2*(sqrt(roofx(i)^2+roofy(i)^2)/speen)+roofp(i)*(up+down) 其中,totalTime是要求的总时间,N是屋顶数(本题中为50),speed是

班级:数用(2班) 姓名:李锦标 学号: 53 - 4 -

贵州师范大学数学学院 数学实验

船行驶的速度(本题中为50(米/分钟)),roof(i)是第i个屋顶的坐标,roofp(i) 是第i个屋顶上的人数。因为要在计算后输出所有屋顶位置和人数,所以需要保存所有屋顶和人数信息。 2.程序设计

⑴ 定义一个结构类型数组存放屋顶信息。

⑵ 依次读入屋顶及其上的人数信息,并保存起来。 ⑶ 计算所需营救时间。

⑷ 输出营救时间和所有屋顶坐标及人数。

3.实现算法的程序 %救援问题

%假设原点与任意一个屋顶的连线不穿过其它屋顶。假设屋顶数为50 %给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。

%并输出所有屋顶的坐标和人数。 clear

num=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):'); end

disp('请依次输入屋顶纵坐标:')

roofy=zeros(1,num); %定义一个一维数组存放屋顶的纵坐标 for i=1:num

roofy(i)=input('y(i):'); end

disp('请依次输入屋顶人数:')

roofp=zeros(1,num); %定义一个一维数组存放屋顶人数 for i=1:num

班级:数用(2班) 姓名:李锦标 学号: 53 - 5 -

贵州师范大学数学学院 数学实验

roofp(i)=input('p(i):'); end

disp('第i个屋顶坐标(x,y)和人数p(i)依次为:') for i=1:num %输出屋顶坐标及人数 fprintf('(%g,%g)\\n',roofx(i),roofy(i)) fprintf('%g\\n',roofp(i)) fprintf('\\n') end

for i=1:num %计算总救援时间

totalTime=totalTime+2*(sqrt(roofx(i)^2+roofy(i)^2)/speen)+roofp(i)*(up+down); end

disp('总救援时间:') %输出救援时间 totalTime

4.实例应用

在上述程序中需要重复输入50个数据才能显示运行结果。太过繁琐。 所以我们只计算3个屋顶的。 令:

num= 2; %屋顶数 speen=5; %船速(m/min) 程序运行后,依次输入6个数:1、2、3、4、5、6 程序运行结果如下: %救援问题

%假设原点与任意一个屋顶的连线不穿过其它屋顶。假设屋顶数为50 %给定屋顶数以及每个屋顶的坐标和人数,求出所有人都到达大本营并登陆所用的时间。

%并输出所有屋顶的坐标和人数。 clear

num=2; %屋顶数 speen=5; %船速(m/min) up=1; %上船时间 down=0.5; %下船时间 totalTime=0; %救援总时间 disp('请依次输入屋顶横坐标:')

班级:数用(2班) 姓名:李锦标 学号: 53 - 6 -

贵州师范大学数学学院 数学实验

roofx=zeros(1,num); %定义一个一维数组存放屋顶的横坐标 for i=1:num

roofx(i)=input('x(i):'); end

disp('请依次输入屋顶纵坐标:')

roofy=zeros(1,num); %定义一个一维数组存放屋顶的纵坐标 for i=1:num

roofy(i)=input('y(i):'); end

disp('请依次输入屋顶人数:')

roofp=zeros(1,num); %定义一个一维数组存放屋顶人数 for i=1:num

roofp(i)=input('p(i):'); end

disp('第i个屋顶坐标(x,y)和人数p(i)依次为:') for i=1:num %输出屋顶坐标及人数 fprintf('(%g,%g)\\n',roofx(i),roofy(i)) fprintf('%g\\n',roofp(i)) fprintf('\\n') end

for i=1:num %计算总救援时间

totalTime=totalTime+2*(sqrt(roofx(i)^2+roofy(i)^2)/speen)+roofp(i)*(up+down); end

disp('总救援时间:') %输出救援时间 totalTime

六、奖金问题的解决 1.题目分析

首先会想到想要把128个村民报的数字读进来,本题其实就是要求一边读一边判断这128个村民报的数字是否与M相同,如果相同就记下这个村民的编号,并累积获奖村名个数,最后记下来的获奖个数去除M,得到每个人所得的奖金数。

可是事先并不知道有多少人会获奖,那么用什么样的变量来存储获奖者编

班级:数用(2班) 姓名:李锦标 学号: 53 - 7 -

贵州师范大学数学学院 数学实验

号呢?如果用128个变量来存储每个村民是否获奖就太繁琐了。所以要介绍一种称为数组的数据结构来帮助解决这个问题。 2.程序设计

可以先把村民的编号,然后用一个称为数组的数据结构来存储所有村民报的赎回自。用另一个数组存储所报数字与M相同的村民的编号。再用一个整数来存储所报数字等于M的村民的人数。 3.算法描述

⑴ 定义一个数组存放所有的村民上报的数据。 ⑵ 定义一个数组存放获奖者的编号(幸运者数组)。 ⑶ 定义一个整数存放获奖者人数。

⑷ 村民顺序上报数字,其相应编号就是存放数据的数组元素下标: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('输入数字:'); end

for i=1:population

sum_nms=sum_nms+nms(i); end

for i=1:population if nms(i)==lucky_m

班级:数用(2班) 姓名:李锦标 学号: 53 - 8 -

贵州师范大学数学学院 数学实验

n=n+1; %统计获奖村民人数 disp('获奖村民是第i个:')

i %输出是第几个村民获奖 end end

disp('共有n个村民获奖:') n

disp('获奖村民获得的奖金数:')

ave=sum_nms/n %获奖村民获得的奖金数

5.实例应用

在上述程序中需要重复输入128个数据才能显示运行结果。太过繁琐。

所以我们只计算10个村民的。 令:

lucky_m=5; %幸运数字 population=10; %村民人数

程序运行后,依次在主窗口中输以下10个数:1、2、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('输入数字:'); end

for i=1:population

sum_nms=sum_nms+nms(i); end

for i=1:population if nms(i)==lucky_m

n=n+1; %统计获奖村民人数 disp('获奖村民是第i个:')

i %输出是第几个村民获奖 end end

班级:数用(2班) 姓名:李锦标 学号: 53 - 9 -

贵州师范大学数学学院 数学实验

disp('共有n个村民获奖:') n

disp('获奖村民获得的奖金数:')

ave=sum_nms/n %获奖村民获得的奖金数

七、实验总结

通过这次实验你掌握了什么,学会什么,哪些是重点掌握和加以注意的。 在本次实验中我能更进一步的掌握MATLAB的程序设计和编写,掌握了脚本式文件和函数式文件的区别与联系,特别是在保存和调用函数式文件时总是出现问题,但是经过这次实验以后自己就能够熟练的应用。但是对于后面的数学模型题,我根本找不到下手的地方,很难找到题目的开口,导致实验不能全不独立完成,在以后的学习中,应该多加强这方面的练习,多看一些数学模型题来提高自己的解题能力。

班级:数用(2班) 姓名:李锦标 学号: 53 - 10 -

本文来源:https://www.bwwdw.com/article/9wz8.html

Top