matlab控制系统.docx

上传人:b****5 文档编号:6649297 上传时间:2023-01-08 格式:DOCX 页数:39 大小:112.28KB
下载 相关 举报
matlab控制系统.docx_第1页
第1页 / 共39页
matlab控制系统.docx_第2页
第2页 / 共39页
matlab控制系统.docx_第3页
第3页 / 共39页
matlab控制系统.docx_第4页
第4页 / 共39页
matlab控制系统.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

matlab控制系统.docx

《matlab控制系统.docx》由会员分享,可在线阅读,更多相关《matlab控制系统.docx(39页珍藏版)》请在冰豆网上搜索。

matlab控制系统.docx

matlab控制系统

偷得半日清闲,来写这个前几天承诺好的东西,如果不出意外,以后每周六就写这么一篇出来,周期不会短也不会太长,毕竟我也在慢慢的学东西,只能从基础的一点点写起,也算给自己的一个复习的机会了,我打算在后面先写一点控制理论的东西,然后用小麦做出来或举些其他的例子,然后留下一些简单问题让大家去做,再然后在下篇里给出解决的方法,很多问题和观点都是基于我个人对控制系统理论与MATLAB的理解,错误和不周是难免的,希望大家多多指正,一些好的,更有效率的实现方法也希望大家能提出来,我们共同提高,讲述风格么,还是轻松和口语化一些,一些术语当然是必须的,但我会尽量说的明白一些,目的让大家能迅速的熟悉小麦以及如何把他应用到我们控制系统的分析设计中去,闲话不多说了,现在开始吧!

要从哪里开始呢,我觉得一上来就讲控制理论和小麦有点那个……还是先说一些关于小麦本身比较基本的东西和一些必须要注意的问题,目的是让那些刚刚接触小麦的朋友不至于对我们可爱的小麦产生恐惧,小麦对于学控制的人来讲,就像是手里笔和草纸,它可以帮助你完成一些复杂的计算,可以帮你作图,分析,但请记住,说到底,这个东西就是一个工具,它不能代替你思考,学它的目的是为了更好的研究我们学习的领域,因此不要为学软件而学软件,既然是工具,就必须学以至用。

小麦的最大好处是,编写程序简单得要死,在写算法的时候只需要按我们平常的书写公式的习惯和思考逻辑来写就可以了,而用其他语言,受到语法规则等的限制,对编程不熟悉的人估计会很快疯掉。

关于小麦的历史什么就不说了,强烈建议大家使用用比较新版本的小麦(现在最新的好像是r2007b),这样会给你处理问题带来方便(后面我会举例说明这个问题)。

当你打开小麦界面的时候,会看到有几个窗口,现在讲两个有用的,现在没用到以后再说,一个是commandwindow,你可以在把一些计算啊,画图啊等等的命令一条一条的输入,然后求取结果,呵呵,比如现在我们来解决世界上最简单但最有争议的问题,在命令窗口里输入1+1然后按回车,你可以看到小麦对这个问题所给出的答案。

这里罗嗦一句,在命令窗口里输入命令的时候,可以不必每输入一条命令就按回车执行,可以把好几句话写完后一起运行,那么你想换行的时候,记得要按住“shift”再按回车,否则小麦就会执行上面你写下的所有语句。

(但有的书上写的是按住“ctrl”再回车,难道是我的电脑比较特殊?

第二个窗口叫currentdirectory这个窗口显示的是你当前路径里的东西(当前路径就是整个界面最上面编辑框里的那段地址路径),这东西有啥用呢,简单的讲就是,你可以直接调用这个当前路径里的文件。

举个例子:

比如你可以在当前路径下(currentdirectory窗口里)存放一张jpg格式的图片,名字叫“picture”,然后在命令窗口里直接敲入下面这段代码:

复制内容到剪贴板

代码:

a=imread('picture','jpg');

imshow(a);

自己试试看能产生什么结果,这句话大家能知道大概是什么意思,就是显示一张图片,但如果你把当前路径改一下,再运行上面的代码,会出现一句鲜红的文字告诉你,兄弟,出错了,“File"picture1"doesnotexist.”。

呵呵,知道是什么意思了吧!

小麦有一个默认的当前路径,就是一打开小麦的时候上面那个编辑框里指定的路径,有一天我看着不爽,想把它改了,问了论坛里的几位猛人,得到了答案,可以这样做,右键点小麦的快捷方式—属性—快捷方式,在“起始位置”那个编辑框里写上你需要的默认当前路径就OK了,简单吧!

要是一个不小心把以上介绍的这两个窗口关了该咋办呢?

不要着急,点上面菜单栏里的desktop,在你需要的窗口或界面前面打勾它就出来了。

现在简单的介绍下小麦的文件系统,这里主要介绍一下“m文件”,其他文件以后用到再说,m文件的扩展名“.m”,m文件用来存放和小麦有关的程序代码。

按功能,m文件分两种,一种叫“脚本文件”,其实我也不知道具体的定义,意思就是说,你可以直接运行它得到一个结果,这个结果和你把里面的东西一行行的输入到命令窗口里再一起运行是一样的。

我们来举个例子:

还是用上面说到的那个jpg图片,记得指定当前路径,然后我们在currentdirectory窗口里右键新建一个m文件,起个名字叫“show_a_picture”双击之后先把里面写的所有东西都删掉(绿色的是注释,不起作用),输入前面写过的代码:

复制内容到剪贴板

代码:

a=imread('picture','jpg');

imshow(a);

然后点菜单里的debug—saveandrun,看一下最后的结果,是不是和前面的一样呢。

第二种叫做“函数文件”,意思就是说你可以通过代码在m文件里定义一个函数,以便我们在需要的时候来调用它,关于自定义函数如果展开来讲,可以说上三天三夜,呵呵,这里简单的说一下,以便大家将来专门看这方面东西的时候会比较容易一些,书写函数的格式大致是这样的:

第一行定义输入输出和函数名字

复制内容到剪贴板

代码:

[y1,y2……yn]=fname(x1,x2……xn)

所有的x和y都只是一个形式上的参数,是为了描述函数关系的方便,所以叫形参,如果只有一个输出那就不必加中括号了,fname是函数的名字,然后在下面写上这个函数里输入和输出的关系。

我们还是举个简单例子,定义一个峰值为2,宽度为1的矩形脉冲函数:

在currentdirectory窗口里新建一个m文件(按我说的做,呵呵),起个名字叫“f”,然后打开它,可以把里面的所有内容删掉:

写如下代码:

复制内容到剪贴板

代码:

functiony=f(x)

if(x>=0)&(x<=1);

  y=2;

else

  y=0;

end

这个函数我想大家能够大致看懂意思,可以在命令窗口中输入f(0.5)或f

(2)来调用它,回车察看结果,可以去尝试一下。

关于m文件的命名有两点一定一定要注意,否则会出现一些难以察觉的错误:

第一:

在给m文件起名字的时候只能用小写字母或下划线,名字里绝对不能用中文或数字以及其他的符号。

第二:

如果你的m文件是一个函数,那么文件名字要与你定义的函数名字(包含子函数的写主函数名)一样。

这两点要像公理一样牢牢的记在脑袋里,绝对不能忘记。

接下来的几篇我打算用写代码的方式来对控制系统进行分析与设计,关于强大的simulink会在后面介绍。

本篇的最后我们说一下小麦的帮助系统,一开始学接触小麦的人不喜欢用帮助系统,因为里面的说明都是英文,我觉得大家应该养成有问题去求助help系统的习惯,问题最好还是能自己解决,这样印象会比较深刻,不要碰到不懂的函数和问题就到论坛里问,帮助文件的英文描述语法还是比较简单的,个别词用词霸查一下,用于帮助系统的功能十分强大,我觉得一半以上的问题是可以自己解决的。

比如我们遇到一个陌生的函数,你想知道他是干嘛用的,可以在命令窗口中直接输入:

复制内容到剪贴板

代码:

help  (函数名字)

然后回车,你会看到出现一些文字,这些东西会非常清楚的告诉你对这个函数的解释以及书写参数的格式,还有一种方式:

在小麦界面的右下角有个“start”,这个按钮类似与windows界面里的“开始”,我们能通过它,选择我们在小麦里所有能用到的东西,点击“strat”—“help”,然后在searchfor的编辑框里搜索你赶兴趣的东西。

OK!

今天先写到这里吧,罗里罗嗦写了一堆很基本的东西,没有深入的说一些运行机理,因为个人觉得作为小麦在控制系统里的应用,关于操作环境方面,了解和注意这些就足够了,一些关于文件怎么打开,怎么保存什么的和你用过的其他软件一样,这里就不多说了。

呵呵,(是不是应该放到基础版面里去)但还是保持前后的完整吧,不要着急,刚刚接触小麦的朋友,一开始要做的事情就是熟悉小麦,尽量和小麦搞好关系,看看界面,点点菜单,简单计算几个数字熟悉一下操作环境就可以了。

下一篇我还是不打算写控制方面的内容,而是想来个一锅端,把以后能用到的一些计算上的常用操作都介绍清楚,主要就是以下这些内容:

数值计算,操作矩阵,符号运算,求解微分方程,分支,选择,循环语句等等。

从第三篇起,我们开始介绍小麦与经典控制理论。

最后给大家一个建议,每天关电脑睡觉前打开MATLAB的界面,对着屏幕大喊(或默念)三声:

“小麦小麦我爱你!

因为你是我手里的笔!

我们还是按套路先从矩阵开始吧!

先来定义一个3阶的矩阵:

clip_image002.gif(339Bytes)

2007-12-813:

07

(这样的矩阵好像叫帕什么矩阵,知道的说一下哈)

在小麦的命令窗口中输入如下代码就ok了:

复制内容到剪贴板

代码:

A=[1,1,1;1,2,3;1,3,6]

这里,逗号也可以用空格代替,然后按回车看看会有什么结果

继续,现在我想把这个帕什么矩阵的第二行取出来。

可以运行下面的代码:

复制内容到剪贴板

代码:

a=A(2,:

注意,在小麦里,冒号有很多种含义,可以表示很多种运算的方式,这里可以简单的理解为:

“全部元素”。

继续,现在我想取出这个矩阵的第三行第二列的元素也就是3,可以运行下面的代码,在输入“a”看结果:

复制内容到剪贴板

代码:

a=A(3,2);

继续,现在我要把若干个上面的矩阵拼在一起组成一个大的矩阵,定义的方式和定义数字矩阵的格式一样,只不过是刚才相应位置上的数字变成的矩阵的名字,可以运行下面的代码,看看有什么结果:

复制内容到剪贴板

代码:

[A,A]

[A,A;A,A]

现在来介绍生成一些特殊矩阵的生成方式:

学线性代数的时候,我们最喜欢的矩阵是0矩阵和单位矩阵是吧!

OK,先从他们俩开始

先定义个单位矩阵,函数名是“eye()”

运行下面的代码生成一个4阶单位矩阵:

复制内容到剪贴板

代码:

eye(4);

生成0矩阵的函数是“zeros()”

运行下面的代码生成一个3行4列的零矩阵:

复制内容到剪贴板

代码:

a=zeros(3,4);

注意,可能有的朋友会问:

定义零矩阵有什么用呢?

定义一个零矩阵在一些时候有着非常重要的作用,比如后面也许我们会说到,对于一些变量,我们一开始不知道它的个数,这个时候就需要我们为这些不知道的东西预先分配存储空间,然后得到一个就存进去一个,这种预先分配存储的空间的动作可以提高程序运行的效率,其实不光是小麦,这种思想也体现在其他的编程语言之中。

继续,我们喜欢的另一种矩阵就是对角矩阵是吧,现在来定义它

函数名字:

“diag()”

语法:

diag(v,k),这里,k是远离主对角线的列数,正数是向上远离,负数是向下,如果你不写,默认的就是0

运行下面两段代码,输入"a"回车看能产生什么结果:

复制内容到剪贴板

代码:

v=[1234];

k=1;

a=diag(v,k);

还有一个十分常用的东东在这里顺便介绍一下,那就是关于用冒号来定义行向量。

如果你想定义一个行向量a=[12345];

除了用第一矩阵的方法来做,可以用更简单的方法:

运行如下代码

复制内容到剪贴板

代码:

A=1:

5

这样的定义方式意思是在1到5之间以1为一个步长在定义行向量,如果你想在1到5之间每0.1个步长取一次数,那么就可以得到50个数,1,1.1,1.2……,代码如下

复制内容到剪贴板

代码:

A=1:

0.1:

5

知道什么意思了吧,记住这个方法,以后很多地方会用到!

下面来介绍一些关于数值和矩阵的一些基本的运算,注意,这里虽然很基础,但有几个地方需要特别注意

我们先来计算一个表达式的值,以便让大家对一些常用的运算函数有一个了解

我们要计算的数学表达式:

clip_image002.gif(617Bytes)

2007-12-813:

39

可以运行下面的代码:

复制内容到剪贴板

代码:

A=2*exp(2*pi)*asin(pi/4)+1+sqrt(3^2+4^2)+abs(cos(pi/6))

运算规则和顺序我们平时书写的一致,这里就不多说了,一些数学计算的符号和函数用到的可以去查手册,这里简单介绍几个。

如果我们想定义一个复数变量,可以直接写:

c=a*i+b

这里i是单位复述变量,也可以用字母j

求复数的模和相角的函数分别是“abs()”和“anlge()”直接在括号里输入复数或名字就可以了

关于对数和指数:

函数log(n)表示的是n的自然对数,log2()与log10(),分别表示以2和10为低的对数

如果你想算e和2的3次方也可以用函数来写,分别为:

exp(3)和pow2(3)

关于数字运算就说这么多吧,一些不知道的运算符号可以去查查相关的手册,但这里有一点要说明的是:

在你给一个变量赋值的时候,变量字母的大写和小写表示不同的变量,是不一样的,一些书里建议的是:

变量尽量用小写字母或小写的字符串来定义,并且起名字的时候尽量让这个名字有一定的意义,可以增加程序的可读性。

现在来介绍关于矩阵的运算

在开始这部分之前,先说一个大家一定千万必须务必……要记住的一个事情:

我们知道1*1的矩阵我们叫标量,就是一个数,标量和标量的运算直接用我们熟悉的运算符号就可以了。

但是,矩阵的运算,包括向量,标量,矩阵之间的运算有所谓叉乘和点乘之分,比如我们定义了

t=1:

10;

我们想计算相应的2t的所有值,就必须用到点乘,符号是“.*”

即:

2.*t

相应的,还有点除,点乘方等运算,如果涉及到这样的运算,这个“点”符号一定一定不要忘掉,由于”.”符号过于微小,如果你的程序写的很大,这个错误将很难被发现,本人一开始就差点被这个事情搞疯掉,前车之鉴吧,不要犯这种低级的错误。

继续,前面我们定义了一个帕什么矩阵G

那么,代码

复制内容到剪贴板

代码:

A=G*G

表示叉乘,就是一般意义上的矩阵乘法,而代码A=G.*G表示点乘,就是把两个矩阵G上相应位置上的数字所乘法。

可以运行一下看看计算结果。

继续,下面介绍几个计算矩阵相关信息的函数

第一批:

squrm()

expm()

logm()分别为求矩阵所有元素的开方,指数,自然对数运算,这个就不多说了,把G搞到括号里面看结果就好了。

第二批:

det()

eig()

inv()

poly()

rank()分别为,求矩阵的行列式,特征值和特征向量,求逆,求特征多项式系数,求秩。

分别简单说一下:

第一个就不多说了,直接把G弄到括号里回车就可以了。

第二个的语法:

如果按a=eig(G)

来写,则a为G的所有特征值(包括重根)组成的一个列向量

如果按[ab]=eig(G)来写,则a为G的所有特征向量组成的矩阵,b为G的所有特征值组成的对角矩阵。

可以去尝试一下,运行这两个代码,看能产生什么结果。

第三个也不必多说,还是把G塞进去就好了,但是,如果G是个不可逆(奇异)的矩阵,呵呵,你可以自己尝试一下小麦会有什么反应。

第四个还是把G塞进去就好了,但是,它的结果是一个行向量,从左到右的数字依次为特征多项式从高次到低次的系数

第五个就不多说了,得到数字就是矩阵的秩。

常用的就这么多,还有一些关于矩阵信息的函数就不多说了,去查手册吧!

关于矩阵和数字运算写到这里先(要饿死了,去吃个饭饭),需要注意的问题请大家牢记,因为很多都是我曾经犯的错误。

下面我门来介绍有关符号表达式的内容

我们知道,一般情况下,我们都是通过符号作为变量或参数来进行计算的,小麦把这样的变量称为符号变量,比如,在命令窗口里输入a+a,我们当然希望小麦给我们的结果是2*a对吧,但是当你按下回车的时候,小麦会提供给你一个错误的信息。

其实,小麦是个很笨笨的家伙,这个问题怎么处理呢。

你必须先告诉小麦,a是一个符号变量,然后才能进行下面的运算,这里介绍一种声明符号变量的方法,函数是:

“syms”代码如下:

复制内容到剪贴板

代码:

symsa;

a+a

我们可以一口气声明很多个字母作为符号变量,声明后,这些字母就可以像数字一样进行各种运算了,先举一个简单的例子:

clip_image003.gif(766Bytes)

2007-12-822:

51

计算这两个表达式的和。

代码如下

复制内容到剪贴板

代码:

symsx;

f1=x^3+2*x^2+8*x+14;

f2=x^2+4*x+10;

f=f1+f2;

这段代码应该没有什么理解上的问题。

可以运行下,看看f的结果

现在我们来构造一个符号矩阵,然后求它的逆,可以运行下面的代码,然后看看B的结果:

复制内容到剪贴板

代码:

symsa11a12a21a22

A=[a11a12;a21a22];

B=inv(A);

现在介绍一些与处理符号表达式以及相关计算的函数:

collect()

expand()

factor()

[numden]=number()

分别为合并同类项,展开因式,分解因式,通分运算。

这些都是比较容易理解的函数,下面按顺序各举一例,运行下看看能产生什么结果。

第一个:

复制内容到剪贴板

代码:

symsxt

y=(x^3+1)*(x+2);

z=collect(y);

第二个:

复制内容到剪贴板

代码:

symsx;

y=cos(3*acos(x));

z=expand(y);

第三个

复制内容到剪贴板

代码:

symsx

y=x^2+2*x+1;

z=factor(y);

第四个

复制内容到剪贴板

代码:

symsx

y=(x+2)/(x*(x+3))+1/(x+1);

[nd]=numden(y)  %这里,n返回分子多项式,d返回分母多项式。

再介绍一个比较有用的函数:

simple(),字面理解一下,这个函数内部包括了各种简化算法,可以将一个烦琐的符号表达式化为小麦认为的最简形式,这里我就不举例子了,大家可以自己写一个比较烦琐的表达式,然后用这个命令处理一下,看看是不是最简。

听爷们儿谈下一话题

下面我们来介绍一下常微分方程的解析解的解法,这一类可能是我们处理控制系统问题经常用到的东西。

隐方程的解法以及数值解和图形解可以参见本论坛柚籽JJ的一个帖子,里面有很精彩的讲解。

链接:

我们先顺便讲一下如何计算一个符号表达式的微分

函数:

diff()

代码如下

复制内容到剪贴板

代码:

symsxa

f=a*x^2+a*x+a+1

df=diff(f)  %默认时对x进行一阶微分

df=diff(f,2)%对f进行二阶微分

dfa=diff(f,a,2)%指定变量a对其进行二阶微分

下面来介绍求解微分方程,这里主要用到一个函数:

dsolve

现在来具体讲一下他的用法:

语法:

dslove('eq','cond','var');

eq是你的微分方程表达式:

cond是此方程的初始条件,var是微分变量,缺省时默认为t

先看一个例子:

我们来解一个齐次的微分方程:

clip_image002.gif(370Bytes)

2007-12-910:

49

并且指定y(0)=y'(0)=1,可运行如下代码来求解:

复制内容到剪贴板

代码:

y=dsolve('D2y+3*Dy+2*y=0','y(0)=1','Dy(0)=1','t');

这里D2y,和Dy的意思大家能猜到了,怎么样!

是不是和我们平时书写微分方程的方式一模一样。

现在来解一个微分方程组:

clip_image005.gif(771Bytes)

2007-12-822:

55

  x,y都是t的函数,不指定初始条件;

求解代码如下:

复制内容到剪贴板

代码:

S=dsolve('Dx=y,Dy=-x')

求出的S是一个结构体(先不用管它是啥!

),我们可以在命令窗口中分别输入S.x和S.y,分别按回车来看x和y的表达式。

关于微分方程就先说这么多吧!

这篇的最后一个任务,我们来介绍小麦的几个最基本的选择和循环控制语句,if,elseif,switch,while和for语句,这些语句的格式和作用与一些编程语言比如C语言差不多,也很容易理解。

编程的时候就不能在命令窗口中直接一行行的输入,需要建立一个m文件,在文件里写你需要的代码,然后运行。

While语句:

你必须给while语句指定一个结束的条件,才能使循环结束,否则他将一直循环下去:

现在用while语句来求1到100所有数字的和。

代码如下:

复制内容到剪贴板

代码:

sum=0

k=1;

whilek<=100;

sum=sum+k;

k=k+1;

end

sum

运行后,sum最终的值为5050

for语句:

语法是在for的后面指定循环变量从哪到哪,每执行一次循环体后,循环变量就加1,一直循环到你指定的终点,语法是fork=1:

10,在没有中断命令的情况下,这个循环要执行十次,这样,我们就可以很清楚的控制循环的次数,所以,在应用中我们基本上是使用for语句来执行循环。

现在用for语句来求上面的问题,代码如下:

复制内容到剪贴板

代码:

sum=0

fork=1:

100;

sum=sum+k;

end

sum

用for语句比while要简单了一些是吧

If和else语句:

这个不解释了,直接看例子

现在我们要对下面这个向量进行处理:

123456789

让它变成:

123454321

代码如下:

复制内容到剪贴板

代码:

fork=1:

9;

ifk<=5;

a(k)=k;

else;

a(k)=10-k;

end

end

a

elseif语句:

还是直接看例子:

下面我们来建立一个具有饱和特性的函数

建立一个名字为f的m文件,代码如下

clip_image01.gif(997Bytes)

2007-12-823:

05

复制内容到剪贴板

代码:

functiony=f(x);

ifx<-1;

  y=-1;

elseif  (x>=-1)&(x<=1);

  y=x;

else

  y=1;

end

然后可以指定一个数x,在命令窗口中对f(x)进行验证。

最后,终于到最后了

来看一下switch-case语句:

当case后的选择判断值与swich条件匹配时就执行此case的语句,如果所有的case不于swich条件匹配就执行oterwise后的语句,下面的例子能说明这个问题:

复制内容到剪贴板

代码:

A=1

switch  A

case  -1

  disp('负数')

case  0

  disp('零')

case  1

  disp('正数')

otherwise

  disp('其他值')

end

最后需要的注意的是,对每

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1