您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > MatLab与控制系统仿真(重点编程)
第4章MatLab的程序设计MatLab是一个工具、开发平台,同时它也是一门编程语言。与在命令窗口用交互的方式工作相比,通过程序运行来解决实际问题,其效率更高,因此,凡是复杂的、大型的应用都是以程序的方式执行。相对其它高级语言,MatLab更简单、编程的效率更高、调试过程也更容易。MatLab中的程序文件是以m为后缀,所以通常将MatLab的程序文件称为m文件。MatLab提供了两种形式的m文件,即:脚本(Script)式m文件(就简称m文件)、函数型m文件。在MatLab中已经嵌入了一个功能强大的集成开发环境——m文件编辑器,用它来进行程序的编辑、修改、调试、运行等,完成应用开发工作。4.1MatLab程序设计基础通过前面内容的学习,大家对MatLab已经有了一个初步的认识和印象,到目前为止,我们都是在“命令”窗口中,以交互的方式运行,完成我们的工作。实际上简单的m文件,就是一个批处理程序,它是若干条命令的集合。例:4.1.1M文件规则和属性函数M文件必须遵循一些特定的规则。除此之外,它们有许多的重要属性,这其中包括:1.函数名和文件名必须相同。例如,函数fliplr存储在名为fliplr.m文件中。2.MATLAB头一次执行一函数个M文件时,它打开相应的文本文件并将命令编辑成存储器的内部表示,以加速执行以后所有的调用。如果函数包含了对其它函数M文件的引用,它们也同样被编译到存储器。普通的脚本M文件不被编译,即使它们是从函数M文件内调用;打开脚本M文件,调用一次就逐行进行注释。3.在函数M文件中,到第一个非注释行为止的注释行是帮助文本。当需要帮助时,返回该文本。例如,»helpfliplr返回上述前八行注释。4.第一行帮助行,名为H1行,是由lookfor命令搜索的行。5.函数可以有零个或更多个输入参量。函数可以有零个或更多个输出参量。6.函数可以按少于函数M文件中所规定的输入和输出变量进行调用,但不能用多于函数M文件中所规定的输入和输出变量数目。如果输入和输出变量数目多于函数M文件中function语句一开始所规定的数目,则调用时自动返回一个错误。相对于函数m文件,脚本式m文件就简单多了,它没有严格的格式要求,只要将有关的命令或函数一一敲入即可,但是还是有几个问题需要注意:1.m文件的名称不得与MatLab的内部函数同名、第一个字符不得为数字(这点与变量的命名规则相同);2.最好在文件的头部加上注释,对该m文件的作用、功能作一个简要说明,而在一些重要命令行后也加上注释行,以方便使用者阅读、查找;3.要特别注意m文件的保存路径或位置,如果不是保存在MatLab默认的路径下,可以使用addpath函数来设置、添加路径,否则,m文件不能运行。脚本式m文件与函数m文件还有一个重要区别:脚本式m文件中的变量均为全局变量,而函数m文件中的变量则是局部变量。这可以从这两种程序文件运行后在Workspace中留下痕迹看出。当然,在函数m文件中也可以专门将某些变量定义为全局变量(关键字是:global)。不过,在使用全局变量(函数m文件中)时应特别注意:①.全局变量需要函数体的变量赋值语句之前定义或说明;②.全局变量名最好是大写,而且要尽量长,能反映它本身的含义;③.实际编程时,全局变量也要尽可能少用,因为一旦它在一个地方被改变,那么其它包括该变量的函数中都得改变,有时可能会出现意想不到情况。4.1.2M文件的组成函数M文件实例:functionf=fact(n)%函数定义行%Computeafactorialvalue%H1行%FACT(N)returnthefactorialofN,%usuallydenotedbyN%帮助文本%Putsimply,FACT(N)isPROD(1:N)%注释f=prod(1:N);%函数体一个完整的函数M文件通常包括:①.函数定义行:定义函数名以及输入、输出变量的数目和顺序;②.H1行:对该函数进行概括性的描述(可用help和Lookfor命令调出此行);③.帮助文本:这是比H1行更详细的帮助信息,使用help命令时与H1行一起显示;④.函数体:这是函数M文件的主要部分,程序的功能都在此部分实现;⑤.注释:对程序行的意义进行解释(与H1行一样都是用%开头)。有的函数M文件还包含return语句!4.1.3M文件编辑器介绍1.m文件编辑器的启动★在命令窗口中敲入:edit★点击工具栏中的新建图标★从菜单file/new/M-file中启动2.m文件编辑器的界面★菜单栏★工具栏★编辑窗口3.m文件的运行★在m文件编辑器内★在命令窗口中运行在命令窗口直接输入m文件名,回车即可,但函数m文件通常还必须带参数才能运行,也可以利用feval函数来运行函数m文件,其格式如下:feval('functionname',arg1,arg2,...)对于脚本式m文件,还可以用run函数在命令窗口中运行存在的m文件。格式:run‘m文件名’(不必带文件的后缀)4.1.4对函数M文件的调用凡是以函数m文件形式保存的程序文件,均可以被其它函数m文件或脚本m文件所调用。例:①先定义一个函数m文件:%计算阶乘functiony=jiech(n)y=1;fori=1:ny=y*i;end②编写m文件实现对上述函数m文件的调用:functionz=dy(n)z=log(jiech(n));4.1.5数据类型与结构MatLab的数据类型前面已经介绍,下面是它们之间的关系图:MatLab中结构(教材中称构架)的概念和C语言中的类似,它也包含一个或多个域(数据容器),每个域可以包含任何类型的数据(这一点与单元数组又相似),且相互独立。下面通过实例来说明如何建立并访问结构。用结构建立学生的数据记录。①.例1:在命令窗口直接创建(或用m文件编辑器)创建。student.num=20070135;student.name='李四';student.age=20;student.weight=67;student.height=1.68;student.test=[90857663885479];从这个例子可以看出结构建立的方法:直接建立结构和各个域,同时给各域赋值(也可以不赋值),结构和域之间用点“.”连接。②.用关键字“struct”创建,格式如下:s=struct('field1',values1,'field2',values2,...)例2:用关键字“struct”创建。student=struct('num',20070135,'name','zhangsan','weight',1.68,'height',75,'test',…[9887659578])③.结构的操作★结构域的访问★结构域的添加、修改直接添加或用函数setfield()添加;直接修改或用函数setfield()修改。★结构域的删除用函数rmfield()删除某个域。格式:s=rmfield(s,'fieldname')4.2MatLab程序的控制程序的流程控制是高级语言中必不可少、也是非常重要的部分,要编写出高质量的程序,实现对复杂系统的控制、仿真,这一点也是必须掌握的。MatLab提供了多种控制结构,包括:顺序结构、选择(分支)结构以及循环结构,每种结构都有各自的控制机制,利用它们及其它们的组合可以实行功能强大的、复杂的应用。4.2.1顺序结构顺序结构最简单,它是一种最基础的程序结构,也是最遵循逻辑思路的程序代码结构,批处理文件就是典型的顺序语句文件。这种语句不需要任何特殊的流控制,按照语句的排列顺序,一条一条的执行,直至结束。例:4.2.2选择(或分支)结构如果程序中需要根据一定条件来执行不同的操作时,可以使用条件语句来构成选择或分支结构。在MatLab中可利用if语句来实现这种结构。if语句的结构通常有以下三种形式:1.单分支结构:这种分支结构最简单,格式为:if表达式语句end它只有一个判断语句,当表达式为真时,就执行语句,否则就不执行。例:functionf=ifone(x)ifx=0fprintf('%fisaPositivenumber.\n',x);end2.双分支结构:此时,采用if-else-end结构,语法是:if表达式语句1else语句2end即:表达式为真,系统执行语句1,否则将转入语句2执行。例:将上面的例子扩充functionf=ifone(x)ifx=0fprintf('%fisapositivenumber.\n',x);elsefprintf('%fisanegativenumber.\n',x);end3.多分支结构:仍采用if-else-end结构,但语法上略有不同,形式如下:if表达式1语句1%表达式1为真执行语句1elseif表达式2语句2%表达式2为真执行语句2elseif表达式3语句3%表达式3为真执行语句3……else语句n%所有表达式为假执行语句nend例:编写一个成绩打印程序。functionf=chengji(x)ifx=90fprintf('%d分,成绩为优\n',x)elseifx=80fprintf('%d分,成绩为良\n',x)elseifx=70fprintf('%d分,成绩为中\n',x)elseifx=60fprintf('%d分,成绩为及格\n',x)elsefprintf('%d分,成绩为不及格\n',x)end4.2.3开关语句(Switch分支结构)开关语句实际上也是分支结构的一种,是一种多选择的分支语句,作用与上面介绍的多分支结构相似,这是MatLab6.0以上版本新增加的功能。该结构的一般调用格式如下:SwitchexpressionCasevalue1StatementsCasevalue2Statements……………….OtherwiseStatementsend例:采用switch结构的一个简单应用。%提示用户输入数据input_num=input('Enteranumber:');%根据情况判断数值大小,显示数据信息switchinput_numcase-1disp('negativeone');case0disp('zero');case1disp('positiveone');otherwisedisp('othervalue');%如果不是上面数据,显示“其它数据”end4.2.4try-catch结构try-catch结构(或模块)为用户提供了一种错误捕捉机制,利用该模块,一旦MatLab的编译系统发现错误,就将其捕捉,用户可以控制MatLab去对出现的错误进行相应处理。它的调用格式如下:try语句1catch语句2end一般来说,语句1中的所有命令都要执行,如果在执行语句1时,没有出现错误,那么在执行语句1之后,就直接跳到end后;但是,如果在执行语句1时,出现了错误,程序立刻转到catch模块中,去执行语句2,并可通过调用lasterr函数查询出错的原因。例:见教材中P70例4-4。4.2.5循环结构很多程序都可能会出现一些反复运行的部分,前面介绍的这些结构就很难实现了。同其它高级语言一样,MatLab也提供了循环语句。在循环语句中,被重复执行的部分称为循环体,控制循环语句是否继续的称为循环条件。在MatLab中有两种循环结构,即所谓的for循环和while循环。1.for循环for循环语句有如下特点:★它的循环判断条件通常是对循环次数的判断,即它的循环次数是预先设定好的;★for循环语句可以嵌套使用。不仅可以对for本身嵌套,还可以对其它的结构形式进行嵌套使用。for循环的语法:fori=表达式语句1,……,语句n;end例:求n个数的平方。functionx=pfh(n)fori=1:nx(i)=i^2;end2.while循环与for循环不同,while循环的判断控制可以是逻辑判断语句,它的循环次数可以是一个不定数,因此比for循环有更广泛的用途。while循环的格式:while表达式语句end在这个循环中只要表达式值不为false
本文标题:MatLab与控制系统仿真(重点编程)
链接地址:https://www.777doc.com/doc-3383829 .html