📄 flc.m
字号:
function flc(m_flct)
%这次实验我采用的模糊控制器是模糊控制表法
% 08000215 陈健
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%给出输入输出量的论域
%输出增量控制的论域[-64,64]
%误差的论域[-4/ke,4/k4]
%误差变化的论域[-4/kde,4/kde]
%确定量化等级 取三个语言变量的量化等级都是9级
%{-4,-3,-2,-1.4,0,1.4,2,3,4},为了提高稳态点控制的
%精度,量化方式采用非线性量化
%误差:{-4/ke,-3/(ke*1.4),-2/(ke*1.4^2),-1.4/(ke*1.4^3),0,1.4/(ke*1.4^3),2/(ke1.4^2),3/(ke*1.4),4/ke}
%误差变化:{-4/kde,-3/(kde*1.4),-2/(kde*1.4^2),-1.4/(kde*1.4^3),0,1.4/(kde*1.4^3),2/(kde1.4^2),3/(kde*1.4),4/kde}
%增量控制输出:{-64,-1.46,-4,-2,0,2,4,1.46,64}
%定义模糊子集
%这次实验我采用5个模糊子集
%{NB,NS,ZE,PS,PB}
%
%
%给出律属度函数值
m_lsd=[0 0 0 0 0 0 0 0.35 1
0 0 0 0 0 0.4 1 0.4 0
0 0 0 0.2 1 0.2 0 0 0
0 0.4 1 0.4 0 0 0 0 0
1 0.35 0 0 0 0 0 0 0];
%经过模糊控制规则的确定,求出了模糊控制表
%下面开始仿真实验
%输入误差和误差变化的量化因子
prompt={'input e:','input kde:','input e的非线性量化因子:','input de的非线性量化因子:'};
default={'0.133','0.133','1.4','1.4'};
k=inputdlg(prompt,'08000215 陈健',1,default);
ke=str2num(k{1});
kde=str2num(k{2});
fe=str2num(k{3});
fde=str2num(k{4});
prompt1={'给定','采样点数','控制强化因子'};
default={'30','200','1'};
kk=inputdlg(prompt1,'给定',1,default);
r=str2num(kk{1});
num=str2num(kk{2});
cq=str2num(kk{3});
uu=[-6.4 -3.2 -1.6 -0.4 0 0.4 1.6 3.2 6.4]*cq;
%变量初始化
y(1)=0;
for i=1:num %采样20000个点
time(i)=i*0.5;
if(i==1)
de(i)=0;
e(i)=0;
else
e(i)=r-y(i);
de(i)=e(i)-e(i-1);
end
%误差的量化,确定模糊控制表的行号rnum
if(e(i)<-4/ke)
rnum=-4;
elseif (e(i)<-3/(ke*fe))
if(-3/(ke*fe)-e(i)>e(i)+4/ke)
rnum=-4;
else rnum=-3;
end
elseif (e(i)<-2/(ke*fe^2))
if(-2/(ke*fe^2)-e(i)>e(i)+3/(ke*fe))
rnum=-3;
else rnum=-2;
end
elseif (e(i)<-1/(ke*fe^3))
if(-1/(ke*fe^3)-e(i)>e(i)+2/(ke*fe^2))
rnum=-2;
else rnum=-1;
end
elseif (e(i)<0)
if(-e(i)>e(i)+1/(ke*fe^3))
rnum=-1;
else rnum=0;
end
elseif (e(i)<1/(ke*fe^3))
if(1/(ke*fe^3)-e(i)>e(i))
rnum=0;
else rnum=1;
end
elseif (e(i)<2/(ke*fe^2))
if(2/(ke*fe^2)-e(i-1)>e(i)-1/(ke*fe^3))
rnum=1;
else rnum=2;
end
elseif (e(i)<3/(ke*fe))
if(3/(ke*fe)-e(i)>e(i)-2/(ke*fe^2))
rnum=2;
else rnum=3;
end
elseif(e(i)<4/ke)
if(4/ke-e(i)>e(i)-3/(ke*fe))
rnum=3;
else rnum=4;
end
elseif(e(i-1)>4/ke)
rnum=4;
end
% 误差变化的量化,确定模糊控制表的列号cnum
if(de(i)<-4/kde)
cnum=-4;
elseif (de(i)<-3/(kde*fde))
if(-3/(kde*fde)-de(i)>de(i)+4/kde)
cnum=-4;
else cnum=-3;
end
elseif (de(i)<-2/(kde*fde^2))
if(-2/(kde*fde^2)-de(i)>de(i)+3/(kde*fde))
cnum=-3;
else cnum=-2;
end
elseif (de(i)<-1/(kde*fde^3))
if(-1/(kde*fde^3)-de(i)>de(i)+2/(kde*fde^2))
cnum=-2;
else cnum=-1;
end
elseif (de(i)<0)
if(-de(i)>de(i)+1/(kde*fde^3))
cnum=-1;
else cnum=0;
end
elseif (de(i)<1/(kde*fde^3))
if(1/(kde*fde^3)-de(i)>de(i))
cnum=0;
else cnum=1;
end
elseif (de(i)<2/(kde*fde^2))
if(2/(kde*fde^2)-de(i)>de(i)-1/(kde*fde^3))
cnum=1;
else cnum=2;
end
elseif (de(i)<3/(kde*fde))
if(3/(kde*fde)-de(i)>de(i)-2/(kde*fde^2))
cnum=2;
else cnum=3;
end
elseif(de(i)<4/kde)
if(4/kde-de(i)>de(i)-3/(kde*fde))
cnum=3;
else cnum=4;
end
elseif(de(i)>4/kde)
cnum=4;
end
%确定控制量
control=m_flct(rnum+5,cnum+5);
du(i)=-uu(control+5);
if(i==1)
u(i)=du(i);
y(i+1)=exp(-0.05)*y(i);
else u(i)=u(i-1)+du(i);
y(i+1)=exp(-0.05)*y(i)+(1-exp(-0.05))*u(i-1);
end
end
%仿真结束
%画响应曲线
yy(1:num)=y(2:num+1);
plot(time,yy)
xlabel('time');
ylabel('y');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -