1.算法仿真效果
matlab2013b仿真结果如下:
遗传优化的优化迭代过程仿真图:
这个是我们采用的优化算法的有过过程,通过优化,可以得到超调量最小的控制器仿真参数。
2.算法涉及理论知识概要
模糊控制的基本概念是由美国加州大学查德教授首先提出来的,模糊控制是以模糊语言变量、模糊集合论和模糊逻辑推理为基础的一种新型控制理论。模糊控制算法是一种非线性智能控制,它很适合于工业生产过程和大系统控制过程,并且其可以和神经网络、预测控制、遗传算法和混沌理论等新学科相结合。模糊控制器的基本原理图如图1所示。
图1虚线方框中的几个模块为模糊控制算法的几个主要步骤,其主要是由计算控制程序来实现的,具体操作流程如下所示:通过控制输出的反馈信息和参考信息进行做差计算,得到差作为控制算法的误差输入信号,这个误差输入信号作为模糊控制器的输入。同时,通过模糊化处理,将这个数值形态的误差信号转换为模糊语言的集合,并根据预先定义的模糊规则进行模糊聚餐,并得到模糊控制量,最后通过逆模糊化处理,将模糊控制量转换为实际的数值信息作为控制输出,并作用到控制对象上。
本系统所采用的模糊神经网络系统结构如图2所示,其中输入t表示本文所设计的控制器是针对炼焦炉烘炉过程高温段进行设计的。
这里,我们最后其实主要要实现的改进结构如下所示:
3.MATLAB核心程序
w2 = zeros(MAXGEN,1);
w3 = zeros(MAXGEN,1);
w4 = zeros(MAXGEN,1);
w5 = zeros(MAXGEN,1);
w6 = zeros(MAXGEN,1);
w7 = zeros(MAXGEN,1);
w8 = zeros(MAXGEN,1);
w9 = zeros(MAXGEN,1);
Error = zeros(MAXGEN-2,1);
fitness = zeros(MAXGEN-2,1);
gen = 0;
for jj=1:1:NIND
%初始化参数,这个和parameter参数相同
w1_NIND(jj) = 0.8;
w2_NIND(jj) = 0.01;
w3_NIND(jj) = 100;
w4_NIND(jj) = 65;
w5_NIND(jj) = 80;
w6_NIND(jj) = 100;
w7_NIND(jj) = 10;
w8_NIND(jj) = 0.75;
w9_NIND(jj) = 0.05;
%计算对应的目标值
parameter;
sim('mains1.mdl');
tmps = object.signals.values;
%计算最大超调值
[V,I] = max(tmps);
tmps2 = mean(tmps(length(tmps)/2:length(tmps)));
%计算超调量
CTL = (V-tmps2)/tmps2;
%计算收敛速度
SLX = I/10000;
J(jj,1) = (CTL);
end
Objv = J;
gen = 0;
Error = [];
Error2 = [];
LEN = 32;
while gen < MAXGEN;
gen
FitnV=ranking(Objv);
Selch=select('sus',Chrom,FitnV);
Selch=recombin('xovsp', Selch,0.95);
Selch=mut( Selch,0.05);
phen1=bs2rv(Selch,FieldD);
for jj=1:1:NIND
if gen == 1
%初始化参数,这个和parameter参数相同
w1_NIND(jj) = 2;
w2_NIND(jj) = 0.01;
w3_NIND(jj) = 100;
w4_NIND(jj) = 65;
w5_NIND(jj) = 80;
w6_NIND(jj) = 100;
w7_NIND(jj) = 10;
w8_NIND(jj) = 0.75;
w9_NIND(jj) = 0.05;
else
w1_NIND(jj) = phen1(jj,1);
w2_NIND(jj) = phen1(jj,2);
w3_NIND(jj) = phen1(jj,3);
w4_NIND(jj) = phen1(jj,4);
w5_NIND(jj) = phen1(jj,5);
w6_NIND(jj) = phen1(jj,6);
w7_NIND(jj) = phen1(jj,7);
w8_NIND(jj) = phen1(jj,8);
w9_NIND(jj) = phen1(jj,9);
end
%计算对应的目标值
parameter;
sim('mains1.mdl');
tmps = object.signals.values;
%计算最大超调值
[V,I] = max(tmps);
tmps2 = mean(tmps(length(tmps)/2:length(tmps)));
%计算超调量
CTL = (V-tmps2)/tmps2;
%计算收敛速度
SLX = I/10000;
JJ(jj,1) = (CTL);
end
Objvsel = JJ;
[Chrom,Objv] = reins(Chrom,Selch,1,1,Objv,Objvsel);
gen = gen+1;
%保存参数收敛过程和误差收敛过程以及函数值拟合结论
w1(gen) = mean(w1_NIND);
w2(gen) = mean(w2_NIND);
w3(gen) = mean(w3_NIND);
w4(gen) = mean(w4_NIND);
w5(gen) = mean(w5_NIND);
w6(gen) = mean(w6_NIND);
w7(gen) = mean(w7_NIND);
w8(gen) = mean(w8_NIND);
w9(gen) = mean(w9_NIND);
Error = [Error,mean(JJ)];
if gen <= LEN
Error2 = [Error2,mean(Error(1:gen))];
else
Error2 = [Error2,mean(Error(gen-LEN+1:gen))];
end
end
w1_best = w1(end)
w2_best = w2(end)
w3_best = w3(end)
w4_best = w4(end)
w5_best = w5(end)
w6_best = w6(end)
w7_best = w7(end)
w8_best = w8(end)
w9_best = w9(end)
figure;
plot(Error2,'b-s');
xlabel('迭代次数');
ylabel('目标优化');
save R.mat w1_best w2_best w3_best w4_best w5_best w6_best w7_best w8_best w9_best Error2