⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cstr_fpid.m

📁 本程序用来实现CSTR模型的模糊PID控制仿真
💻 M
字号:
% 本程序用来实现CSTR模型的模糊PID控制仿真
% 
% 作者:

clear

% 创建一个模糊推理系统
a = newfis('fuzzcontrol');

% 添加输入变量e和隶属度函数
a = addvar(a,'input','e',[-3,3]);

a = addmf(a,'input',1,'NB','zmf',[-3,-1]);
a = addmf(a,'input',1,'NM','trimf',[-3,-2,0]);
a = addmf(a,'input',1,'NS','trimf',[-3,-1,1]);
a = addmf(a,'input',1,'Z','trimf',[-2,0,2]);
a = addmf(a,'input',1,'PS','trimf',[-1,1,3]);
a = addmf(a,'input',1,'PM','trimf',[0,2,3]);
a = addmf(a,'input',1,'PB','smf',[1,3]);

% figure(1);
% plotmf(a,'input',1);

% 添加输入变量ec和隶属度函数
a = addvar(a,'input','ec',[-3,3]);

a = addmf(a,'input',2,'NB','zmf',[-3,-1]);
a = addmf(a,'input',2,'NM','trimf',[-3,-2,0]);
a = addmf(a,'input',2,'NS','trimf',[-3,-1,1]);
a = addmf(a,'input',2,'Z','trimf',[-2,0,2]);
a = addmf(a,'input',2,'PS','trimf',[-1,1,3]);
a = addmf(a,'input',2,'PM','trimf',[0,2,3]);
a = addmf(a,'input',2,'PB','smf',[1,3]);

% figure(2);
% plotmf(a,'input',2);

% 添加输出变量U和隶属度函数

a = addvar(a,'output','U',[-3,3]);

a = addmf(a,'output',1,'NB','trimf',[-4,-3,-2]);
a = addmf(a,'output',1,'NM','trimf',[-3,-2,-1]);
a = addmf(a,'output',1,'NS','trimf',[-2,-1,0]);
a = addmf(a,'output',1,'Z','trimf',[-1,0,1]);
a = addmf(a,'output',1,'PS','trimf',[0,1,2]);
a = addmf(a,'output',1,'PM','trimf',[1,2,3]);
a = addmf(a,'output',1,'PB','trimf',[2,3,4]); 

% figure(3);
% plotmf(a,'output',1);

% 推理规则表
rulelist = [ 
     1     1     1     1     1;
     1     2     1     1     1;
     1     3     2     1     1;
     1     4     2     1     1;
     1     5     3     1     1;
     1     6     3     1     1;
     1     7     4     1     1;
     2     1     1     1     1;
     2     2     2     1     1;
     2     3     2     1     1;
     2     4     3     1     1;
     2     5     3     1     1;
     2     6     4     1     1;
     2     7     5     1     1;
     3     1     2     1     1;
     3     2     2     1     1;
     3     3     3     1     1;
     3     4     3     1     1;
     3     5     4     1     1;
     3     6     5     1     1;
     3     7     5     1     1;
     4     1     2     1     1;
     4     2     3     1     1;
     4     3     3     1     1;
     4     4     4     1     1;
     4     5     5     1     1;
     4     6     5     1     1;
     4     7     6     1     1;
     5     1     3     1     1;
     5     2     3     1     1;
     5     3     4     1     1;
     5     4     5     1     1;
     5     5     5     1     1;
     5     6     6     1     1;
     5     7     6     1     1;
     6     1     3     1     1;
     6     2     4     1     1;
     6     3     5     1     1;
     6     4     5     1     1;
     6     5     6     1     1;
     6     6     6     1     1;
     6     7     7     1     1;
     7     1     4     1     1;
     7     2     5     1     1;
     7     3     5     1     1;
     7     4     6     1     1;
     7     5     6     1     1;
     7     6     7     1     1;
     7     7     7     1     1;
];

a =  addrule(a,rulelist);
 
%  解模糊方法
a = setfis(a,'DefuzzMethod','centroid');

% 模糊推理系统创建完毕
 
% *****************************************************************

% 仿真参数
N = 200;
h = 0.1;

% 控制变量初值
Q(1) = 100.0;
Qc(1) = 15.0;

% 状态变量初值
Ca(1) = 0.037;
T(1) = 402.35;
Tc(1) = 345.44;
H(1) = 6.0; % 单位是分米

% 被控变量设定值
Cas = 0.06;
Ts = 405.0;
Tcs = 350.0;

% PID调节参数、模糊控制比例因子
% 控制Ca
% Kp = 20.0;  
% Ti = 0.05;
% Td = 0.0; 
% Ke = 120; 
% Kc = 10;  
% Ku = 0.1; 

% 控制T
% Kp = 1.5;  
% Ti = 1.0;
% Td = 0.0;  
% Ke = 0.3; 
% Kc = 0.1;  
% Ku = 0.2; 

% 控制Tc
Kp = 0.5;  
Ti = 0.2;
Td = 0.0;
Ke = 0.5; 
Kc = 0.05;  
Ku = 0.1; 

q0 = Kp*(1+h/Ti+Td/h);
q1 = -1*Kp*(1+2*Td/h);
q2 = Kp*Td/h;

% 误差变量
ek = 0;
ek_1 = 0;
ek_2 = 0;
  
% 控制仿真
for i = 1:N 
%     % 控制生成物浓度Ca
%     ek_2 = ek_1;
%     ek_1 = ek;
%     ek = Cas-Ca(i);
%     e(i) = ek;
%     ec(i) = (ek-ek_1)/h;
%     
%     if abs(ek)>0.005
%         dQ =(evalfis([ek*Ke,(ek-ek_1)/h*Kc],a))*Ku;
%         Q(i+1) = Q(i)+dQ;
%     else 
%         dQ = q0*ek+q1*ek_1+q2*ek_2;
%         Q(i+1) = Q(i)+dQ;
%     end 
%     
%     [Ca(i+1), T(i+1), Tc(i+1), H(i+1)] = CSTR_RK4(Q(i+1), Qc, Ca(i), T(i), Tc(i), H(i));
    
%     % 控制反应温度 T
%     ek_2 = ek_1;
%     ek_1 = ek;
%     ek = Ts-T(i);
%     e(i) = ek;
%     ec(i) = (ek-ek_1)/h;
%     
%     if abs(ek)>0.5
%         dQc =(evalfis([ek*Ke,(ek-ek_1)/h*Kc],a))*Ku;
%         Qc(i+1) = Qc(i)-dQc;
%     else 
%         dQc = q0*ek+q1*ek_1+q2*ek_2;
%         Qc(i+1) = Qc(i)-dQc;
%     end 
%     
%     [Ca(i+1), T(i+1), Tc(i+1), H(i+1)] = CSTR_RK4(Q, Qc(i+1), Ca(i), T(i), Tc(i), H(i));

% 控制冷却液温度 Tc
    
    ek_2 = ek_1;
    ek_1 = ek;
    ek = Tcs-Tc(i);
    e(i) = ek;
    ec(i) = (ek-ek_1)/h;
    
    if abs(ek)>0.5
        dQc =(evalfis([ek*Ke,(ek-ek_1)/h*Kc],a))*Ku;
        Qc(i+1) = Qc(i)-dQc;
    else 
        dQc = q0*ek+q1*ek_1+q2*ek_2;
        Qc(i+1) = Qc(i)-dQc;
    end 
    
    [Ca(i+1), T(i+1), Tc(i+1), H(i+1)] = CSTR_RK4(Q, Qc(i+1), Ca(i), T(i), Tc(i), H(i));
end
% **********************************************

% figure(1)
% plot(Ca,'b.-')
% grid on

% figure(2)
% plot(T,'b.-')
% grid on

figure(3)
plot(Tc,'b.-')
grid on

% figure(2)
% plot(e)
% grid on
% 
% figure(4)
% plot(ec)
% grid on

% figure(4)
% plot(Qc)
% grid on

% figure(5)
% plot(Q)
% grid on

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -