倒立摆仿真实验报告
倒立摆是一个非线性、不稳定的系统,是经常作为研究比较不同控制方法的典型例子。有许多抽象的控制概念,如控制系统的稳定性、可控性、系统抗干扰能力等,都可以通过倒立摆系统直观地表现出来,倒立摆系统的高阶次,不稳定,多变量,非线性和强耦合等特性,使得许多现代控制理论的研究人员一直将它视为研究对象。倒立摆系统具有3个特性,即:不确定性,耦合性,开环不稳定性。直线型倒立摆系统,是由沿直线导轨运动的小车以及一端固定于小车上的匀质长杆组成的系统,小车可以通过传动装置由交流伺服电机驱动,小车导轨一般有固定的行程,因而小车的运动范围是受到限制的。
一阶倒立摆建模
在忽略了空气流动阻力,以及各种摩擦之后,可将倒立摆系统抽象成小车和匀质杆组成的系统,如下图所示M:小车质量;x:小车位置;m:摆杆质量J:摆杆惯量;F:加在小车上的力;l:摆杆转动轴心到杆质心的长度;θ:摆杆与垂直向上方向的夹角。
图1 倒立摆示意图
倒立摆的数学模型为
/180)2sin]180mgsincos[fml(p 2(4/3)mlmplcos我们可以实时量测角度θ(◦),并计算出角速度(◦/s),控制的任务是产生合适的作用力f,以使倒立摆保持直立状态。
一 连续模糊控制器
1、论域的正规化
60/s,F10N,,首先设定m15,将θ,f的实际值分别除以m,mm,F,并加以1限幅后,得到正规化的输入输出变量: mm
xk1yk2z[1,1] /k3其中x,y,zfk11/m1/151/60k21/mk3fm102、定义模糊几何及其隶属函数
对正规化的输入输出变量x,y,z各定义五个模糊集合:NL,NS,Z,PS,PL,分别用A1~A5,B1~B2,C1~C2来代表,x,y,z三个变量的模糊集合的隶属函数均是对称,均匀分布,全交迭的三角形,如图2所示。
μNLNS1ZPSPL-1-0.5图2 变量的隶属函数 0.501x 3、设计模糊控制规则集
x和y各有五个模糊集合,所以最多有5225条规则,根据经验只用11条规则即可,如表1所示。
表1 倒立摆的模糊控制规则集
Z NL NS Z PS PL NL NL NS NS Z Z NL NS Z PS PL PS Z PS PL PL
4、模糊控制器的设计
(1)在MATLAB命令窗口Fuzzy,打开模糊推理系统编辑器(FIS Editor); (2)利用FIS Editor 编辑器的Edit—>Add Variable—> input 菜单,添加一条输入语言变量,并将两个输入语言变量的名称分别定义为x,y,z;
图3 设置输入输出模糊语言
(3)利用FIS Editor 编辑器的Edit—>Membership Functions 菜单,打开隶属函数编辑器(MF),将输入语言变量x,y的取值范围(Range)和显示范围(Display Range)设置为[-1,1],隶属度函数类型(Type)设置为三角形函数(trimf),而所包含的五条曲线的名称分别为NL,NS,Z,PS,PL,分别代表负大、负小、零、正小、正大,两个输入,一个输出的设置相同;
图4 设置输入输出模糊语言
(4)利用编辑器的Edit—>Rules菜单,打开模糊规则编辑器(Rules Editor)设置11条模糊控制规则:
If x=Z and y=NL ,then z=NL If x=Z and y=NS ,then z=NS If x=PS and y=NS ,then z=Z If x=NL and y=Z ,then z=NL If x=NS and y=Z ,then z=NS If x=Z and y=Z ,then z=Z If x=PS and y=Z ,then z=PS If x=PL and y=Z ,then z=PL If x=NS and y=PS ,then z=Z If x=Z and y=PS ,then z=PS
If x=Z and y=PL ,then z=PL
图5 模糊控制规则设置
(5)利用编辑器的File—>Save to Workspace,将当前的模糊推理系统保存到工作空间,命名为dlb。
(6)建立起模糊推理规则后,由View→Rules和View→Surface菜单项将分别得出如图所示规则显示图形,由这些图形可以更好地理解建立的模糊推理规则。
图6
图7
(7)在simulink仿真系统中,画出倒立摆模糊控制系统图,设置K1,K2,K3,打开Fuzzy Logic Controller模糊逻辑控制器模块对话框,在其FIS File or Structure 参数对话框输入dlb。
图8 倒立摆模糊控制系统图(连续)
图9 导入模糊控制器
(8)用S-函数描述状态方程,S函数编写见附录1。再将S—Function导入。
图10 导入S函数
(9)在Simulink系统中,打开仿真参数设置窗口,正确设置仿真参数,启动仿真,可以看到倒立摆变化曲线。
图11 倒立摆连续系统波形图(a)
(10)给出两组不同初始状态、看仿真图形变化 当=5、=30时,仿真图形如图11(b)所示。
图11 倒立摆连续系统波形图(b)
当=5、=50时,仿真图形如图11(c)所示。
图11 倒立摆连续系统波形图(c)
(11)改变参数K1、K2、K3,看看3个参数的影响
初始状态下给出K1=1/15 K2=1/60 K3=10 波形图如图12所示
图12
当K2、K3不变时,K1=1/8时,仿真图形如图13(a)所示
图13(a)
当K2、K3不变时,K1=1/40时,仿真图形如图13(b)所示
图13(b)
当K1、K3保持初始值不变时,K2=1/20时,仿真图形如图14(a)所示
14(a)
当K1、K3保持初始值不变时,K2=1/40时,仿真图形如图14(b)所示
图14(b)
当K1、K2保持初始值不变时,K3=25时,仿真图形如图15(a)所示
图15(a)
当K1、K2保持初始值不变时,K3=60时,仿真图形如图15(b)所示
图15(b)
二 离散模糊控制器
1、离散模糊控制器的设计
离散论域的模糊控制器的设计包括以下主要步骤: (1)输入/ 输出变量论域的离散化
e,e,u都是实数域上的连续变量,在本例中他们的变化范围分别为
e[15,15],e[60,60],u[10,10]。将他们全部变换到离散论域
6,5,4,3,2,1,0,1,2,3,4,5,6,得到离散论域上的输入/输出变量e*,e*,u*。(2)定义模糊集合及其隶属函数表
对e*,e*,u*分别定义7个模糊集合,NL,NM,NS,Z,PS,PM,PL。 为方便起见对e*,e*,u*的隶属函数表定义相同。如下 隶属度 -6 NL 1 NM 0.2 NS 0 Z 0 PS 0 PM 0 PL 0 e*,e*,u*的论域 -5 0.7 0.7 0 0 0 0 0 -4 0.2 1 0.1 0 0 0 0 -3 0 0.7 0.7 0 0 0 0 -2 0 0.2 1 0.1 0 0 0 -1 0 0 0.7 0.7 0 0 0 0 0 0 0.1 1 0 0 0 1 0 0 0 0.7 0.2 0 0 2 0 0 0 0.1 0.7 0.2 0 3 0 0 0 0 1 0.7 0 4 0 0 0 0 0.7 1 0.2 5 0 0 0 0 0.1 0.7 0.7 6 0 0 0 0 0 0.2 1 (3)设计模糊控制规则集
u* e* e* NL NM NS Z PS PM PL NL × PL PL PM PM NM NL NM × PL PS PS PM NM NL NS PL PM PS PS PS NM NL Z PL PM PS Z NS NM NL PS PL PM NS NS NS NM NL PM PL PM NM NM NS NS × PL PL PM NM NM NL NL × (4)求模糊关系矩阵R和模糊控制表
在Matlab中新建M文件,编写M文件计算模糊控制表。M文件编写见附录2。
图16 修改离散模糊控制数据
2、建立模型
图17 倒立摆系统离散模型
仿真波形图为
图18 倒立摆离散系统波形图
附录一
function [sys,x0,str,ts]=dlb2(t,x,u,flag) switch flag, case 0
[sys,x0,str,ts]=mdlInitializeSizes(); case 1
sys=mdlDerivatives(t,x,u); case 3
sys=mdlOutputs(x); case {2,4,9} sys=[]; otherwise
error(['Unhandled flag=',num2str(flag)]); end;
function [sys,x0,str,ts]=mdlInitializeSizes() sizes=simsizes; sizes.NumContStates=2; sizes.NumDiscStates=0;
sizes.NumOutputs=1; sizes.NumInputs=1; sizes.DirFeedthrough=0; sizes.NumSampleTimes=1; sys=simsizes(sizes); x0=[10;30]; str=[]; ts=[0 0];
function sys=mdlDerivatives(t,x,u) dx(1)=x(2);
dx(2)=((1.1*9.8*sin(x(1)*pi/180)-cos(x(1)*pi/180)*(u+0.1*0.5*(x(2)*pi/180)^2*sin (x(1)*pi/180) ) )/((4/3)*1.1*0.5-0.1*0.5*(cos (x(1)*pi/180))^2))*180/pi; sys=[dx(1);dx(2)]; function sys=mdlOutputs(x) sys=x(1);
附录二
Input1_Terms = [1,2,3,4,5,6,7]; Input2_Terms = [1,2,3,4,5,6,7]; Output_Terms = [1,2,3,4,5,6,7];
Input1_Terms_Membership = [0,0,0,0,0,0,0,0,0,0,0.2,0.7,1; 0,0,0,0,0,0,0,0,0.2,0.8,1,0.8,0.2; 0,0,0,0,0,0,0,0.8,1,0.8,0.2,0,0; 0,0,0,0,0,0.5,1,0.5,0,0,0,0,0; 0,0,0.2,0.8,1,0.8,0,0,0,0,0,0,0; 0.2,0.8,1,0.8,0.2,0,0,0,0,0,0,0,0; 1,0.7,0.2,0,0,0,0,0,0,0,0,0,0]; Input2_Terms_Membership = Input1_Terms_Membership; Output_Terms_Membership = Input1_Terms_Membership; Rule=[0,0,7,7,7,7,7; 7,7,6,6,6,6,6; 7,5,5,5,3,2,2; 6,5,5,4,3,2,2; 6,6,5,3,3,3,1; 2,2,2,2,2,3,1; 1,1,1,1,1,0,0];
for i=1:169 for j=1:13 R(i,j)=0; end end
for Input1_Terms_Index=1:7 for Input2_Terms_Index=1:7
if (Rule(Input1_Terms_Index,Input2_Terms_Index)~=0)
Output_Terms_Index=Rule(Input1_Terms_Index,Input2_Terms_Index );
A=Input1_Terms_Membership(Input1_Terms_Index,:); B=Input2_Terms_Membership(Input2_Terms_Index,:); C=Output_Terms_Membership(Output_Terms_Index,:); for i=1:13
for j=1:13 R1(i,j)=min(A(i),B(j)); end end R2=[ ]; for k=1:13
R2=[R2;R1(k,:)']; end
for i=1:169
for j=1:13 R3(i,j)=min(R2(i),C(j)); end end
R=max(R,R3); end end end
for Input1_value_index=1:13 for Input2_value_index=1:13
Input1_value_membership=Input1_Terms_Membership(:,Input1_value_index);
[Max_Input1_value,Max_Input1_index]=max(Input1_value_membership); Ad=Input1_Terms_Membership(Max_Input1_index,:);
Input2_value_membership=Input2_Terms_Membership(:,Input2_value_index);
[Max_Input2_value,Max_Input2_index]=max(Input2_value_membership);
Bd=Input2_Terms_Membership(Max_Input2_index,:); for i=1:13
for j=1:13
Rd1(i,j)=min(Ad(i),Bd(j)); end end Rd2=[ ];
for k=1:13 Rd2=[Rd2;Rd1(k,:)']; end
for j=1:13
Cd(j)=max(min(Rd2,R(:,j))); end sum1=0; sum2=0; for i=1:13
sum1=sum1+Cd(i); sum2=sum2+Cd(i)*(i-7); end
OUT=round(sum2/sum1);
Fuzzy_Table(Input1_value_index,Input2_value_index)=OUT; end end
因篇幅问题不能全部显示,请点此查看更多更全内容