控制系统与MATLAB的菜鸟教程(四)…

来源:互联网 发布:js怎么判断日期格式 编辑:程序博客网 时间:2024/06/07 00:32
写这篇之前先说明一个情况,恩……因为最近要准备学校的考试,所以,这个学期的教程这次可能是最后一篇了,接下来的34个星期内,可能不会写新的东西出来,但是寒假里我会把这个事情继续下去,在这里先请个假,咔咔!!

按照上一次说的,这一篇开始我们来介绍控制系统的时域分析。这部分内容比较基本,也比较重要,其中的一些操作很经典,可能以后会经常用到,所以需要格外的注意

引子:

我们先从上一篇我留下的一个问题开始说起;

上一次,我留下了两个问题,第二个问题是就求一个闭环系统的传递函数,那个比较简单,第一个相对来说要思考以下,

现在我们把问题再简化一下。用代码写出

s1.gif 

的单位阶跃响应,还记得我的要求么,只能用我们上一篇里介绍的函数。我的目的其实是让大家熟悉一些函数的用法,和单位阶跃响应的求

解过程,阶跃响应怎么求的呢,步骤是不是这样:先根据系统的输入和传递函数来求出系统的输出,然后在把输出进行拉氏逆变换,求出输出

的时域形式,在指定仿真时间来作图。现在我们按照所说的过程来编写程序。

  1. symss
  2. G=1/(0.5*s+1); %传递函数
  3. U=1/s;%输入
  4. G1=G*U;%输出
  5. T=ilaplace(G1);  反变换
  6. ezplot(T,[0 10]);
  7. axis([0,10,0 1.2])%指定坐标轴的范围
复制代码
运行上面的代码就可以得到一个一阶系统的阶跃响应曲线,上面的代码不解释了,我想都能看懂。

关于一些基本理论(这里请耐心看下去):

我还是问你们两个问题,看看你们对最基本的东西的掌握情况

 如果给你一个系统的传递函数,那么,这个系统的动态性能从最根本上讲取决于什么。

 这些决定因素是如何影响系统的性能的

这个问题其实是我们古典控制理论最核心的问题,所有的方法都是基于这个问题来展开的。现在给出一个答案。



给定一个传递函数,决定系统性能的最根本因素就是系统的零点和极点在复平面上的分布情况,其中,起决定性作用的是极点的分布,他决


定了系统是否是稳定的是否有震荡,震荡的频率和幅度等等系统最关键的东西,零点的存在起的是一种调节作用,要么是锦上添花,要么


雪上加霜。我们学习控制,最终的目的是学会如何根据各种被控对象的情况来设计合适的控制器,但从上面的意义上来讲,设计控制器的


最终目的就是为了把整个系统的零点和极点控制在我们希望的区域或范围内。




说这么多的目的是想让大家知道,这是我们控制理论里最根本的问题,在学习一些分析和设计方法的时候我们最好多想一下,这个种方法对系统的零极点分布有什么影响,我觉得这样对我们理解一些问题尤其是一些相关经验的建立会有很大帮助。

OK,前面强调了系统极点的重要性,再展开来讲,我们有一系列非常重要的结论。



对一个受到阶跃信号输入的系统

 如果系统所有极点都具有负实部,那么这个系统无论如何都是稳定的(输出有一个最终的恒定值)

 系统只要有一个极点有正实部,这个系统都是不稳定或着发散的

 系统的极点如果存在复数根,那么系统的输出将存在震荡。复根离实轴越远震荡越厉害,反之,则不存在震荡。

我们知道,在上个世纪初,在还没有小麦的黑暗时代里,劳斯同志挺身而出,发明了分析系统极点的一个定性算法,后来我们把它叫做劳斯判据。让我们为好同志阿劳默哀一秒种。BUT!阿劳死了就死了吧,反正我们现在已经不用这个东西了,因为现在有了非常成熟的寻根算法,“用小麦计算,一次顶过去一万次,方便!实惠!您愁准了,mathwork牌小麦!!!”呵呵,现在我们来给出几种求系统极点的方法。


用函数:roots


这个函数非常有用,它返回一个列向量,结果是一个多项式方程精确的根。例如我们要求一个传递函数


s2.gif 




的所有零点和极点。代码如下

  1. z=roots([3 2 5 46]);
  2. p=roots([1 3 4 2 7 2]);
复制代码
这个函数不难,都猜到这个函数的用法了吧
然后可以输入zp查看零点和零点


用函数zpkdata

这个函数是最直接的做法,不介绍了,用法见链接
[url=http://www.ilovematlab.cn/thread-1182-1-1.html][/url]http://www.ilovematlab.cn/thread-1182-1-1.html

用函数pzmap
这个函数的作用是画出一个系统的零极点的分布图,这种方法给出了一个非常的直观的结果。现在来求上面传递函数的零极点分布图。
代码如下:
  1. sys=tf([3 2 5 46],[1 3 4 2 7 2]);
  2. pzmap(sys)
  3. grid on
复制代码
2.bmp
我们得到了这样的一个图形,酷吧!!图上叉符号代表极点圆圈符号是零点,我们可以非常清楚的看到,这个系统具有右半平面的极点,所以这个系统是不稳定的

另外说一句,如果这个系统的传递函数的增益k是一个变量,那么系统的极点将不会是几个确定的值,反映在上面的图象上,就变成了几条随k变化的曲线,这样的曲线就是传说中的“根轨迹”,关于根轨迹后面还会说到。

下面来补充一个内容:如何把一个传递函数进行部分分式展开。这里用到一个求留数的函数
resdue

用法:

[r pk]=residue(num,den)

numden分别是分子和分母多项式的系数矩阵

r留数p是求得的极点k余下项s的系数,由于我们的传递函数一般都是分子的阶次小于分母(这叫做物理可实现形式),所以,一般k



就是0,返回一个空矩阵。举个例子就明白了:

现在来求一个传递函数的部分分式展开
s3.gif 


代码和返回值如下:

  1. [r p k]=residue([3 15 12],[1 5 8.25 5 1])

  2. r =

  3.    -2.2222
  4.    -2.6667
  5.     2.2222
  6.     2.3333


  7. p =

  8.    -2.0000
  9.    -2.0000
  10.    -0.5000
  11.    -0.5000


  12. k =[]
复制代码

从代码中我们可以求出部分分式展开的最后结果:

s4.gif 


很简单,懂了吧!!!

下面来介绍如何求系统的输出响应,涉及到的几个函数可能以后会经常用到


求系统的阶跃响应

当然,你可以用这一篇最开始的方法来求,但是更简便的方法是用一个函数

step

直接看例子


s5.gif 

的阶跃响应曲线

代码如下:
  1. G=tf([1 2 4],[1 10 54]);
  2. step(G)
复制代码

或者直接:step([1 2 4],[1 10 54])

得到系统的阶跃响应曲线如图:
3.bmp
2007-12-23 09:05上传
下载附件 (230.74KB)

s5.gif (1.34KB, 下载次数: 53)

 

s5.gif


我们知道,类似上面的这样一个系统响应曲线,有以下这几个性能指标

峰值、峰值时间、超调量

调节时间(或过渡过程时间)

上升时间:这里注意,我们学过的上升时间是指输出第一次达到稳态值的时间,小麦定义的上升时间和我们学过的定义有区别,具体是什么大家可以尝试一下,看看小麦对上升时间是怎么定义的。

稳态值

这几个指标我们可以通过一个操作直接在图中获得:


在图上的空白处点击鼠标右键—>characteristics

看到了吧,里面有四个选项,英文意思大家都应该认识,点击相关的选项,小麦会自动标出这个指标对应在图象上的点,然后你可以把鼠标指针放在这些点上,


看出现在方框里里的数值,下面我选中了选项“peakresponse”,如下图所示:标出了峰值,峰值时间和超调量。


4.bmp


 

求系统的单位冲击响应

这里还是一样,可以用最开始的方法,由于单位冲击函数的拉氏逆变换为1,所

以直接求传递函数的逆变换就可以了对吧!!

小麦也有一个响应的函数求单位冲击响应

impulse 

用法和step函数类似,还是看例子吧!!

现在求上面那个传递函数的单位脉冲响应,代码如下:
  1. impulse([1 24],[1 10 5 4])
复制代码

5.bmp 


求系统的任意输入的响应,这边先介绍两个函数,然后再罗嗦点其他的东西

gensiglism


这两个函数一般是配合使用的

函数gensig的官方定义是:产生用于函数lsim的试验输入信号。

一般常用的方式是:

[u,t]=gensig(type,tau,t)

参数type指定输入的类型,‘sin’代表正弦,‘square’代表方波,‘pulse’为周
期性脉冲

参数tau指的输入信号的周期,t是输入持续的时间

大家可以尝试下面的代码看看能产生什么结果

  1. [u,t]=gensig('sin',5)
  2. plot(t,u)
复制代码


函数lism的官方定义是:求系统在任意输入信号作用下的时间响应
这个函数经常与gensig函数一起使用

格式lism(sys,u,t)

sys是你建立的传递函数,u是输入,t是输入的持续时间,这两个量大多数时候
gensig函数确定

看下面的例子:

求一个系统在指定方波输入下10秒内的输出响应:


s6.gif 


代码如下

  1. [u,t]=gensig(‘square’,4,10,10)
  2. G=tf([2 5 1],[1 2 3]);
  3. lsim(G,u,t)
复制代码

6.bmp 
图中,灰色的线是输入信号u



这里多说几句,lsim函数固然强大,但是遇到你需要的输入函数,你必须要把这个函数自己定义出来,然后才可以这样来用,这样就增加了工作量,我觉得遇到需要你指定任意输入的情况,还是用本篇最开始的方法比较好(拉氏逆变换后直接画时域的图),虽然有点原始,但是无论是信号求拉氏变换还是逆变换都比较直观容易,所以,在求解这类问题的时候,原始方法是一个比较不错的选择。

这篇的最后,我们来做一个有一点点小难度的事情,我们来编写一个函数,功能是根据系统的传递函数和输出持续时间来计算系统的单位阶跃响应的过渡过程时间!!! 精度为正负2%


没关系,听我一步步的道来,不会太难。


首先我们明确编程的目的,是求过渡过程时间,那么什么是过渡过程时间呢?


这个概念大家脑袋里一定要明确:



过渡过程时间是指:系统的输出第一次到达超调量小于指定精度范围内的那个周期的时间



这句话大家仔细理解一下,觉得拗口不理解也没关系。继续往下看,由于我们的仿真时间是一个密度很大的向量,所以我们编



程的手段就是从零开始一个时间点一个时间点的搜索,假设输出的最终稳态值为A,那么我们的目的就是搜索到这样的一个时



间点,这个时间点满足这样的条件,在它之后的所有时间点上,系统的输出值都在精度范围以内,也就是:0.98a-1.02a之间,



由于我们是从零时刻开始按顺序搜索的,所以,我们一定会找到唯一一个首先进入这个区间的时间点,并且这个时间点满足上



面说的条件,那么,这个时间点就是我们要找的过渡过程时间ts



以上就是编程的大体思路,那么根据上面说的,我们在编写函数的时候需要哪些数据呢


第一 我们要把系统在仿真时间内的所有时间向量的值它的范围以及系统的阶跃输出数据的值拿到手,这样才能够搜索比较。


第二 我们需要得到系统的最终稳态值a,因为我们根据这个来确定0.98a1.02a

现在我们开始编写这个函数,代码如下(其实很短)


形参t为时间向量的值,ys为阶跃输出数据向量的值

  1. function ts=f(t,ys)
  2. dimt=length(t);  %仿真持续时间长度 
  3. yss=ys(dimt);  %求稳态值
  4. for i=1:dimt;   
  5. if ys(i)>1.02*yss; 
  6. ts=t(i);
  7. elseif ys(i)<0.98*yss;
  8. ts=t(i);
  9. end
  10. end
复制代码


这个函数我们编好了,记得我们前面说的,存储的时候要把它改成和函数一样的名字,也就是‘f


现在我们来用这个函数求一个阶跃响应的过渡过程时间,代码如下


  1. G=tf(25,[1 625]); 
  2. t=0:0.01:10;
  3. ys=step(G,t);  %获取系统的输出数据
  4. ts=f(t,ys)  %启动函数
复制代码


我们可以运行step(G)命令,用前面的方法来验证一下我们求得的值是否正确,这两段代码还是要好好的看一下,我觉得认真看的话是绝对可以理解的。

OK!!
今天就写到这里,总结一下,我们今天主要介绍了系统零极点和系统输出响应的几种求法,这些东西都是非常基本的操作。

这次由于间隔时间比较长,留一个相对难一点的问题给大家,

编写一个函数:求系统阶跃输出响应的上升时间tr(这里按我们大多数书里的定义:输出第一次达到稳态值的时间)。

提示:仍然用上面说到的搜索方法来求,可以在for循环中用break选择在适当的时候结束和跳出循环,

关于系统的时域分析,还有一些内容,比如求取稳态误差和根轨迹的问题等等,留到下一次再说吧。

虽然一个月内不会再写东西,但依然要记得我们的口号:


小麦小麦我爱你,因为你是我手里的笔!!!!耶!!!:lol :lol

0 0