h0 = 0; %初始液面的高度
h = h0; %液面实时高度
r = 1; %水箱底面半径
ki = 0.106; %输入阀门有关系数
ko = 0.212; %输出阀门有关系数
%定义模糊控制器
a=newfis('Water Tank');
%定义高度误差e的隶属度函数
a=addvar(a,'input','e',[-1 1]);
a=addmf(a,'input',1,'N','trapmf',[-1,-1,-0.8,0]);
a=addmf(a,'input',1,'ZR','trimf' ,[-0.8,0,0.8]);
a=addmf(a,'input',1,'P','trapmf',[0,0.8,1,1]);
%定义高度误差变化率de的隶属度函数
a=addvar(a,'input','de',[-1 1]);
a=addmf(a,'input',2,'N','trapmf' ,[-1,-1,-0.8,0]);
a=addmf(a,'input',2,'ZR','trimf' ,[-0.8,0,0.8]);
a=addmf(a,'input',2,'B','trapmf' ,[0,0.8,1,1]);
%定义输出变量(入水阀门开关度)u的隶属度函数
a=addvar(a,'output','u',[-5 5]);
a=addmf(a,'output',1,'NB','trapmf',[-5,-5,-4,-2]);
a=addmf(a,'output',1,'NS','trimf',[-4,-2,0]);
a=addmf(a,'output',1,'ZR','trimf',[-2,0,2]);
a=addmf(a,'output',1,'PS','trimf',[0,2,4]);
a=addmf(a,'output',1,'PB','trapmf',[2,4,5,5]);
%定义模糊规则
rulelist = [1 0 5 1 2;2 1 4 1 1;2 2 3 1 1;2 3 2 1 1;3 0 1 1 2];
a=addrule(a,rulelist);
T=0.1; %定义采样时间间隔
N=2500; %定义总采样点数
hd1 = 1; %预想达到的液面高度为1m
e = h0 - hd1; %计算初始时刻的液面误差
de = 0; %设定初始时刻液面误差变化率为0
kd = 5.9; %误差变化率的系数,以求得模糊推理中论域内的误差变化率
u1 = 0; %定义水箱进水口阀门的绝对开关量
%将模糊控制器作用于被控对象
for k = 1:N
if k<=800
hd(1,k) = 1;
elseif k>800
hd(1,k) = 2;
end
de1 = kd*de; %求得论域内的误差变化率
if e>=1
e=1;
elseif e<=-1
e=-1;
end
if de1>=1
de1=1;
elseif de1<=-1
de1=-1;
end
in = [e de1]; %输入模糊控制器的参数
u = evalfis(in,a); %得出模糊控制器的输出结果(进水阀门开启或关闭的变化量)
u1 = u1+u; %得到阀门此时的绝对开启量
%判断此时阀门绝对开启量与最大开启量的关系
if u1>=5
u1=5;
elseif u1<=0
u1=0;
end
uu(1,k)=u1; %将每一采样点时刻的绝对开启量存入一数组uu
%阀门绝对开启度作用于控制对象
k1 = func(h,u1);
k2 = func(h+T*k1/2,u1);
k3 = func(h+T*k2/2,u1);
k4 = func(h+T*k3,u1);
h = h+(k1+2*k2+2*k3+k4)*T/6; %用龙格库塔法求出每一采样时刻的液面高度
yy(1,k)=h; %将每一采样时刻液面高度存入数组yy
e1 = e; %将误差赋给新变量e1
e = h-hd(1,k); %求得新的误差
de = (e-e1)/T; %得出新的误差变化率
end
kk=[1:N]*T; %将每一采样时刻构成的时间序列作为一时间轴
figure(1);
plot(kk,hd,'k',kk,yy,'r');%画出预想的液面高度,以及实际液面高度随时间的变化
grid on
xlabel('时间(秒)');
ylabel('液面高度');
figure(2);
plot(kk,uu,'b');%画出进水阀门的绝对开启量随时间的变化
grid on
xlabel('时间(秒)');
ylabel('输入阀门开关度');
评论0