本章导读
MATLAB也是一门计算语言,它的运算指令和语法基于一系列基本的矩阵运算以及它们的扩展运算,它还支持复数这一数值元素,这也是MATLAB区别于其他高级语言的最大特点之一,它给许多领域的计算带来了极大方便。
MATLAB包括四种基本数据类型,即双精度数组、字符串数组、元胞数组、构架数组。数值之间可以相互转化,这为其计算功能开拓了广阔的空间。
1.变量与常量
变量是数值计算的基本单元。与C语言等其他高级语言不同,MATLAB语言中的变量无须事先定义,一个变量以其名称在语句命令中第一次合法出现而定义,运算表达式变量中不允许有未定义的变量,也不需要预先定义变量的类型,MATLAB会自动生成变量,并根据变量的操作确定其类型。
(1)MATLAB变量命名规则
MATLAB中的变量命名规则如下:
①变量名区分大小写,因此A与a表示的是不同的变量;
②变量名以英文字母开始,第一个字母后可以使用字母、数字、下画线,但不能使用空格和标点符号;
③变量名长度不得超过31位,超过的部分将被忽略;
④某些常量也可以作为变量使用,如i在MATLAB中表示虚数单位,但也可以作为变量使用。
常量是指那些在MATLAB中已预先定义其数值的变量,默认的常量如表2.1所示。
表2.1 MATLAB默认常量
(2)MATLAB变量的显示
任何MATLAB语句的执行结果都可以在屏幕上显示,同时赋值给指定的变量,没有指定变量时,赋值给一个特殊的变量ans,数据的显示格式由format命令控制。format只影响结果的显示,不影响其计算与存储。MATLAB总是以双字长浮点数(双精度)来执行所有的运算。如果结果为整数,则显示没有小数;如果结果不是整数,则输出形式有表2.2所示的几种形式。
表2.2 MATLAB的数据显示格式
(3)MATLAB变量的存取
工作空间中的变量可以用save命令存储到磁盘文件中。输入命令“save<文件名>”,将工作空间中全部变量存到“<文件名>.mat”文件中去,若省略“<文件名>”则存入文件“matlab.mat”中;命令“save<文件名><变量名集>”将“<变量名集>”指出的变量存入文件“<文件名>.mat”中。
用load命令可将变量从磁盘文件读入MATLAB的工作空间,其用法为“load<文件名>”,它将“<文件名>”指出的磁盘文件中的数据依次读入名称与“<文件名>”相同的工作空间中的变量中去。若省略“<文件名>”则“matlab.mat”从中读入所有数据。
用clear命令可从工作空间中清除现存的变量。
2.字符串
字符串是MATLAB中符号运算的基本元素,也是文字等表达方式的基本元素,在MATLAB中,字符串作为字符数组用单引号(ˈ)引用到程序中,还可以通过字符串运算组成复杂的字符串。字符串数值和数字数值之间可以进行转换,也可以执行字符串的有关操作。
3.元胞数组
元胞是元胞数组(Cell Array)的基本组成部分。元胞数组与数字数组相似,以下标来区分,单元胞数组由元胞和元胞内容两部分组成。用花括号{}表示元胞数组的内容,用圆括号()表示元胞元素。与一般的数字数组不同,元胞可以存放任何类型、任何大小的数组,而且同一个元胞数组中各元胞的内容可以不同。
【例2-1】 元胞数组创建与显示实例。
解: MATLAB程序代码如下。
元胞数组A第1行用元胞数组标志法建立一个字符串和一个矩阵;第2行用元胞内容编址法,建立一个传递函数和一个由两个元素组成的元胞组,该元胞组分别是矩阵和字符串,最后,用celldisp函数显示该元胞数组A。
4.构架数组
与元胞数组相似,构架数组(Structure Array)也能存放各类数据,使用指针方式传递数值。构架数组由结构变量名和属性名组成,用指针操作符“.”连接结构变量名和属性名。例如,可用parameter.temperature表示某一对象的温度参数,用parameter.humidity表示某一对象的湿度参数等,因此,该构架数组parameter由两个属性组成。
5.对象
面向对象的MATLAB语言采用了多种对象,如自动控制中常用的传递函数模型对象(tf object)、状态空间模型对象(ss object)和零极点模型对象(zpk object),一些对象之间可以相互转换,例如可以从传递函数模型对象转化为零极点模型对象,这将在后面具体介绍。
MATLAB中数组(array)可以说无处不在,任何变量在MATLAB中都是以数组形式存储和运算的。
按照数组元素的个数和排列方式,MATLAB中的数组可以分为:
(1)没有元素的空数组(empty array);
(2)只有一个元素的标量(scalar),它实际上是一行一列的数组;
(3)只有一行或者一列元素的向量(vector),分别叫做行向量和列向量,也统称为一维数组;
(4)普通的具有多行多列元素的二维数组;
(5)超过二维的多维数组(具有行、列、页等多个维度)。
按照数组的存储方式,MATLAB中的数组可以分为:普通数组和稀疏数组(常称为稀疏矩阵)。稀疏矩阵适用于那些大部分元素为0,只有少部分非零元素的数组的存储,主要是为了提高数据存储和运算的效率。
MATLAB中一般使用方括号([])、逗号(,)或空格,以及分号(;)来创建数组,方括号中给出数组的所有元素,同一行中的元素间用逗号或空格分隔,不同行之间用分号分隔。
1.空数组
空数组是MATLAB中特殊的数组,它不含有任何元素。空数组可以用于数组声明,数组清空,以及各种特殊的运算场合。
创建空数组很简单,只需要把变量赋值为空的方括号即可。
2.一维数组
一维数组包括行向量和列向量,是所有元素排列在一行或一列中的数组。实际上,一维数组可以看做二维数组在某一方向(行或列)尺寸退化为1的特殊形式。
创建一维行向量,只需要把所有用空格或逗号分隔的元素用方括号括起来即可;而创建一维列向量,则需要在方括号括起来的元素之间用分号分隔。不过,更常用的办法是用转置运算符(ˈ),把行向量转置为列向量。
创建一维数组可能用到:方括号、逗号或空格、分号、冒号、函数linspace和logspace,以及转置符号(ˈ)。
3.二维数组
常规创建二维数组的方法实际上和创建一维数组方法类似,就是综合运用方括号、逗号、空格,以及分号。
方括号把所有元素括起来,不同行元素之间用分号间隔,同一行元素之间用逗号或者空格间隔,按照逐行排列的方式顺序书写每个元素。
当然,在创建每一行或列元素的时候,可以利用冒号和函数的方法,只是要特别注意创建二维数组时,要保证每一行(或每一列)具有相同数目的元素。
创建二维数组,也可以通过函数拼接一维数组,或者利用MATLAB内部函数直接创建特殊的二维数组。
【例2-2】 数组创建实例。
解: 在命令窗口输入:
下面简要介绍数组的各种数学运算。
1.数组-数组运算
最基本的就是数组和数组的加(+)、减(-)、乘(*)、乘方(^)等运算。要注意,数组的加、减,要求参与运算的两个数组具有相同的尺寸,而数组的乘法要求第一个数组的列数等于第二个数组的行数,乘方运算在指数n为自然数时相当于n次自乘,这要求数组具有相同的行数和列数。
数组除法实际上是乘法的逆运算,相当于参与运算的一个数组和另一个数组的逆(或伪逆)数组相乘。MATLAB中数组除法有左除(/)和右除(\)两种:
(1) A / B 相当于 A *inv( B )或 A *pinv( B );
(2) A \ B 相当于inv( A )* B 或pinv( A )* B 。
其中inv是数组求逆函数,仅适用于行列数相同的方形数组(线性代数中,称为方阵);pinv是求数组广义逆的函数。
2.点运算
前面讲到的数组乘、除、乘方运算,都是专门针对数组定义的运算。有些情况下,用户可能希望对两个尺寸相同的数组进行元素对元素的乘、除,或者对数组的逐个元素进行乘方,这可以通过点运算实现。
A .* B ,就可以实现两个同样尺寸的数组 A 和数组 B 对应元素的乘法,同样地, A ./ B 或 A .\ B 实现元素对元素的除法, A .^n实现对逐个元素的乘方。
特别要强调的是,许多MATLAB内置的运算函数,如sqrt、exp、log、sin、cos等,都只能对数组进行逐个元素的相应运算。至于专门的数组的开方、指数等运算,都有专门的数组运算函数。
3.专门针对数组的运算函数
MATLAB中,专门针对数组的运算函数一般末尾都以m结尾(m代表matirx),如sqrtm、expm、logm等,这些运算都是特别定义的数组运算,不同于针对单个数值的常规数学运算。
【例2-3】 数组运算。
解: 在命令窗口输入:
MATLAB软件的最大特色是强大的矩阵计算功能,在MATLAB软件中,所有的计算都是以矩阵为单元进行的,可见矩阵是MATLAB的核心。下面以表格的形式列出MATLAB提供的每类矩阵运算的函数,并各举一个实例进行说明,同类函数的用法基本类似,详细的用法及函数内容说明可参考联机帮助。
由m行n列构成的数组a称为m×n阶矩阵,它总共由m×n个元素组成,矩阵元素记为a ij ,其中i表示行,j表示列。
当m=n时,矩阵a称为方阵。当i≠ j时,所有的a ij =0,且m=n,得到的矩阵称为对角阵。
当对角阵的对角线上的元素全为1时,称为单位阵,记为 I 。
对于(m×n)阶矩阵w,当w ij =a ji 时,称w是a的转置矩阵,记为w=a′。
对于a为(m×1)的形式时,称a是m个元素的列向量,对于a为(1×n)的形式时,称a是n个元素的行向量。
矩阵的表现形式和数组相似,它以左方括号“[”开始,以右方括号“]”结束,每一行元素结束用行结束符号(分号“;”)或回车符分割,每个元素之间用元素分割符号(空格或“,”)分隔。建立矩阵的方法有直接输入矩阵元素、在现有矩阵中添加或删除元素、读取数据文件、采用现有矩阵组合、矩阵转向、矩阵移位及直接建立特殊矩阵等。
【例2-4】 矩阵创建实例。
解: MATLAB程序代码如下。
运行结果是创建了一个2×3的矩阵a,a的第1行由1、2、3这3个元素组成,第2行由4、5、6这3个元素组成,输出结果如下:
接着输入:
运行结果是创建了一个3×3的矩阵b,b矩阵是在a矩阵的基础上添加一行元素11、12、13,组成一个3×3矩阵,输出结果如下:
MATLAB中对矩阵元素的访问如下所示:
●单个元素的访问:b(3,2)→12,访问了第3行和第2列交叉的元素;
●整列元素的访问:b(:,3)→[3,6,13]’,访问了第3列中的所有元素;
●整行元素的访问:b(1,:)→[1,4,11],访问了第1行中的所有元素;
●整块元素的访问:b(2:3,2:3)→[5,6;12,13],访问了一个(2×2)的子块矩阵。
MATLAB提供了很多个特殊矩阵的生成函数,表2.3列出了一些常用的生成函数,关于其他的特殊矩阵生成函数及使用格式,请参见联机帮助。
表2.3 MATLAB常用特殊矩阵的生成函数
【例2-5】 特殊矩阵生成函数使用实例。
解: MATLAB程序代码如下。
运行结果是生成了b矩阵,它是调用下三角矩阵生成函数tril()生成的a矩阵的下三角矩阵,输出结果如下:
矩阵与矩阵之间可以进行如表2.4所示的基本运算。
注意
在进行左除“/”和右除“\”时,两矩阵的维数必须相等。
表2.4 矩阵基本运算
【例2-6】 矩阵基本运算实例。
解: MATLAB程序代码如下。
两矩阵a与b进行了左除和右除运算,输出结果如下:
MATLAB提供了多种关于矩阵的函数,表2.5列出了一些常用的矩阵函数运算。
表2.5 常用的矩阵函数运算
【例2-7】 矩阵函数运算实例。
解: MATLAB程序代码如下。
通过函数eig()计算矩阵a的特征向量b和特征值c,输出结果如下:
矩阵分解常用于方程求根,表2.6列出了一些常用的矩阵分解运算。
表2.6 常用的矩阵分解运算函数
【例2-8】 矩阵分解运算函数使用实例。
解: MATLAB程序代码如下。
通过函数lu()对矩阵a进行LU分解,得到上三角阵U、下三角阵L、置换矩阵P,输出结果如下:
MATLAB提供了符号数学工具箱(Symbolic Math Toolbox),大大增强了MATLAB的功能。符号数学工具箱的特点为:
(1)符号数学工具箱适用于广泛的用途,而不是针对一些特殊专业或专业分支;
(2)符号数学工具箱使用字符串来进行符号分析,而不是基于数组的数值分析。
符号数学工具箱是操作和解决符号表达式的符号数学工具箱(函数)集合,有复合、简化、微分、积分以及求解代数方程和微分方程的工具。另外还有一些用于线性代数的工具,求解逆、行列式、正则形式的精确结果,找出符号矩阵的特征值而没有由数值计算引入的误差。工具箱还支持可变精度运算,即支持符号计算并能以指定的精度返回结果。
符号运算与数值运算的主要区别如下:
(1)数值运算中必须先对变量赋值,然后才能参与运算;
(2)符号运算无须事先对独立变量赋值,运算结果以标准的符号形式表达。
符号运算的运算对象可以是没赋值的符号变量,可以获得任意精度的解。
1.符号表达式
符号表达式是代表数字、函数、算子和变量的MATLAB字符串,或字符串数组。不要求变量有预先确定的值,符号方程式是含有等号的符号表达式。符号算术是使用已知的规则和给定符号恒等式求解这些符号方程的实践,它与代数和微积分所学到的求解方法完全一样。符号矩阵是数组,其元素是符号表达式。
MATLAB在内部把符号表达式表示成字符串,与数字变量或运算相区别;否则,这些符号表达式几乎完全像基本的MATLAB命令。
2.创建符号对象
MATLAB提供了两个建立符号对象的函数:sym和syms,两个函数的用法介绍如下。
(1)sym函数
sym函数用来建立单个符号量,一般调用格式为:
符号量名=sym(ˈ符号字符串ˈ)
该函数可以建立一个符号量,符号字符串可以是常量、变量、函数或表达式。应用sym函数还可以定义符号常量。
(2)syms函数
函数sym一次只能定义一个符号变量,使用不方便。MATLAB提供了另一个函数syms,一次可以定义多个符号变量。
syms函数的一般调用格式为:
syms符号变量名1 符号变量名2…符号变量名n
用这种格式定义符号变量时不要在变量名上加字符串分界符(ˈ),变量间用空格而不要用逗号分隔。
含有符号对象的表达式称为符号表达式,建立符号表达式有以下3种方法:
●利用单引号来生成符号表达式;
●用sym函数建立符号表达式;
●使用已经定义的符号变量组成符号表达式。
【例2-9】 符号表达式创建实例。
解: 在MATLAB窗口,输入下列命令:
3.符号矩阵
符号矩阵也是一种符号表达式,所以前面介绍的符号表达式运算都可以在矩阵意义下进行。但应注意这些函数作用于符号矩阵时,是分别作用于矩阵每一个元素的。
通过sym函数创立符号矩阵,矩阵元素可以是任何不带等号的符号表达式,各符号表达式的长度可以不同,矩阵元素之间可用空格或逗号分隔。
例如,在命令窗口中输入A=sym(ˈ[a,2*b;3*a,0]ˈ),就完成了一个符号矩阵 的创建,输出的结果为:
需要注意的是:符号矩阵每一行的两端都有方括号,这是与MATLAB数值矩阵的一个重要区别。
在MATLAB中,数值矩阵不能直接参与符号运算,必须先转化为符号矩阵。
(1)将数值矩阵转化为符号矩阵
函数调用格式为:sym(数值矩阵)
(2)将符号矩阵转化为数值矩阵
函数调用格式:numeric(A)
由于符号矩阵是一个矩阵,所以符号矩阵能进行有关矩阵的运算。MATLAB还有一些专用于符号矩阵的函数,这些函数作用于单个的数据无意义。例如:
transpose(s):返回s矩阵的转置矩阵。
determ(s):返回s矩阵的行列式值。
其实,许多应用于数值矩阵的函数,如diag、triu、tril、inv、det、rank、eig等,也可直接应用于符号矩阵。
4.符号表达式的四则运算
符号表达式的四则运算比较简单,常用的函数介绍如下:
●factor(S):对S分解因式,S是符号表达式或符号矩阵;
●expand(S):对S进行展开,S是符号表达式或符号矩阵;
●collect(S):对S合并同类项,S是符号表达式或符号矩阵;
●collect(S,v):对S按变量v合并同类项,S是符号表达式或符号矩阵;
●simplify(S):应用函数规则对S进行化简;
●simple(S):调用MATLAB的其他函数对表达式进行综合化简,并显示化简过程。
符号变量和数字变量之间可转换,也可以用数字代替符号得到数值。符号运算种类非常多,常用的符号运算有代数运算、积分和微分运算、极限运算、级数求和、进行方程求解等。
出于篇幅的考虑,下面仅对常用的符号运算进行介绍,其他的符号运算的使用方法大同小异,读者可通过MATLAB的帮助文档或其他关于符号函数工具箱的书籍进行学习,此处不再赘述。
常用的符号运算有求极值、级数求和、微积分、解微分方程等,下面分别进行介绍。
●limit
limit是求极限的符号函数,其常用的格式是:
limit(F,x,a,ˈrightˈ)或limit(F,x,a,ˈleftˈ)
表示当自变量x从右侧或左侧逼近a时,函数F的极值。
●diff
diff是求微分最常用的符号函数,其输入参数既可以是函数表达式,也可以是符号矩阵。
常用的格式是:diff(f,x,n),表示f关于x求n阶导数。
●int
int是求积分最常用的符号函数,其输入参数可以是函数表达式。
常用的格式是:int(f,r,x0,x1),其中,f为所要积分的表达式,r为积分变量,若为定积分,则x0与x1为积分上下限。
●symsum
symsum是级数求和的符号函数,其常用的格式是:
S=symsum(fk,k,k0,kn),其中fk为级数的通项,k为级数自变量,k0和kn为级数求和的起始项和终止项,且可设为inf。
●dsolve
dsolve求解常微分方程的符号函数,其常用的格式是:
dsolve(ˈeqn1ˈ,ˈconditionˈ,ˈvarˈ)
该函数求解微分方程eqn1在初值条件condition下的特解。参数var描述方程中的自变量符号,省略时按默认原则处理,若没有给出初值条件condition,则求方程的通解。
dsolve在求微分方程组时的调用格式为:
dsolve(ˈeqn1ˈ,ˈeqn2ˈ,…,ˈeqnNˈ,ˈcondition1ˈ,…,ˈconditionNˈ,ˈvar1ˈ,…,ˈvarNˈ)
函数求解微分方程组eqn1、…、eqnN在初值条件conditoion1、…、conditionN下的解,若不给出初值条件,则求方程组的通解,var1、…、varN给出求解变量。
【例2-10】 微积分的符号运算实例。(1)已知表达式f=sin(ax),分别对其中的x和a求导;(2)已知表达式f=xlog(1+x),求对x的积分和x在(0,1)上的积分值。
解: 输入如下MATLAB程序代码。
运行程序,输出结果如下所示:
【例2-11】 常微分方程符号运算实例。(1)计算微分方程 +3xy= 的通解。(2)计算微分方程xy ˈ +2 y-e x =0在初始条件y| x=1 =2e下的特解。(3)求y ˈˈ +2 y ˈ +e x =0的通解。
解: 输入如下的MATLAB程序代码。
运行程序,输出结果如下所示:
可知(1)的通解为y= ,其中C 9 为常数;(2)的特解为y= ;(3)的通解为y=- *C 7 +C 6 ,其中C 7 ,C 6 为常数。
除了传统的数学运算外,MATLAB还支持关系运算和逻辑运算。如果你已经有了一些编程经验,那对这些运算不会陌生。这些操作符和函数的目的是提供求解真/假命题的答案。关系运算和逻辑运算主要用于控制基于真/假命题的各MATLAB命令(通常在M文件中)的流程或执行次序。
作为所有关系表达式和逻辑表达式的输入,MATLAB把任何非0数值当做真,把0当做假。所有关系表达式和逻辑表达式的输出,对于真输出为1,对于假输出为0。
MATLAB为关系运算和逻辑运算提供了关系操作符和逻辑操作符,如表2.7和表2.8所示。
表2.7 关系运算符
表2.8 逻辑运算符
此外,MATLAB还提供了若干关系运算函数和逻辑运算函数,分别如表2.9和表2.10所示。
表2.9 关系运算函数
表2.10 逻辑运算函数
MATLAB语言具有强大的运算功能,熟练掌握和运用这些功能是发挥MATLAB强大功能的基础。
由于篇幅所限,本章只讲了那些最基本,最具有代表性的运算,其他的运算与之大同小异,读者可参照help文档自行学习,熟练掌握。