实例:模糊PID控制系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
被控对象:
Ts = 0.1;
Plant = c2d(zpk([],[-1 -3 -5],1),Ts); %零极点模型,并离散化
根据对象Plant,确定PID参数:
C0 = pid(1,1,1,'Ts',Ts,'IF','B','DF','B'); % 定义PID结构
C = pidtune(Plant,C0) %对PID参数进行优化[Kp, Ki, Kd] = piddata(C); % 输出参数
得出PID结构及其参数值:
接下来根据求出的PID参数确定GCE、GE 、GCU 和GU的取值:由模糊PID控制结构可得如下等式:
Kp = GCU * GCE + GU * GE
Ki = GCU * GE
Kd = GU * GCE
形式转换如下:
GE = 10; %根据模糊控制的论语直接确定GCE = GE*(Kp-sqrt(Kp^2-4*Ki*Kd))/2/Ki=3.4285; GCU = Ki/GE=2.8631;
GU = Kd/GCE=2.0138;
模糊PID控制系统结构(连续模糊控制器):
模糊控制器输入输出结构:
模糊控制器输入输出隶属度函数:
模糊控制器规则表:
模糊控制器规则曲面图:
连续模糊PID控制器,仿真结果:
模糊PID控制系统结构(离散模糊控制器):
离散模糊控制器查询表:
离散模糊PID控制器,仿真结果:
主要代码如下:
(1)、对象模型:
Ts = 0.1;
Plant = c2d(zpk([],[-1 -3 -5],1),Ts);
(2)、PID参数优化:
C0 = pid(1,1,1,'Ts',Ts,'IF','B','DF','B');
C = pidtune(Plant,C0)
[Kp, Ki, Kd] = piddata(C);
(3)、比例因子确定:
GE = 10;
GCE = GE*(Kp-sqrt(Kp^2-4*Ki*Kd))/2/Ki;
GCU = Ki/GE;
GU = Kd/GCE;
(4)、连续模糊PID控制建立:
FIS = newfis('FIS','sugeno');
%%
% 定义输入E:
FIS = addvar(FIS,'input','E',[-10 10]);
FIS = addmf(FIS,'input',1,'Negative','gaussmf',[7 -10]);
FIS = addmf(FIS,'input',1,'Positive','gaussmf',[7 10]); %%
% 定义输入CE:
FIS = addvar(FIS,'input','CE',[-10 10]);
FIS = addmf(FIS,'input',2,'Negative','gaussmf',[7 -10]); FIS = addmf(FIS,'input',2,'Positive','gaussmf',[7 10]); %%
% 定义输出u:
FIS = addvar(FIS,'output','u',[-20 20]);
FIS = addmf(FIS,'output',1,'Min','constant',-20);
FIS = addmf(FIS,'output',1,'Zero','constant',0);
FIS = addmf(FIS,'output',1,'Max','constant',20);
% 定义规则:
%
% # If |E| is Negative and |CE| is Negative then |u| is -20 % # If |E| is Negative and |CE| is Positive then |u| is 0
% # If |E| is Positive and |CE| is Negative then |u| is 0
% # If |E| is Positive and |CE| is Positive then |u| is 20 ruleList = [1 1 1 1 1;... % Rule 1
1 2 2 1 1;... % Rule 2
2 1 2 1 1;... % Rule 3
2 2
3 1 1]; % Rule 4
FIS = addrule(FIS,ruleList);
gensurf(FIS) %生成模糊控制器
(5)、离散模糊控制器查询表:
Step = 2;
E = -10:Step:10;
CE = -10:Step:10;
N = length(E);
LookUpTableData = zeros(N);
for i=1:N
for j=1:N
% compute output u for each combination of break points LookUpTableData(i,j) = evalfis([E(i) CE(j)],FIS);
end
end
更多资料请访问:
徐文力新浪博客
/mybigdata