1.算法仿真效果
matlab2013b仿真结果如下:
遗传优化的优化迭代过程仿真图:
这个是我们采用的优化算法的有过过程,通过优化,可以得到超调量最小的控制器仿真参数。
2.算法涉及理论知识概要
模糊控制的基本概念是由美国加州大学查德教授首先提出来的,模糊控制是以模糊语言变量、模糊集合论和模糊逻辑推理为基础的一种新型控制理论。模糊控制算法是一种非线性智能控制,它很适合于工业生产过程和大系统控制过程,并且其可以和神经网络、预测控制、遗传算法和混沌理论等新学科相结合。模糊控制器的基本原理图如图1所示。
图1虚线方框中的几个模块为模糊控制算法的几个主要步骤,其主要是由计算控制程序来实现的,具体操作流程如下所示:通过控制输出的反馈信息和参考信息进行做差计算,得到差作为控制算法的误差输入信号,这个误差输入信号作为模糊控制器的输入。同时,通过模糊化处理,将这个数值形态的误差信号转换为模糊语言的集合,并根据预先定义的模糊规则进行模糊聚餐,并得到模糊控制量,最后通过逆模糊化处理,将模糊控制量转换为实际的数值信息作为控制输出,并作用到控制对象上。
本系统所采用的模糊神经网络系统结构如图2所示,其中输入t表示本文所设计的控制器是针对炼焦炉烘炉过程高温段进行设计的。
这里,我们最后其实主要要实现的改进结构如下所示:
3.MATLAB核心程序
w1 = zeros(MAXGEN,1); 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