《教学课件第二节MATLAB程序设计.ppt》由会员分享,可在线阅读,更多相关《教学课件第二节MATLAB程序设计.ppt(62页珍藏版)》请在三一办公上搜索。
1、第二节 MATLAB程序设计,1 M文件2 程序控制结构3 函数文件4 程序举例5 程序调试,1 M文件1.1 M文件概述,用MATLAB语言编写的程序,称为M文件。M文件可以根据调用方式的不同分为两类:1、命令文件(也称为脚本文件)(Script File)2、函数文件(Function File)。,命令文件(Script File):命令简单罗列,使用主窗口中变量,输出也存放在主窗口对应的内存中。,函数文件(Function File):除命令罗列外,还有参数的输入和 输出操作,并且具有固定的格式。,1、首先建立命令文件并以文件名f2c.m存盘。clear;%清除工作空间中的变量 f=i
2、nput(输入华氏温度f=);c=5*(f-32)/92、然后在MATLAB的命令窗口中输入f2c,将会执行该命 令文件,执行情况为:f2c 输入华氏温度f=73 c=22.7778,例1 建立命令文件将华氏温度 f 转换为摄氏温度 c。,1.2 M文件的建立与打开,建立新的M文件 为建立新的M文件,启动MATLAB文本编辑器有3种方法:(1)菜单操作:从File菜单中选择New菜单项,再选择M-file 命令,则出现MATLAB 文本编辑器窗口。(2)命令操作:在MATLAB命令窗口输入命令edit,则启动 MATLAB文本编辑器。,M文件是一个文本文件,它可以用任何编辑程序来建立和编辑。,
3、(3)命令按钮操作:单击MATLAB主窗口工具栏上的New M-File命令按钮。,1.2.2 打开已有的M文件,打开已有的M文件,也有3种方法:(1)菜单操作:从File菜单中选择Open命令,则出现Open 对话框,在对话框中选中所需打开的M文件。(2)命令操作。在MATLAB命令窗口输入命令:edit 文件名 则打开指定的M文件。(3)命令按钮操作。单击主窗口工具栏上的Open File命令按 钮,则在弹出对话框中选择所需打开的M文件。,2 程序控制结构2.1 顺序结构普通结构数据的输入,从键盘输入数据,则可以使用input函数来进行,该函数的调用格式为:变量=input(提示信息,选项
4、);其中提示信息为一个字符串,用于提示用户输入什么样的数据。如果在input函数调用时采用s选项,则允许用户输入一个字符串;如果省略则不识别字符串。例如,想输入一个人的姓名,可采用命令:xm=input(Whats your name?,s);,数据的输出,MATLAB提供的命令窗口输出函数主要有disp函数,其调用格式为 disp(输出项1,输出项2,)其中输出项既可以为字符串,也可以为矩阵。,例2 输入x,y的值,并将它们的值互换后输出。程序如下:x=input(Input x please.);y=input(Input y please.);z=x;x=y;y=z;disp(x);di
5、sp(y);,例3 求一元二次方程ax2+bx+c=0的根。程序如下:a=input(a=?);b=input(b=?);c=input(c=?);d=b*b-4*a*c;x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a);disp(x1=,num2str(x(1),x2=,num2str(x(2);,a=?3b=?6c=?9x1=-1+1.4142i,x2=-1-1.4142i函数num2str(),把数值转化为字符串。,程序的暂停,1、暂停执行可以使用pause指令,其调用格式为:pause(延迟秒数)如:pause(3)则延时3秒 如果省略延迟时间,则将暂停程序,
6、直到用户按 任一键后程序继续执行。2、keyboard 指令没有调用参数,每次该指令出现,则用户获得操作权,程序暂停,同时命令提示符 变化为K,用户可以输入其他指令运行,如果想 继续程序的执行,只需输入return并按下回车。3、要强行中止程序的运行可使用Ctrl+break操作。,2.2 选择结构,1if语句 在MATLAB中,if语句有3种格式。(1)单分支if语句:实例:if 条件 if a30 语句组 b=a-3;end end 当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。,逻辑符号:大于,小于=,小于等于=,不等于=,
7、与&,或|。,(2)双分支if语句:实例:if 条件 if a30 语句组1 b=a-3;else else 语句组2 b=a+3;end end 当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。,程序如下:x=input(请输入x的值:);if x=0 y=(x+sqrt(pi)/exp(2);else y=log(x+sqrt(1+x*x)/2;end,例4 计算分段函数的值。,(3)多分支if语句:if 条件1 语句组1 elseif 条件2 语句组2 elseif 条件m 语句组m else 语句组n end语句用于实现多分支选择结构。
8、,if x=1 y=10;elseif(x-1)end,例5:分段函数,switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:(其中break可加可不加)switch 表达式 case 表达式1 语句组1 case 表达式2 语句组2 case 表达式m 语句组m otherwise 语句组n end,2switch语句,price 200 没有折扣 200 price500 3%折扣 500 price1000 5%折扣 1000price2500 8%折扣 2500price5000 10%折扣 5000price 14%折扣输入所售商品的价格,求其实际销售价格。,例6
9、某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用变量price来表示):,程序如下:price=input(请输入商品价格);switch fix(price/100)case 0,1%价格小于200 rate=0;%折扣比例保存变量 百分比 case 2,3,4%价格大于等于200但小于500 rate=3/100;case num2cell(5:9)%价格大于等于500但小于1000 rate=5/100;case num2cell(10:24)%价格大于等于1000但小于2500 rate=8/100;case num2cell(25:49)%价格大于等于2500但小于5000
10、 rate=10/100;otherwise%价格大于等于5000 rate=14/100;endprice=price*(1-rate)%输出商品实际销售价格,取整函数fix(),向零方向取整。fix(-0.9-0.1 1.1 1.5)ans=0 0 1 1同类函数有:四舍五入取整round()向证无穷方向取整ceil()向负无穷方向取整floor(),元胞数组(cell array):允许存放,操作各种不同类型,不同大小的数据。A=rand(2,2);B=rand(3,3);C=good;D=0;X(1,1)=A;X(1,2)=B;X(2,1)=C;X(2,2)=D celldisp(X(
11、1,1)ans1=0.9501 0.6068 0.2311 0.4860,2.3 循环结构,1for语句for语句的格式为:for 循环变量=表达式1:表达式2:表达式3 循环体语句 end 其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。,for m=100:999 m1=fix(m/100);%求m的百位数字 m2=rem(fix(m/10),10);%求m的十位数字 m3=rem(m,10);%求m的个位数字 if m=m1*m1*m1+m2*m2*m2+m3*m3*m3 disp(m)endend其中:rem为求余数,例
12、8 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。程序如下:,rem(4,3)ans=1 rem(5,3)ans=2 rem(6,3)ans=0,程序如下:y=0;n=100;for i=1:n y=y+1/(2*i-1);end,例3-9 已知,当n=100时,求y的值。,在实际MATLAB编程中,采用循环语句会降低其执行速度,所以前面的程序通常由下面的程序来代替:,n=100;i=1:2:2*n-1;y=sum(1./i);,for语句更一般的格式为:,for 循环变量=矩阵表达式 循环体语句end执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语
13、句,直至各列元素处理完毕。,例10 写出下列程序的执行结果。s=0;a=12,13,14;15,16,17;18,19,20;21,22,23;for k=a s=s+k;end disp(s);,2while语句,while语句的一般格式为:while(条件)循环体语句 end 其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。,程序如下:sum=0;和cnt=0;输入数值的个数val=input(Enter a number(end in 0):);while(val=0)sum=sum+val;cnt=cnt+1;val=input(Enter
14、a number(end in 0):);endif(cnt 0)sum mean=sum/cntend,例11 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。,3break语句和continue语句,与循环结构相关的语句还有break语句和continue语句。它们一般与if语句配合使用。,break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。,程序如下:for n=100:200 if rem
15、(n,21)=0 continue end breakendn,例12 求100,200之间第一个能被21整除的整数。,for m=1:500 s=0;for k=1:m/2 if rem(m,k)=0 s=s+k;end end if m=s disp(m);endend,4循环的嵌套 如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。,例13 若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求1,500之间的全部完数。,3 函数文件(用户自定义函数),3.1 函数文件的基本结构,函数文件由function语句引导,其基本结构为
16、:function 输出形参表=函数名(输入形参表)注释说明部分 函数体语句1、以function开头的一行为引导行,表示该M文件是一个函数文件。并且保存的文件名和函数名相同。2、函数名的命名规则与变量名相同。3、输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于一个时,则用方括号括起来。,例14 编写函数文件求半径为r的圆的面积和周长。,子函数,1、在某个函数文件中定义的其他函数,成为当前函数文件 的子函数,一般只能被当前函数文件调用。2、基本结构:在函数文件fun1.m中 function y=fun1(x1,x2)y=fun2(x1,x2);function y=fun2
17、(a,b)y=fun3(a,b);function y=fun4(e,f)各个子函数可以互相调用 y=e+f;function y=fun3(c,d)y=fun4(c,d);,例15:绘制草帽函数,3.2 函数调用,函数调用的一般格式是:输出实参表=函数名(输入实参表)注意:1、输入参数用()输入 输出参数用 输入 2、函数调用时各实参出现的顺序、个数,应与函 数定义时形参的顺序、个数一致,否则会出错。3、函数调用时,先将实参传递给相应的形参,从 而实现参数传递,然后再执行函数的功能。,s,p=fcircle(5)s=78.5398p=31.4159me,例16 利用函数的递归调用,求n!。,
18、n!本身就是以递归的形式定义的:显然,求n!需要求(n-1)!,这时可采用递归调用。递归调用函数文件factor.m如下:function f=factor(n)if n=1 f=1;else f=factor(n-1)*n;%递归调用求(n-1)!end,在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数,甚至调用它自身。一个函数调用它自身称为函数的递归调用。,factor(5)ans=120 y=factor(6);yy=720,3.3 函数参数的可调性,在调用函数时,MATLAB用两个永久变量 nargin nargout分别记录调用该函数时的输入实参和输出实参的个数。只要在
19、函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。,function fout=charray(a,b,c)if nargin=1 fout=a;elseif nargin=2 fout=a+b;elseif nargin=3 fout=(a*b*c)/2;end,例17 nargin用法示例。函数文件charray.m:,y=charray(2)y=2 y=charray(2,3)y=5 y=charray(2,3,4)y=12,例18 全局变量应用示例。定义两个函数 function y=g1(m,n)global M NM=m;N=
20、n;y=g2(1,1);,3.4 全局变量与局部变量 全局变量用global命令定义,格式为:,global 变量名,function y=g2(a,b)global M Ny=a*M+b*N;调用:g1(2,5)ans=7,3.4 程序举例,例19 猜数。首先由计算机产生1,100之间的均匀分布的一个随机整数,然后由用户猜测所产生的随机数。根据用户猜测的情况给出不同提示:如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“You win”,同时退出。用户最多可以猜7次。提示:随机数生成指令 rand,答案:,function y=play n=0;m=ceil(10
21、0*rand);if m=0 m=1;end while(nm)disp(High);elseif(xm)disp(Low);else disp(You win);n=8;end n=n+1;end if(n=7)disp(You lose);end,3.5 eval的应用,字符格式语句转换指令,运行格式如下:eval(字符串)如:b=eval(35)结果 b=3+5 x=2;b=eval(x+log(1+x)+2)结果b=x+log(1+x)+2=5.0986,eval 举例,函数文件 myfun.m 代码如下:function y=myfun(fun,a,b)%fun为字符串 x和y为输入
22、参数 y=eval(fun)在命令窗口中输入 fun=2*a+b2+3*a*b;y=myfun(fun,4,5)y=93,4 程序调试4.1 程序调试概述,一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。语法错误包括词法或文法的错误,例如函数名的拼写错、表达式书写错等。程序运行时的错误是指程序的运行结果有错误,这类错误也称为程序逻辑错误。,4.2 调试器,1Debug 该菜单项用于程序调试,需要与Breakpoints菜单项配合使用。2Breakpoints 共有6个菜单命令,前两个是用于在程序中设置和清除断点的,后4个是设置停止条件的,用于临时停止M文件的执行,并给用户
23、一个检查局部变量的机会,相当于在M文件指定的行号前加入了一个keyboard命令。,例:求素数,矩阵参数操作,n=rank(A)n 是矩阵 A的秩x=det(A)x 是矩阵 A的行列式x=size(A)x 是由2个元素组成的行向 量,分别为行和列数x=length(v)x 是向量v的长度x=trace(A)x是矩阵A的迹(对角元素之和)x=norm(A)x 是向量或矩阵A的范数,矩阵操作,A=magic(n)A为 n n 的魔方矩阵A=diag(v)生成以向量v各元素为对角线的矩阵 v=diag(A)生成以矩阵A各对角元素组成的向量X=tril(A)X 是矩阵A的下三角阵(包含对角线)X=tr
24、iu(A)X 是矩阵A的上三角阵(包含对角线),矩阵操作,v=max(A)v 是矩阵A各列最大值组成的向量,如果A为向量,则v为最大值。v=min(A)v对应最小值,用法同max v=sum(A)v为求和操作,用法同maxv=mean(A)v为均值操作,用法同max A=sort(A,s)升序排序操作,s=1,逐列 s=2,逐行 V=median(A,s)求中间值操作,s的值同sortv=find(表达式)返回满足表达式条件的所有元素的序号,常用函数,char 将数值转换为对应字符 如:char(76)=Lsetstr 同char,在matlab7.0中被char代替 int2str 将整数转
25、换为字符串 如:int2str(76)=76 num2str 可以转换小数,且可以设置有效数位数 num2str(1/11,4)=0.09091str2num 将字符串转换为数字 如:a=str2num(23.2)upper lower 将大小写互相转换 如:lower(A)=a,a=1 2 2;norm(a)ans=3 A=magic(3)A=8 1 6 3 5 7 4 9 2 max(A)ans=8 9 7,a=3 2 1 5 4;b=find(a=3)b=1 4 5 char(76)ans=L num2str(1/11,4)ans=0.09091,练习1:,1、求21到37,所有能被3或
26、5整除的数组成的向量。2、A=1 3 5 求矩阵的秩、矩阵的迹 2 3 4 判断矩阵是否奇异 1 3 4 判断矩阵是否正定3、求矩阵最大元素判断算法,并由输入的矩阵验证,要求矩阵的大小任意。4、求100以内的所有质数。5、对1 2 3 6 11 20 37,分析其后续值求法程 序,并写出100以内的所有数。6、求题目2中矩阵A的所有元素之和。,练习2:,1、编制function文件round.m,输入参数为半径r,输出 参数为圆的周长L和面积S。2、设原定有10人参加比赛,但是实际参加比赛的人数难 以事先确定,试编制一个函数文件bisai.m,自己规定 输入和输出参数,无论参加人数如何都可以按照从高 到低的顺序输出分数序列。3、编制程序qiujie.m,输入方程组Ax=b的系数矩阵A和 向量b,则返回当前方程组的解的状况(唯一解、多解、无解),且如果有唯一解,则解出唯一解并输出。,练习3:,1、编制一个计算器程序jisuanqi.m,以子程序的方式实现 加、减、乘、除、开方、平方等等操作。具体的操作类型和需要的数据以输入参数的形式由主 函数输入并传递给子函数。提示:考虑global 和 nargin 的使用。,