1.已知某一炉温控制系统,要求温度保持着600℃恒定。针对该控制系统有以下控制经验。
(1)若炉温低于600℃,则升压;低得越多升压越高。 (2)若炉温高于600℃,则降压;高得越多降压越低。 (3)若炉温等于600℃,则保持电压不变。
设模糊控制器为一维控制器,输入语言变量为误差,输出为控制电压。输入、输出变量的量化等级为7级,取5个模糊集。试设计隶属度函数误差变化划分表,控制电压变化划分表和模糊控制规则表。
解:(1) 确定变量
定义理想温度为600℃,实际炉温为T,则温度差为:
e=600-T
将温度差e作为输入变量。
(2)输入量和输出量的模糊化
将偏差e分成5个模糊集:负大(NB),负小(NS),零(ZO),正小(PS),正大
(PB)。将偏差e的变化分成7个等级:-3,-2,-1,0,+1,+2,+3,从而得到温度变化模糊表如表1所示:
表1-温度变化e划分表 隶属度 模糊集 PB PS ZO NS NB 变化等级 -3 0 0 0 0 1 -2 0 0 0 0.5 0.5 -1 0 0 0.5 1 0 0 0 0 1 0 0 +1 0 1 0.5 0 0 +2 0.5 0.5 0 0 0 +3 1 0 0 0 0 控制电压u也分成5个模糊集:负大(NB),负小(NS),零(ZO),正小(PS),正大(PB)。将偏差u的变化分成7个等级:-3,-2,-1,0,+1,+2,+3,而得到电压变化模糊表如表2示:
表2-电压变化e划分表 隶属度 模糊集
MATLAB仿真程序如下: %Fuzzy Control for water tank clear all; PB PS ZO NS NB 变化等级 -3 0 0 0 0 1 -2 0 0 0 0.5 0.5 -1 0 0 0.5 1 0 0 0 0 1 0 0 +1 0 1 0.5 0 0 +2 0.5 0.5 0 0 0 +3 1 0 0 0 0 close all;
a=newfis('fuzz_tank');
a=addvar(a,'input','e',[-3,3]); %Parameter e a=addmf(a,'input',1,'NB','zmf',[-3,-1]); 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,'PB','smf',[1,3]);
a=addvar(a,'output','u',[-4,4]); %Parameter u a=addmf(a,'output',1,'NB','zmf',[-4,-1]); a=addmf(a,'output',1,'NS','trimf',[-4,-2,1]); a=addmf(a,'output',1,'Z','trimf',[-2,0,2]); a=addmf(a,'output',1,'PS','trimf',[-1,2,4]); a=addmf(a,'output',1,'PB','smf',[1,4]);
rulelist=[1 1 1 1; %Edit rule base 2 2 1 1; 3 3 1 1; 4 4 1 1; 5 5 1 1];
a=addrule(a,rulelist);
a1=setfis(a,'DefuzzMethod','mom'); %Defuzzy
writefis(a1,'tank'); %Save to fuzzy file \"tank.fis\" a2=readfis('tank');
figure(1); plotfis(a2); figure(2);
plotmf(a,'input',1); figure(3);
plotmf(a,'output',1);
flag=1; if flag==1 showrule(a) %Show fuzzy rule base ruleview('tank'); %Dynamic Simulation end
disp('-------------------------------------------------------');
disp(' fuzzy controller table:e=[-3,+3],u=[-4,+4] ');
disp('-------------------------------------------------------');
for i=1:1:7 e(i)=i-4;
Ulist(i)=evalfis([e(i)],a2); end
Ulist=round(Ulist)
e=-3; % Error
u=evalfis([e],a2) %Using fuzzy inference
2.用高级语言(C、VC++、MATLAB等)编程实现用BP神经网络实现下列函数的非线性映射:
f(x)1log10x,1x10 x分析误差曲线及网络的泛化能力。
解:clear all; close all;
xite=0.50; alfa=0.05;
w2=rands(6,1); w2_1=w2;w2_2=w2_1;
w1=rands(2,6); w1_1=w1;w1_2=w1;
dw1=0*w1; x=[0,0]';
u_1=0; y_1=0;
I=[0,0,0,0,0,0]'; Iout=[0,0,0,0,0,0]'; FI=[0,0,0,0,0,0]'; ts=0.001; for k=1:1:10000 time(k)=k*ts; u(k)=k*ts;
y(k)=u_1^(-1)*log10(u_1);
for j=1:1:6 I(j)=x'*w1(:,j); Iout(j)=1/(1+exp(-I(j))); end
yn(k)=w2'*Iout; % Output of NNI networks
e(k)=y(k)-yn(k); % Error calculation
w2=w2_1+(xite*e(k))*Iout+alfa*(w2_1-w2_2);
for j=1:1:6
FI(j)=exp(-I(j))/(1+exp(-I(j)))^2; end
for i=1:1:2
for j=1:1:6
dw1(i,j)=e(k)*xite*FI(j)*w2(j)*x(i); end end
w1=w1_1+dw1+alfa*(w1_1-w1_2); yu=0; for j=1:1:6
yu=yu+w2(j)*w1(1,j)*FI(j); end dyu(k)=yu;
x(1)=u(k); x(2)=y(k);
w1_2=w1_1;w1_1=w1; w2_2=w2_1;w2_1=w2; u_1=u(k); y_1=y(k); end figure(1);
plot(time,y,'r',time,yn,'b'); xlabel('times');ylabel('y and yn');
3. 已知优化函数为:
x1624f(x)4x2.1xx1x24x24x2,32141xi5
用高级语言编程实现用遗传算法搜索其最大值和最优解。
MATLAB 程序如下: Size=80; G=200;
CodeL=10; umax=5; umin=-5;
E=round(rand(Size,2*CodeL)); %Initial Code for k=1:1:G time(k)=k; for s=1:1:Size m=E(s,:); y1=0;y2=0;
m1=m(1:1:CodeL); for i=1:1:CodeL
y1=y1+m1(i)*2^(i-1); end
x1=(umax-umin)*y1/1023+umin; m2=m(CodeL+1:1:2*CodeL); for i=1:1:CodeL
y2=y2+m2(i)*2^(i-1); end
x2=(umax-umin)*y2/1023+umin;
F(s)=4*x1^2-2.1*x^4+x1^6/3+x1*x2-4*x2^2+4*x2^4; end Ji=1./F;
BestJ(k)=min(Ji);
fi=F; [Oderfi,Indexfi]=sort(fi); Bestfi=Oderfi(Size); BestS=E(Indexfi(Size),:); bfi(k)=Bestfi;
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size); %Selecting Bigger fi value
kk=1;
for i=1:1:Size
for j=1:1:fi_S(i)
TempE(kk,:)=E(Indexfi(i),:); kk=kk+1; end end pc=0.60;
n=ceil(20*rand); for i=1:2:(Size-1) temp=rand;
if pc>temp for j=n:1:20
TempE(i,j)=E(i+1,j); TempE(i+1,j)=E(i,j); end end end
TempE(Size,:)=BestS; E=TempE; %pm=0.001;
%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm %pm=0.0; %No mutation pm=0.1; %Big mutation
for i=1:1:Size
for j=1:1:2*CodeL temp=rand;
if pm>temp %Mutation Condition if TempE(i,j)==0 TempE(i,j)=1; else
TempE(i,j)=0; end end end end
TempE(Size,:)=BestS; E=TempE; end
Max_Value=Bestfi BestS x1 x2
因篇幅问题不能全部显示,请点此查看更多更全内容