资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,.,*,第5章 程序设计和M文件,5.1 程序控制,5.2 M文件结构,5.3 函数的使用,5.4 程序的调试,5.5 匿名函数、inline对象和函数句柄,5.6 函数绘图,5.7 数值分析,.,5.1 程序控制,三种常用的结构:,顺序结构、分支结构和循环结构。,4种程序流程控制语句:,分支控制语句、循环控制语句、错误控制语句和流程控制语句。,.,5.1.1 分支控制语句,实现满足一定条件就执行相应分支的功能。,1.if 结构,if,条件1,语句段1,elseif,条件2,语句段2,.,else,语句段n,end,.,例51,x=-5:0.1:5;,if x=1,y=x.2-1;,elseif -1x1,y=0;,else,y=-x.2-1;,end,plot(x,y);,.,2.switch 结构,常用于各种条件的列举。,switch,表达式,case,值1,语句段1,case,值2,语句段2,.,otherwise,语句段n,end,说明:,(1),表达式只能是标量或字符串;,(2),case后面的值可以是标量、字符串或元胞数组;,(3),switch和end必须配对使用。,.,例5-2,使用switch结构判断学生成绩的等级,90分以上为优,8090为良,7080为中,6070为及格,60分以下为不及格。,score=98;,s1=fix(score/10);,%取十位数,switch,s1,case,9,10,s=优,case,8,s=良,case,7,s=中,case,6,s=及格,otherwise,s=不及格,end,s=,优,.,5.1.2 循环控制语句,实现将某段程序重复执行。,1.for循环,for,循环变量=array,循环体,end,说明:array可以是向量也可以是矩阵,循环执行的次数就是array的,列数,,每次循环中循环变量依次取array的各列并执行循环体,直到array所有列取完。,练习,.,for n=1:5%循环5次,for n=-1:0.1:1%循环21次,for n=linspace(-2*pi,2*pi,5)%循环5次,a=eye(2,3);for n=a%循环3次,n为列向量,例53,x=eye(5);,len=length(x),for,n=1:len,x(n,n)=n,end,len=5,x=1 0 0 0 0,0 1 0 0 0,0 0 1 0 0,0 0 0 1 0,0 0 0 0 1,x=1 0 0 0 0,0 2 0 0 0,0 0 1 0 0,0 0 0 1 0,0 0 0 0 1,x=,1 0 0 0 0,0 2 0 0 0,0 0 3 0 0,0 0 0 4 0,0 0 0 0 5,.,or:,x=eye(5);,for n=1:length(x),x(n,:)=x(n,:)*n,end,.,2.while循环,常用于预先知道循环条件或循环结束条件的情况。,while,条件表达式,循环体,end,例5-4,使用while循环计算,f(x)=sin(x),,x5且每次x递增ln(x)。,x=0.1;,while,x1000时终止计算。,x=0:10;,for,n=x,f=exp(n);,if,f1000,break,end,end,n=,7,f=,1.0966e+003,.,例5-6,使用for循环将字符串中的数值取出,遇到非数值则跳过。,str=The result is 100.;,len=length(str);,s=;,for,n=1:len,if,str(n)9|str(n)=0&str(n)a=1 3 5;,b=1 2 3;,try,c=a.*b,catch,c=a.*b;,end,c,c=,1 6 15,lastmsg,lastid=lasterr,lastmsg=,Error using=times,Matrix dimensions must agree.,lastid=,MATLAB:dimagree,.,例5-7-2,a=1 2 3,b=4 5 6,try,c=a*b;,disp(try is excute),catch,c=a.*b;,disp(catch is excute),end,c,.,5.1.4 流程控制命令,1.return命令,return,命令:,(1)用于结束程序的执行,并立即返回到上一级调,用函数,(2)终止键盘方式,注意:,当程序进入死(无限)循环时,则按Ctrl+break键来终止程序的运行。,2.keyboard命令,keyboard,命令用来使程序暂停运行,等待键盘命令,命令窗口出现“K”提示符,当键盘输入“,return,”后,程序才继续运行。keyboard命令可以用来在程序调试或程序执行时修改变量。,.,a=1 3 5;,keyboard,try,c=a.*b;,catch,c=a.*b;,end,c,.,3.input命令,a=input(Place enter a data:);,r=input(str,s),%从键盘中输入字符串保存到变量r,4.disp命令,disp命令是较常用的显示命令,常用来显示字符串型的信息提示。,5.pause命令,pause命令用来使程序暂停运行,当用户按任意键才继续执行。常用于程序调试或查看中间结果,也可以用来控制执行的速度。pause的命令格式如下:,pause(n),%暂停n秒,练习,.,5.2,M,文件结构,MATLAB 7.3的程序如果要保存则使用扩展名是“.m”的M文件,M文件有两种即M脚本文件(Script File)和M函数文件(Function File)。,.,5.2.1 M文件的一般结构,1.函数声明行,函数声明行是在M函数文件的第一行,只有M函数文件必须有,以“,function,”引导并指定函数名、输入和输出参数,M脚本文件没有函数声明行。,2.H1行,H1行是帮助文字的第一行。,3.帮助文本,4.程序代码,程序代码由MATLAB语句和注释语句构成。,.,5.2.2 M脚本文件和M函数文件,1.M脚本文件,格式:通常为一连串指令,没有函数声明行,无输入和输出参数.,M脚本文件的说明:,(1)运行脚本文件时,只是简单地按顺序从文件中读取一条条命令,送到MATLAB命令窗口中去执行;,(2)M脚本文件运行产生的变量都驻留在,MATLAB的基本工作空间中,,在命令窗口中运行的命令可以使用这些变量;,(3)脚本文件的命令可以访问工作空间的所有数据,因此要,注意避免工作空间和脚本文件中的同名变量相互覆盖,,一般在M脚本文件的开头使用“clear”命令清除工作空间的变量。,.,例5-8,在M文件编辑调试器窗口中编写M脚本文件得出10 50范围内的所有素数。,%EX5_8 计算1050内的素数,clear,y1=primes(50);,%获得50以内的所有素数,n=length(primes(10);,%获得10以内素数的个数,y=y1(n+1:end),在命令窗口中输入:,ex5_8,y=,11 13 17 19 23 29 31 37 41 43 47,在工作空间中就可以查看到变量y1、n和y,并可以修改和使用这些变量。,练习,PRIMES(N),is a row vector of the prime numbers less than or,equal to N.A prime number is one that has no factors other,than 1 and itself.,.,2.M函数文件,格式:有函数声明行,可以输入参数和输出参数。,M函数文件的说明如下:,(1),M函数文件在运行过程中产生的变量都存放在,函数本身的工作空间,中。函数的工作空间随具体的M函数文件调用而产生,并随调用结束而删除,如果运行多个函数则产生多个临时的函数工作空间;,(2)当文件执行完最后一条命令或遇到“return”命令时就结束函数文件的运行,同时函数工作空间的变量被清除;,(3)一个M函数文件至少要定义一个函数。,.,函数声明行的格式:,function,输出参数列表=,函数名,(输入参数列表),说明:,函数名是函数的名称,保存时最好函数名与文件名一致,当不一致时,MATLAB以文件名为准;,输入参数列表是函数接收的输入参数,多个参数间用“,”分隔;,输出参数列表是函数运算的结果,多个参数间用“,”分隔。,.,函数定义的形式举例:,定义多输入输出参数的函数,function x,y,z=sphere(theta,phi,rho),无输入参数的函数,function y=sphere,(or sphere(),无输出参数的函数,function sphere(x),(or function=sphere(x),.,例5-9,将例5-7的计算行向量乘积的运算使用M函数文件保存。,function,c=ex5_9(a,b),%EX5_9(a,b)returns the product of a and b,%c is the product,%a is the multiplier,%b is the multiplicand,%copyright 2007-10-01,try,c=a.*b;,catch,c=a.*b;,end,调用该函数:,z=ex5_9(1 2 3,4 5 6),z=,4 10 18,.,例:,function,distance=dist2(x1,y1,x2,y2),%DIST2 Calculate the distance between two points,%Function DIST2 calculates the distance between,%two points(x1,y1)and(x2,y2)in a Cartesian coordinate system.,%Calling sequence:,%res=dist2(xl,y1,x2,y2),%Define variables:,%x1-x-position of point 1,%y1-y-position of point 1,%x2-x-position of point 2,%y2-y-position of point 2,%distance-Distance between points,%Record of revisions:,%Date Programmer Description of change,%12/15/98 S.J.Chapman Original code,%Calculate distance.,distance=sqrt(x2-x1).2+(y2-y1).2);,.,使用该函数的脚本文件如下:,%Script file:test_dist2.m,%Purpose:,%This program tests function dist2.,%Record of revisions:,%Date Programmer Description of change,%12/15/98 S.J.Chapman original code,%Define variables:,%ax-x-position of point a,%ay-y-position of point a,%bx-x-position of point b,%by-y-position of point b,%result-Distance between the points,.,%Get input data.,disp(Calculate the distance between two points:);,ax=input(Enter x value of point a:);,ay=input(Enter y value of point a:);,bx=input(Enter x value of point b:);,by=input(Enter y value of point b:);,%Evaluate function,result=dist2(ax,ay,bx,by);,%Write out result.,fprintf(,The distance between points a and b is%fn,result);,.,直接在命令窗口调用该函数:,test_dist2,Calculate the distance between two points:,Enter x value of point a:,1,Enter y value of point a:,1,Enter x value of point b:,4,Enter y value of point b:,5,The distance between points a and b is 5.000000,.,help dist2,DIST2 Calculate the distance between two points,Function DIST2 calculates the distance between,two points(xl,yl)and(x2,y2)in a Cartesian,coordinate system.,Calling sequence:,res=dist2(xl,y1,x2,y2),.,5.3 函数的使用,模块化程序设计:,将一个大任务分成若干小的子任务,用一个一个的函数完成这些子任务,通过函数间的调用完成复杂任务.,优点:,易于维护和修改程序.,注意:,主函数可以调用子函数,子函数可以调用其他子函数或本身,但子函数不能调用主函数.,.,5.3.1 主函数和子函数,一个M函数文件中可以包含一个或多个函数.,1.主函数,主函数是出现在文件最上方的函数,即第一行声明的函数.一个M文件只能有一个主函数,通常主函数名与M函数文件名相同。,2.子函数,(1)子函数的,次序无任何限制,;,(2)子函数只能被,同一文件中,的函数(主函数或子函数)调用,不能被其它文件的函数调用;,(3)同一文件的主函数和子函数运行时的,工作空间是相互独立的,。,eg.ex5_10,.,5.3.2 函数的输入输出参数,Matlab函数调用过程实际上也是参数的传递过程.,函数A调用了函数B,称A为“主调函数”,而B为“被调用函数”.,函数通过输入参数接收数据,经函数运算后由输出参数输出结果.,.,1.参数的传递,函数的参数传递是将主调函数中的变量值传给被调函数的输入参数。,(1)函数参数传递的是,数值,;,(2)参数的存储空间:被调函数的输入参数存放在函数的工作空间中,与MATLAB的工作空间是独立的,当调用结束时函数的工作空间被清除,输入参数就消失了。,eg.ex5_10,.,2.输入输出参数的个数,Matlab中调用函数时的参数个数和函数声明时的不一定相同,可用专用函数确定实际调用时输入输出参数的个数。,(1)nargin和nargout,函数,nargin(fun),%获取函数fun的输入参数个数,nargout(fun),%获取函数fun的输出参数个数,说明:,fun是函数名,当nargin和nargout函数在函数体内时fun可省略,在函数外时fun不省略。,.,补充:可选参数,MATLAB的许多函数有可选参数,它们如何判断用到了哪些参数以及进行了什么操作呢?,可以用,8个特殊函数,来获得可选参数的信息,及报告参数中的错误.,.,nargin,该函数返回调用函数时实际用的输入参数的个数.,nargout,该函数返回调用函数时实际用的输出参数的个数.,nargchk,当调用函数时用了太少或太多输入参数时,该函数返回一个标准的错误信息.,error,当参数有致命错误时,显示错误信息并异常中断产生错误的函数.,warning,当参数无致命错误时,显示警告信息且函数继续执行.,inputname,该函数根据参数个数返回实际的变量名.,.,help,nargchk,NARGCHK Validate(验证)number of input arguments.,MSG=NARGCHK(LOW,HIGH,N),returns an appropriate error message string if N is not between,LOW,and,HIGH,.If it is,NARGCHK returns an empty matrix.,Example:,error(nargchk(1,3,nargin,struct),.,eg.使用可选参数,function,mag,angle=polar_value(x,y),%POLAR_VALUE Converts(x,y)to(r,theta),%Function POLAR_VALUE converts an input(,x,y,),%value into(r,theta),with theta in degrees.,%It illustrates the use of optional arguments,%Define variables:,%angle-Angle in degrees,%msg-Error message,%mag-Magnitude,.,%x-Input x value,%y-Input y value(optional),%Record of revisions:,%Date Programmer Description of change,%12/16/98 S.J.Chapman original code,%Check for a legal number of input arguments.,msg=nargchk(1,2,nargin);,error(msg);,.,%If the y argument is missing,set it to 0.,if,nargin mag angle=polar_value,?Error using=polar-value,Not enough input arguments.,mag angle=polar_value(1,-1,1),?Error using=polar value,Too many input arguments.,mag angle=polar_value(1),mag=1,angle=0,.,mag angle=polar_value(1,-1),mag=1.4142,angle=-45,mag=polar_value(1,-1),mag=1.4142,mag angle=polar_value(0,0),Warning:Both x and y are zero:angle is meaningless!,In d:bookmatlabchap5polar_value.m at line 32,mag=0,angle=0,.,(2)varargin和varargout,函数,用于处理复杂输入输出参数,varargin和varargout函数需要与分支结构结合使用,将函数调用时实际传递的参数构成元胞数组,通过访问元胞数组中各元素内容来获得输入输出变量。,格式:,function y=fun(varargin),%输入参数为varargin的函数fun,function varargout=fun(x),%输出参数为varargout的函数fun,function varargout=fun(varargin),.,5.3.3 局部变量、全局变量和静态变量,变量的作用域和生存期:作用域是变量的作用范围,生存期是变量的生存时间。,根据变量作用域的不同,可将其分为局部变量和全局变量。,根据变量生存期的不同,可将其分为自动变量和静态变量。,注意:函数名与同一作用域的变量名不能重复,否则函数无法被调用.,.,1.局部变量,局部变量(Local Variables)的作用范围是定义该变量的函数内部。,声明局部变量:不需要特别声明,变量的存储:在独立的函数工作空间中,变量结束:变量所在的函数执行完毕时。,.,2.全局变量,全局变量具有全局作用域,可在不同函数和Matlab工作空间中共享。,作用:减少参数传递过程,提高程序执行效率。,缺点:全局变量在任何定义过的函数中都可以修改,使用时应十分小心。,.,(1)声明全局变量,全局变量在使用前必须用“,global,”声明,而且每个要共享全局变量的函数和工作空间,都必须逐个用“global”对该变量加以声明。,(2)清除全局变量,使用clear命令,命令格式如下:,clear global 变量名,%清除某个全局变量,clear global,%清除所有的全局变量,eg.li5_13,.,3.静态变量,格式:,persistent,x;,注意:它只能在function里声明,且只有这个function才能认识它.,声明后需初始化,注意不能直接赋值;而是先用isempty(x)判断x是否已经赋值,若没有,则可以赋值给x。,如:function y=test(),persistent,a;if isempty(a)a=0;end a=a+1;y=a;,之后第一次调用y=test;结果y=1,第二次调用y=test;结果y=2。就是说a记录了每次调用function后的结果。,如果a为自动变量,则每次调用y=test后结果都是1.,.,5.3.4 嵌套函数、私有函数和重载函数,1.嵌套函数,在MATLAB中一个函数的内部还可以定义一个或多个函数,这种定义在其他函数内部的函数就称为嵌套函数。此时,每个函数必须用end结束。,调用原则:,(1)外层函数可以调用内一层函数,但不能隔层调用;,(2)同层嵌套函数可以互相调用,(3)内层函数可以调用外一层函数及和外层函数同层的其他函数。,.,function A(x),function B(x,y),function C(z),end,end,function D(x),function E(z,y),end,end,end,A可以调用:B,D,B可以调用:C,D,A,C可以调用:B,D,E,D可以调用:E,B,A,E可以调用:D,B,C,.,2.私有函数,私有函数是限制访问权限的函数,私有函数存放在“private”子目录中,只能被其直接父目录的M函数文件所调用。,3.重载函数,重载函数是指两个函数使用相同的名称,处理的功能相似,但参数类型或个数不同,重载函数通常放在不同的文件夹下,文件夹名称以“”开头后面跟一个数据类型名。,.,5.3.5 函数的工作过程和P码文件,1.函数的搜索过程,当在MATLAB中输入一个标识符时,首先确认是不是变量名,若不是,则做如下搜索:,检查是否是本M函数文件内部的子函数;,检查是否是“private”目录下的私有函数;,检查是否在当前路径中;,检查是否在搜索路径中。,.,2.P码文件,P码就是伪代码(Pseudocode),一个M文件第一次被调用时,MATLAB就将其进行编译并生成P码文件存放在内存中,生成的P码文件与原M文件名相同,其扩展名为“.p”,P码文件的保密性好。,pcode File1.m,File2.m.-inplace%生成File1.p,File2.p文件,.,3.函数的工作空间,每一个M函数运行时都有一个内存区,称为函数的工作空间。,清除函数的工作空间:,clear functions,%清除所有编译过的M函数文件和MEX文件工作空间,clear function funname,%清除某个编译过的函数工作空间,.,5.4 程序的调试5.4.1 直接检测,(1)对于需要检测的变量可以通过删除语句行末尾的分号,或在程序的适当位置加显示变量值的语句,将结果显示在命令窗口中;,(2)以脚本文件的方式来执行该函数。调试函数时,可以将该函数的第一句函数声明行前加“%”,并给输入参数赋值;,(3)在程序的适当位置添加“keyboard”语句,当程序运行至此句会暂停运行,并在命令窗口显示“k”提示符,这时就可以在命令窗口查看和修改各变量的内容。,.,5.4.2 M文件编辑调试器窗口,1.“Debug”菜单,(1)Step(F10),(2)Step in(F11)和Step out(shift+F11),(3)Run/Continue(F5),(4)Set/Clear Breakpoints(F12),(5)Set/Modify Conditional Breakpoint,(6)Stop if Errors/Warnings,(,7,),Exit Debug Mode,.,5.5 匿名函数、inline对象和函数句柄5.5.1 匿名函数,匿名函数是面向命令行代码的函数形式,通常只有一句很简单的语句。,fhandle=(arg1,arg2,.)(expr),%创建匿名函数,说明:,fhandle是函数句柄;arg1,arg2,.是参数列表,也可以省略;expr是函数表达式。,例:5-16,fhnd1=(x)(1+exp(-x);,%,创建匿名函数,rf1=fhnd1(2),%,调用匿名函数,rf1=,1.1353,.,5.5.2 inline,对象,创建inline对象就是使用inline函数将字符串转换成inline对象。,inline_fun=inline(string,arg1,arg2,),%,创建,inline,对象,例:,5-17,f=inline(sin(x)*exp(-z*x),x,z),%,创建,inline,对象,f,class(f),%,查看,f,的类型,ans=,inline,y1=f(1,2),%,调用,inline,对象,f,y1=,0.1139,y2=feval(f,1,2),y2=,0.1139,.,5.5.3,函数句柄,函数句柄(,Function_Handle,)包含了函数的路径、函数名、类型以及可能存在的重载方法,,即函数是否为内部函数、,M,或,P,文件、子函数、私有函数等,。,1.,创建函数句柄,fhandle=fun,%创建函数句柄,2.,函数句柄的调用,y1,y2,=fhandle(arg1,arg2),%调用函数句柄fhandle,y1,y2,=feval(fhandle,arg1,arg2),y1,y2,=feval(fun,arg1,arg2),.,5.6 函数绘图5.6.1 fplot命令,fplot,命令可以绘制函数的曲线。,fplot(fun,limits,tol,Linespec),%绘制函数fun的曲线,fplot(fun,limits,n),说明:,fun是函数句柄或函数名;limits是自变量的取值范围xmin xmax或xmin xmax ymin ymax;tol是相对误差度,默认为2e-3,可省略;Linespec是线型,与plot命令的设置相同,可省略;n是绘制的点数,当n1时至少绘制n+1个点。,例:,fhnd=(x)(exp(-x).*sin(x);,fplot(fhnd,0 20,b-.*),.,5.6.2 ezplot命令,ezplot,命令也是用于绘制函数在某一自变量区域内的图形,ezplot命令格式如下:,ezplot(fun,min,max),%绘制函数fun的曲线,ezplot(x,y,tmin,tmax),说明:fun是函数句柄或函数名;min,max是自变量的范围,可省略,省略时默认为-2*pi,2*pi,当fun是二元函数,则范围是xmin xmax ymin ymax;x和y是指x(t)和y(t);tmin,tmax是t的范围,可省略,省略时范围是0,2*pi。,例:,ezplot(x2+y2-1,-3,3,-3,3),.,5.7 数值分析5.7.1 求最小值和过零点,1.一元函数的最小值,fminbnd函数可以获得一元函数在给定区间内的最小值。,x=fminbnd(fun,x1,x2)%寻找最小值,2.,多元函数的最小值,fminsearch,函数可以获得多元函数的最小值。,x,fval=fminsearch(fun,x0)%,寻找最小值,3.一元函数的过零点,x=fzero(fun,x0)%,获得fun在x0附近的过零点,一元函数f(x)的过零点求解可以使用fzero函数来实现。,练习,.,5.7.2 数值积分,一元函数的数值积分,采用自适应的Simpson方法。,q=quad(fun,a,b,tol,trace),例:,fhnd=(x)(exp(-x.2);,q1=quad(fhnd,-1,1,2e-3,1)%数值积分并跟踪展示迭代过程,9 -1.0000000000 5.43160000e-001 0.3198710950,11 -0.4568400000 9.13680000e-001 0.8538774475,13 0.4568400000 5.43160000e-001 0.3198710950,q1=,1.4936,.,5.7.3 微分方程组数值求解,MATLAB 7.3为解常微分方程提供了7种数值求解的方法,包括ode45、ode23、ode113、ode15s、ode23s、ode23t和ode23tb 函数,各函数的命令格式如下:,t,y=ode45(fun,ts,y0,options)%,解常微分方程,说明:,fun,是函数句柄或函数名;,ts,是自变量范围,可以是范围,t0,tf,,也可以是向量,t0,tf,;,y0,是初始值,,y0,应该是和,y,具有同样长度的列向量;,options,是设定微分方程解法器的参数,可省略,可以由,odeset,函数来获得。,.,例5-,25,使用,ode45,函数解微分方程。,先将二阶微分方程式变换成一阶微分方程组:,创建M函数文件ex5_25.m,虽然t参数不用,但微分方程的函数必须有时间t变量:,function ex5_25(),ts=0,20;%自变量范围,y0=0;0;%初始条件,t,y=ode45(ex5_25_1,ts,y0);,plot(t,y(:,1),r,t,y(:,2),g-),function yp=ex5_25_1(t,y),%EX5_25 使用ode45函数解微分方程,yp=y(2);-1.414*y(2)-y(1)+1;,.,练习:,运行以下命令:,a=eye(5);,for n=a(2:end,:),则for循环的循环次数是_。,A.5 B.4,C.3 D.1,A,.,练习:,运行以下命令则_,a=1 2 3,keyboard,K a=1 2 4;,K return,A.a=1 2 3 B.a=1 2 4,C.命令窗口的提示符为“K”,D.,出错,B,.,练习:,编写M脚本文件,分别使用for和while循环语句计算 ,当sum1000时终止程序。,答案:,clear,sum=0,for n=1:1000,sum=nn+sum,if sum1000,break,end,end,clear,sum=0;n=1;,while sum1000,sum=nn+sum,n=n+1,end,.,练习:,求y(x)=-e,-x,|sin(sin(x)|在x=0附近的最小值。,答案:,fhnd=(x)(-exp(-x)*abs(sin(sin(x),y=fminbnd(fhnd,0,10),.,练习:,解微分方程,y0=1,并绘制曲线,答案:,fhnd=(t,y)(y*tan(y)-cos(y);,t,y=ode45(fhnd,0,20,1);,plot(t,y),.,
展开阅读全文