第 1 章 MATLAB与Simulink基础 1.1MATLAB基础 1.1.1MATLAB概述 MATLAB(matrix laboratory,矩阵实验室)是MathWorks公司开发的、目前国际上最流行、应用最广泛的科学与工程计算软件。 MATLAB具有强大的矩阵计算功能和良好的图形可视化功能,为用户提供了非常直观简洁的程序开发环境,被誉为“巨人肩上的工具”,在信号处理、图像处理、控制系统辨识、模糊控制以及神经网络等学科领域都有广泛的发展。 MATLAB提供了很多专用的工具箱,如控制系统工具箱(control system toolbox)、信号处理工具箱(signal processing toolbox)等。控制系统工具箱主要是运用经典控制理论处理线性时不变(linear timeinvariant,LTI)系统的函数集合,为LTI定常系统的建模、分析和设计提供了完整的解决方案。另一个框图式操作界面工具——单输入/单输出(singleinput/singleoutput,SISO)系统设计工具,可用于单输入/单输出反馈控制系统的补偿器校正设计。 MATLAB还有一个重要的软件包就是动态仿真集成环境Simulink。Simulink与用户的交互接口基于Windows模型化图形输入,使得用户可以把更多的精力投入系统模型的构建上,而非语言的编程上。所谓模型化图形输入是指Simulink提供了一些按功能分类的基本的系统模块,用户只需要知道这些模块的输入/输出及模块的功能,而不必研究模块内部是如何实现的。通过对这些基本模块的调用,再将它们连接起来就可以构成所需要的系统模型,然后进行仿真分析与设计。 MATLAB集科学与工程计算、图形可视化、图像处理、多媒体处理于一体,并提供了Windows图形界面设计方法。MATLAB语言有以下特点。 1. 功能强大 MATLAB语言的功能强大体现在以下两个方面。 1) 强大的科学运算功能 MATLAB是以复数矩阵为基本编程单元的程序设计语言,其强大的运算功能使其成为世界顶尖的数学应用软件之一。 MATLAB的数值运算要素不是单个数据,而是矩阵,每个变量代表一个矩阵,矩阵有m×n个元素,每个元素都可视为复数,所有的运算包括加、减、乘、除和函数运算等都对矩阵和复数有效; 另外,通过MATLAB的符号工具箱,可以解决在数学、应用科学和工程计算领域中常常遇到的符号计算问题。 2) 功能强大的模块工具箱 MATLAB对很多专门的领域都提供了功能强大的模块工具箱,一般来讲,它们都是由特定领域的专家开发的,用户可以直接使用工具箱,而不需要自己编写代码,例如数据采集、概率统计、优化算法、神经网络、小波分析、模型预测、电力系统仿真等,都在工具箱家族中有自己的一席之地,使MATLAB适用于不同领域。 2. 人机界面友好,编程效率高 MATLAB的语言规则与笔算式相似,矩阵的行列数无须定义,MATLAB的命令表达式与标准的数学表达式非常相近,易写、易读并易于交流。 MATLAB是以解释方式工作的,即它对每条语句进行解释后立即执行,输入算式后无须编译立即得到结果,若有错误也立即做出反应,便于编程者立即改正,减轻了编程和调试的工作量,提高了编程效率。 3. 强大而智能化的图形处理功能 MATLAB自出现以来,就具有方便的数据可视化功能,能将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。高层次的作图包括二维和三维的可视化、图像处理、动画和表达式作图。 MATLAB还可以方便地将工程计算的结果可视化,使原始数据的关系更加清晰明了,并揭示数据间的内在联系。 4. 可扩展性强 MATLAB软件包括基本部分和工具箱两大部分,具有良好的可扩展性。MATLAB的函数可以直接编辑和修改,MATLAB的工具箱可以任意增减。 MATLAB允许用户编写可以和MATLAB进行交互的C或C++语言程序。另外,MATLAB网页服务程序还允许在Web应用中使用自己的MATLAB数学和图形程序。 5. Simulink动态仿真功能 MATLAB的Simulink提供了动态仿真的功能,用户通过绘制框图模拟线性、非线性、连续或离散的系统,通过Simulink能够仿真并分析该系统。 1.1.2MATLAB环境 MATLAB既是一种高级计算机语言,又是一个编程环境。MATLAB的系统界面,通常是指这个软件系统所具有的各种界面里的诸多菜单命令、工具栏按钮与对话框。通过对其进行操作,可以运行并管理系统,生成、编辑与运行程序,管理变量与工作空间,输入/输出数据与相关信息以及生成与管理M文件等。 1. MATLAB的运行界面 1) MATLAB的启动方法 当MATLAB安装完成后,在桌面上创建一个MATLAB的快捷图标。双击该图标就可以打开MATLAB的工作界面; 也可以通过打开“开始”菜单的“程序”选项选择MATLAB的程序选项来打开; 还可以在MATLAB的安装路径中找到可执行文件Matlab.exe来启动MATLAB。 MATLAB启动后的操作界面如图1.1.1所示。 图1.1.1MATLAB R2010b界面 2) MATLAB操作界面 图1.1.1所示的是默认设置情况下的MATLAB操作界面,主要由菜单、工具栏、命令窗口、工作空间管理窗口、命令历史窗口和当前目录窗口组成,它们可重叠在一起,也可独立分离,可根据用户需求调节窗口大小。 (1) 菜单和工具栏 MATLAB的菜单和工具栏界面与Windows程序的界面类似,只要稍加实践就可以掌握其功能和使用方法。 (2) 命令窗口(Command Window) MATLAB命令窗口是用来接收MATLAB命令的窗口。在命令窗口中直接输入命令,可以实现显示、清除、储存、调出、管理、计算和绘图等功能。MATLAB命令窗口中的符号“”为运算提示符,表示MATLAB处于准备状态。当在提示符后输入一段程序或一段运算式后按回车键,MATLAB会给出计算结果并将其保存在工作空间管理窗口中,然后再次进入准备状态。 在命令窗口中实现管理功能的常用命令如表1.1.1所示。 表1.1.1命令窗口常用命令 命令 含义 cd 显示当前工作目录 dir 显示当前工作目录或指定目录下的文件 clc 清除命令窗口中的所有内容 clf 清除图形窗口 quit(exit) 退出MATLAB type test 在命令窗口中显示文件test.m的内容 delete test 删除文件test.m which test 显示test.m的目录 what 显示当前目录或指定目录下的M、MAT、MEX文件 为了便于对输入的内容进行编辑,MATLAB提供了一些控制光标位置和进行简单编辑的常用操作键,掌握这些命令可以在输入命令的过程中起到事半功倍的效果,命令窗口常用操作键如表1.1.2所示。 表1.1.2命令窗口常用操作键 操作键 含义 操作键 含义 ↑ 调用上一行 ↓ 调用下一行 ← 光标左移一个字符 → 光标右移一个字符 home 光标置于当前行首 end 光标置于当前行尾 del 删除光标处的字符 backspace 删除光标前的字符 在以上操作键中,反复使用“↑”,可以调出以前输入的所有命令,进行修改、计算。 (3) 工作空间管理窗口(Workspace) 工作空间管理窗口显示当前MATLAB的内存中使用的所有变量的变量名、变量的大小和变量的数据结构等信息,数据结构不同的变量对应着不同的图标。 在命令窗口中,实现变量的显示、清除、储存和调出的命令如表1.1.3所示。 表1.1.3命令窗口中实现变量控制的命令 命令 含义 who 显示当前工作空间中的所有变量名 whos 显示当前工作空间中的所有变量的变量名、变量的大小和数据类型 whos x 显示工作空间中的变量x的大小、数据类型 disp(x) 显示变量x的内容 clear 清除工作空间中的所有变量 clear x 清除工作空间中的变量x save文件名 把工作空间中的变量保存在当前MATLAB目录下产生的一个扩展名为mat的文件中 load文件名 把该mat文件中的变量调入到MATLAB的内存中 (4) 命令历史窗口(Command History) 命令历史窗口显示所有执行过的命令。在默认设置下,该窗口会保留自MATLAB安装后使用过的所有命令,并表明使用的时间。利用此窗口,一方面可以查看曾经执行过的命令; 另一方面,可以重复利用原来输入的命令,这只需在命令历史窗口中直接双击某个命令,就可以执行该命令。 (5) 当前目录窗口(Current Folder) 当前目录窗口显示当前目录下所有文件的文件名、文件类型和最后修改时间。 2. MATLAB帮助系统 MATLAB为用户提供了非常完善的帮助系统,如在线帮助、帮助窗口以及MATLAB演示等。通过使用帮助菜单或在命令窗口中输入帮助命令,可以很容易地获得MATLAB的帮助信息,进一步学习MATLAB。 1) 命令窗口查询帮助系统 在命令窗口查询帮助系统中最常用的命令是help。通过help命令,可以在命令窗口获得在线帮助。调用格式如下: help%在命令窗口列出所有主要的基本帮助主题 help /%在命令窗口列出所有的运算符和特殊字符 在命令窗口输入“help (函数名)”,就会在命令窗口中列出该函数的M文件的描述及用法,这是MATLAB中最常用的获取帮助信息的方式,例如: >> help sqrt SQRTSquare root. SQRT(X) is the square root of the elements of X. Complex results are produced if X is not positive. See also sqrtm. Overloaded functions or methods (ones with the same name in other directories) help sym/sqrt.m Reference page in Help browser doc sqrt 2) 联机帮助系统 单击MATLAB操作界面窗口的“?”按钮或选定“Help”菜单的前4项中的任意一项或在命令窗口中执行helpwin、helpdesk或doc命令都可以运行帮助窗口,进入MATLAB的联机帮助系统。 帮助向导页面包含四个页面,分别是帮助主题(Contents)、帮助索引(Index)、查询帮助(Search)以及演示帮助(Demos)。如果知道需要查询的内容的关键字,一般可以选择Index或Search模式来查询; 只知道需要查询的内容所属的主题或只是想进一步了解和学习某一主题,一般可以选择Contents或Demos模式来查询。 3) 联机演示系统 选择MATLAB主窗口菜单的“Help”→“Demos”选项或在命令窗口输入“demos”或直接在帮助页面上选择“Demos”选项都可以进入联机演示系统。通过联机演示系统,用户可以直观、快速地学习MATLAB某个工具箱的使用方法,它是有关的参考书籍所不能替代的。 1.1.3MATLAB数值运算 1. 变量 变量是任何程序设计语言的基本要素之一,MATLAB语言当然也不例外。与一般常规的程序设计语言不同的是,MATLAB语言并不要求对所使用的变量进行事先声明,也不需要指定变量类型,它会自动根据赋予变量的值或对变量进行的操作来确定变量的类型并为其分配内存空间。在赋值过程中,如果变量已存在,MATLAB将使用新值代替旧值,并以新的变量类型代替旧的变量类型。 MATLAB中变量的命名规则是: (1) 变量名区分大小写; (2) 变量名的长度不超过31位,第31个字符之后的字符将被忽略; (3) 变量名必须以字母开头,之后可以是任意字母、数字或下划线,变量名中不允许使用标点符号。 MATLAB中有一些预定义的变量,这些特殊的变量称为常量。如表1.1.4所示。 表1.1.4MATLAB语言中的常量 常量名 常量值 常量名 常量值 i, j 虚数单位 realmin 最小可用正实数 pi 圆周率 realmax 最大可用正实数 eps 计算机的最小浮点数 inf 正无穷大,如1/0 NaN NotaNumber,非数,特指0/0 flops 浮点运算数 在MATLAB语言中,定义变量时应避免与常量名相同,以免改变常量的值。 与其他程序设计语言相同,MATLAB语言中也存在变量作用域的问题。在未特殊说明的情况下,MATLAB语言将所识别的一切变量视为局部变量,即仅在其调用的函数内有效。若要定义全局变量,应对变量进行声明,即在该变量前加关键字global。 2. 数据运算 数学运算符号: “+”加法运算; “-”减法运算; “*”乘法运算; “.*”点乘运算; “/”右除运算; “\”左除运算; “./”点右除运算; “.\”点左除运算; “^”乘幂运算。 MATLAB中标点符号的含义是: (1) 在命令窗口中输入一个MATLAB语句(语句的一般形式为: 变量=表达式),如果语句后为逗号或无标点符号,则在命令窗口中显示该语句的计算结果; 如果语句后为分号,MATLAB只进行计算,不在命令窗口中显示计算结果。如果要查看计算结果,只需要在命令窗口中输入变量名按回车键或打开工作空间双击选中的变量即可。 (2) 在MATLAB的命令窗口中输入一个表达式或利用MATLAB进行编程时,如果表达式太长,可以用续行符号“...”将其延续到下一行。 (3) 编写MATLAB程序时,通常利用符号“%”对程序或其中的语句进行注释。 MATLAB中常用的数学函数如表1.1.5所示。 表1.1.5MATLAB中常用的数学函数 函数名 功能 函数名 功能 abs(x) 绝对值或向量的模值 exp(x) 指数函数ex angle(z) 复数z的相角 log(x) 自然对数 sqrt(x) 开平方 log10(x) 以10为底的对数 real(z) 复数z的实部 conj(z) 复数z的共轭复数 image(z) 复数z的虚部 sign(x) 符号函数 sin(x) 正弦函数 asin(x) 反正弦函数 cos(x) 余弦函数 acos(x) 反余弦函数 tan(x) 正切函数 atan(x) 反正切函数 3. 向量运算 1) 向量生成 向量包括行向量和列向量。在MATLAB中,向量是这么表示的: 用左方括号“[”开始,以空格或逗号为间隔输入元素值,最后以右方括号“]”结束,生成的向量是行向量。列向量也是以左方括号开始,右方括号结束的,不过元素值之间使用分号或者回车键分隔。除了直接输入外,还有以下三种生成方法生成行向量。列向量可以通过对行向量的转置运算得到。 (1) 冒号法 格式为: x=a:b:c,这里生成的向量x是以a为初值、c为终值、b为公差的等差数列构成的行向量。冒号表示直接定义向量元素之间的增量,而不是向量元素的个数,若增量为1(即b=1),上面的格式可简写为: x=a:c。 例1.1.1 >>x=0:0.5:2.5 x = 00.50001.00001.50002.00002.5000 (2) 函数linspace 调用格式: linspace(first_value,last_value,number) 其功能是生成一个初值为first_value、终值为last_value、元素个数为number的等差数列构造的行向量。由此可知,linspace是通过直接定义元素个数,而不是元素之间的增量来创建向量的。 例1.1.2 >> x=linspace(0,5,8) x = 00.71431.42862.14292.85713.57144.28575.0000 (3) 函数logspace 调用格式: logspace(first_value,last_value,number) 该格式表示构造一个初值为10first_value、终值为10last_value、元素个数为number的行向量。logspace函数功能相当于对linspace函数产生的向量取以10为底的指数。 2) 向量的运算 (1) 向量与标量的四则运算: 向量与标量之间的四则运算是指向量中的每个元素分别与标量进行加减乘除运算。 (2) 向量间的运算: 向量间的加减运算中,参与运算的向量必须具有相同的维数。乘除运算中,对于点乘“.*”“.\”,参与运算的向量必须具有相同的维数,点乘或者点除为向量对应的元素相乘或相除; 乘“*”、除“\”必须满足线性代数中所学的矩阵相乘或相除的条件。 (3) 幂运算: 向量的幂运符为“.^”,为元素对元素的幂运算。 3) 向量元素的引用 向量元素的下标是从1开始的,对元素的引用格式为: 变量名(下标)。此外,计算向量元素个数、最大值、最小值的函数分别为length、max、min。 4. 数组运算 1) 数组的建立 (1) 直接输入数组 建立数组最直接的方法是在命令窗口中直接输入数组。数组元素需要用方括号“[ ]”括起来,元素之间可以用空格、逗号或分号分隔。需要注意的是,用空格和逗号分隔建立行数组,元素之间全部用分号分隔建立列数组。 (2) 利用冒号表达式建立数组 利用冒号表达式建立等差数组,此时不用方括号“[ ]”。它的基本形式为x=x1:step:x2,其中x1、step、x2 分别为给定数值,x1表示数组的首元素数值,step 表示步长,即从第二个元素开始,后一个元素与前一个元素之间的差值,x2表示数组尾元素数值限。注意: x2并非尾元素数值,当x2-x1为step的整数倍时,x2才是尾元素数值。 2) 数组元素的调用 (1) 调用数组的一个元素: 数组的元素可以通过下标调用,如x(i)表示数组x的第i个元素。 (2) 调用数组的部分元素: x(a:b:c)表示调用数组x的从第a个元素开始、以b为步长、到第c个元素的这部分元素,b可以为负数,b缺省时为1。 (3) 直接使用元素序号调用数组元素: x([a b c d])表示调用数组x的第a、b、c、d个元素构成一个新数组[x(a) x(b) x(c) x(d)]。 3) 数组的运算 (1) 数组对标量的加、减、乘、除、乘方是数组的每个元素对该标量进行相应的加、减、乘、除、乘方运算。 (2) 两个相同维数的数组进行加、减、乘、除、幂运算,可按元素对元素的方式进行,不同大小或维数的数组不能进行运算。 (3) 两个相同维数的数组的点积由dot函数实现,调用格式: dot(a,b)。 (4) 两个三维数组之间的向量积由cross函数实现,调用格式: cross(a,b)。其中a、b必须是三个元素的向量。 5. 矩阵运算 由于MATLAB的数值计算功能都是以(复)矩阵为基本单元进行的,因此,MATLAB中矩阵的运算可谓最全面、最强大。 1) 矩阵的建立 (1) 直接输入小矩阵 在键盘上直接输入矩阵是最方便、最常用和最好的建立数值矩阵的方法,尤其适合较小的简单矩阵。用此方法建立矩阵时,应当注意以下几点: ① 输入矩阵以“[ ]”为其标识,即矩阵的元素应在“[ ]”的内部,此时MATLAB才将其识别为矩阵,如: a= [1,2,3; 1,1,1; 4, 5, 6]; ② 矩阵的同行元素之间可由空格或逗号分隔,行与行之间用分号或回车符分隔; ③ 矩阵大小可不预先定义; ④ 若不想获得中间结果,在“[ ]”后可用分号结束; ⑤ 无任何元素的空矩阵也合法; ⑥ 矩阵元素可以为运算表达式,如 b= [sin(pi/3), cos(pi/4); log(9), tanh(6)]。 (2) 使用MATLAB提供的矩阵编辑器输入和修改矩阵 当矩阵很大、不适合在命令窗口直接输入时,可以使用MATLAB提供的矩阵编辑器来完成矩阵的输入和修改。在使用矩阵编辑器时,必须首先在命令窗口中预先定义一个变量,这个变量可以是数或简单的矩阵。例如在命令窗口中输入A=1,打开工作空间窗口,选中变量A双击,就可以打开矩阵A的编辑器,通过添加或修改原来的元素,从而建立起需要的矩阵。 (3) 通过M文件建立大矩阵 当矩阵的规模比较大时,直接输入法就显得笨拙,出现差错也不易修改。为了解决此问题,可以通过M文件输入矩阵。M文件是一种可以在MATLAB环境中运行的文本文件,分为命令文件和函数文件两种。这里是用命令M文件来建立大型矩阵。从菜单栏的“File”中选择“New”,再选择“Mfile”命令,打开MATLAB Editor窗口,按格式把所要输入的矩阵写入一文本文件中,并将此文件以m为扩展名,即为M文件。在MATLAB命令窗口中输入此M文件名,运行后则把M文件中的大型矩阵输入MATLAB的内存中。 (4) 利用矩阵函数建立矩阵 可以用MATLAB的函数来建立全零矩阵,全1矩阵,单位矩阵,均匀分布(标准正态分布)随机矩阵,对角矩阵和上、下三角矩阵等特殊矩阵。 2) 矩阵元素的调用 矩阵元素的调用包括利用矩阵的全下标来调用矩阵的元素和利用矩阵的单下标来调用矩阵的元素两种方式。 (1) 利用矩阵的全下标来调用矩阵的元素 若A是一个二维矩阵,可以用A(i,j)来调用矩阵A的第i行第j列的元素,A(i,:)是调用矩阵A的第i行,A(:,j)是调用矩阵A的第j列,A([1,3],[2,4])得到由矩阵A的第1、3行和第2、4列交叉处元素所构成的矩阵。 (2) 利用矩阵的单下标来调用矩阵的元素 通过单下标来调用矩阵的元素的格式为A(k)。在MATLAB中,矩阵是按列优先排列的一个长列向量格式来存储的,例如A=[2,6,9;4,2,8;3,0,1]。在MATLAB中是被存储成以2、4、3、6、2、0、9、8、1排列的一个列向量。矩阵A的第3行第2列,也就是值为0的元素在存储空间上是第六个元素。可以用A(6)调用这个元素,这就是单下标调用矩阵元素的方法。命令B=A(:)得到B=[2;4;3;6;2;0;9;8;1]。 3) 矩阵的运算 (1) 矩阵与标量的运算: 与数组与标量的运算类似。 (2) 两个矩阵元素之间的运算: 与两个数组元素之间的运算类似。 (3) 矩阵的加、减法: A±B。 (4) 矩阵的乘法: A*B。 (5) 矩阵的除法: 矩阵除法有左除“\”和右除“/”两种。方程AX=B的解用X=A\B表示,方程 XA=B的解用X=B/A表示。 (6) 方阵的逆运算: inv(A)。 (7) 方阵的行列式: det(A)。 (8) 方阵的乘方运算 A^p: 当p为正整数时,A^p表示矩阵A自乘p次; 当p为负整数时,A^p表示矩阵A-1自乘|p|次,此时要求A可逆; 当p为0时,A^0等于与A同维的单位阵。 6. 多项式运算 MATLAB以行向量表示多项式由大到小的幂次方的多项式系数,这样就把多项式的问题转化为向量的问题。 1) 多项式的建立 (1) 由系数向量建立多项式: 在MATLAB中,由于多项式是以向量形式储存的,因此建立多项式的最简单的方法是直接输入向量,MATLAB自动将向量元素按降幂顺序分配给多项式的各系数值,向量可以是行向量,也可以是列向量。 (2) 特征多项式的建立: 矩阵的特征多项式由函数poly实现。 (3) 由多项式的根建立多项式: 由给定的根建立相应的多项式也由函数poly实现。 2) 多项式的运算 (1) 求多项式的值 求多项式的值是以数组为计算单元,计算函数是polyval,调用格式为: y=polyval(p,x)。其中p为行向量形式的多项式,x为代入多项式的值,它可以是标量、向量、矩阵。如果x是向量或者矩阵,该函数将对向量或者矩阵的每一个元素计算多项式的值。 例1.1.3 >>p=[1,11,55,125];x=[1,1;2,2]; >>a=polyval(p,x) (2) 求多项式的根 可以直接调用MATLAB的函数roots求多项式的所有根。 例1.1.4求解方程2x4-5x3+6x2-x+9=0的所有根。 >>p=[2 -5 6 -1 9];