智能控制设计作业
- 格式:wps
- 大小:261.21 KB
- 文档页数:13
入口 ec(k) = e(k) - e(k-1) e(k) = r(k) - y(k) 取当前采样值
模糊整定ΔKp,ΔKi,ΔKd e(k-1) = e(k) e(k)、ec(k)模糊化
计算当前Kp,Ki,Kd PID控制器输出 返回
智能控制设计作业 一、题目 设计一个模糊自适应整定PID控制器,其被控对象为:
22.28()(0.5)(1.648.45)pGssss
(1-1)
采样时间为1ms,编写matlab仿真程序,确定其在阶跃输入的响应结果,并与经典PID控制相比较。要求详细描述控制系统的设计,控制系统工作流程,模糊控制中的输入输出的隶属函数设计及其采用的模糊规则。
二、模糊自适应整定PID控制器的设计过程
1.模糊PID工作流程的拟定 参照教材,工作流程图如右所示,其中,e是偏差 ec是偏差变化量。r代表输入,y代表输出。 Kp,Ki,Kd分别代表比例、积分、微分环节的系数。
图2-1 流程图 2.matlab仿真程序的编写 (1)matlab仿真程序设计前的准备工作 具体的程序请见附录。 采样时间为1ms,采用z变换进行离散化,离散化后的被控对象为: y(k)=-den(2)y(k-1)-den(3)y(k-2)-den(4)y(k-3)+num(2)u(k-1)+num(3)u(k-2)+num(4)u(k-3) 位置指令为幅值1.0的阶跃信号,r(k)=1.0。仿真时,先运行模糊推理系统设计程序conclusion.m,实现模糊推理系统,并将此模糊推理系统调入内存中,然后运行模糊控制程序controller.m。在程序conclusion.m中,根据下面的模糊控制规则,分别对e、ec、kp、ki、kd进行隶属函数的设计。根据位置指令、初始误差和经验设计e、ec、kp、ki、kd的范围。其中,这几个变量的隶属函数均采用三角形模型的隶属函数。
(2)确定模糊控制规则 将输入的e、ec与输出的kp、ki、kd进行模糊化。 输入量e、ec的模糊集分为{负大、负小、零、正小、正大},五个成员。 输出量的kp、ki、kd模糊集都为{负大、负中、负小、零、正小、正中、正大}七个成员。 对这5个变量的的论域的划分,以及隶属函数的设计如下面的图2-1到图2-5所示。具体数据可以见附录的conclusion.m程序。 因为有两个输入,而且各五种状况,故有25条规则。 1.如果偏差e为负大,且ec为负大,那么Kp为负大,Ki为负大,Kd为正小 2.如果偏差e为负大,且ec为负小,那么Kp为负大,Ki为负大,Kd为正小 3.如果偏差e为负大,且ec为零,那么Kp为负中,Ki为负中,Kd为正中 4.如果偏差e为负大,且ec为正小,那么Kp为负大,Ki为负中,Kd为正大 5.如果偏差e为负大,且ec为正大,那么Kp为负大,Ki为负大,Kd为正大
6.如果偏差e为负小,且ec为负大,那么Kp为负中,Ki为负中,Kd为正中 7.如果偏差e为负小,且ec为负小,那么Kp为负中,Ki为负小,Kd为正小 8.如果偏差e为负小,且ec为零,那么Kp为负中,Ki为负小,Kd为正小 9.如果偏差e为负小,且ec为正小,那么Kp为零,Ki为正小,Kd为正小 10.如果偏差e为负小,且ec为正大,那么Kp为正小,Ki为正中,Kd为零
11.如果偏差e为零,且ec为负大,那么Kp为正大,Ki为正大,Kd为负中 12.如果偏差e为零,且ec为负小,那么Kp为正中,Ki为正大,Kd为负中 13.如果偏差e为零,且ec为零,那么Kp为正中,Ki为正中,Kd为负小 14.如果偏差e为零,且ec为正小,那么Kp为正小,Ki为正小,Kd为零 15.如果偏差e为零,且ec为正大,那么Kp为零,Ki为零,Kd为零
16.如果偏差e为正小,且ec为负大,那么Kp为正大,Ki为负大,Kd为正大 17.如果偏差e为正小,且ec为负小,那么Kp为正中,Ki为负中,Kd为正中 18.如果偏差e为正小,且ec为零,那么Kp为正小,Ki为负小,Kd为正小 19.如果偏差e为正小,且ec为正小,那么Kp为零,Ki为正中,Kd为负中 20.如果偏差e为正小,且ec为正大,那么Kp为负小,Ki为正大,Kd为负大
21.如果偏差e为正大,且ec为负大,那么Kp为正中,Ki为负中,Kd为正中 22.如果偏差e为正大,且ec为负小,那么Kp为正小,Ki为负小,Kd为正小 23.如果偏差e为正大,且ec为零,那么Kp为零,Ki为零,Kd为负小 24.如果偏差e为正大,且ec为正小,那么Kp为负小,Ki为正中,Kd为负中 25.如果偏差e为正大,且ec为正大,那么Kp为负小,Ki为正大,Kd为负大 按照上述模糊规则,可以建立以下模糊规则表
表2-1 Kp整定的模糊规则表 NB NS Z PS PB NB NB NM PB PB PM NS NB NM PM PM PS Z NM NM PM PS Z PB NB Z PS Z NS PS NB PS Z NS NS
表2-2 Ki整定的模糊规则表 NB NS Z PS PB
NB NB NM PB NB NM NS NB NS PB NM NS Z NM NS PM NS Z PB NM PS PS PM PS PS NB PM Z PB PB
表2-3 Kd整定的模糊规则表 NB NS Z PS PB
NB PS PM NM PB PM NS PS PS NM PM PS Z PM PS NS PS NS PB PB PS Z NM NM PS PB Z Z NB NB
ec e ec e
ec e 图2-1 误差的隶属函数
图2-2 误差变化率的隶属函数 图2-3 kp的隶属函数
图2-4 Ki的隶属函数 图2-4 Kd的隶属函数
图2-5 模糊系统fuzzpid.fis的结构 图2-4 模糊推理系统的动态仿真环境
图2-4 模糊PID控制阶跃响应 三、与经典PID控制相比较 1.对控制对象进行PID控制器设计 为了计算方便,设计控制器时。先为被控对象进行降阶,继而补上纯PID(P/s+Is+D),通过多次试验以挑输出效果比较好的P、I、D系数。又因为为了和上题进行比较,故选取的参数都是上题中的参数初值。 综合上面的因素最后选择PID控制器为:
)5.01)(5.0(sss=s25.0s1.5ss23 (3-1)
于是可以得到如下的经过PID控制器整定后的闭环系统。
图3-1 经典PID整定后的闭环系统图 通过matlab的classical.m文件仿真后得到如下的阶跃响应图。具体程序请见附录。
图3-1 经典PID整定后的系统阶跃响应仿真图
- Y(s) R(s) s25.0s1.5ss23
)45.864.1(5.0s28.22ss)(
Gc Gp 2.模糊自适应整定PID控制器与经典PID控制器的比较 下面两图选取的参数类似,即模糊自适应PID控制器的初值与经典PID选取的参数一致,因此可以从下图看出二者的一些区别。
图3-2 模糊自适应整定PID控制器与经典PID控制器的阶跃响应比较 模糊自适应整定很大程度取决于模糊变量的结构、隶属函数,模糊规则以及初值的选取,实验过程中若是一部分选取不当便引起振荡或者上升时间太久、稳态误差过大等等问题。但是一旦能够选取较为适当的时候。模糊PID能够做到比经典PID更为快速达到稳态。在图中,可见模糊控制的方法下,上升时间tr=3.7s,而经典PID的方法下,上升时间是tr=12s。但是模糊控制方法下的波形输出没那么规则平滑,这点则主要归咎于本人对规则的设定不太合理所致。
三、实验总结 通过这次实验可以说我们有了多方面的收获:第一,加深了对模糊控制方法的学习;第二,认识matlab编程语言的规律;第三,回顾了经典PID控制方法,并通过对两种控制方法进行比较来加深印象。 四、附录 1.inference.m程序 clear all; close all; a=newfis('fuzzpid');
a=addvar(a,'input','e',10*[-1,1]); a=addmf(a,'input',1,'NB','zmf',10*[-1,-0.6]); a=addmf(a,'input',1,'NS','trimf',10*[-0.8,-0.4,0]); a=addmf(a,'input',1,'Z','trimf',10*[-0.4,0,0.4]); a=addmf(a,'input',1,'PS','trimf',10*[0,0.4,0.8]); a=addmf(a,'input',1,'PB','smf',10*[0.6,1]);
a=addvar(a,'input','ec',3*[-3,3]); a=addmf(a,'input',2,'NB','zmf',3*[-3,-1.8]); a=addmf(a,'input',2,'NS','trimf',3*[-2.4,-1.2,0]); a=addmf(a,'input',2,'Z','trimf',3*[-1.2,0,1.2]); a=addmf(a,'input',2,'PS','trimf',3*[0,1.2,2.4]); a=addmf(a,'input',2,'PB','smf',3*[1.8,3]);
a=addvar(a,'output','kp',[-3.5,3.5]); a=addmf(a,'output',1,'NB','zmf',[-3.5,-2.5]); a=addmf(a,'output',1,'NM','trimf',[-3,-2,-1]); a=addmf(a,'output',1,'NS','trimf',[-2,-1,0]); a=addmf(a,'output',1,'Z','trimf',[-1,0,1]); a=addmf(a,'output',1,'PS','trimf',[0,1,2]); a=addmf(a,'output',1,'PM','trimf',[1,2,3]); a=addmf(a,'output',1,'PB','smf',[2.5,3.5]);
a=addvar(a,'output','ki',5*[-0.8,0.8]); a=addmf(a,'output',2,'NB','zmf',5*[-0.8,-0.4]); a=addmf(a,'output',2,'NM','trimf',5*[-0.6,-0.4,-0.2]); a=addmf(a,'output',2,'NS','trimf',5*[-0.4,-0.2,0]); a=addmf(a,'output',2,'Z','trimf',5*[-0.2,0,0.2]); a=addmf(a,'output',2,'PS','trimf',5*[0,0.2,0.4]); a=addmf(a,'output',2,'PM','trimf',5*[0.2,0.4,0.6]); a=addmf(a,'output',2,'PB','smf',5*[0.4,0.8]);