系统分析与控制.docx
《系统分析与控制.docx》由会员分享,可在线阅读,更多相关《系统分析与控制.docx(26页珍藏版)》请在冰豆网上搜索。
系统分析与控制
系统分析与控制
实验指导书
石油大学机电教研室
二○○○年四月
第三篇MATLAB语言应用
一、概述
MATLAB是以复数矩阵作为基本编程单元的一种程序设计语言,它提供了矩阵的运算与操作。
并有较强的绘图功能,已成为国际上最流行的控制系统CAD的软件工具。
不仅流行于控制界,在生物医学语言图像处理,分析,计算机技术等各行各业也有广泛应用。
MATLAB是一个功能极强的高度集成化程序设计语言。
它具备一般程序设计语言的基本语句结构。
但功能更强,这是C或FORTRAN语言无法比拟的。
由于MATLAB提供了强大的矩阵处理和绘图功能,控制界学者将自己擅长的CSCAD方法用MATLAB加以实现,出现了大量的MATLAB配套工具箱。
如控制界流行的控制系统工具箱(controlsystemstoolbox),系统辨识工具箱(systemidentificationtoolbox),鲁棒控制工具箱(robustcontroltoolbox),多变量频域设计工具箱(multivariablefrequencydesigntoolbox),最优化工具箱(optimizationtoolbox),信号处理工具箱(signalprocessingtoolbox)以及仿真环境SIMULINK。
这使得MATLAB风靡国际控制界。
值得一提的是,1990年MathWorks软件公司为MATLAB提供了新的控制系统模型图形输入与仿真工具,原名为SIMULAB,该工具很快在控制界就有了广泛的使用。
1992年以来正式改名为SIMULINK,这一名字的含义是相当直观的,因为它较明显地表明此软件的两个显著的功能:
SIMU(仿真)与LINK(连接),亦即可以利用鼠标器在模型窗口上“画’’出所需的控制系统模型,然后利用SIMULINK提供的功能来对系统进行仿真或线性化分析。
这种做法的一个优点是,可以使得一个很复杂系统的输入变得相当容易且直观。
MATLAB4.x版本运行在microsoftwindows环境,在MATLAB语言环境下,>>标志为MATLAB的命令提示符,MATLAB命令窗口的界面下,有一个菜单条,其中提供了很多功能,在命令行键入DEMO命令,它将启动演示程序,从而领略MATLAB的强大运算和绘图功能。
二、MATLAB的基本语句结构
MATLAB实际上可以认为是一种解释性语言,在MATLAB工作环境下,键入一个命令或程序,MATLAB对它进行处理,最后返回运算结果。
2.1MATLAB语言
最基本的赋值语言结构为:
变量名列表=表达式
左边为返回值,右边是表达式定义,可以是矩阵运算,也可以包含MATLAB下的函数调用。
表达式可以由分号结束,也可以由逗号或换行符结束,但含义不同,如以分号结束则左边变量结果将不显示,否则将把左边返回矩阵的内容全部显示出来。
和C语言类似,MATLAB是区分大小写的(case-sensitive)。
MATLAB和C语言不同,在调用函数时MATLAB可以返回多个结果(亦即多个矩阵),这时等号左边是由[]括起来的矩阵列表,例如:
[m,p]=bode(n,d,w)
中调用了控制系统工具箱的bode()函数来求取传递函数n,d在指定的频率段w内的幅值响应m和相位响应p。
MATLAB函数调用时输入输出变量分别在等号两边列出,这种记号很容易记忆。
也可以采用下面格式调用
[m,p]=bode(a,b,c,d,1,w)
其中a,b,c,d,为系统的状态方程描述,MATLAB会自动地从输入参数个数上判定给出的是传递函数还是状态方程模型,从而进行正确计算,这类似于C++中重载的观念。
2.2矩阵的输入
输入格式为
>>A=[1,2,3;4,5,6;7,8,0]
A=123
456
780
其中同一行中的内容用逗号分隔,而采用分号来表示换行。
上述格式输入矩阵A后,矩阵内容将在屏幕上显示出来。
如在上面赋值表达式的末尾加一个分号,这矩阵内容就不显示了。
这由用户通过在语句末尾加分号的方式来决定是否显示运算结果。
同一行中分隔的逗号也可以由空格来代替。
如下方式也是许可的
>>A=[123;456
789];
或>>A=[123;4,5,…
6;78,9];
向量的输入是一般矩阵输入的特殊情况,下面的两条命令分别定义了行和列向量
>>V1=[123,4]>>V2=[1;2;3;4]
学会了矩阵的基本表示方法后,就容易理解下面的输入方式和结果了
>>A=[A;[135]]
MATLAB定义了两个基本的复数常量,i和j,这些值为数学上的
。
如果它们不被赋值,则将保留这种定义。
如果重新赋值,将保留新的值,如采用MATLAB命令a=sqrt(-1)则也定义了a为复数常量。
在MATLAB下4+3*i的赋值命令将得出4.0000+3.0000i的结果,而利用前面的A矩阵,在输入命令A+ones(size(A))*i后得到一个复数矩阵,注意不能在一个复数元素之内加空格,如[1+2*i,2]赋值表达式因在1和+2*i之间无意多留一个空格,将被错误解释成含有三个元素的向量。
>>A+ones(size(A))*i
ans=
在变量赋值语句中,等号左边的矩阵名列表和等号一起可以省略,这时将把返回的矩阵名设置为ans变量。
ans是保留的MATLAB字符串,它表示上面一个式子的返回结果。
其它保留字符有:
判断0元素的误差限eps,其默认值eps=2.2204×10-16,用户可以用eps=eps×10修正。
pi表示圆周率
inf表示无穷大,MATLAB允许最大数值为1.7976931×10308,inf的一个计算方法为1/0,这种计算在MATLAB中是允许的。
NaN常量,它是一个不定式(NotaNumber),由inf/inf或0/0产生的。
在MATLAB中这样的矩阵赋值A=[12inf;125]是允许的。
>>A=[12inf;125]
它与列向量B=[1;2;3]乘积为
>>A*B
ans=inf
20
2.3矩阵的基本运算与控制语句
矩阵的加减:
C=A+B和C=A-B,如A和B矩阵维数相同这执行运算。
矩阵的转置:
B=A’,即B=AT,这一运算包括复数矩阵的运算。
>>A=[5+i,2-i,1;6*i,4,9-i];B=A’
矩阵的翻转处理:
B=fliplr(A);C=flipud(A);D=rot90(A),
分别表示左右、上下和旋转90度的翻转处理。
矩阵的乘法:
C=A*B;A为n×m矩阵,B为m×r矩阵,C为n×r矩阵。
矩阵的乘方运算:
B=Ax,A矩阵为方阵。
>>A^2>>A^0.1
>>A=[123;456;780];B=[234;567;890]
矩阵的点运算:
C=A.*B,表示A和B矩阵的元素直接相乘。
方阵的求逆:
B=inv(A)
矩阵的除法:
左除A\B,表示线性方程AX=B的解X,即X=A-1B。
右除A/B,其定义为BA-1。
单个矩阵元素的赋值与运算:
>>A(2,3)=100;
它只改变该元素的值,不影响其它元素的值。
如行或列数大于原来矩阵范围,这时MATLAB自动扩展原来矩阵,将扩展后没赋值的矩阵元素置为0。
>>A(4,5)=8命令执行结果就可从屏幕看到。
冒号表达式:
s1:
s2:
s3,其中s1为起始值,s2为步距,s3为终止值,此命令产生一个行向量,如s2不给出,认为步距为1,A(:
j)表示A矩阵第j列全部元素,A(i,:
)表示A矩阵第i行全部元素,A(1:
2,2:
4)表示对A矩阵取第一行和第二行内,并在第二列到第四列中的所有元素构成的子矩阵,观察下面命令运行结果。
>>A(2:
3,1:
2:
5)
逻辑运算:
MATLAB支持逻辑运算及不定式处理,它使用逻辑运算符&,|和~分别表示“与”,“或”和“非”等逻辑运算。
MATLAB控制语句有循环语句(for语句、while语句)和if条件转移语句与C语言大同小异。
如for语句为:
for循环变量=表达式1:
表达式2:
表达式3
循环语句组
end
while(条件式)
循环语句组
end
MATLAB的多项式函数:
多项式求值polyval(p,x0);多项式求导polyder(p);求解多项式方程的根roots(p)。
其中输入向量p是多项式系数降幂排列构成的向量。
MATLAB提供了丰富的编程语句结构和实用函数,MATLAB本身编写出来的具有特殊目的程序(或M函数),其文件后缀名均为.M,这些文件都是由纯ASCII字符构成的,MATLAB下的M文件可以直接执行,这时只需在命令提示符>>下键入该文件名即可,MATLAB下的大多数应用程序都是由M函数形式给出,如求取矩阵特征多项式的函数poly()和求取伴随矩阵的函数compan()等,除了M函数外,MATLAB还提供了大量底层的内部函数,如求取特征值的函数eig(),奇异值分解的函数svd()等,这类文件是不可读的。
MATLAB允许用户调用可执行文件.exe,调用方式为在提示符>>下键入惊叹号!
,后面直接跟可执行文件的文件名或DOS命令即可,如可由!
chkdsk命令来直接大于DOS下的chkdsk.exe文件。
其它DOS命令也一样直接调用。
MATLAB已把一些常用的DOS命令做成相应的MATLAB命令,如DIR命令。
在规定的格式下,MATLAB也支持用户用C语言或FORTRAN语言编写的程序。
MATLAB工作空间及变量管理:
MATLAB以复数矩阵为基本编程单元,用户可以直接使用一个矩阵,不必显式指明矩阵的维数。
一个矩阵维数可用size()函数来测取,调用格式为
[n,m]=size(A)如等号左边只返回一个参数,这返回的参数是一个1×2的行向量,两个元素分别为矩阵A的行数和列数。
同样的n=length(A)返回A向量的元素个数或A矩阵行列数中的最大值,等效于max(size(A))。
如用户查看目前工作空间的变量名,可用who命令来完成。
>>who
了解这些变量的具体细节,则可用whos命令查看
>>whos
分别列出变量名(Name),矩阵大小(Size),元素个数(Element),字节数(Bytes),表现密度(Density:
完整FULL或稀疏度),有无复数(Complex)等,用户可用clear命令删除一些不再使用的变量,
>>clearac将删除工作空间中的a和c变量。
a和c之间不能加逗号,否则将被解释成删除a变量后,显示变量c内容,而不是删除c变量。
exist()函数查询工作空间是否存在一个变量,格式为:
i=exit(字符串),如i=exist(‘A’);
i的值不是A存在形式,1表示一个变量名为A的矩阵,2表示工作路径下存在一个A.m的文件,3表示MEX文件,4表示SIMULINK文件,5表示一个内部函数A(),0表示不存在和A有关的变量和文件。
MATLAB下数值显示精度默认值为4位有效数字,,这一显示精度可用format命令来控制。
输入输出语句:
A=input(提示信息,选项);如A=input(‘entermatrixA=>‘);表示首先给出提示后,等待用户输入A矩阵,input()如常用’s’选项,则允许用户输入一个字符串。
disp(A)其中A既可用为字符串也可以为矩阵,如
>>A=‘Hello,world”;disp(A)
工作空间变量通过调用函数save命令可被保存到文件中,格式为
save文件名变量列表其它选项
savemydatabc表示将工作空间的a,b,c变量保存到mydat.mat,mat为系统自动使用的数据文件扩展名,如保存全部工作空间变量应该用savemydat命令。
load文件名此命令可以把矩阵数据从文件中调到工作空间来。
MATLAB还提供了低级文件打开和处理命令,如fopen(),fclose(),sprintf(),这同C语言几乎一致。
MATLAB的联机帮助系统
MATLAB提供了大量的函数和命令,通过help命令可查询各个函数的有关信息,其格式为
help命令或函数名
MATLAB还提供了关键词查询命令lookfor,例如若查出和矩阵分解(decomposition)有关的MATLAB和工具箱函数,则可运行lookfordecomposition命令
>>lookfordecomposition
2.4MATLAB的绘图功能
二维曲线绘制
plot(x,y)x,y向量分别存放着X和Y轴的数据
>>t=0:
.1:
2*pi;y=sin(t);plot(t,y)将绘制出正弦曲线。
>>t=0:
.1:
2*pi;y=[sin(t);cos(t)];plot(t,y)将绘制出正余弦两组曲线。
在彩色显示器下,MATLAB自动用不同颜色将图形显示出来。
MATLAB提供了一些图形选项如下表所示:
表MATLAB绘图命令的各项选择
选项
意义
选项
意义
‘-‘
‘:
’
‘r’
‘b’
‘*’
‘o’
实线
点线
红色
蓝色
用星号绘制各个数据点
用圆圈绘制各个数据点
‘--‘
‘-.’
‘g’
‘y’
‘.’
‘x’
虚线
点划线
绿色
黄色
用点号绘制各个数据点
用叉号绘制各个数据点
调用格式为
plot(x轴变量1,y轴变量1,选项1,x轴变量2,y轴变量2,选项2,…)
>>t=0:
.1:
2*pi;y1=sin(t);y2=cos(t);y3=sin(t).*cos(t);
>>plot(t,y1,’-’,t,y2,’:
’,t,y3,’x’)
>>grid,xlabel(‘ThisismyXaxis’),ylabel(‘myYaxis’),title(‘myownplot’)
ginput()函数允许用户用鼠标来点选屏幕点,其格式为
[x,y,button]=ginput(n)
n为选择点的数目,返回的向量x,y存储点中的n个点的坐标,button为n维向量其分量为鼠标键的标号,如button[i]=1,则说明第次按下的是鼠标左键,2或3分别对应中键和右键。
其它低级命令如line()和text()函数类似C语言函数的调用。
格式为
text(x1,y1,chStr,选项)
line(x,y)或line(x,y,z)分别表示二维或三维上由向量x,y(,z)定义的折线。
解读下面程序:
clg
axis([0,10,0,5])
holdon;x=[];y=[];
fori=1:
10
[x1,y1,button]=ginput
(1);if(button~=1)break;end
chStr=[‘(‘,num2str(x1),’,’,num2str(y1),‘)’];text(x1,y1,chStr);
plot(x1,y1,’o’)
x=[x,x1];y=[y,y1];
end
line(x,y);holdoff
hold命令用来保护原来图形不被删除。
MATLAB下特殊坐标:
MATLAB还允许绘制极坐标曲线、对数坐标曲线和直方图等。
极坐标曲线绘制函数:
polar(theta,rho,选项)
其中theta,rho分别为角度向量和幅值向量,选项内容和plot()函数基本一致。
直方图绘制函数bar():
bar(x,y,选项)或[xx,yy]=bar(x,y)
前一种调用将直接由给定的(x,y)向量绘制出直方图;后一种只进行数据变换供plot(xx,yy)函数使用来绘制直方图。
例如
t1=0:
0.2:
2*pi;y1=sin(t1);
t2=0:
0.5:
2*pi;y2=sin(t2);
bar(t1,y1);axis([0,2*pi,-1,1]);holdon
[t3,y3]=bar(t2,y2);plot(t3,y3);holdoff
对数坐标曲线绘制函数:
semilogx(x,y,选项),semilogy(x,y,选项),loglog(x,y,选项)
分别对横坐标、纵坐标和纵横坐标进行对数变换。
MATLAB允许将一个窗口分隔多个部分来绘制多个图形,这可通过函数
subplot(n,m,k)来设置,n,m表示窗口分隔的行列数,k表示绘图部分代号。
例
theta=0:
0.1:
6*pi;r=cos(theta/3)+1/9;
subplot(2,2,1);polar(theta,r);
subplot(2,2,2);plot(theta,r);
subplot(2,2,3);semilogx(theta,r);grid
subplot(2,2,1);semilogy(theta,r);grid
MATLAB还提供了实用函数logspace()按对数等间距地分布来产生一个向量,其调用格式
x=logspace(x1,x2,n)n表示向量点个数,默认值为50。
其它绘图及图形属性函数参见附录。
三维曲线绘制:
plot3(x,y,z,选项)可绘制三维曲线,如
t=o:
pi/50:
10pi;
x=sin(t);y=cos(t);z=t;
plot3(x,y,z,’g-’)
mesh(x,y,z,c)可绘制三维曲面,c为颜色矩阵表示不同高度下的颜色范围,约定c=z,即颜色正比于图形的高度。
例:
选择一定区域,绘制函数
的三维曲面图。
>>[x,y]=meshgrid(-3:
1/8:
3);
>>z=3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-1/3*exp(-(x+1).^2-y.^2);
>>mesh(x,y,z)
>>axis([min(min(x)),max(max(x)),min(min(y)),max(max(y)),min(min(z)),max(max(z))])
其它还有表面函数surf(),surfc(),surf1(),等高线绘制函数contour(),调用方法同前。
三、数值线性代数方法及MATLAB功能
设多项式
首一化处理的新多项式
其伴随矩阵(companionmatrix)
函数调用:
B=compan(p)生成伴随矩阵,其中p为一个多项式向量。
设一序列C,各个元素满足{c1,c2,…,cn},Vandermonde矩阵构成为:
函数调用格式为V=vander(c)c为一向量。
矩阵的行列式|A|:
函数调用格式D=det(A)D为一标量,A为方阵。
矩阵的秩:
函数调用格式k=rank(A,tol)tol为误差限,默认eps,即k=rank(A)。
矩阵特征多项式:
函数调用格式P=poly(A)返回向量P为降幂排列多项式系数。
矩阵特征根(特征方程的解)V=roots(P)P为特征多项式系数向量。
矩阵特征值:
若对矩阵A存在非零向量X,且有一标量满足:
Ax=x
则分别称x,为矩阵A的特征向量和特征值
函数调用格式[V,D]=eig(A)D为特征值构成的对角矩阵,V为特征向量矩阵。
函数调用z=eig(A)只返回特征值
矩阵求逆:
函数调用格式B=inv(A)
线性方程Ax=B的解可以由x=ina(A)*B求出,也可以简单由x=A/B求出。
3.1矩阵的非线性运算
MATLAB提供了两类函数,其中一类是对矩阵的各个元素进行运算的,第二类是对整个矩阵进行运算的;
第一类函数调用格式为:
B=函数名(A)如B=sin(A),
其它如下表
表面向矩阵元素的非线性函数表
函数名
意义
函数名
意义
abs()
求模(绝对值)
asin(),acos()
反正,余弦函数
sqrt()
求平方根
log(),log10()
自然,常用对数
exp()
指数函数
real(),imag(),conj()
求实虚部及共轭
sin(),cos()
正,余弦函数
round(),floor(),ceil()
取整,尾函数
MATLAB还允许调用fplot()函数来直接绘制出基本函数曲线图形,函数调用格式为:
fplot(函数名,绘图区间,样本点数N)
函数名为上表给出的任意名称,绘图区间为1×2的向量,元素是自变量的最小值与最大值,样本点数可省略,约定N=25。
如fplot(‘sin’,[0,2*pi]);将绘制出一个周期内的正弦曲线。
第二类面向矩阵的非线性运算函数
MATLAB提供了求取矩阵指数eA的4个函数:
expm(),expm1(),expm2(),expm3(),分别采用不同算法实现。
其中常用的函数还有
logm()(矩阵求对数)sqrtm()(矩阵求平方根)funm()(矩阵求任意函数),
funm()调用方法为:
funm(矩阵名,’函数名’)
如求矩阵A的正弦矩阵命令为B=funm(A,’sin’)。
矩阵函数运算是基于矩阵特征值和特征向量而完成的,有时会出现错误。
这时矩阵的非线性函数运算可以通过幂级数的方法简单求出。
数据分析处理介绍
一组数据的最大和最小值可分别采用下面函数求出
[xM,i]=max(x);或[xm,i]=min(x);
其中xM,xm分别为向量x的最大值和最小值,i为所在的位置,这两个函数也可返回一个参数,而不返回i。
如x不是向量而是矩阵则返回矩阵列向量的最小值和最大值构成的行向量。
MATLAB还提供了对数据大小进行排序的函数sort(),调用后向量元素值从小到大进行排列。
其它如mean()求向量平均值,std()求向量标准方差,median()求向量的中间值,等等。
函数的定积分即
的计算
函数调用格式:
y=quad(函数名,a,b,tol)函数quad8()调用方法一样,但算法不同。
其中a,b为定积分上下限,tol为变步长积分用的误差限。
后者的精度和效率高些。
非线性方程求解及最优化
由前面的介绍可以看出,线性代数方程和多项式方程均可以在MATLAB下通过一个函数的调用而直接求出,并且求出的结果可以保证很高的精度。
非线性方程组的求解方法比较复杂,在MATLAB中给出了一个函数fzero(),可以用来求解含有一元方程的解。
在MATLAB的早期版本中还提供了求解多元方程的求解函数fsolve(),该函数的基本调用格式为x=fsolve(函数名,初值);
其中x为返回的解,函数名是由引号括起来的,在该函数中对非线性方程组有一个一般的描述,而初值为求根过程的起始点。
但在MATLAB4.0中没有提供此函数,如果需要也可以将早期版本的fsoleve.m文件及其组成部分的ne*.m文件复制到