MATLAB控制系统仿真课件第四章_第1页
MATLAB控制系统仿真课件第四章_第2页
MATLAB控制系统仿真课件第四章_第3页
MATLAB控制系统仿真课件第四章_第4页
MATLAB控制系统仿真课件第四章_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章M文件和程序设计主要内容4.1 程序控制语句4.2 命令文件和函数文件4.3 字符串的求值4.4 程序性能优化利用流程结构,可以编写出复杂程序MATLAB支持的流程结构循环结构、转移结构、

开关结构、试探结构MATLAB语言的流程结构4.1程序控制语句一、条件转移结构分支控制语句有if和switch两种语句if结构

ifexpression commandsend4.1程序控制语句if-else结构

ifexpressioncommands1elsecommands2end4.1程序控制语句if-elseif-else结构

ifexpression_1 command_1elseifexpression_2 command_2……elseifexpression_n-1 command_n-1else command_nend

例4.1.1:有分段函数

计算并显示函数值。编程输入x的值,4.1程序控制语句switch-case结构

switchexp_constcasevalue_1 commands_1 casevalue_2 commands_2 ┅casevalue_ncommands_n otherwisecommands_ow end注意:exp_const表达式可以为标量或者字符串。对于标量形式,用关系运算符“==”比较,对于字符串形式,用函数strcmp比较。case语句后的value_n值可以是标量、字符串,也可以是细胞数组。对比,C语言中otherwise是用default来表示的4.1程序控制语句二、循环控制for循环

fork=Arraycommandsend说明

k称为循环变量,commands称为循环体。循环的执行步骤是:循环变量从左到右依次取Array数组的一列,每取一列就执行一次循环体,循环体被执行的次数为Array的列数。for循环一般用于循环次数已知的程序流程控制。for循环典型结构注意:for循环结构v为一个向量,循环变量i每次从v向量中取一个数值,执行一次循环体的内容,如此下去,直至执行完v向量中所有的分量v的内容可以任意排列(使得程序非常灵活)C语言类似的结构4.1程序控制语句while循环

whileexpressioncommandsend说明while循环通常用在循环次数未知的情况下,而且要在循环体修改循环表达式的值,否则容易造成死循环。Break(一般在循环中结合if语句)

从循环体(上一层)中跳出,并使循环结束。注意:while结构的特点是可以设置出口for(可视为无条件)和while结构侧重点不同例4.1.2:输入物品的标签号码,显示物品的种类。其中标签号码为1、5、7的物品为食品,号码为10到19的物品为办公用品,号码为20、24、28的为音像制品。 要求:不断从键盘输入标签号码,输入一个号码显示一次物品种类,输入错误号码要给出提示,输入号码0则结束输入。其他常用流程控制语句continue命令用于结束本次for或while循环,只结束本次循环而继续进行下次循环。return命令用于终止当前命令的执行,并且立即返回到上一级调用函数pause命令

用来使程序运行暂停,等待用户按任意键继续。input命令用来提示用户应该从键盘输入数值、字符串和表达式,并接受该输入。例:计算的1~100中所有素数的和(理解break与continue)sum=2;ss=0;NUM=[];forn=3:100form=2:fix(sqrt(n))ifmod(n,m)==0

ss=1;

break;

else

ss=0;

endendifss==1 continue;

endNUM=[NUM,n];sum=sum+n;end例循环求解例用循环求解求最小的m,使下式成立使用while结构较容易实现,不宜应用for结构。例[向量化编程]求和4.1程序控制语句三、异常检测Matlab有异常处理机制,即可以检测某些语句的执行是否正确,如果发生运行错误,Matlab的异常处理机制会捕捉到这个错误,并跳转到用户指定的错误处理程序。try-catch语句

trycommandscatchhandlesend

说明:

执行语句组commands,当语句组commands执行发生错误时,跳转到错误处理语句组handles。

优点:设置错误陷阱、提高算法的执行效率(例4.1.3)4.1程序控制语句四、其他程序流控制语句出错处理

error('message') 显示出错信息message,中止程序运行

errortrap 发生错误后,程序继续执行或退出的状态切换

lasterr 显示Matlab给出的最新的出错 信息,并中止程 序运行警告处理

warning('message')显示警告信息message,程序继续运行

lastwarn

显示Matlab最新给出的警告信息,程序自动运行五、人机交互控制input

v=input(‘message’) 将用户键入的内容赋给变量v,messages是显示信息

v=input(‘message’,‘s’)将用户键入的内容作为字符串赋给变量v4.1程序控制语句keyboard

从键盘读入多个Matlab指令,直到用户输入return指令才返回。yesinput

v=yesinput('Prompt',default,posible) 说明Prompt是显示在屏幕上的提示信息;default是缺省值,即如果没有键盘输入时变量v赋值为default;posible是变量v可能接受的值。pausepause

暂停执行文件,等用户输入任意按键后继续执行pause(n)

暂停n秒后,程序继续执行dispdisp(X) 显示数组X的内容,但是不显示数组X的名字4.1程序控制语句控制控制结构小结循环结构的两种结构for结构与while结构两种结构的优缺点与适用范围语句break可以终止当前的循环条件转移语句ifelseelseif开关结构switchcase及其与C语言的异同试探结构trycatch4.2命令文件和函数文件

用户可以把需要运行的Matlab指令保存在一个以“.m”为扩展名的文件中,通过在命令窗口键入这个文件的名字来运行文件中的Matlab指令,我们称这些文件为m文件。按照m文件的组成和特点,可以分为命令文件和函数文件。为什么使用MATLAB函数?例M-脚本文件实现问题M-脚本以M-文件的形式被存取为什么需要函数?若最大值不为10000,M-文件就需要被修改则需要一种新的文件形式——M函数输入变量:N返回变量:s,mMATLAB语言函数的基本结构信息处理单元函数的程序结构可以编写一个M-函数function[m,s]=findsum(k)s=0;m=0;while(s<=k),m=m+1;s=s+m;end

优点:无需修改程序函数文件要在第一行用function关键字来显式的定义;函数M文件的第一行用关键字“function”把M文件定义为一个函数,指定函数的名字,同时定义了函数的输入变量和输出变量。输入变量的定义用圆括号(),如果有多个输入变量则用逗号分隔;输出变量的定义用中括号[],如果有多个输出变量则用逗号分隔。函数文件的名字和第一行所定义的函数名相同;帮助文本的第一行,它紧跟在定义行之后并以“%”符号开头,用于概括说明函数的功能。在命令窗口用lookfor命令时将显示函数的H1行。可以用比函数定义中数目少的输入变量和输出变量来调用函数,要对输入输出变量进行检查或处理函数文件内部定义的变量属于临时变量,只有函数运行期间才被生成,函数运行结束后,这些临时变量会被Matlab系统自动删除。例4.2.2:编写函数文件求命令文件有关命令文件的描述如下:命令文件没有输入参数也没有输出参数,只是一些Matlab命令和函数的组合;命令文件可以操作基本工作空间(BaseWorkspace)的变量,也可以生成新的变量。命令文件执行结束后新变量将保存在基本工作空间中,不会被自动清除;命令文件是用“.m”为扩展名的文件,只要命令文件在搜索路径上,在命令窗口键入文件名就可以运行命令文件。例4.2.1:编写命令文件求解小于1000且为2的整数次幂的正整数。4.2命令文件和函数文件说明M文件是一个文本文件,可以使用各种文本编辑器编辑和修改,也可以使用MATLAB的M文件编辑器/调试器;在运行程序之前,一定要确定这个M文件是否在MATLAB的搜索路径中。若不在,可以选择File|SetPath菜单,在路径设置对话框中,加入该路径到所有搜索路径的最前端。一旦用SetPath菜单设置了搜索路径后,Matlab会自动保存这些路径;在MATLAB的命令窗口输入M文件名即可运行该命令文件;M文件运行过程中产生的变量会驻留在基本工作空间中,即使文件运行结束也不会被自动删除,只有关闭了MATLAB后基本工作空间才会被删除。4.2命令文件和函数文件四、函数的输入变量和输出变量

1.输入变量和输出变量的检测检测输入变量和输出变量的函数,其格式和功能如下:

n=nargin 用于函数内,返回实际输入变量的个数

n=nargin('fun') 获取fun函数的声明的输入变量个数

n=nargout 用于函数体,返回实际输出变量的个数

n=nargout('fun') 获取fun函数的声明的输出变量个数

vname=inputname(n)

用于函数内,返回第n个输入变量的实际 调用变量名字

2.数目可变的输入变量和输出变量

Matlab支持输入变量和输出变量数目可变的函数。用户可以使用Matlab提供的两个指令来自己编写参数数目可变的函数。 4.2命令文件和函数文件varargin 数目可变的输入变量列表varargout

数目可变的输出变量列表说明

编写参数数目可变的函数时,函数定义行的“数目可变的变量”要放在“普通变量”之后;varargin的工作过程:varargin是一个细胞数组,里面放置的是“数目可变的变量”;函数被调用时,输入变量的传递规则是:实际输入变量依次逐个传递给函数定义的输入变量列表中的“普通输入变量”;然后把剩余的实际输入变量依次传递给varargin细胞数组中的细胞;varargin细胞数组中的细胞作为一个“普通输入变量”来使用。4.2命令文件和函数文件varargout的工作过程和varargin类似,只是其对应的是函数的输出变量。4.2命令文件和函数文件例hilbert长方形矩阵的生成:编写一个函数生成n×mHilbert矩阵要求:输入变量:n,m,输出变量H,若只给出一个输入参数,则自动生成方阵,在函数中给出合适的帮助信息,检测输入和返回变量的个数nargin,nargout五、有关工作空间

1.工作空间有了函数文件后,工组空间会变得复杂起来。Matlab将工作空间分成2类: 基本工作空间 基本工作空间是Matlab启动后自动创建的,只有关闭了Matlab后基本工作空间才会被删除。基本工作空间内部包括Matlab建立的特殊变量(如pi、i、j、NaN等)和命令窗口执行语句过程中生成的变量。 函数工作空间函数工作空间是函数文件运行时自动创建的工作空间,它是临时的,当函数运行完毕后,会被系统自动撤销。其中保存了函数内部定义或者运算生成的临时变量,它们在函数执行完成后就不存在了。4.2命令文件和函数文件2.局部变量和全局变量局部变量存在于函数工作空间的临时变量(即函数内部定义的变量)称为局部变量。局部变量只能被定义它的函数使用。在函数的定义中,其输入变量和输出变量就是局部变量,即函数的输入变量和输出变量只能在本函数内部被使用。全局变量通过global关键字可以定义全局变量。全局变量可以被所有工作空间共享,即所有工作空间都可以访问全局变量,但是前提是使用之前要先在工作空间内用global关键字声明全局变量。建议在函数的开始处定义或声明全局变量,全局变量的名字一般采用大写字母命名。4.2命令文件和函数文件3.跨工作空间的变量赋值有些时候需要跨工作空间给变量赋值,Matlab提供了相关的函数。格式:assignin('ws','var',val)

说明

把当前工作空间的变量val赋值给'ws'工作空间的名为'var'的变量。其中,'ws'可以取: 'base' 表示基本工作空间

'caller‘ 表主调函数工作空间六、子函数和私有函数如果一个项目比较复杂,就需要编写大量的函数文件,这些函数文件通常都是该工程中专用的,其他程序很少会用到。此时应该限制这些自编函数可以被调用的范围,避免在Matlab基本工作空间中出现过多的标识符,尽量避免在一个工作空间内出现同名函数。为了限制函数的使用范围,Matlab支持子函数和私有函数。4.2命令文件和函数文件1.子函数

Matlab允许一个函数文件内定义多个函数。其中,第一个定义的函数称为主函数,其他的函数称为子函数。关于主函数和子函数的描述如下:每个文件的第一行定义的是主函数;只有主函数可以被其他程序调用;函数文件的名字必须和主函数相同;子函数只能被处在同一个文件中的主函数或者其他子函数调用;主函数和各个子函数的工组空间是彼此独立的,即每个函数拥有自己独立的工作空间。4.2命令文件和函数文件2.私有函数私有函数是在函数M文件所在目录的private子目录中的函数M文件,其性质如下:私有函数只能被private的直接父目录中定义的M文件调用,其他目录的M文件或者命令窗口无权调用私有函数。私有函数的定义和构成和普通函数相同。例4.2.4:编写函数文件求4.2命令文件和函数文件七、M文件的执行当Matlab遇到一个新的标识符corv时,它将按照下面步骤寻找这个标识符。检查corv是否是一个变量名;检查corv是否是内建函数名;检查corv是否是子函数;检查corv是否是私有函数;检查corv是否是当前目录中的文件;在SetPath指定的路径内搜索corv文件;

Matlab将使用最先找到的那个corv标识符。如果经过上述步骤的搜索,也无法找到corv标识符,则给出提示信息“???Undefinedfunctionorvariable'corv'.”4.2命令文件和函数文件4.3字符串的求值Matlab提供了字符串求值的函数,利用这些函数,可以用字符串构造Matlab的函数和命令,并运行这些字符串命令。一、eval

y=eval('expression') 计算字符串表达式expression[a1,a2,...]=eval('function(b1,b2,...)')

计算函数调用的字符串表达式注意:eval的输入变量只能是字符串eval()函数的功能就是将括号内的字符串视为语句并运行eval('y1=sin(2)')就是相当于在matlab命令窗口输入了y1=sin(2)这条命令。例4.3.1:表达式字符串的计算例4.3.2:eval和函数调用例:写出如下程序的运行结果forx=1:3eval(['y',num2str(x),'=',num2str(x^2),';'])end二、feval

[y1,y2,...]=feval('function',x1,...,xn)说明‘function’只能是函数名,或函数的句柄,不能是表达式字符串。x1、x2等是调用函数'function'的输入变量,即函数的自变量值。y1、y2等是函数的输出变量,即函数的返回值。feval就是把已知的数据或符号带入到一个定义好的函数句柄中,用来计算指定函数在某点的函数值,如a=feval(fun,x),就相当于a=fun(x)。@用于创建函数句柄4.3字符串的求值函数句柄的创建方法①:直接加@语法:@函数名

fun1=@sin;方法②:str2func函数语法:str2func('函数名')

fun2=str2func('cos');方法③:单行表达式语法:@(参数列表)单行表达式

fun3=@(x,y)x.^2+y.^2;实质:xsqual=@(x)1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);相当于建立了一个函数文件:%xsqual.mfunctiony=xsqual(x)y=1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);使用函数句柄的优点(1)在更大范围调用函数函数句柄包含了函数文件的路径和函数类型,即函数是否为内部函数、M文件、子函数、私有函数等,因此无论函数所在的文件是否在搜索路径上,是否是当前路径,是否是子函数或私有函数,只要函数句柄存在,函数就能执行。(2)提高函数调用的速度不使用函数句柄时,对函数的每次调用都要为该函数进行全面的路径搜索,直接影响了速度。(3)使函数调用象使用变量一样方便、简单。(4)可迅速获得同名重载函数的位置、类型信息。例:写出入下程序的运行结果1)symstf=@(x,y)x^2+y^2k1=feval(f,1,t)k2=f(1,t)k3=feval(f,1,1)k4=f(1,1)2)a=feval(@(x)(x^2+1),2)三、内联函数用户可以用M文件来建立函数,函数的功能可以很复杂,函数的输出变量也可以有多个。对于简单的数学表达式,用M文件来建立函数就显得不够方便。Matlab提供了内联函数的功能,内联函数可以将表达式转换为函数。内联函数是Matlab面向对象的一个类,其类型名为inline。1.内联函数的建立

g=inline('expr')

将串表达式expr转换为内联函数

g=inline('expr','arg1','arg2',...)

将串表达式expr转化为以arg1、arg2等为自变量(输入变量)的内联函数4.3字符串的求值g=inline('expr',n)将串表达式expr转化为以自变量x,P1,P2,…,Pn为自变量的内联函数。其中P必须大写(语法要求)。n为P的个数。例4.3.4:建立内联函数表示数学函数,并计算的值例4.3.5:阅读本例程序代码,了解inline的使用方法。4.3字符串的求值2.和内联函数有关的函数class(fun) %获取内联函数的数据类型char(fun) %获取内联函数的计算公式字符串argnames(fun) %获取内联函数的输入变量名字vectorize(fun)

%使内联函数具有数组运算规则例4.3.6:阅读本例程序代码,了解和内联函数相关的函数的

使用方法。4.3字符串的求值4.4程序性能优化Matlab语言是解释执行的语言,其优点是编程简单、使用方便,但其缺点就是程序执行速度缓慢,执行效率低下。对于复杂的程序,程序员要考虑程序性能的优化,让应用程序既能够完成预期的功能,又具有较快的运行速度和较高的执行效率。一、源代码级的优化

1.循环的向量化

Matlab的运算功能是针对向量的,因此尽量少使用for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论