1.2 MATLAB基本使用方法
本节主要介绍MATLAB强大的数学计算功能和图形绘画功能,为控制系统的建模、分析和设计打下基础。
1.2.1 基本要素
MATLAB基本要素包括变量、数值、复数、字符串、运算符、标点符等。
1.变量
MATLAB不要求用户在输入变量的时候进行声明,也不需要指定变量类型。MATLAB会自动依据所赋予变量的值或对变量进行的操作来识别变量的类型。在赋值过程中,如果赋值变量已存在,那么MATLAB将使用新值替换旧值,并替换其类型。
MATLAB变量的命名规则如下:
① 变量名区分字母大小写,如feedback和Feedback表示两个不同变量。
② MATLAB 6.5版本以上,变量名不得超过63个字符。
③ 变量名必须以英文字母开头。
④ 变量名由字母、数字和下画线组成,但不能包含空格和标点。
不管使用哪种计算机语言,变量的命名习惯很重要。好的变量命名可以大大提高程序的可读性。变量名不宜太长,一般用小写字母表示;变量名应使用能帮助记忆、或能够提示其在程序中用法的名字,这样还可以避免重复命名;当变量名包含多个词时,可以在每个词之间添加一个下画线,或者每个内嵌的词的第一个字母都大写,如my_var或MyVar。
MATLAB有一些自己的特殊变量,是由系统自动定义的,当MATLAB启动时就驻留在内存中,但在工作空间中却看不到,这些变量被称为预定义变量或默认变量,如表1.2.1所示。
表1.2.1 MATLAB预定义变量
【例1.2.1】计算2π值。
解:在MATLAB命令窗口中输入:
>> 2*pi
运行结果为:
ans = 6.2832
注意:在定义变量时,应避免与预定义变量名重复,以免改变这些变量的值。如果已经改变了某个变量的值,可以通过输入 "clear变量名”来恢复该变量的初始设定值。
2.数值
在MATLAB中,数值表示既可以使用十进制计数法,也可以使用科学计数法。所有数值均按IEEE浮点标准规定的长型格式存储,数值的有效范围为10−308~10308。
3.复数
MATLAB中复数的基本单位表示为i或j。可以利用以下语句生成复数:
① z = a + bi z=a+bi。
② z=r*exp (θ*i),其中r是复数的模,θ是幅角的弧度数。
4.字符串
在MATLAB中创建字符串的方法是,将待建的字符串放入单引号中。注意,单引号必须在英文状态下输入,而字符串内容可以是中文。
MATLAB中,字符串的字体颜色为紫色。
【例1.2.2】显示字符串“欢迎使用MATLAB"。
解:在MATLAB命令窗口中输入:
>> ’欢迎使用MATLAB'
运行结果为:
ans = 欢迎使用MATLAB
5.运算符
MATLAB中运算符包括算术运算符、关系运算符和逻辑运算符,如表1.2.2所示。
表1.2.2 MATLAB运算符
6.标点符
在MATLAB中,一些标点符号也被赋予了特殊的意义或用于进行一定的计算等,如表1.2.3所示。
表1.2.3 MATLAB标点符
这里对冒号做进一步介绍。冒号在MATLAB中的作用极为丰富,不仅可以定义行向量,还可以截取指定矩阵中的部分元素。
产生等间距行向量的格式为:
from:step:to %产生以from开始,以to结尾,步长为step的行向量
说明:
① from、step、to均为数字表示。
② step可省略,步长默认为1。
【例1.2.3】用冒号产生增量为1和2的行向量。
解:在MATLAB命令窗口中输入:
>> a=2:8 %默认增量为1
运行结果为:
a = 2 3 4 5 6 7 8
在MATLAB命令窗口中输入:
>> a=2:2:8 %产生增量为2的行向量
运行结果为:
a = 2 4 6 8
1.2.2 应用基础
用户可以利用MATLAB在命令窗口中随心所欲地进行各种数学演算,就如同使用计算器那么简单方便。
【例1.2.4】求算术运算[9×(10-1) + 19]÷22的结果。
解:在MATLAB命令窗口中输入:
>> (9*(10-1)+19)/2^2
运行结果为:
ans = 25
说明:
① 命令行行首符号“>>”是命令输入提示符,由MATLAB自动产生,用户不用自行输入。
② MATLAB的运算符号为西文字符,不能在中文状态下输入。
③ 在全部输入一个命令行内容后,必须按下回车键,该命令才会被执行。
④ 如果不想显示计算结果,可以在命令行结尾处添加分号“; ”。对于以分号结尾的语句,尽管该命令已执行,但MATLAB并不显示其运算结果。
⑤ 可以添加百分号“%”来对语句进行注释。百分号后所有输入语句都为注释,直至输入回车键。系统并不执行注释语言。注释语句在MATLAB中以绿色文字显示。
1.矩阵
矩阵是MATLAB的基本运算单元,矩阵运算是MATLAB的核心。在MATLAB中,矩阵的生成方法有很多,既可以以矩阵格式输入得到,也可以由MATLAB提供的函数生成。
在MATLAB中输入矩阵应该要注意:
① 所有运算符号和标点符号必须在英文状态下输入。
② 矩阵每行元素之间用空格或逗号“, ”分隔,矩阵行之间用分号“; ”隔离。整个矩阵放在方括号“[ ]”中。
③ 不必对矩阵维数做说明,系统将自动配置。
【例1.2.5】输入矩阵。
解:在MATLAB命令窗口中输入:
>> A=[1,0,0;0,1,0;0,0,1] %也可以输入A=[1 0 0;0 1 0;0 0 1]得到相同结果
运行结果为:
A = 1 0 0 0 1 0 0 0 1
注意:例1.2.5中的命令被执行后,矩阵A会被保存在MATLAB的工作空间内。如果用户不用clear命令清除或对它重新赋值,那么该矩阵值会一直保存在工作空间内,直到该次的MATLAB命令窗口关闭。
进一步地,A(i, j)表示矩阵A中第i行第 j列元素。在MATLAB中,使用A(i, :)提取矩阵第i行的全部元素;使用A(:, j)提取矩阵第 j列的全部元素;使用A(i1:i2, :)提取i1~i2行的全部元素;使用A(i, j)提取矩阵A中第i行第 j列元素。
【例1.2.6】提取例1.2.5中矩阵A第1、2行元素。
解:在MATLAB命令行中输入:
>> A (1:2, :)
运行结果为:
ans = 1 0 0 0 1 0
MATLAB中还可以利用方括号将矩阵进行“合成”。如在MATLAB命令窗口中输入:
>> B=[A, A+1; A+2, A+3]
运行结果为:
B = 1 0 0 2 1 1 0 1 0 1 2 1 0 0 1 1 1 2 3 2 2 4 3 3 2 3 2 3 4 3 2 2 3 3 3 4
2.特殊矩阵的生成
MATLAB中内置了很多特殊矩阵的生成函数,利用这些函数可以自动生成一些特殊的矩阵。
(1)空矩阵
空矩阵用方括号“[ ]”表示。
空矩阵大小为零,但变量名却保存在工作空间中。
(2)单位阵
单位阵使用函数eye ()实现。其格式如下:
eye (n) %生成n维的方阵 eye (n, m) %生成n×m维矩阵
【例1.2.7】生成4×4维的单位阵。
解:在MATLAB命令窗口中输入:
>> a=eye (4)
运行结果为:
a = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
(3)零矩阵
零矩阵使用函数zeros ()实现。格式与函数eye ()相同。
【例1.2.8】生成3×4维的零矩阵。
解:在MATLAB命令窗口中输入:
>> a=zeros (3,4)
运行结果为:
a = 0 0 0 0 0 0 0 0 0 0 0 0
(4)对角矩阵
对角矩阵使用函数diag ()实现。其调用格式如下:
diag(V) %生成元素在主对角线上的对角阵 diag(V, K) %生成对角阵
说明:
① V为向量,即对角阵元素值。
② K为数值,表示向量V偏离主对角线的列数。K < 0时,V在主对角线下方;K > 0时,V在主对角线上方;K = 0时,V在主对角线上。
【例1.2.9】生成对角矩阵。
解:在MATLAB命令窗口中输入:
>> V=[1 3 5 7]; >> diag (V)
运行结果为:
ans = 1 0 0 0 0 3 0 0 0 0 5 0 0 0 0 7
在MATLAB命令窗口中输入:
>> diag (V, -1)
运行结果为:
ans = 0 0 0 0 0 1 0 0 0 0 0 3 0 0 0 0 0 5 0 0 0 0 0 7 0
在MATLAB命令窗口中输入:
>> diag (V,2)
运行结果为:
ans = 0 0 1 0 0 0 0 0 0 3 0 0 0 0 0 0 5 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0
(5)全部元素为1的矩阵
该矩阵使用函数ones ()实现,其调用格式和函数eye ()相同。
【例1.2.10】产生一个3×4维的全一矩阵。
解:在MATLAB命令窗口中输入:
>> ones (3,4)
运行结果为:
ans = 1 1 1 1 1 1 1 1 1 1 1 1
1.2.3 数值运算
MATLAB在科学计算及工程中的应用极其广泛,其主要原因是许多数值运算问题都可以通过MATLAB简单地得到解决。
1.向量运算
向量是组成矩阵的基本元素之一。向量的输入和矩阵的输入一样,行向量元素之间用空格或逗号“, ”隔离,列向量元素之间用分号“; ”隔离。在1.2.1节中还介绍了利用标点符冒号“:”生成等间距行向量的方法。
向量的基本运算包括向量与常数间、向量与向量间的运算。
(1)向量与常数之间的四则运算
向量与常数之间的四则运算是指向量的每个元素与常数进行的加、减、乘、除等运算。运算符号分别是“+”、“−”、“*”及“/”。
(2)向量与向量之间的运算
向量与向量之间的加、减运算是指向量的每个元素与另一个向量的对应元素之间的加、减运算。运算符号为“+”和“−”。
向量的点积用函数dot ()实现。向量的叉积用函数cross ()实现。
dot (a, b) %计算向量a和b的点积 cross (a, b) %计算向量a和b的叉积
【例1.2.11】计算向量A=[123]和B=[7 12 30]的点积和叉积。
解:在MATLAB命令窗口中输入:
>> A=[1 2 3]; B=[7 12 30]; >> dot (A, B)
运算结果为:
ans = 121
在MATLAB命令窗口中输入:
>> cross (A, B)
运行结果为:
ans = 24 -9 -2
2.数组运算
数组是一组实数或复数排成的长方阵列。单位数组通常就是行向量或列向量;多维数组可以认为是矩阵在维数上的扩张。
从数据结构看,二维数组和矩阵没什么区别。但是在MATLAB中,数组和矩阵的运算有较大的区别。MATLAB中,矩阵运算是按照线性代数运算法则定义的,而数组的运算则按照MATLAB所定义的规则,目的是为了数据管理方便、操作简单、命令形式自然及计算执行有效。
(1)数组与实数间的四则运算
运算符号为:加“+”、减“−”、乘“*”、除“/”。单维数组与实数的运算和向量与实数的运算完全相同。
(2)数组之间的四则运算
运算符为:加“+”、减“−”、乘“.*”、点左除“.\”、点右除“./”。数组间的四则运算是按元素与元素的方式进行的,数组间的加、减运算和矩阵中的加、减运算相同。数组的左除和右除含义是不同的。
【例1.2.12】数组相除运算。
解:在MATLAB窗口中输入:
>> A=[1 2;3 4;5 6]; >> B=[1 3;2 4;5 7]; >> C=A./B %点右除
运行结果为:
C = 1.0000 0.6667 1.5000 1.0000 1.0000 0.8571
在MATLAB命令窗口中输入:
>> C=A.\B %点左除
运行结果为:
C = 1.0000 1.5000 0.6667 1.0000 1.0000 1.1667
注意:执行数组间的运算时,参与运算的数组必须维数相同,运算所得的数组维数也与原数组维数相同。
(3)数组的乘方运算
数组乘方运算的符号为“.^”,按元素对元素的幂运算进行,这与矩阵的幂运算完全不同。
【例1.2.13】数组的乘方运算。
解:在MATLAB命令窗口中输入:
>> A=[1 2;3 4;5 6]; >> C=A.^2
运行结果为:
C = 1 4 9 16 25 36
注意:数组在进行“乘”、“除”和“乘方”运算时,运算符中的小圆点绝不能遗漏。遗漏点后虽然仍然可以运算,但此时已不按数组运算规则进行运算了。
3.矩阵运算
矩阵运算是MATLAB最基本的运算,MATLAB矩阵运算功能十分强大。这里分为基本的数值运算和函数运算两部分来介绍。
(1)基本数值运算
数组运算与矩阵运算不同,如果在数组运算中遗漏了运算符中的小圆点,那么MATLAB就不会根据数组运算规则进行计算,而是根据矩阵运算规则计算。因此,去掉小圆点即为矩阵的数值运算符:加“+”、减“−”、乘“*”、除“\”或“/”、乘方“^”。
另外,矩阵的转置运算用符号右单引号“' ”完成,与向量的转置运算相同。在MATLAB中,矩阵的基本数值计算规则遵照线性代数的规则。这里不做专门介绍。
(2)矩阵的函数运算
实现矩阵运算的函数如表1.2.4所示。
表1.2.4 实现矩阵特有运算的函数
【例1.2.14】矩阵的函数运算。
解:(1)转置运算。在MATLAB命令窗口中输入:
>> A=[1 2 0;2 5-1;4 10-1]; >> B=A'
运行结果为:
B = 1 2 4 2 5 10 0 -1 -1
(2)求逆运算。在MATLAB命令窗口中输入:
>> B=inv (A)
运行结果为:
B = 5 2 -2 -2 -1 1 0 -2 1
(3)行列式运算。在MATLAB命令窗口中输入:
>> B=det (A)
运行结果为:
B = 1
(4)求秩运算。在MATLAB命令窗口中输入:
>> B=rank (A)
运行结果为:
B = 3
4.多项式运算
在控制系统的设计与分析中,往往需要求出控制系统的特征根或传递函数的零极点,这些都与多项式及其运算有关。
在MATLAB中,多项式用系数的行向量表示,而不考虑多项式的自变量。如对一般的多项式:
P(x)=a0xn+a1xn-1+...+an-1x+an
在MATLAB中表示为:
P=[a 0a1...an]
MATLAB提供多项式运算的函数如下:
p=conv (p1, p2) %多项式卷积,p是多项式p1、p2的乘积多项式 [q, r]=deconv (p1, p2) %多项式解卷,q是p1被p2除的商多项式,r是余多项式 p=poly (a) %求方阵a的特征多项式,或由根a构造多项式p dp=polyder (p) %由根求多项式,多项式求导数,求多项式p的导数多项式dp p=polyfit (x, y, n) %多项式曲线拟合,求x, y向量给定数据的n阶拟合多项式p pA=polyval (p, s) %多项式求值,按数组运算规则计算多项式值 pM=polyvalm (p, s) %多项式求值,按矩阵运算规则计算多项式值 [r, p, k]=residue (num, den) %分式多项式的部分分式展开。num是分子多项式系数向量,%den是分母多项式系数向量,r是留数,p是极点,k是直项 r=roots (p) %多项式求根,r是多项式p的根向量
【例1.2.15】用多项式根构造多项式。
解:在MATLAB命令窗口中输入:
>> P=[1 2.5 0 2 0.5 2]; >> r=roots (P) %求多项式P的根
运行结果为:
r = -2.7709 0.5611 + 0.7840i 0.5611-0.7840i -0.4257 + 0.7716i -0.4257-0.7716i >> p1=poly (r)
运行结果为:
p1 = 1.0000 2.5000 -0.0000 2.0000 0.5000 2.0000
【例1.2.16】已知控制系统的输出像函数为,将其展开为部分分式。
解:在MATLAB命令窗口中输入:
>> num=[10 0]; den=[1-3 2]; >> [r, p, k]=residue (num, den)
运行结果为:
r = 20 -10 p = 2 1 k = []
由运行结果可以得到部分分式展开式为。
1.2.4 符号运算
MATLAB的数学计算分为数值计算和符号计算。数值计算不允许使用未定义的变量,而符号计算可以对未赋值的符号对象进行运算和处理。
MATLAB提供符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境中。符号运算可以实现微积分运算、表达式的简化、求解代数方程和微分方程以及积分变换等。
1.创建和使用
在MATLAB中,进行符号运算时首先要创建符号对象,然后利用这些基本的符号对象构成新的表达式,进而完成所需的符号运算。
符号对象的创建用函数sym ()完成,其调用格式如下:
S=sym (A) %将数值A转换为符号对象S。A可以是数字或数值矩阵或数值表达式 S=sym (' x') %将字符串x转换为符号对象S syms a1 a2 … %aN=sym (' aN')的简洁形式。变量名之间只能用空格隔开
【例1.2.17】将字符表达式转换为符号变量。
解:在MATLAB命令窗口中输入:
>> S=sym ('2*sin (x)*cos (x)')
运行结果为:
S = 2*sin (x)*cos (x)
在MATLAB命令窗口中输入:
>> y=simple (S) %使用函数simple ()化简符号表达式
运行结果为:
y = sin (2*x)
2.关键词:符号对象
在MATLAB中,符号对象是一种数据结构,包括符号常数、符号变量和符号表达式,用来存储代表符号的字符串。在符号运算中,凡是由符号表达式生成的对象也是符号对象。实质上,符号数学就是对字符串的运算。
3.基本运算和函数运算
(1)在MATLAB的符号运算中,运算符加“+”、减“−”、乘“*”、除“/”或“\”实现矩阵运算;点乘“.*”、点除“./”或“.\”实现数组运算。
(2)指数函数和对数函数的使用方法,符号运算和数值计算是相同的。
(3)在符号运算中,MATLAB提供常用的矩阵代数函数diag (、inv (、det (、rank (、poly ()及eig (。用法与数值计算相同。
【例1.2.18】求矩阵的行列式、逆和特征值。
解:(1)求行列式。在MATLAB命令窗口中输入:
>> syms a11 a12 a21 a22; %定义符号变量a11, a12, a21, a22 >> A=[a11 a12; a21 a22] A = [ a11, a12] [ a21, a22] >> DetA=det (A) %求矩阵A的行列式
运行结果为:
DetA = a11*a22-a12*a21
(2)求逆。在MATLAB命令窗口中输入:
>> InvA=inv (A)
运行结果为:
InvA = [ a22/(a11*a22-a12*a21), -a12/(a11*a22-a12*a21)] [ -a21/(a11*a22-a12*a21), a11/(a11*a22-a12*a21)]
(3)求特征值。在MATLAB命令窗口中输入:
>> EigA=eig (A)
运行结果为:
EigA = 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2) 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)
注意:MATLAB的符号对象并无逻辑运算功能。
4.符号表达式的操作
MATLAB中对符号表达式的操作包括表达式的因式分解、展开和化简等。其操作函数的格式如下:
collect (e, v) %合并同类项,将表达式e中v的同幂项系数合并 expand (e) %表达式展开,将表达式e进行多项式展开 factor (e) %因式分解,对表达式e进行因式分解 horner (e) %嵌套分解,将表达式e分解成嵌套形式 [n, d]=numden (e) %表达式通分,将表达式e通分,并返回分子和分母 simple (e) %表达式化简,将表达式e化简成最简短形式 subs (e, old, new) %符号变量替换,将表达式e的符号变量由old替换为new
【例1.2.19】已知数学表达式为y=ax 2+bx+c,试将其系数替换为,a=sin x, b=ln t, c=xe2t。
解:在MATLAB命令窗口中输入:
>> syms a b c x t; %定义符号变量 >> y=a*(x^2)+b*x+c; >> y2=subs (y, [a b c], [sin (x) log (t) x*exp (2*t)])
运行结果为:
y2 = sin (x)*x^2+log (t)*x+x*exp (2*t)
【例1.2.20】对表达式y=x4-5x3+5x2+5x-6进行因式分解。
>> y=sym (' x^4-5*x^3+5*x^2+5*x-6'); >> y1=factor (y)
运行结果为:
y1 = (x-1)*(x-2)*(x-3)*(x+1)
【例1.2.21】已知数学表达式为,应用MATLAB将其通分。
解:在MATLAB命令窗口中输入:
>> syms x; >> y=((x+3)/(x*(x+1)))+((x-1)/(x^2*(x+2))); >> [num, den]=numden (y)
运行结果为:
num = x^3+6*x^2+6*x-1 den = x^2*(x+1)*(x+2)
即通分后,表达式为。
5.积分变换
符号的积分变换包括傅里叶(Fourier)变换、拉普拉斯变换(Laplace)和z变换。拉普拉斯变换和z变换在控制理论的研究中起着非常重要的作用,所以这里仅介绍这两种变换。
(1)拉普拉斯变换及其反变换
F=laplace (f) %求时域函数f的拉普拉斯变换F f=ilaplace (F) %求复域函数F的拉普拉斯反变换f
【例1.2.22】求函数 f(t)=t e-a t sin ωt的拉普拉斯变换F(s)。
解:在MATLAB命令窗口中输入:
>> syms t a w; >> f=t*(exp (-a*t))*sin (w*t); >> F=laplace (f)
运行结果为:
F = 2*w/((s+a)^2+w^2)^2*(s+a)
【例1.2.23】求像函数的拉普拉斯反变换。
解:在MATLAB命令窗口中输入:
>> syms s; >> F=2/s+3/(s^2+9)+1/(s+2); >> f=ilaplace (F)
运行结果为:
f = 2+sin (3*t)+exp (-2*t)
(2)z变换及其反变换
F=ztrans (f) %求时域序列f的z变换F f=iztrans (F) %求z域函数F的z反变换f
【例1.2.24】求单位阶跃函数 f(t)=1(t)的z变换。
解:f(t)=1(t)的时域序列为 f(n)=1。
在MATLAB命令窗口中输入:
>> n=sym (1); >> F=ztrans (n)
运行结果为:
F = z/(z-1)
【例1.2.25】求z变换函数的z反变换。
解:在MATLAB命令窗口中输入:
>> syms z; >> F=10*z/((z-1)*(z-2)); >> f=iztrans (F)
运行结果为:
f = 10*2^n-10
1.2.5 图形表达功能
MATALB提供了丰富的图形表达功能,能够将各种科学运算结果进行可视化。计算的可视化可以将杂乱的数据通过图形来表示,从中观察出其内在的关系。
1.二维曲线的绘制
二维绘图是MATLAB的基础绘图,使用函数plot ()完成。其调用格式如下:
plot (x, y, ' s') %基本绘图格式 plot (x1, y1, ' s1' , …, xN, yN, ' sN') %绘制多条曲线。每条曲线以(x, y, s)结构绘制,调用格式与plot (x, y, ' s')相同
说明:
① 如果x, y是相同维数的向量,则绘制以x为横坐标、y为纵坐标的曲线;
如果x是向量,y是矩阵,且y的行(或列)的维数与x的维数相同,则绘制以x为横坐标的多条不同颜色的曲线,曲线数等于x的维数;
如果x是矩阵,y是向量,则以y为横坐标,其余与上述情况相同;
如果x, y是相同维数的矩阵,则绘制以x对应列元素为横坐标,y对应列为纵坐标的曲线,曲线数等于矩阵的列数。
② 函数plot (x, y, ' s')中,y可默认。
③ s为选项字符串,用来设置曲线颜色、线型等,其代表的具体含义见表1.2.5。当s默认时曲线为“实线”,单条曲线颜色为“蓝色”,多条曲线按“蓝、绿、红、青、品红、黄、黑”自动着色。
表1.2.5 字符串s代表含义
【例1.2.26】已知函数y1(x)=e-0.1xsinx, y2(x)=e-0.1xsin (x+1),且x∈[0,4π],绘制两条曲线。
解:在MATLAB命令窗口中输入:
>> x=0:0.5:4*pi; %设置绘制点步长为0.5 >> y1=exp (-0.1*x).*sin (x); >> y2=exp (-0.1*x).*sin (x+1); >> plot (x, y1, ' --' , x, y2, ' *') %设置曲线y1为虚线表示,y2为八字符显示
运行结果如图1.2.1所示。
图1.2.1 例1.2.26的曲线图
2.绘图操作
(1)多次重叠绘图
如果分别使用函数plot ()绘制多条曲线,在绘制第二条曲线时,若不加命令hold,那么第一条曲线就会自动消失。为了在一张图中绘制多条曲线,就必须使用hold命令。
hold on %使当前曲线与坐标轴具备不被刷新的功能,即可重叠绘图 hold off %使当前曲线与坐标轴取消具备不被刷新的功能
【例1.2.27】使用hold命令,重新绘制例1.2.26中的曲线。
解:在MATLAB命令窗口中输入:
>> x=0:0.5:4*pi; %设置绘制点步长为0.5 >> y1=exp (-0.1*x).*sin (x); >> y2=exp (-0.1*x).*sin (x+1); >> plot (x, y1, ' --'); %绘制曲线y1 >> hold on >> plot (x, y2, ' *'); %在同一图中重叠绘制曲线y2 >> hold off
运行结果如图1.2.2所示。
图1.2.2 例1.2.27的曲线
可以看到,虽然上面两例曲线都是在同一图中绘制,但例1.2.26绘制的曲线y1是蓝色的,曲线y2是绿色的;而例1.2.27绘制的两条曲线都是蓝色的。
(2)多窗口绘图
需要在多个窗口中绘图时,可使用figure命令。
figure(N) %创建绘图窗口,N为其序号
【例1.2.28】在两个不同窗口中绘制例1.2.26的曲线。
解:在MATLAB命令窗口中输入:
>> x=0:0.5:4*pi; %设置绘制点步长为0.5 >>y1=exp (-0.1*x).*sin (x); >>y2=exp (-0.1*x).*sin (x+1); >> plot (x, y1, ' --') >> figure (2) >> plot (x, y2, ' *')
运行结果如图1.2.3所示。
图1.2.3 例1.2.28的曲线图
注意:进行多窗口绘图时,应先使用figure (N)命令创建窗口,再绘图。
(3)图形窗口的分割
用户可以在同一个图形窗口中同时显示多幅独立的子图。在MATLAB中可以使用函数subplot ()来实现。
subplot(m, n, k) %使m×n幅子图中的第k幅成为当前图
说明:
① m为行数,n为列数,k为子图编号。编号顺序是自左向右,再自上而下依次排号。
② 使用函数subplot ()后,若想再使用单幅图,应用命令clf清除。
③ k值不能大于m、n之和。
【例1.2.29】在同一个图形窗口中绘制例1.2.26的曲线。
解:在MATLAB命令窗口中输入:
>> x=0:0.5:4*pi; %设置绘制点步长为0.5 >> y1=exp (-0.1*x).*sin (x); >> y2=exp (-0.1*x).*sin (x+1); >> subplot (2,1,1), plot (x, y1, ' --') >> subplot (2,1,2), plot (x, y2, ' *')
运行结果如图1.2.4所示。
图1.2.4 例1.2.29的曲线图
(4)图形注释
MATLAB提供丰富的图形注释函数。通过表1.2.6中的函数,可以为图形添加标题、标注、网格和图例等。
表1.2.6 图形注释函数
说明:
① 函数annontation ()创建的特殊注释包括:线型、箭头、文本箭头、文本框、矩形及椭圆。
② 命令grid用法为:
grid on %添加坐标网格 grid off %去掉网格
【例1.2.30】为函数y1=x sin x, y2=x cos x, x∈[0,4π]的图形添加标题、坐标轴标注。
解:在MATLAB命令窗口中输入:
>> x=0:0.1:4*pi; >> y1=x.*sin (x); >> y2=x.*cos (x); >> plot (x, y1, ' -' , x, y2, ' --') >> title (’曲线y1=xsinx,曲线y2=xcosx') %添加标题 >> xlabel (' x'), ylabel (' y') %添加坐标轴标注 >>legend (’第一条’, ’第二条’) %添加图例 >> grid on %添加网格线
运行结果如图1.2.5所示。
图1.2.5 例1.2.30的曲线图
在MATLAB中也可以使用属性编辑器(Property Editor)来为图形添加标题、坐标轴标注及坐标网格。
选择菜单Tools→Edit Plot后,双击图形窗口内区域,或选择菜单View→Property Editor,出现如图1.2.6所示的对话框,在其中进行设置即可。
图1.2.6 图形窗口属性编辑器
3.特殊坐标绘图
MATLAB特殊坐标绘图包括对数坐标绘图、极坐标绘图和双纵坐标绘图。
(1)对数坐标绘图
semilogx (x, y) %以x轴为对数坐标绘制曲线 semilogy (x, y) %以y轴为对数坐标绘制曲线 loglog (x, y) %以x、y轴为对数坐标绘制曲线
【例1.2.31】已知函数y=lg x,试在对数坐标下绘制其曲线图。
解:在MATLAB命令窗口中输入:
>> x=1:0.1:20; >> y=log10(x); >> loglog (x, y)
运行结果如图1.2.7所示。
图1.2.7 例1.2.31的对数坐标曲线图
(2)极坐标绘图
polar(theta, rho, ' s' ) %绘制极坐标图
说明:
① theta为角度向量;rho为幅值向量。
② 字符串’s’的含义与用法请参照plot ()函数。
【例1.2.32】应用MATLAB绘制三叶玫瑰线r=2sin 3θ。
解:在MATLAB命令窗口中输入:
>> theta=0:0.1:2*pi; >> polar (theta,2*sin (3*theta), ' --')
运行结果如图1.2.8所示。
图1.2.8 例1.2.32的三叶玫瑰线
(3)双纵坐标绘图
plotyy(x1, y1, x2, y2) %在同一个图形窗口以左右不同纵轴绘制两条曲线
说明:左纵轴用于(x1, y1)数据对,右纵轴用于(x2, y2)数据对。
【例1.2.33】已知函数y1(x)=200e-0.05xsin (x), y2(x)=0.8e-0.5xsin (10x),且x∈[0,20],使用函数plotyy ()绘制两条曲线。
解:在MATLAB命令窗口中输入:
>> x=0:0.01:20; >> y1=200*exp (-0.05*x).*sin (x); >> y2=0.8*exp (-0.5*x).*sin (10*x); >> plotyy (x, y1, x, y2)
运行结果如图1.2.9所示。
图1.2.9 例1.2.33的曲线图
4.三维图形的绘制
在MATLAB中,三维图形的绘制可分为三维曲线的绘制和三维曲面的绘制。三维曲线的绘制使用函数plot3()来实现。
plot3(x, y, z, ' s' ) %绘制三维曲线,x, y, z分别为三维坐标向量
【例1.2.34】绘制三维柱面螺旋线。
解:在MATLAB命令窗口中输入:
>> t=0: pi/50:10*pi; >> plot3(sin (t), cos (t), t) >> grid on
运行结果如图1.2.10所示。
图1.2.10 例1.2.34的三维柱面螺旋线
使用函数mesh ()来实现三维曲面网线绘图。
mesh(x, y, z) %绘制三维曲面网线
说明:
① x, y可以是向量或矩阵。
② 当x, y是矩阵时,应先使用函数meshgrid ()生成绘制三维曲线的坐标矩阵数据。
【例1.2.35】绘制三维曲面网线。
解:在MATLAB命令窗口中输入:
>> [x, y]=meshgrid (-8:0.1:8); %生成x坐标与y坐标的矩阵数据 >> r=sqrt (x.^2+y.^2)+eps; >> z=sin (r)./r; >> mesh (x, y, z)
运行结果如图1.2.11所示。
图1.2.11 例1.2.35的三维曲面网线图
使用函数surf ()来绘制三维表面图形。
surf(x, y, z) %绘制三维曲面。x, y, z分别为三维空间的坐标位置矩阵
【例1.2.36】绘制三维曲面图。
解:在MATLAB命令窗口中输入:
>> [x, y]=meshgrid (-8:0.1:8); >>r=sqrt (x.^2+y.^2)+eps; >> z=sin (r)./r; >> surf (x, y, z)
运行结果如图1.2.12所示。
图1.2.12 例1.2.36的三维曲面图
1.2.6 程序设计基础
到目前为止,例题中所采用的MATLAB运行方式都是在其命令窗口中直接输入交互命令行的运行方式。除此之外,M文件的运行方式也是MATLAB中较常用的一种运行方式。MATLAB是一种高效的编程语言,它有自身的程序设计要求、格式、语法、设计命令和调试方法等。本节将简单介绍MATLAB的程序设计语言。
1.M文件
MATLAB程序设计实质上就是进行M文件编程。M文件具有以下特点:
(1)形式上,MATLAB程序文件是一个ASCII码文件,扩展名一律为.m, M文件的名称由此而来。用一般的文字处理软件(如记事本、写字板等)都可以对M文件进行编辑和修改。
(2)M文件大大扩展了MATLAB的能力。MATLAB的一系列工具箱就是用M文件构成的。
(3)M文件的语法与C语言十分相似,因此熟悉C语言的用户可以很轻松地掌握MATLAB的编程技巧。
M文件又分为M脚本文件和M函数文件,其文件扩展名均为.m。下面就这两种文件形式进行说明。
M脚本文件是一种简单的M文件,没有输入和输出参数,仅包含了一系列MATLAB命令的集合,类似于DOS下的批处理文件。脚本文件不仅能对工作空间中已存在的变量或文件中新建的变量进行操作,也能将所建的变量及其运行结果保存在工作空间中,以备使用。
M文件的运行方式也很简单,可以在MATLAB命令窗口中输入该脚本文件的文件名,MATLAB即会自动执行该文件的各条语句;也可以在M文件编辑/调试窗口菜单中选择Debug—Run,即可运行该脚本文件。
【例1.2.37】通过M脚本文件绘制玫瑰花瓣图形。
解:(1)编写M脚本文件,并存储文件名为C1_2_1.m。如图1.2.13所示。
图1.2.13 C1_2_1文件的M文件编辑/调试窗口
(2)运行M脚本文件,结果如图1.2.14所示。
图1.2.14 例1.2.36的玫瑰花瓣图
M函数文件区别于M脚本文件之处是,在M文件的第一行中包含有函数声明行。每一个M文件都定义了一个函数。实际上,MATLAB提供的函数命令大部分都是由M函数文件定义的。
M函数文件的基本结构是:
✓ 函数声明行 %function [输出变量列表]=函数名(输入变量列表)
✓ H1行 %用%开头,注释说明,可省略
✓ 在线帮助文本 %用%开头,注释说明,可省略
✓ 函数体 %一条或若干条MATLAB命令
① 函数声明行是M函数文件必须有的,且函数名和文件名必须一致。若两者不一致,MATLAB以文件名为准。
② H1行用来概要说明该函数的功能,提供给Help在线帮助使用或lookfor查询关键词。
2.变量和数据结构
M文件中的变量分为全局变量(global variable)和局部变量(local variable)。全局变量的作用域是整个MATLAB工作空间,通过global命令来定义。其格式为:
Global x y z %定义全局变量x, y和z
注意:由于全局变量在任何定义过的函数中都可以修改,因此不提倡使用全局变量。使用时建议把全局变量的定义放在函数体的开始,并用大写字母命名。
局部变量的作用域是函数文件所在的区域,其他函数文件无法调用。局部变量仅在其所在的函数文件运行时作用,该函数文件一旦运行结束,局部变量也就自动消失了。
MATLAB的数据类型一共有九种,如表1.2.7所示。
表1.2.7 数据类型及描述
3.流程控制语句
MATLAB提供了简明的流程控制语句供用户进行程序设计,主要有循环结构、条件结构、开关结构及试探结构。这里仅做简要介绍。
(1)for循环语句
for循环控制变量=(循环次数设定) 循环体 end
说明:
① 设定循环次数可以是数值,也可以是数组。定义格式为:初始值:步长:终值。
② 和C语言类似,for语句可嵌套。
【例1.2.38】使用for语句计算1+3+5+…+100的值。
解:在M文本编辑器中输入:
%C8_2_2 sum=0; for n=1:2:100 sum=sum+n end
运行结果为:
sum = 2500
(2)while循环语句
while循环判断语句 循环体 end
说明:
① 循环判断语句为某种形式的逻辑判断表达式。
② While语句不能设定循环次数。
【例1.2.39】使用while语句重新计算例1.2.38。
解:在M文件编辑器中输入:
%C1_2_3 sum=0; n=1; while n<=100 sum=sum+n n=n+2 end
运行结果为:
sum = 2500 n = 101
(3)if-else-and语句
if 逻辑判断语句 执行语句1 else 执行语句2 end
if语句还有if-end和其嵌套形式,使用方法和C语言相似,这里不再赘述。
(4)switch-case语句
switch 选择判断量 case选择判断值1 选择判断语句 case选择判断值2 选择判断语句 … otherwise 判断执行语句 end