收藏 分销(赏)

MATLAB上机实验报告.docx

上传人:二*** 文档编号:4516091 上传时间:2024-09-26 格式:DOCX 页数:15 大小:43.21KB
下载 相关 举报
MATLAB上机实验报告.docx_第1页
第1页 / 共15页
本文档共15页,全文阅读请下载到手机保存,查看更方便
资源描述
MATLAB上机实验报告 专业:_姓名: 学号: 运行结果为:s= 55 例4:在区间[-2, -0.75 ]内,以步长0.25,对函数y =f (x) = l+1/x求值,并列表显示。 r=U; s=[]; forx= -2.0:0.25:-0.75 y=l+l/x; r=[rxj; s=[s y]; end [r; s]' 运行结果为 ans = -2.0000 0.5000 -1.7500 0.4286 -1.5000 0.3333 -1.2500 0.2000 -1.0000 0 -0.7500 -03333 注意:for循环不能用循环内重新给循环变量赋值来终止 for循环的循环变审;[表达式1:表达式2:表达式3],其实为一行向后。 例5:用for循环求行向量卜2,5,3,6,-2]各元素之和。 3=1-2,53,6,-2]; s=0; k=0; for n=an%显示每一次循环变量的值 k=k+l;%记录循环次数s=s+n;%计算行向量a各元素之和 end k,s%显示总的循环次数和计算结果 运行结果为 n =-2 n =5 n =3 n =6 n =-2 k=5 s=10 例6:观察以下程序的运行结果。 data=[3 9 45 6; 7 16 -1 5] k=0; for n=data%显示每一次循环变量的值 k=k+l; %记录循环次数x=n(l)-n(2) endk%显示总的循环次数 运行结果为data = 39456716-15 n =37 x =-4n =9 16x =-7 n =45-1 x= 46n =6 5x =1 k =4 例7:以for循环求1 ! +2 ! +…+10!的值。 s=0; for i=l:10P=l; for j=l:iP=P*j; end s=s+p; end s 运行结果为 s=4037913 注意:for循环可嵌套使用。 例8:比拟下面两段程序的执行情况。 (a) for n=l:10x(n)=sin(n*pi/10); end xn=l:10; x=sin(n*pi/10) 两段程序的运行结果相同,均为x = 0.30900.58780.8090 0.95111.0000 0.95110.8090 0.5878 0.30900.0000 当有一个等效的数组方法来解给定的问题时,应防止用for循环。后者执行更快,更 直观、简便(2) while 循环 for循环的循环次数往往是固定的,而while循环可不定循环次数,其一般形式为 while关系表达式 语句 end 例9:分析以下程序的功能。 num=0; EPS=1;while (1+EPS)>1 EPS=EPS/2; num=num+l; end num=num-l EPS=2*EPS 运行结果为: num =52EPS =2.2204e-016 (3)if语句if语句的一般结构是 if表达式语句1else 语句2end例10:以for循环求容差变量EPS o EPS=1; for n=l:100EPS=EPS/2; if (1+EPS)<=1 EPS=EPS*2 break end end num = n-1 运行结果为EPS =2.2204e-016 num =52 例11:试用for语句和if语句创立以下矩阵: 5 1 0 0 0 1 5 1 0 0 0 1 5 1 0 0 0 1 5 1 0 0 0 1 5 A=[]; for k=l:5 for j=l:5if k==j A(k,k)=5;elseif abs(k-j)==l A(k,j)=l;else A(k,j)=O;end end end A运行结果为 A = 5 1 0 0 0 1 5 1 0 0 0 1 5 1 0 0 0 1 5 1 0 0 0 1 5 ⑷switch语句switch语句的一般结构是 switch表达式case表达式1 语句1case表达式2 语句2case表达式n 语句notherwise 语句n+1 End 例12:试用switch语句完成卷面成绩score的转换: 80 > sco re 三 (1) score N90 分,优;(2)90 >score N80 分,良;(3)70 分,中;(4) 70 >score 260 分,及格;(5)60Vscore,不及格, score=input('请输入卷面成绩:score='); switch fix(score/10)case 9 grade='优'case 8 grade='良,case 7 grade='4q'case 6 grade:,及格, otherwisegrade:'不及格 end运行结果为:请输入卷面成绩:score=87 grade = 良 (5)try语句 try语句是MATLAB特有的语句,其一般结构是 try 语句1 catch 语句2 end 例13:某图像文件名为pic ,但不知其存储格式为.bmp还是Jpg,试编程正确 读取该图像文件。 trypicture=imread(,pic.bmp,/bmp,); filename='pic.bmp'; catch picture=imread('pic.jpg7jpg'); filename=,pic.jpg'; end filename 运行结果为 filename = pic.jpg(6)程序流的控制 1. break 语句 终止本层for或while循环,跳转到本层循环结束语句end的下一条语句。 2. return 语句 终止被调用函数的运行,返回到调用函数pause 语句 其调用格式有 (1) pause :暂停程序运行,按任意键继续。 (2) pause(n):程序暂停运行n秒后继续。 (3) pause on/off :允许/禁止其后的程序暂停。 3. continue 语句 在for循环或while循环中遇到该语句,将跳过其后的循环体语句,进行下一次循环。 6.3数据的输入与输出.键盘输入语句(input) 其调用格式有 (l)x = input('prompt'):显示提示字符串prompt,,要求用户键盘输入x的值 (2) x = inputCprompt'/s'):显示提示字符串,promp匕要求用户键盘输入字符型变量x值2.屏幕输出语句(disp) 屏幕输出最简单的方法是直接写出欲输出的变量或数组名,后面不加分号。此外,可以 采用disp语句,其调用格式为disp(x)MATLAB文件操作 (l)fopen 语句 (1) fid = fopen(filename):以只读方式翻开名为filename的二进制文件,如果文件可以 正常翻开,那么获得一个文件句柄号fid ;否那么fid=-l。 (2) fid = fopen(filename,permission):以 permission 指定的方式翻开名为 filename 的二 进制文件或文本文件,如果文件可以正常翻开,那么获得一个文件句柄号fid(非0整数)否 那么 fid =-lo (3) fclose 语句 (1) status = fclose(fid):关闭句柄号fid指定的文件。如果fid是已经翻开的文件句柄 号,成功关闭,status =0;否那么status = -1 (2) status = fclose('all'):关闭所有文件(标准的输入/输出和错误信息文件除外)。成功关 闭,status =0:否那么 status = -1例13编写函数,统计M文件中源代码的行数(注释行和空白行不计算在内)。 function y = lenm(sfile) % lenm count the code lines of a M-file, % not include the comments and blank lines s=deblank(sfile);%删除文件名sfile中的尾部空格 if length(s)<2| | (length(s)>2&&any(lower(s(end-l:end))~='.m'))s=(s;.m,];%判断有无扩展名.m,假设没有,那么加上 end if exist(s/'file')~=2;error([s/ not exist']);return;end%判断指定的m文件是否存在;假设不存在,那么显示错误信息并返回 fid=fopen(s;r');count=0;%翻开指定的 m 文件while 〜feof(fid); line=fgetl(fid);%逐行读取文件的数据if isempty(line)| | strncmp(deblanks(line),'%',l); %判断是否为空白行或注释行 continue;%假设是空白行或注释行那么执行下一次循环end count=count+l;%记录源代码的行数end y=count; %删除字符串中的首尾空格的函数 function st=deblanks(s);st=fliplr(deblank(fliplr(deblank(s)))); 以lenm.m为例,调用并验证该函数。 » sfile='lenm';» y = lenm(sfile) y= 17面向对象编程 ⑴创立类目录 创立一个新类,首先应该为其创立一个类目录。 (2)建立类的数据结构 在MATLAB中,常用结构数组建立新类的数据结构,以存储具体对象的各种数据。 ⑶创立类的基本方法 为了使类的特性在MATLAB环境中稳定而符合逻辑,在创立一个新类时,应该尽 量使用MATLAB类的标准方法。 例14:创立一个名为curve的对象。 (1)首先创立一个类目录@curve,放在 c:\my_classe 目录下,即 c:\my_classes\@curve, 通过addpath命令将类目录增加到MATLAB的搜索路径中: addpath c:\my_classes; (2)创立对象构造函数。具体如下: function c=curve(a)%curve类的对象构造函数 %c = curve创立并初始化一个curve对象%参数a为1X2的细胞数组,a{l}为函数名,a{2}为函数描述 %函数必须和fplot要求的形式相同,即y = f(x),参见fplot %如果没有传递参数,那么返回包含x轴的一个对象 if nargin==0%在此情况下为默认的构造函数c.fcn="; c.descr=";c=class(c;curve,);%返回一个不能对类方法访问的空结构curve对象 elseif isa(a, 'curve')c=a;%如果传递的参数是一个curve对象,那么返回该 对象的副本 elseif (ischar(a{l}) & ischar(a{2}))c.fcn=a{l}; c.descr=a{2};c=class(cz 'curve'); %返回一个 curve 对象 elsedispf'Curve class error #1: Invalid argument.') %如果传递的参数是错误类型,那么将给出错误信 息 End 为了画出curve对象的曲线,创立plot方法如下: function p=plotl(cz limits)% curve.plotl在limits指定的区域中画出对象curve的图形 % limits为x轴的坐标范围([xmin xmax]),% 或 x、y 轴的坐标范围([xmin xmax ymin ymax]). step=(limits(2)-limits(l))/40; x=limits(l):step:limits(2);%画出函数图形 fplot(c.fcnjimits); title(c.descr);执行以下命令: » parabola=curve({'x*x',抛物线'}) parabola = curve object: 1-by-l » plotl(parabola,[-2 2]);MATLAB程序优化 (1)预先声明数组空间。这样MATLAB就不必在每次输出结果时都重新调整数组的 大小 (2)代码向量化。向量化主要是指用向量操作代替传统的循环语句,作为面向矩阵 运算的语言 (3)在if,while和switch等语句中使用产生标量结果的条件表达式,可以加快判断语句 (4)输入/输出数据时尽量使用函数load和save,它们比低级I /0文件函数快。 (5)把程序中耗时的局部单独用C语言或Fortranc语言写成MEX文件,通常能 提高运行速度 (6) MATLAB 7.0集成开发环境是用JVM实现的。可以启动不带集成环境的 MATLAB(执行MATLAB-nojvm命令启动)以增加程序执行时的可用内存。 (7)在程序中随时清除不再使用的大数组以释放内存,例如clearA或A =[]o (8)由于MATLAB采用堆栈技术管理内存,因此为了防止内存碎片,可在程序中多 次调用函数Pack o (9)利用代码剖析工具profile全面优化程序设计。 6.4 程序调试 MATLAB提供了一系列程序调试命令,利用这些命令,可以在调试过程中设置、清除和 列出断点,逐行运行M文件,在不同的工作区检查变量,用来跟踪和控制程序的运行,帮 助寻找和发现错误。 6.5 习题.简述使用m文件与在MATLAB窗口中直接输入命令有何异同,有何优缺点 答:相同点:M文件和命令窗口一样都可以运行程序,命令是相同的 不同点:①直接输入不能保存,M文件可以保存;②直接输入遇到多语句命令时,比 较麻烦,而M文件就没有这个问题;③直接输入可以直接显示每步的结果,可以及时修改; ④M文件要运行时检查错误。⑤函数只能用M文件来写。@M文件可以重复使用,而直 接输入命令不能重复 命令窗口的优点:简单快捷又强大;缺点:可重复性低,不便于次的重复运算和程序的 修改; M文件的优点:能自己加入函数,程序,编程语言,易于寻找错误,易于修改,可储 存;缺点:需要创立文件,计算简单的数据时不如命令窗口快捷.简述脚本形式的M文件与函数形式的M文件的异同? 答:(1)相同点:脚本文件与函数文件的相同点是都具有M文件的基本特点,如保存 格式为ASCII码的形式,符合命名规那么. (2))不同点:脚本文件是命令的集中,只需输入脚本文件名,就可以一次执行所有命 令。没有输入、输出参数,没有参数传递功能,文件名可以任意取,一般需要由其他语句调 用, 函数文件的首行语句必须以function开始,有函数名,文件名必须与函数名一致,函数 空间生成的变量是局部变量。可以包含输入输出参数,有参数传递功能。 1 .编写一个函数projectl.m ,其功能是判断某一年是否为闰年。 解:function result=projectl(n) if((mod(n/4)==0 && mod(n,100)~=0 )| | (mod(n,400)==0 && mod(nz100)==0))disp(,此年是闰年为 elsedispC此年不是闰年,); end 4 .编制一个函数,使得该函数能对输入的两个数值进行比拟并返回其中的最小值解:x=input('输入数值:x='); y=input(,输入数值:y=');if x>y min=y;else min=x;end min 5 .试计算以下循环语句操作的步数。 (l)for i=-1000:1000循环次数:2001 (2)forj=l:2:20循环次数:10 6 .观察以下循环语句,计算每个循环的循环次数和循环结束之后var的值。 (1) var=l;while mod(varz10)~=0 var=var+lend var=10循环次数:9次 (2) var=2;while var<=100 var=varA2; endvar=256循环次数:3次 (3) var=3;while var>100 var=varA2;end var=3 循环次数:0次 7.假设有一整数矩阵A ,请编制一个函数,将此整数矩阵以ASCII码的整数方式储存 在文件之中。例如当矩阵A的内容如表6-6所示。 123456 那么储存于文件的内容为 123 456解:»A=[];a=l; »for k=l:2for j=l:3 A(kJ)=a;a=a+l; end end 8.先将A=magic(10)的数据以uint8的数据类型存入一个二进制文件mytest.bin中, 执行命令(write ;再执行命令fread将此魔方阵读至工作空间的一个变量。 解:A=magic(10); fid = fopenCmytest.bin'/wb'); fwrite(fid,A/uint8'); fclose(fid); fid = fopen('mytest.bin7rb'); B=fread(fid,[10/10];uint8') fclose(fid); 实验五 -‘、实验目的3 二、实验内容3 三、实验步骤3 1 . M文件的编辑3 2 .程序流程控制结构3for循环结构4 1) while循环结构5练习5 2) if-else-end 分支结构5) switc-case 结构6 3 .子函数和参数传递6练习7 4 . 局部变量和全局变量8MATLAB上机练习 6.1 M文件8 (1)脚本文件8 (2)函数文件-9MATLAB的程序控制结构 9 (2) while 循环-12 (3)if 语句12 (4)switch 语句13 (5)try 语句14 ⑹程序流的控制14数据的输入与输出14 (1)键盘输入语句 14 (2)屏幕输出语句14MATLAB文件操作 (l)fopen 语句15 (2) fclose 语句15面向对象编程15 ⑴仓犍类目录 15 (2)建立类的数据结构 15 (3)创立类的基本方法16MATLAB程序优化17 6.2 程序调试17 实验五MATLAB程序设计一、实验目的 掌握MATLAB程序设计的主要方法,熟练编写MATLAB函数。 二、实验内容 (1)M文件的编辑。 (2)程序流程控制结构。 (3)子函数调用和参数传递。 (4)局部变量和全局变量。 三、实验步骤.M文件的编辑 选择MATLA的菜单File|New|M-file,翻开新的M文件进行编辑,然后输入以下内容, 并保存文件名为expl.mo%M脚本文件 %功能:计算自然数列1〜100的数列和 s=0; for n=l:100s=s+n; end s运行结果:s= 5050 保存好文件后,在命令窗口输入expl即可运行该脚本文件,注意观察变显空间。接 着创立M函数文件,然后输入以下内容,并保存文件名exp2.m%这是M函数文件 %功能:计算自然数列1〜x的数列和 function s=exp2(x)s=0; for n=l:xs=s+n; end 保存好文件后,在命令窗口输入 »clear »s=exp2(100) open%命令可以翻开M文件进行修改 »open conv%翻开 conv 函数运行结果:s= 5050 1 .程序流程控制结构 1) for循环结构 for n=l:10n end 运行结果: n = 1 n = 2 n = 3n = 4n = 5n = 6n = 7n = 8n = 9n = 10另一种形式的for循环: n=10:-l:5 的列数 for i=n%循环的次数为向量i end 运行结果: n = 1098765i = 10i = 9i = 8i = 7i = 5while循环结构 在命令窗口输入: »clear,clc; x=l; while 1x=x*2 end运行结果: x = Infx = Inf 将会看到MATLAB进入死循环,因为while判断的值恒为真,这时须按下Ctrl +C键 来中断运行,并且可看到x的值为无穷大。 练习2) while循环结构:(1)请把exp2.m函数文件用while循环改写。 解:function s=exp2(x)s=0; n=0; while n<=xs=s+n; n=n+l; end 运行结果:exp2(100)ans =5050 (2)用兀/4 =l-l/3+l/5-l/7+…公式求兀的近似值,直到最后一项的绝对值小于10 为止,试编写其M脚本文件。 n=0; s=O;k=l;while k>10e-6 s=s+(-l)An/(2*n+l); k=l/(2*n+l); n=n+l;end pi=4*s运行结果pi = 3.1416 2) if-else-end 分支结构 if-else-end分支有如下3种形式。 (a) if表达式语句组1 end (b) if表达式语句组1 else 语句组2 end (c) if 表达式A语句组1 elseif 表达式B语句组2 elseif语句组3 else语句组n Endswitch-case 结构 创立M脚木文件exp3.m,输入以下内容并在命令窗口中运行。 %功能:判断键盘输入的数是奇数还是偶数n=input('n='); if isempty(n) error('please input n') end switch mod(n,2) case 1A』奇数' case 0A8偶数' end运行结果: n=2018 A=偶数 n=2019 A =奇数 3.子函数和参数传递x 有一个函数g(x) En! (x =1,2,3…),试编写实现该函数的函数文件。 n 1 function g=exp4(x)%主函数 g=0;for n=l:x g=g+fact(n);%调用子函数 %子函数 end function y=fact(k) y=i; for i=l:ky=y i; end 输入参数可以由函数nargin计算,下面的例子sinplot2(),当只输入一个参数w 时,sinplot2()函数会给p赋予默认值0。 function y=sinplot (w,p) if nargin>2erro(ztoo many input') end if nargin==l P=0; end x=linspace(0,2*pi,500); z=sin(x.*w+p);练习:(1)编写求矩形面积函数rect ,当没有输入参数时,显示提示信息;当只输入一个参 数时,那么以该参数作为正方形的边长计算其面积;当有两个参数时,那么以这两个参数为长 和宽计算其面积。 解: function s=rect(xzy) switch(nargin) case 0 error('illegal argument'); case 1 s=x*x; case 2 s=x*y;end (2)编写一个字符串加密函数nch=my_code(ch,x),其中ch是字符串参数,x为整 数;加密方法是:把ch的每一个字符的ASCII码值加上x ,得到的即为加密后的新的字符 串nch o由于可显示ASCH码值是有范围的(32 , 126),因此当得到的ASCII码值大于126 时,需要减去93。同理,再编写一个解码函数nch=my_dcode(ch ,x)。 提示:char(32:126)可获得ASCII码值为32〜126的字符。 解: 力口密:function nch=my_code(ch,x) nch=ch+x;if nch>126 nch=nch-95; char(nch)else char(nch)end 解码:function nch=my_code(ch,x) nch=ch-x;if (nch<32) nch=nch+95;char(nch) elsechar(nch) 4.局部变量和全局变量 自程序执行开始到退出MATLAB ,始终存放在工作空间,可被任何命令文件和数据文 件存取或修改的变量即是全局变量,全局变量可用于函数之间传递参数,全局变量用关键 字global声明。 编写一个求和的函数文件,其名为summ.m.程序如下: function s=summ global BEG END k=BEG:END; s=sum(k); 再编写调用M脚本文件use.m来调用summ.m函数文件,它们之间通过全局变量传递 参数。 程序如下: global BEG END BEG=1; END=10; sl=summ; BEG=1; END=20; s2=summ;MATLAB上机练习 6.1 M文件 (1)脚本文件 脚本文件是M文件中最简单的•种,不需要输入顿号输出参数,用命令语句可以控制 MATLAB命令工作空间的所有数据。 例1:编程计算向量元素的平均值。 >> x=input('输入向量:x=');[mzn] =size(x);%判断输入量的大小 if~((m==l)|(n==l))| ((m==l)& (n==l)) %判断输入是否为向量error('必须输入向量。,) end %计算向量x所有元素的平均值 average=sum(x)/length(x) 输入向量:x=[l 2 3]average =2 (2)函数文件 如果M文件的第一个可执行语句以function开始,该文件就是函数文件,每一个函数文件都定义一个函数。MATLAB提供的函数命令大局部都是由函数文件定义的. 例2:编写函数average_2()用于计算向量元素的平均值。 function y=average_2(x)%函数average_2(x)用以计算向量元 %素的平均值。 %输入参数x为输入向量,输出参数y%为计算的平均值。 %非向量输入将导致错误。 [m,n]=size(x); %判断输入最的大小if-((m==l)| (n==l))| ((m==l)& (n==l)) % 判断输入是否为向量 error('必须输入向量。,) y=sum(x)/length(x);%计算向量x所有元素的平均值 (3)函数调用 调用函数文件的一般格式为【输出参数表上函数名(输入参数表) 调用函数时应注意: (1)当调用一个函数时,输入和输出参数的顺序应与函数定义时的一致,其数目可以按 少于函数文件中所规定的输入和输出参数调用函数,但不能使用多于函数文件所规定的输入 和输出参数数目。 (2)在编写函数文件调用时常通过nargin、nargout函数来设置默认输入参数,并决定 用户所希望的输出参数。 (3)当函数有一个以上输出参数时,输出参数包含在方括号内。 (4)当函数有一个或多个输出参数,但调用时未指定输出参数,那么不给输出变量赋任何 值。 (5)函数有自己的独立工作空间,它与MATLAB的工作空间分开。除非使用全局变量, 函数内变量与MATLAB其他工作空间之间唯一的联系是函数的输入和输需参数。 6.2 MATLAB的程序控制结构(1) for循环 for循环允许一组命令以固定的和预定的次数重复。for循环的一般形式是 for循环控制变量=表达式1:表达式2:表达式3语句 End 例3:求$=1>的值。n从1到10 s=0; for n=l:10s=s+n; end
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服