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

来源:互联网 发布:js怎么判断日期格式 编辑:程序博客网 时间:2024/06/07 05:48
为打字方便,以下把MATLAB简称“小麦”

昨天学校开运动会,一群人被抓去当观众,就没写成。晚上在群里声讨,为什么都读研了还要做这种事情,最后大家的一致结论是:这年头呀,研一的和大一的没啥区别,呵呵。

从这一篇开始,我们介绍有关控制系统的内容,我的目的是想让大家熟悉和初步掌握:MATLAB是如何辅助我们处理控制系统的问题的,从这一篇开始,我们要接触到大量的工具箱函数,熟练和灵活的应用这些函数是学习的关键。前面说过,我打算从古典控制论的MATLAB应用写起,一直到最后能够结合我的主攻方向来给大家尽量介绍一些先进的控制策略以及MATLAB仿真,现在,让我们回到奈奎斯特、伯德、维纳和伊文斯的时代,开始漫长的古典控制理论。

拉普拉斯变换与逆变换

拉普拉斯同志在天堂一定笑的很开心,因为有了小麦,呵呵,关于L变换和逆变换,只要两个函数就可以搞定,laplaceilaplace

上面两个函数是符号计算工具箱里的函数,拉普拉斯变换的定义这里就不说了,这个都不知道的话一种方法是撞墙,另一种方法去看书吧。一般情况下,L变换是以字母t为自变量,以其他字母作为参数来进行变换。记得我们前面说的,必须告诉小麦,这些东西统统都是字符变量,才可以进行下面的计算。
现在来计算 sin(wt)L变换:代码如下
  1. syms a t w x
  2. f1=laplace(exp(a*t))
  3. f2=laplace(sin(w*t))
复制代码

结果就是相应的L变换

现在来计算函数:L变换,并对结果进行通分
代码如下:
  1. syms t
  2. f=2+sin(3*t)+exp(-2*t);
  3. F=laplace(f)
复制代码


这个代码的结果是分散的三个分式的形式
可以用函数numden()对这个表达式进行通分
格式是[a,b]=numden(f)


运行上面的代码后a,b的值分别是通分后的分子和分母多项式

在这里,把小麦里已经定义好的单位冲击函数单位阶跃函数告诉大家,分别是dirac(t)heaviside(t)使用之前记得要把t设置为符号变量,如果你要想把阶跃函数加1个单位的延迟只需要heaviside(t-1)就可以了。关于这两个函数网上很多人再问,大吵大嚷的人也有,但大多数人居然不知道,这里我给大家指出来,大家可以尝试一下把这两个函数进行L变换看看结果是否正确,以后再用到这两个函数的时候可别说我没告诉过你哦!!!

L变换


用函数ilaplace,这个函数主要是以字母s为自变量,以其他字母为参数进行变换,这也和我们平时习惯是一样的,得到的结果是一个以关于字母t的函数

现在来求像函数 

  的逆L变换

代码如下:
  1. syms a b s
  2. F=1+a/(s+1)+b/(s+2)^2
  3. f=ilaplace(F)
复制代码


对一个时域或传递函数矩阵,可以先把矩阵定义好之后再对这个矩阵进行L和逆L变换,得到结果是矩阵里每一个元素的变换结果:举一个简单例子:
  1. syms t s
  2. F11=2/(s+1)
  3. F22=1/(s+2)
  4. Fs=[F11,F22]
  5. M=ilaplace(Fs)
复制代码

这个代码不解释了,相信大家能知道它的意思


在这里,顺便把z变换和逆z变换的函数告诉大家,用法和L变换的两个函数大致相同,分别是:ztransiztrans

下面来介绍关于绘图的几个最基本的操作

问题一 如何画平面曲线图

用函数plotezplot

直接举例:
0pi上画cost*sint的图像


plot命令,代码:
  1. t=0:0.01:pi;
  2. y=cos(t).*sin(t);
  3. plot(t,y)
复制代码



说明一下,这里定义的ty都是一个向量plot命令把这些密度很大的向量点连在一起,让大家认为是一个曲线的形式,可以尝试一下把plot(t,y)变成plot(y,t)看看有什么变化,一看就知道啦

还有,记得我前面特意关照的关于向量之间相乘的问题么,这里是向量的对应项做乘法,因此是点乘,这个点符号一定不要忘记加上,如果你去掉了,就会提示错误。

ezplot函数,代码如下
  1. syms t 
  2. y= cos(t)*sin(t);
  3. ezplot(y,[0 pi])
复制代码

这里说两点,用这个函数的时候,t的步长系统自动指定,y定义的是一个符号表达式,不是一个向量,这个与plot有点区别,因此,在写表达式的时候就不用写点乘符号了。只要按习惯来写就可以了。

另外,关于如何指定曲线的颜色,线型等属性,可以去查一查表,这里就不赘述了。

问题二
如何在一张图上画一条以上以上的曲线,以便比较


用命令:hold on
废话不多说,看例子
现在,我要把sinxcosx02pi的图像画到同一幅图里去。
代码如下
  1. t=0:0.01:2*pi
  2. y1=sin(t);
  3. y2=cos(t);
  4. plot(t,y1);
  5. hold on
  6. plot(t,y2,'r')
复制代码

其中,'r'的意思是指定第二条曲线为红色,

如果不用hold on命令,这个代码也可以直接写成
  1. t=0:0.01:2*pi
  2. y1=sin(t);
  3. y2=cos(t);
  4. plot(t,y1,t,y2,'r');
复制代码

最后,你可以运行hold off命令关闭这一功能,再画新图的时候,就只有最新的一条曲线了,大家可以去尝试一下。 

问题三:如何把不同的图形画在不同的窗口里

这里举个例子就明白了

现在把sinxcosx02pi的图像画在两个窗口的坐标系里,代码入下
  1. syms t
  2. figure(1)
  3. ezplot(cos(t),[0,2*pi])
  4. figure(2)
  5. ezplot(sin(t),[0,2*pi])
复制代码

懂了吧figure(1)figure(2)目前可以认为是指定两个窗口 

问题四:如何在同一个窗口里显示多幅图像

subplot命令


还是举例子,现在我要把sinxcosx02pi的图像画同一个窗口的两张图里去。
代码如下
  1. syms t
  2. subplot(2,1,1);
  3. ezplot(sin(t),[0,2*pi]);
  4. subplot(2,1,2);
  5. ezplot(cos(t),[0,2*pi]);
复制代码
subplot(m,n,k)的意思是,把窗口分成mn列个图像(坐标系),k表示这些图像里先从左到右在从上到下的第k个图像,把这第k个图像指定为当前的坐标系来进行操作。结合上面的例子,相信大家能很好的理解。

OK,以上四个问题是我们作图的最基本操作,关于作图的问题,有很多方法,很多的函数可以执行,这篇先说这么多,以后如果有需要再专门介绍。

继续,我们来学习如何构造连续系统的传递函数

理论简述:


首先,告诫大家不要学着学着就忘本了

现在我来问你们几个问题,如果你能回答上来,说明你还没有忘本。如果对下面的问题不是特别的清楚,建议你最好先弄清楚再往下看

第一:以连续系统为例子,传递函数是怎么来的

第二:为什么要用传递函数来表达系统,好处在哪里,有什么局限。



OK,我来给大家的一个简单的参考答案,连续系统中,把一个系统的微分方程等号两边分别取拉普拉斯变换,然后把输入和输出放在一边,其他项放在另一边就得到了我们的传递函数模型。

实际上,通过L变换,系统的微分方程模型转换成了代数方程模型,分析代数方程无论从难度和手段的多样性都要比直接分析微分方程好很多,因此,我们采用传递函数来研究一个系统更加的直观和方便。另外,传递函数表达了一个系统输入和输出的关系,也就是说,一系统给定了,那么它的传递函数就不会变化,也就是说传递函数不受输入和输出的变化影响。

传递函数的局限在于,它只能反映系统的外部特性,也就是输入和输出的特性,因此,传递函数模型也被一些人称为“黑箱”模型,因为我们只能看到由它引起的外部变化,并不能解决系统内部的一些问题和矛盾。要解决这个问题就要用状态空间模型和现代控制理论,因此,状态空间模型又称“白箱”模型,我们可以清晰的看到它的内部结构,以便对系统进行优化和完善。

关于系统模型的问题先说一下构想,我想分步骤来写,连续系统传递函数模型的各种形式在这篇里介绍,频率响应模型我打算在频域分析里简单说一下,关于状态空间的问题,在后面讲到现代控制原理的内容时再专门介绍。关于离散的内容,还没想好要怎么弄,初步打算是专门写个东西来介绍它。

现在我们来生成一个传递函数模型:

用函数 tf 可以很方便的构造:


方法一 代码如下
  1. num=[1 3 2]
  2. den=[1 5 7 3]
  3. sys=tf(num,den)
复制代码

numden分别为分子和分母多项式的系数

方法二 代码如下:
  1. s=tf('s')
  2. sys=(s^2+3*s+2)/(s^3+5*s^2+7*s+3)
复制代码
方法三 代码如下
  1. sys=tf([1 3 2],[1 5 73]
复制代码

我们知道,一个传递函数的零点和极点直接决定了系统的性能,我们在定义传递函数的时候直接用已知的或我们需要的极点和零点来定义它,这种模型叫做零极点增益模型,构造函数为zpk

现在来建立一个零极点增益模型:

这个传递函数的增益为10,有一个零点,三个极点
生成代码如下

  1. z=[-1];
  2. p=[0,-2,-5];
  3. k=10;
  4. G=zpk(z,p,k)
复制代码


其中,z,p,k分别代表零点的矩阵,极点的矩阵,和增益
也可以写在一起:
  1. G=zpk(-1,[0, -2,-5],10)
复制代码

这里罗嗦一句,零点和极点的值都可以设定为复数

修改传递函数的属性值

在小麦里,传递函数模型自身包含了很多的属性,比如输入输出的维数,自变量是什么,有没有延迟等等,可以用命令get()来察看,括号里是你定义好的传递函数模型。这里说两个属性,一个是变量的选取,一个是有关延时的问题。

如果你想修改任何一个属性,只需要按下面格式输入就可以了,sys是你定义的传递函数,name是属性的名称,等号右边是你希望的属性值
  1. sys.name=value
复制代码

例如我现在要把传递函数的自变量s修改为p
就可以这样来做
  1. sys.variable='p'
复制代码

如果你想给sys系统加一个单位的输入延迟可以修改sysinputdelay属性
  1. sys.inputdelay=1
复制代码

运行后看看传递函数有什么变化

fzpk函数还有一个功能,就是能将其他类型的模型转换成自己代表的模型,大家可以自己尝试一下,先建立一个tf模型sys,再运行zpk(sys) 看看是不是能够转换得了,这个就不多说了,关于模型建立的问题这里只介绍常用的方法,比较详细的介绍参见本版的一个帖子,链接如下:
http://www.ilovematlab.cn/thread-1182-1-1.html

于建立模型相对应,我们也有相应的函数来得到tf和zpk模型的参数,比如可以获取tf模型的分子和分母多项式的系数,可以得到zpk模型的增益和零基点,函数为tfdata和zpkdata,由于这两个函数用法简单,这里不介绍,详细信息还是参见上面的链接。

现在来介绍系统模型的串联,并联和反馈连接

两个系统的串联和并联可以直接用乘号和加号计算,也可以用相应的函数进行运算


两个传递函数分别为f1f2
G=f1+f2,就表示两个系统并联的结果,用函数来表达,等价于:G=parallel(f1,f2)
G=f1*f2,就表示两个系统串联的结果,用函数来表达,等价于:G=series(f1,f2)

下面来介绍用代码实现模型的反馈连接
我们用feedback函数来实现如下图所示的反馈



代码如下
  1. f1=tf(1,[1 1]);
  2. f2=tf(1,[1 2]);
  3. f3=feedback(f1,f2);
复制代码
可以直接输入f3察看最后的结果
简单说明一下,在这里函数里,f1是前项通道的传递函数,f2是反馈通道的函数。
Feedback函数默认时为负反馈,如果需要正反馈,可以运行下面的代码:
  1. feedback(f1,f2,+1)
复制代码

今天先写到这里吧,又写了好多,收不住了,呵呵,下一篇我们来专门用一个篇幅的长度来介绍控制系统的时域分析以及用小麦仿真。

最后留两道……恩,作业吧,如果你能独立的做出来,说明今天的内容你完全掌握了并能运用了

第一题,只运用今天我们介绍的函数或命令,来作出一个系统的单位阶跃响应曲线的图像,系统为一个最简单的一阶加延迟的系统
G=    (注意,只能用这一篇介绍的函数哦!!!)




第二题,用代码求出下面这个系统的总传递函数:



今天就到这里吧,还记得我们的口号吗!!
小麦小麦我爱你,因为你是我手里的笔!!耶!!!!!
0 0