第三章MATLAB程序设计一、matlab的工作模式1、指令驱动模式通常matlab以指令驱动模式工作即在matlab窗口下,当用户输入单行指令时,matlab立即处理这条指令,并显示结果,这就是matlab命令行方式。命令行操作时,matlab窗口只允许一次执行一行上的一个或几个语句。x1=0:10,x2=0:3:11,x3=11.5:-3:0x1=012345678910x2=0369x3=11.50008.50005.50002.5000•在matlab窗口输入数据和命令进行计算时,当处理复杂问题和大量数据时是不方便的。因此应编辑m文件。2.m文件m文件的语法类似于c语言,但有自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序。matlab是解释性的编程语言。m文件有两类独立的m文件—称程序文件可调用m文件—称函数文件(1).程序文件—简单的m文件程序文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。(2).matlab内置函数文件matlab自定义的函数文件称内置函数文件调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数——用typesin查不到。调用格式:y=sin(2*x)实际应用中:x=0:2*pi/180:2*pi;y=sin(2*x)plot(x,y)01234567-1-0.8-0.6-0.4-0.200.20.40.60.81(3).函数m文件—需要输入变量,返回输出变量•matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了matlab的能力。•各种工具箱的内部函数基本都是M函数文件,用户也可以自己编写一组M函数文件组成工具箱•对于某一类特殊问题,如创建了许多m函数文件,则可形成新的工具箱。•这种用matlab语言创建定义新的matlab函数的功能,正体现了matlab语言强大的扩展功能。二、文本编辑窗MATLAB文本编辑器的功能就是完成编写、修改和调试这种文件程序就要用到M文件编辑器/调试器。文本编辑器/调试器的启动可以从命令窗口中或当前目录窗口中选择新建或打开文件按钮进入,或在命令窗口中键入:edit(回车)。其编辑模式如下图所示。•在文本编辑器中,文字的不同颜色显示表明文字的不同属性。•绿色:注解;黑色:程序主体;•红色:属性值的设定;蓝色:控制流程。•编辑功能与大多数编辑器类似,都有复制、粘贴、查找、加注释、缩进等功能•具有程序调试功能:设置断点、单步执行、连续执行等•在运行程序之前,必须设置好MATLAB的工作路径,使得所要运行的程序及运行程序所需要的其他文件处在当前目录之下,只有这样,才可以使程序得以正常运行。•否则可能导致无法读取某些系统文件或数据,从而程序无法执行。文本编辑器的相关菜单功能:•SaveandRun:保存并运行程序,直到遇到下一个断点。对应工具按钮为。•SingleStep:单步执行。对应工具按钮为。•StepIn:运行当前程序行,如果当前行调用了另外一个函数,则跳转到这个函数里。对应的工具按钮为。•ExitDebugMode:退出调试模式。工具按钮为。•Set/ClearBreakpoint:设置/清除断点。•ClearAllBreakpoints:清除所有的断点。文本编辑器的参数设置三、MATLBA程序的基本设计原则•1、%后面的内容是程序的注解,要善于运用注解使程序更具可读性。•2、养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其他变量对程序运行的影响。但注意在子程序中不要用clear。•3、参数值要集中放在程序的开始部分,以便维护。要充分利用MATLAB工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间结果不在屏幕上显示,以提高执行速度。•4、input指令可以用来输入一些临时的数据;而对于大量参数,则通过建立一个存储参数的子程序,在主程序中用子程序的名称来调用。•5、程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。•6、充分利用Debugger来进行程序的调试(设置断点、单步执行、连续执行),并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设计结果集成到一起。•7、设置好MATLAB的工作路径,以便程序运行。•8、MATLAB程序的基本组成结构•%说明•清除命令:清除workspace中的变量和图形(clear,close)•定义变量:包括全局变量的声明及参数值的设定•逐行执行命令:指MATLAB提供的运算指令或工具箱•………提供的专用命令•控制循环:包含for,ifthen,switch,while等语句•逐行执行命令•………•绘图命令:将运算结果绘制出来•M程序文件以.m格式进行存取,包含一连串的MATLAB指令和必要的注释。•M程序文件中的命令格式和前后位置,与在命令窗口中输入的没有任何区别。•需要在工作空间中创建并获取变量,也就是说处理的数据为命令窗口中的数据,没有输入参数,也不会返回参数。•程序运行时只需在工作空间中键入其名称即可。•使用helpxxx时将返回程序开始处的注释信息四、M程序文件•命令文件包括两部分:注释文件和程序文件•%二阶系统时域响应曲线•%阻尼系数为0.3•x=0:0.1:20;•y=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3));•plot(x,y)程序部分•画出分段函数所表示的曲面:%Thisisaexample.a=2;b=2;clf;%CLFClearcurrentfigurex=-a:0.2:a;y=-b:0.2:b;fori=1:length(y)forj=1:length(x)ifx(j)+y(i)1z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));elseifx(j)+y(i)=-1z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));elsez(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);endendendaxis([-a,a,-b,b,min(min(z)),max(max(z))]);colormap(flipud(winter));surf(x,y,z);15457.0117575.015457.0),(215.175.375.0216215.175.375.02112122212212122xxexxexxexxpxxxxxxxx五、M函数文件第一行:函数声明行functiony=dfw1(r,p)res=r(1);p0=p(1);……y=-sum(res);输出参数函数名输入参数(可以没有输入参数)函数名要遵守Matlab变量名的命名规则,M函数存盘时的文件名与函数名相同。从函数返回的惟一信息包含在输出参数中,要确保函数中包含一条给输出参数赋值的语句(可以没有输出参数)。function输出形参列表=函数名(输入形参列表)%注释说明部分(可选)函数体语句(必须)第一行为引导行,表示该M文件是函数文件函数名的命名规则与变量名相同(必须以字母开头)当输出行参多于一个时,用方括号括起来函数必须是一个单独的M文件函数文件名必须与函数名一致以百分号开始的语句为注释语句函数文件由function语句引导•函数可以接受输入变量,并将运算结果送到输出变量•函数具有单独的工作空间,函数体内使用的除返回和输入变量外的所有变量都是局部变量,只在函数工作空间中存在。•局部变量不保存在Matlab工作空间中,只在函数运行期间有效•当函数执行到最后一条命令或遇到return命令后,就结束函数的执行,同时函数工作空间的变量被清除。•函数基本格式:•(1)函数定义行(关键字function)•function[out1,out2,..]=filename(in1,in2,..)•输入和输出(返回)的参数个数分别由nargin和•nargout两个MATLAB保留的变量来给出。•(2)第一行帮助行,即H1行•以(%)开头,作为lookfor指令搜索的行•(3)函数体说明及有关注释•以(%)开头,用以说明函数的作用及有关内容,•作为help指令显示的行。如果不希望显示某段信•息,可在它的前面加空行•(4)函数体语句functiony=tt(zeta)%tt:二阶系统时域响应曲线%其他注释%zeta阻尼系数x=0:0.1:20;y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));plot(x,y)用于lookforx,y是局部变量help•在MATLAB中,调用函数的常用形式是:•[输出参数1,输出参数2,…]•=函数名(输入参数1,输入参数2,…)•函数调用可以嵌套,一个函数可以调用别的函数,甚至调用它自己(递归调用)。(1)函数调用a=1;b=3;c=1;[x1x2]=FindRoots(a,b,c)function[x1x2]=FindRoots(a,b,c)%a*x^2+b*x+c=0x1=(-b+(b^2-4*a*c)^0.5)/(2*a);x2=(-b-(b^2-4*a*c)^0.5)/(2*a);函数调用的一般格式输出实参列表=函数名(输入实参列表)函数调用时,实参的顺序应与函数定义时的形参的顺序一致。函数调用functiony=dfw1(r,p)函数定义形参z=dfw1(x,k)实参1、nargin函数体内获取实际输入变量的个数2、nargout函数体内获取实际输出变量的个数3、nargin(‘fun’)函数体外获取定义输入变量数4、nargout(‘fun’)函数体外获取实际输出变量数5、varargin获得输入变量的各元素内容6、varargout获得输出变量的各元素内容见文件mysum.mMATLAB在函数调用上有一个与众不同之处:函数所传递的参数具有可调性。函数文件examp.m:functionfout=examp(a,b,c)ifnargin==1fout=a;elseifnargin==2fout=a+b;elseifnargin==3fout=(a*b*c)/2;end程序文件mydemo.m:x=[1:3];y=[1;2;3];examp(x)examp(x,y')examp(x,y,3)函数通过输入和输出参数与其它M文件进行数据传递。当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即全部被清除。函数文件中的变量都是局部的,即一个函数文件中定义的变量不能被另一个函数文件或其它M文件使用。(2)局部变量函数文件运行时,matlab会专门开辟一个临时工作区间,称为函数工作区间。如果在M函数中,调用某个M程序文件,那么该程序文件运行时产生的所有变量都存放于该函数空间中,而不是存放在Matlab空间。变量名列表中的各个变量用空格隔开,不能用逗号!全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而在结构化程序设计中,全局变量是不受欢迎的。特别是当程序较大,子程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使用全局变量。global变量名列表(3)全局变量如果在若干个M文件中,都把某个变量定义为全局变量,则这些函数将公共使用这一变量。所有函数都可以对它进行存取和修改操作。globalabca=18.3036b=3816.44c=-46.13fori=1:11t=373.2+10*(i-1)psat(i)=antoine(t)end%函數:Antoine.mfunctionp_vap=antoine(t)globalabcp_v