www.gusucode.com > 锅炉水位系统模糊控制的实例matlab源码程序 > code/jcl/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');