- 积分
- 0
- 注册时间
- 2008-9-12
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 messenger 于 2011-7-1 18:51 编辑
模糊控制,附带说明,希望对大家有用哈!
语言变量X,Y,Z的隶属度函数.
论域
语
言值
|
-4
|
-3
|
-2
|
-1
|
0
|
1
|
2
|
3
|
4
| NB
|
1
| 0.5
|
0
| 0
|
0
|
0
|
0
|
0
|
0
| NS
|
0
|
0.5
|
1
|
0.5
|
0
|
0
|
0
|
0
|
0
| ZO
|
0
|
0
|
0
|
0.5
|
1
|
0.5
|
0
|
0
|
0
| PS
|
0
|
0
|
0
|
0
|
0
|
0.5
|
1
|
0.5
|
0
| PB
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0.5
|
1
|
模糊控制规则表
Z
|
X
| NB
|
NS
|
ZO
|
PS
|
PB
|
Y
| NB
|
PB
|
PB
|
PS
|
PS
|
ZO
| NS
|
PB
|
PS
|
PS
|
ZO
|
ZO
| ZO
|
PS
|
PS
|
ZO
|
ZO
|
NS
| PS
|
PS
|
ZO
|
ZO
|
NS
|
NS
| PB
|
ZO
|
ZO
|
NS
|
NS
|
NB
| 设计带有纯延迟的一阶惯性环节(假设T=6,τ=0.02):
的模糊控制器,观察仿真结果。
编程如下:
- %被控系统建模
- num=1;
- den=[6,1];
- [a1,b,c,d]=tf2ss(num,den);%传递函数转换到状态空间
- x=[0];
- %系统参数
- T=0.01;h=T;td=0.02;N=1000;
- nd=td/T;%系统纯延迟
- R=ones(1,N);%参考输入
- %定义输入和输出变量及隶属度函数
- a=newfis('Simple');
- a=addvar(a,'input','e',[-4 4]);
- a=addmf(a,'input',1,'NB','trimf',[-4,-4,-2]);
- a=addmf(a,'input',1,'NS','trimf',[-4,-2,0]);
- a=addmf(a,'input',1,'ZO','trimf',[-2,0,2]);
- a=addmf(a,'input',1,'PS','trimf',[0,2,4]);
- a=addmf(a,'input',1,'PB','trimf',[2,4,4]);
- a=addvar(a,'input','de',[-4 4]);
- a=addmf(a,'input',2,'NB','trimf',[-4,-4,-2]);
- a=addmf(a,'input',2,'NS','trimf',[-4,-2,0]);
- a=addmf(a,'input',2,'ZO','trimf',[-2,0,2]);
- a=addmf(a,'input',2,'PS','trimf',[0,2,4]);
- a=addmf(a,'input',2,'PB','trimf',[2,4,4]);
- a=addvar(a,'output','u',[-4 4]);
- a=addmf(a,'output',1,'NB','trimf',[-4,-4,-2]);
- a=addmf(a,'output',1,'NS','trimf',[-4,-2,0]);
- a=addmf(a,'output',1,'ZO','trimf',[-2,0,2]);
- a=addmf(a,'output',1,'PS','trimf',[0,2,4]);
- a=addmf(a,'output',1,'PB','trimf',[2,4,4]);
- %模糊规则矩阵
- rr=[5 5 4 4 3
- 5 4 4 3 3
- 4 4 3 3 2
- 4 3 3 2 2
- 3 3 2 2 1];
- r1=zeros(prod(size(rr)),3);k=1;
- for i=1:size(rr,1)
- for j=1:size(rr,2)
- r1(k,:)=[i,j,rr(i,j)];
- k=k+1;
- end
- end
- [r,s]=size(r1);
- r2=ones(r,2);
- rulelist=[r1,r2];
- a=addrule(a,rulelist);
- %采用模糊控制器的二阶系统仿真
- e=0;de=0;
- ke=30;kd=5;ku=1;
- for k=1:N
- %输入变量变换至论域
- e1=ke*e;
- de1=kd*de;
- if e1>=4
- e1=4;
- elseif e1<=-4
- e1=-4;
- end
- if de1>=4
- de1=4;
- elseif de1<=-4
- de1=-4;
- end
- %模糊推理,计算出被控对象的控制输入
- in=[e1 de1];
- u=ku*evalfis(in,a);
- uu(1,k)=u;
- if k<=nd
- u=0;
- else
- u=uu(1,k-nd);
- end
- %控制作用于被控系统,计算系统输出;利用龙格—库塔法进行系统仿真
- k0=a1*x+b*u;
- k1=a1*(x+h*k0/2)+b*u;
- k2=a1*(x+h*k1/2)+b*u;
- k3=a1*(x+h*k2)+b*u;
- x=x+(k0+2*k1+2*k2+k3)*h/6;
- y=c*x+d*u;
- yy(1,k)=y;
- %计算系统输出误差及误差导数
- e1=e;e=y-R(1,k);
- de=(e-e1)/T;
- end
- %典型二阶环节的模糊控制输出曲线
- kk=[1:N]*T;
- figure(1);
- plot(kk,R,'k',kk,yy,'r');grid on
- xlabel('时间(秒)');ylabel('输出');
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|