1、第2章 Simulink使用基础,2.1 MATLAB的计算单元:向量与矩阵 2.2 MATLAB计算单元的基本操作 2.3 多项式表达与基本运算 2.4 MATLAB的基本绘图功能 2.5 M文件与MATLAB函数 2.6 MATLAB的单元与结构体,2.1 MATLAB的计算单元:向量与矩阵,MATLAB作为一个高性能的科学计算平台,主要面向高级科学计算。MATLAB的基本计算单元是矩阵与向量,向量为矩阵的特例。一般而言,二维矩阵为由行、列元素构成的矩阵表示;对于m行、n列的矩阵,其大小为mn。在MATLAB中表示矩阵与向量的方法很直观,下面举例说明。,例如,矩阵 ,行向量 ,列向量,在M
2、ATLAB中可以分别表示为A=1 2 3; 4 5 6B=1 2 3C=4; 5; 6,注意:(1) MATLAB中所有的矩阵与向量均包含在中括号之中。如果矩阵的大小为11,则它表示一个标量,如a=3 %a表示一个数(2) 矩阵与向量中的元素可以为复数,在MATLAB中内置虚数单元为i、j;虚数的表达很直观,如34*i或者34*j 。,技巧:(1) MATLAB中对矩阵或向量元素的引用方式与通常矩阵的引用方式一致,如A(2 ,3)表示矩阵A的第2行第3列的元素。如若对A的第2行第3列的元素重新赋值,只需键入如下命令:A(2,3)=8;则矩阵A变为A =1 2 3 4 5 8,(2) MATLA
3、B中分号(;)的作用有两点:一是作为矩阵或向量的分行符,二是作为矩阵或向量的输出开关控制符。即如果输入矩阵或向量后键入分号,则矩阵与向量不在MATLAB命令窗口中显示,否则将在命令窗口中显示。如输入矩阵 A=1 2 3; 4 5 6 % 按下Enter键,则在MATLAB命令窗口中显示A = 1 2 34 5 6,(3) 冒号操作符(:)的应用。冒号操作符在建立矩阵的索引与引用时非常方便且直接。如上述对多维矩阵F的建立中,冒号操作符表示对矩阵F第一维与第二维所有元素按照其顺序进行引用,从而对F进行快速赋值,无需一一赋值。如 B=2:5 %对向量进行赋值 B=2 3 4 5 B(1:3)=2 %
4、向量B从第1个到第3 个元素全部赋值为2,B=2 2 2 5 C=6: -2:0 %将向量C进行递减赋值,初始值为6,终止值为0,步长为2 C= 6 4 2 0 冒号操作符的使用很灵活,如图2.1所示。,图2.1 冒号操作符使用示意图,从图2.1中可以看出,使用冒号操作符对矩阵元素进行引用非常灵活和方便,它可以有效地对矩阵的指定元素或指定区域进行各种操作与控制。这使得MATLAB对矩阵的操作方式非常符合习惯的用法,易于理解与应用。此外,MATLAB还支持多种不同类型的数据,它们的建立和基本引用与本节介绍的基本相同,这里不再赘述。有兴趣的读者可以参考MATLAB的联机帮助。,2.2 MATLAB
5、计算单元的基本操作,2.1节介绍了MATLAB的基本计算单元,即矩阵与向量的建立与引用方法。本节将简单介绍在MATLAB环境下矩阵与向量的操作与运算。,1. 矩阵加法与减法如果矩阵A与矩阵B具有相同的维数,则可以定义矩阵的加法与减法,其结果为矩阵相应元素作运算所构成的矩阵。矩阵加法与减法在MATLAB中的表达方式为 C=A+B; %C为矩阵A与B之和 D=A-B; %D为矩阵A与B之差,【例2.1】 若,则则C=1 4 46 10 9D=1 0 22 0 3,矩阵与标量的加法与减法是指标量本身与矩阵所有元素进行相应运算,如若b1,E=A+b,则E=2 3 45 6 72. 矩阵的乘法与除法如果
6、矩阵A的列数等于矩阵B的行数,则矩阵A、B可以相乘。其结果C=AB在MATLAB中可表示为 C=A*B; %A、B相乘,若A、B不满足矩阵乘法法则,MATLAB会给出出错信息,【例2.2】 若,则则C=7 1116 29如果矩阵A为方阵,A的p次方可以用Ap表示。如果p是一个正整数,那么这个幂可以由矩阵的连续相乘定义。当p=0时,其结果为与A相同的矩阵;当p0时,只有在A的逆存在时才可定义Ap,其意义为inv(A)(p)。,在MATLAB中,矩阵除法有两种形式,即左除()和右除(/)。如果A是一个非奇异方阵,那么 AB % 表示A的逆与B的左乘,即inv(A)*B B/A % 表示A的逆与B的
7、右乘,即B* inv(A)矩阵的左除和右除运算还可以用来求解矩阵方程AX=B的解:X=AB如果A是一个方阵,X就是方程的解;如果A是一个行数大于列数的矩阵,X就是方程的最小二乘解。,3. 矩阵的转置转置是一种重要的矩阵运算,在MATLAB中由撇号表示: B=A % B为A的转置如果 ,则 。如果A中含有复数元素,则A的转置矩阵中的元素为原来元素的共轭。,4. 对矩阵元素的操作与运算在上述各种常用运算中,所有的操作都是针对矩阵所有元素或一部分元素的操作。其实还可以对矩阵元素进行单独的操作运算。对于加法和减法,对矩阵元素的操作与对矩阵的操作是一致的。其它运算对于所有矩阵元素的操作需要在操作符前加点
8、,如【例2.3】所示。,【例2.3】 若 则 A.*B= % 矩阵对应元素相乘 7 4 -1 0 B./A= % 矩阵对应元素相除 7 1 -1 0,B.2= % 矩阵元素乘方运算 49 4 1 0 A.B= % 矩阵对应元素幂运算 1 4 -1 1 C.= % 矩阵转置 1.0000+2.0000i,3.0000+1.0000i 5.0000-2.0000i,1.0000+3.0000i,作为高性能的科学计算工具,MATLAB对矩阵与向量提供强大的支持;但由于本书主要讲述使用Simulink需要具备的MATLAB的基础知识,因此对这部分内容仅作简单介绍,感兴趣的读者可以参考任何一本MATLA
9、B参考书。,2.3 多项式表达与基本运算,Simulink用于动态系统建模、仿真与分析时,将会大量使用多项式。许多系统的模型描述(如系统的传递函数)都需要使用多项式,并在多项式描述的基础上对系统进行仿真分析。本节将简单介绍MATLAB中的多项式表示及其基本运算。1. 多项式的建立在MATLAB中,n阶多项式p(x)由一个长度为n1的向量p所表示,向量p的元素为多项式的系数,且按照自变量x的降序排列。若n阶多项式为,则其在MATLAB中的表示方法为注意,多项式中系数为0的项不能忽略,p中相应元素应置为0。如多项式在MATLAB中应表示为p=3 0 2 3,(其中),2. MATLAB中多项式操作
10、函数简介(1) roots(p):长度为n的向量,表示n阶多项式的根,即方程p(x)=0的根,可以为复数。(2) conv(p,q):表示多项式p,q的乘积,一般也指p,q的卷积。(3) poly(A):计算矩阵A的特征多项式向量。(4) poly(p):由长度为n的向量中的元素为根建立的多项式,结果是长度为n1的向量。(5) polyval(p,x):若x为一数值,则计算多项式在x处的值;若x为向量,则计算多项式在x中每一元素处的值。,3. 举例分析【例2.4】 求多项式的根。解:在MATLAB的命令窗口中依次输入以下命令,即可求出其根。 p=3 0 2 3; rootp=roots(p)
11、% rootp为多项式的根 rootp =0.3911 + 1.0609i0.3911 - 1.0609i-0.7822,2.4 MATLAB的基本绘图功能,MATLAB作为高性能、交互式的科学计算工具,具有非常友好的图形界面,这使得MATLAB的应用非常广泛;同时MATLAB也提供了强大的绘图功能,这使得用户可以通过对MATLAB内置绘图函数的简单调用,便可迅速绘制出具有专业水平的图形。在利用Simulink进行动态系统仿真时,图形输出可以使设计者快速地对系统性能进行定性分析,故可大大缩短系统开发时间。,MATLAB的图形系统是面向对象的。图形的要素,如坐标轴、标签、观察点等都是独立的图形对
12、象。一般情况下,用户不需直接操作图形对象,只需调用绘图函数就可以得到理想的图形。通过本节的学习,用户能够快速掌握图形绘制技术。1. 基本的二维图形绘制命令(1) plot(x,y):输出以向量x为横坐标,以向量y为纵坐标且按照x,y元素的顺序有序绘制的图形。x与y必须具有相同长度。,(2) plot(y):输出以向量y元素序号m为横坐标,以向量y对应元素ym为纵坐标绘制的图形。(3) plot(x1,y1,str1,x2,y2,str2,):用str1指定的方式,输出以x1为横坐标,y1为纵坐标的图形。用str2指定的方式,输出以x2为横坐标,y2为纵坐标的图形。若省略str,则MATLAB自
13、动为每条曲线选择颜色与线型。str选项中的部分参数如表2.1所示。,表2.1 plot命令选项,2. 简单的三维图形绘制命令(1) plot3(x,y,z):用向量x、y和z的相应点(xi,yi,zi)进行有序绘制三维图形。向量x,y,z必须具有相同的长度。(2) plot3(x1,y1,z1,str1,x2,y2,z2str2,):用str1指定的方式,对x1,y1和z1进行绘图;用str2指定的方式,对x2,y2和z2进行绘图;如果省略str,则MATLAB自动选择颜色与线型。,3. 图形绘制举例【例2.6】 用MATLAB绘制正弦函数在0,2中的图形。解:在MATLAB命令行下输入 x=
14、0:0.1:2*pi; % pi为MATLAB中默认的圆周率 y=sin(x); plot(x, y, *);其中x为自变量,这里使用冒号表达式设定其取值步长为0.1,取值范围为0,2。用星号*输出图形,结果如图2.2所示。,图2.2 绘制正弦函数曲线,图2.3 多项式绘制,4. 简单的图形控制命令(1) clc:清除命令窗口。(2) grid:自动在各个坐标轴上加上虚线型的网格。(3) hold on:保持当前的图形,允许在当前图形状态下绘制其它图形,即在同一图形窗口中绘制多幅图形。 (4) hold off:释放当前图形窗口,绘制的下一幅图形将作为当前图形,即覆盖原来图形。这是MATLAB
15、的缺省状态。(5) hold:在hold on与hold off之间进行切换。,5. 简单的子图命令(1) subplot(m,n,p):将图形窗口分成m行n列的子窗口,序号为p的子窗口为当前窗口。子窗口的编号由上至下,由左至右。(2) subplot:设置图形窗口为缺省模式,即subplot(1,1,1)单窗口模式。,【例2.8】 绘出在三维空间中的一个随机曲线。解:在MATLAB命令行下输入 x=cumsum(rand(1,1000)-0.5); y=cumsum(rand(1,1000)-0.4); z=cumsum(rand(1,1000)-0.3); plot3(x,y,z) gri
16、d;,图2.4 随机曲线绘制,【例2.9】 在一个图形窗口的左侧子图中绘制函数, 在右侧子图中绘制函数 , 其中 。解:在MATLAB命令行下输入: x=-3:0.1:3; y1=x.3-2*x-3; y2=x.*sin(x); subplot(1,2,1),plot(x,y1,*),grid subplot(1,2,2),plot(x,y2,-),grid,图2.5 子图绘制,由此可见,MATLAB的图形绘制功能非常强大,文中仅以几个简单的例子说明,读者可以进一步对生成的图形进行更低层操作(操作图形对象),以便获得更好的效果,这里不再赘述。,2.5 M文件与MATLAB函数,2.1.1 M文
17、件编辑器“工欲善其事,必先利其器。”用户应首先熟悉一下最经常使用的M文件编辑器(M File Editor)。M文件编辑器不仅仅是一个文字编辑器,它还具有一定的程序调试功能,虽然没有像VC、BC那样强大的调试能力,但对于调试一般不过于复杂的MATLAB程序已经足够了。在MATLAB命令行下输入edit则弹出如图2.6所示的M文件编辑器窗口。,图2.6 M文件编辑器,1. 编辑功能(1) 选择:与通常鼠标选择方法类似,但这样做其实并不方便。如果习惯了,使用Shift+箭头键是一种更为方便的方法,熟练后根本就不需要再看键盘。 (2) 拷贝粘贴:没有比Ctrl+C、Ctrl+V键更方便的了,相信使用
18、过Windows的人一定知道。(3) 寻找替代:寻找字符串时用Ctrl+F键显然比用鼠标点击菜单方便。,(4) 查看函数:阅读大的程序常需要看看都有哪些函数并跳到感兴趣的函数位置,M文件编辑器没有为用户提供像VC或者BC那样全方位的程序浏览器,却提供了一个简单的函数查找快捷按钮,单击该按钮,会列出该M文件所有的函数。(5) 注释:如果用户已经有了很长时间的编程经验而仍然使用Shift+5来输入%号,一定体会过其中的痛苦(忘了切换输入法状态时,就会变成中文字符集的百分号)。,(6) 缩进:良好的缩进格式为用户提供了清晰的程序结构。编程时应该使用不同的缩进量,以使程序显得错落有致。增加缩进量用Ct
19、rl+键,减少缩进量用Ctrl+ 键。当一大段程序比较乱的时候,使用smart indent (聪明的缩进,快捷键Ctrl+I)也是一种很好的选择。,2. 调试功能M程序调试器的热键设置和VC的设置有些类似,如果用户有其它语言的编程调试经验,则调试M程序显得相当简单。因为它没有指针的概念,这样就避免了一大类难以查找的错误。不过M程序可能会经常出现索引错误,如果设置了stop if error(Breakpoints菜单下),则程序的执行会停在出错的位置,并在MATLAB命令行窗口显示出错信息。下面列出了一些常用的调试方法。,(1) 设置或清除断点:使用快捷键F12。(2) 执行:使用快捷键F5
20、。(3) 单步执行:使用快捷键F10。(4) step in:当遇见函数时,进入函数内部,使用快捷键F11。(5) step out:执行流程跳出函数,使用快捷键Shift+F11。(6) 执行到光标所在位置:非常遗憾这项功能没有快捷键,只能使用菜单来完成这样的功能。,(7) 观察变量或表达式的值:将鼠标放在要观察的变量上停留片刻,就会显示出变量的值,当矩阵太大时,只显示矩阵的维数。(8) 退出调试模式:没有设置快捷键,使用菜单或者快捷按钮来完成。,2.1.1 MATLAB语言的语法1. 注释MATLAB中用百分号%表示其后为程序注释(实际上在前面已经碰到了这样的注释)。编写M程序和编写其它程
21、序一样应该养成良好的程序注释习惯。除了程序间的注释,编写M文件时还应该在文件头说明该程序的功能和使用方法,使用Help命令看到的帮助信息正是这些在文件头的注释。,2. 赋值语句 在MATLAB中,赋值语句的基本语法结构为 variablename=value; 3. 逻辑表达式 在MATLAB中,逻辑表达式的基本语法结构为 logicalvaluevariable1 关系运算符 varialble2;logicalvaluelogical expression 1 逻辑运算符 logical expression 2; 其中关系运算符有= =(等于)、(不等于)、(大于)、=(不小于)、=(不
22、大于)等。逻辑运算符有&(逻辑与)、|(逻辑或)和(逻辑非)等。,4. 条件控制语句MATLAB中由if语句进行判断,其基本语法结构为if 逻辑表达式语句集合end在if与逻辑表达式之间必须有一个空格;当逻辑表达式值为真时,执行语句集合中的语句;这里语句集合可以是MATLAB中的单独命令,也可以是由逗号、分号隔开的语句集合或return语句。,对于简单的语句也可以写成下面的形式:if 逻辑表达式,语句集合,end此外,if语句还可以与elseif、else组合成更为复杂的控制语句,其语法格式如下:if 逻辑表达式语句集合1else语句集合2end,5. 循环语句MATLAB中实现循环的语句有两
23、种:for语句与while语句,以实现某些语句的循环执行。for语句语法格式如下:for 变量=表达式语句集合end,2.1.1 MATLAB脚本文件与M函数MATLAB中有两种M文件:一种称为脚本文件(类似于批处理语句),另一种是M函数(类似于函数的概念)。 1. 脚本文件脚本文件是由一系列MATLAB的命令、内置函数以及M文件等构成的文件,它可以由一般的编辑器进行编制,其结果保存在相应的M文件中。M脚本文件的实质为命令的集合,在MATLAB中执行M脚本文件时,MATLAB从文件中读取命令执行,完成用户的工作。,一般习惯于使用MATLAB的编辑器编制M文件。打开MATLAB编辑器,新建M脚本
24、文件,保存时系统会自动将文件保存成*.m文件。然后便可以在MATLAB命令窗口或其它M文件中使用。其特点是按照脚本中语句的顺序执行,生成的变量放在当前的工作区之中(如果从命令行运行,则放在基本工作区)。,【例2.10】 编写一个M文件绘制函数在区间中的图形。解:在MATLAB命令行下输入edit命令以打开M文件编辑器,输入以下程序:x=-6:0.1:6; % 设定自变量x的取值范围 leng=length(x); % 计算向量x的长度,for m=1:leng % 计算函数值if x(m)=0 % 判断x取值所在范围y(m)=sin(x(m); % 计算分段函数值elseif x(m)=3y(
25、m)=x(m); % 计算分段函数值elsey(m)=-x(m)+6; % 计算分段函数值end end plot(x,y,*),grid; %绘制函数曲线,将其存盘为demomfile1.m(该文件就是一个MATLAB脚本文件),然后在MATLAB命令行下输入: demomfile1则生成如图2.7所示的函数曲线。本例目的在于说明M脚本文件的编写技术,以及如何使用前面所讲述的MATLAB语言的条件判断与循环语句。由此可见使用MATLAB语言进行程序设计简单而又快速。,图2.7 使用M文件绘制函数图形,2. M函数MATLAB的函数与脚本不同,M函数的第一行为关键字function,函数第一次
26、执行时将生成内存代码,生成的变量放在函数的工作区。在MATLAB中有大量的内置函数及大量的工具箱函数,使用它们可以完成大部分的工作;但由于不同的用户有不同的需要,MATLAB允许用户开发自己的专用或通用函数,以扩展MATLAB的函数应用。这里仅简单介绍一下M函数的编制与使用方法。这对理解后面的S-函数有很重要的作用。,(1) M函数的第一行必须包含function,普通的M文件没有这种要求。(2) 在function后面必须声明函数名、输入变量(输入参数)与输出变量(输出参数),如function outvar=function_name(inputvar)。(3) M函数可以有零个、一个或多
27、个输入或输出。(4) M函数的调用方式为:outvar=function_name(inputvar)。,(5) M函数文件名须和函数名function_name相同,调用时函数的输入与输出变量名称不需要和函数定义中的变量相同。(6) M函数的注释用%开始的行表示,help function_name 显示的是紧接第一行之后的注释。,MATLAB允许将多个函数写在同一个M文件中,其中第一个函数是M文件的主函数,M文件名必须为主函数的名字。其余的函数均为子函数,并受到其它函数的调用。因此,用户可以书写具有模块化特色的MATLAB函数,但是要注意以下几点:(1) 所有的子函数只能在同一M文件下调用
28、。(2) 每个子函数都有自己单独的工作区,必须由调用函数传递合适的参数。(3) 当子函数调用结束后,子函数的工作区将被清空。,【例2.11】 编写一个通用的M函数求取【例2.10】中函数在任意点的值,并绘制函数在区间中的图形。解:(1) 编写函数demofun并将其存储在同名M文件demofun.m中。 function y=demofun(x) % M函数定义 leng=length(x); % 计算向量x的长度 for m=1:leng % 计算函数值if x(m)=0 % 判断x取值所在范围,y(m)=sin(x(m); % 计算分段函数值elseif x(m)=3y(m)=x(m);
29、% 计算分段函数值elsey(m)=-x(m)+6; % 计算分段函数值end end,(2) 编写M脚本文件demofile2.m,绘制函数曲线或在命令行下输入下列命令: x=-6:0.1:6; % 设定x的取值范围 y=demofun(x); % 调用函数demofun.m求值 plot(x,y),grid; % 输出图形结果如图2.8所示,与前面输出图形一致。,图2.8 使用子函数绘制图形,M函数可以较好地将具有一定功能的脚本文件进行封装,这样有利于程序的阅读与修改。这时可以在MATLAB命令窗口中显示工作区中的变量,输入以下命令: whosName Size Bytes Classx
30、1121 968 double arrayy 1121 968 double array Grand total is 242 elements using 1936 bytes,2.6 MATLAB的单元与结构体,1. 字符串数据MATLAB作为高性能的科学计算平台,不仅提供高精度的数值计算功能,而且还提供对多种数据类型的支持。如double类型表示双精度浮点数,char表示字符,unit8表示无符号8位整型数等等。除此之外,MATLAB还提供对字符串的支持,在MATLAB中字符串由单引号来定义,如,Strname=Simulation % 表示Strname为一字符串,其值为 Simula
31、tion进而可以定义字符(串)矩阵。它与定义普通矩阵类似。,2. 单元矩阵在前面所提到的矩阵与向量中,矩阵之中所有元素的数据类型均为单一的类型。MATLAB支持复合数据类型的矩阵与向量,这是由一个特殊的矩阵实现的,它就是单元矩阵(Cell类型的矩阵)。在有些书中,单元矩阵也称为细胞矩阵或细胞数组。,单元矩阵的生成方式有如下三种: (1) 使用花括号 直接生成,这与普通矩阵使用中括号 生成方法一致。例如 cellmatrix=xidian,press,20;xian,15.21,university; (2) 直接对单元矩阵中的每一单元分别进行赋值,如 cellname1=MATLAB; cel
32、lname2=20.23; (3) 通过MATLAB中单元矩阵的创建命令cell创建合适的矩阵。cell的使用方法如下: cellname=cell(m,n) % 表示创建一个mn的单元矩阵,3. 结构体如今的程序设计语言中,大都提供了对结构体变量的支持;MATLAB同样支持结构体变量,而且其生成与使用都非常容易、直观。结构体是一个很有用的某些具有某种相关性记录的集合体,它使一系列相关记录集合到一个统一的结构之中,从而使这些记录能够被有效地管理、组织与引用。,在MATLAB中,结构体是按照域的方式生成与存储结构体中的每个记录;一个域中可以包括任何MATLAB支持的数据类型,如双精度数值、字符、
33、单元矩阵及结构等类型。下面简单介绍结构体的生成与引用。1) 结构体生成结构体生成方式: struct_name(record_number).field_name=data;如某个班级学生花名册的建立: student(1).name=Li Yang; student(1).number=0134;,student(2).name=Ma Lei; student(2).number=0135; . . . student(33).name=Yao Hui; student(33).number=0166student是具有33个结构变量的向量,表示某个班级所有33个同学的姓名与学号。每一个记录对应一个学生的姓名与学号。由此可见,在MATLAB中建立结构体是不费吹灰之力的。,2) 结构体引用在MATLAB中对结构体变量的引用也很简单,如对上述学生花名册中的第二个学生记录的引用如下: Name=student(2).name; Number=student(2).number;其结果为Name=Ma LeiNumber=0134,