|
楼主 |
发表于 2006-11-7 19:25
|
显示全部楼层
这是代码
% 被控系统建模
num=10;
den=[1 3 2];
[a1,b,c,d]=tf2ss(num,den);
x=[0;0];
%系统参数
T=0.1;td=0.5;
N=250;
R=1*ones(1,N);
%建立新的FIS结构为FC.fis
FC=newfis('FC');
%添加输入输出变量
FC=addvar(FC,'input','E',[-6 6]);
FC=addvar(FC,'input','EC',[-6 6]);
FC=addvar(FC,'output','U',[-7 7]);
%添加隶属度函数
FC=addmf(FC,'input',1,'NB','trimf',[-6 -6 -2]);
FC=addmf(FC,'input',1,'NM','trimf',[-6 -4 -1]);
FC=addmf(FC,'input',1,'NS','trimf',[-5 -2 0]);
FC=addmf(FC,'input',1,'N0','trimf',[-3 -0 +0]);
FC=addmf(FC,'input',1,'P0','trimf',[0 0 3]);
FC=addmf(FC,'input',1,'PS','trimf',[0 2 5]);
FC=addmf(FC,'input',1,'PM','trimf',[1 4 7]);
FC=addmf(FC,'input',1,'PB','trimf',[2 6 6]);
FC=addmf(FC,'input',1,'NB','trimf',[-6 -6 -2]);
FC=addmf(FC,'input',1,'NM','trimf',[-7 -4 -1]);
FC=addmf(FC,'input',1,'NS','trimf',[-5 -2 0]);
FC=addmf(FC,'input',1,'0','trimf',[-2 0 2]);
FC=addmf(FC,'input',1,'PS','trimf',[0 2 5]);
FC=addmf(FC,'input',1,'PM','trimf',[1 4 7]);
FC=addmf(FC,'input',1,'PB','trimf',[2 6 6]);
FC=addmf(FC,'output',1,'NB','trimf',[-7 -7 -3]);
FC=addmf(FC,'output',1,'NM','trimf',[-7 -4 -1]);
FC=addmf(FC,'output',1,'NS','trimf',[-5 -1 1]);
FC=addmf(FC,'output',1,'0','trimf',[-2 0 2]);
FC=addmf(FC,'output',1,'PS','trimf',[-1 1 5]);
FC=addmf(FC,'output',1,'PM','trimf',[1 4 7]);
FC=addmf(FC,'output',1,'PB','trimf',[3 7 7]);
%添加控制规则
rr=[7 7 7 7 6 4 4;
7 7 7 7 6 4 4;
6 6 6 6 4 3 3;
6 6 5 4 3 2 2;
6 6 5 4 3 2 2;
5 5 4 2 2 2 2;
4 4 2 1 1 1 1;
4 4 2 1 1 1 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];
FC=addrule(FC,rulelist);
%采用模糊控制器的二阶系统仿真
E=0;EC=0;IE=0;
x=[0,0];
ke=60;kd=2.5;ki=0.01;ku=0.8;
for k=1:N
%输入变量变换至论域
E1=ke*E;
EC1=kd*EC;
if E1>=6
E1=6;
elseif E1<=-6
E1=-6;
end
if EC1>=6
EC1=6;
elseif EC1<=-6
EC1=-6;
end
%模糊推理,计算出被控对象的控制输入
in=[E1 EC1];
U=ku*evalfis(in,FC);
uu(1,k)=U;
%控制作用于被控系统,计算系统输出
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;
%计算系统输出误差及误差导数
E1=E;
E=y-R(1,k);
EC=(E-E1)/T;
IE=IE+E*T;
yy(1,k)=y;
end
%典型二阶环节的模糊控制输出曲线
kk=[1:N]*T;
figure(1);
plot(kk,R,'k',kk,yy,'r',kk,yy1,'b'); |
|