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

📄 xfcn4.m

📁 书籍代码:遗传演算法原理与应用_活用MATLAB(Source Code)
💻 M
字号:
% xfcn4.m used for ogata808_fuzzy.m file.

function PI=xfcn4(x)
% must be defined since those are used in Simulink model.
global  Se Sde Su Sxe Sxde Sxu rulex  Emin  MAX_error Count  check1g lin5_fuzz lin6_fuzz VIC

% load fuzzy controller without rules. Rules are integers from 0 to 5.
%lin5_fuz0=readfis('lin5_fuz0.fis');
lin5_fuz2=readfis('lin5_fuz2.fis');
Count=Count+1;

% Transfer x to parameters.
fro=[1 1;1 2;1 3;1 4; 1 5
   2 1;2 2;2 3;2 4; 2 5
   3 1;3 2;3 3;3 4;3 5
   4 1;4 2;4 3;4 4;4 5
   5 1;5 2;5 3;5 4;5 5];
%rulex=[1 5 1 5 2    1 5 1 1 5    1 5 3 1 5    1 5 5 1 5    4 1 5 1 5]; % GA #1 modified
%rulex(6:12)=fix(x(1:7)); 
%rulex=rulex';
%rulex=[1 1 1 2 3    1 1 2 3 4    1 2 3 4 5   5 5 4 3 2    5 5 5 4 3]'; %First design
%rulex(IX)=Count; fprintf('===>Count=%i\n',Count);
IX=1:12;
rulex(IX)=fix(x(IX)); 
rulex(26*ones(size(IX))-IX)=6*ones(1,length(IX))-rulex(IX);
rulex(13)=3;

rulexa(IX)=fix(x(IX+12)); 
rulexa(26*ones(size(IX))-IX)=6*ones(1,length(IX))-rulexa(IX);
rulexa(13)=3;

i=find(rulex<1); if ~isempty(i), rulex(i)=ones(size(i)); end;
i=find(rulex>=5); if ~isempty(i), rulex(i)=5*ones(size(i)); end;
i=find(rulexa<1); if ~isempty(i), rulexa(i)=ones(size(i)); end;
i=find(rulexa>=5); if ~isempty(i), rulexa(i)=5*ones(size(i)); end;
%==========The best =========================================
%rulex  =[1 5 4 1 5 5 3 5 2 5 1 2 3 4 5 1 4 1 3 1 1 5 2 1 5 ];
%rulexa=[1 4 5 1 4 1 1 1 2 1 1 4 3 2 5 5 4 5 5 5 2 5 1 2 5 ];
%=========================================================
%fprintf('>>>Now %i\n',rulex(IX));
Se=x(26); Sde=x(27);Su=x(28);
Sxe=x(29); Sxde=x(30); Sxu=x(31); 

x(35)=max([0.05 x(35)]); x(35)=min([x(35), 2.5]);
x(36)=max([0.05 x(36)]); x(36)=min([x(36), 2.5]);
x(37)=max([0.05 x(37)]); x(37)=min([x(37), 2.5]);
x(40)=max([0.05 x(40)]); x(40)=min([x(40), 2.5]);
x(41)=max([0.05 x(41)]); x(41)=min([x(41), 2.5]);
x(42)=max([0.05 x(42)]); x(42)=min([x(42), 2.5]);
x(45)=max([0.05 x(45)]); x(45)=min([x(45), 2.5]);
x(46)=max([0.05 x(46)]); x(46)=min([x(46), 2.5]);
x(47)=max([0.05 x(47)]); x(47)=min([x(47), 2.5]);

x(34)=max([0.3 x(34)]); x(34)=min([x(34), 1.5]);  % 0.2<x2<1.5
x(39)=max([0.3 x(39)]); x(39)=min([x(39), 1.5]);  % 0<x1<x2
x(44)=max([0.3 x(44)]); x(44)=min([x(44), 1.5]);
x(33)=max([0.0 x(33)]); x(33)=min([x(34)-0.2, x(33)]);
x(38)=max([0.0 x(38)]); x(38)=min([x(39)-0.2, x(38)]);
x(43)=max([0.0 x(43)]); x(43)=min([x(44)-0.2, x(43)]);

% The following two are for checking only.
%==========The best =========================================
Se=125.011842; Sde=99.282396; Su=-794.495934;
Sxe=94.839325; Sxde=41.224725; Sxu=-765.544893;
%=========================================================

post=ones(25,2);
rule_list=[fro rulex' post];
lin5_fuzz=addrule(lin5_fuz2,rule_list);

lin5_fuzz=addvar(lin5_fuzz,'input','ek',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'NL','gaussmf',[x(36) -x(34)]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'NS','gaussmf',[x(35) -x(33)]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'ZE','gaussmf',[x(37)  0]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'PS','gaussmf',[x(35) x(33)]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'PL','gaussmf',[x(36) x(34)]);
figure(2);subplot(221);plotmf(lin5_fuzz,'input',1)

lin5_fuzz=addvar(lin5_fuzz,'input','dek',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'NL','gaussmf',[x(41) -x(40)]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'NS','gaussmf',[x(40) -x(38)]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'ZE','gaussmf',[x(42)  0]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'PS','gaussmf',[x(40) x(38)]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'PL','gaussmf',[x(41) x(40)]);
figure(2);subplot(222);plotmf(lin5_fuzz,'input',2)

lin5_fuzz=addvar(lin5_fuzz,'output','duk',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'NL','gaussmf',[x(46) -x(44)]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'NS','gaussmf',[x(45) -x(43)]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'ZE','gaussmf',[x(47)  0]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'PS','gaussmf',[x(45) x(43)]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'PL','gaussmf',[x(46) x(44)]);
figure(2);subplot(223);plotmf(lin5_fuzz,'output',1)

writefis(lin5_fuzz,'lin5_fuzz');
lin5_fuzz=readfis('lin5_fuzz.fis');
lin5_fuzz=rmvar(lin5_fuzz,'input',3);
lin5_fuzz=rmvar(lin5_fuzz,'input',3);
lin5_fuzz=rmvar(lin5_fuzz,'output',2);
writefis(lin5_fuzz,'lin5_fuzz');
%----------------------------------------------------------------------------
rule_list=[fro rulexa' post];
lin6_fuzz=addrule(lin5_fuz2,rule_list);

lin6_fuzz=addvar(lin6_fuzz,'input','ek',[-2 2]);
lin6_fuzz=addmf(lin6_fuzz,'input',1,'NL','gaussmf',[x(36) -x(34)]);
lin6_fuzz=addmf(lin6_fuzz,'input',1,'NS','gaussmf',[x(35) -x(33)]);
lin6_fuzz=addmf(lin6_fuzz,'input',1,'ZE','gaussmf',[x(37)  0]);
lin6_fuzz=addmf(lin6_fuzz,'input',1,'PS','gaussmf',[x(35) x(33)]);
lin6_fuzz=addmf(lin6_fuzz,'input',1,'PL','gaussmf',[x(36) x(34)]);
figure(3);subplot(221);plotmf(lin6_fuzz,'input',1)

lin6_fuzz=addvar(lin6_fuzz,'input','dek',[-2 2]);
lin6_fuzz=addmf(lin6_fuzz,'input',2,'NL','gaussmf',[x(41) -x(40)]);
lin6_fuzz=addmf(lin6_fuzz,'input',2,'NS','gaussmf',[x(40) -x(38)]);
lin6_fuzz=addmf(lin6_fuzz,'input',2,'ZE','gaussmf',[x(42)  0]);
lin6_fuzz=addmf(lin6_fuzz,'input',2,'PS','gaussmf',[x(40) x(38)]);
lin6_fuzz=addmf(lin6_fuzz,'input',2,'PL','gaussmf',[x(41) x(40)]);
figure(3);subplot(222);plotmf(lin6_fuzz,'input',2)

lin6_fuzz=addvar(lin6_fuzz,'output','duk',[-2 2]);
lin6_fuzz=addmf(lin6_fuzz,'output',1,'NL','gaussmf',[x(46) -x(44)]);
lin6_fuzz=addmf(lin6_fuzz,'output',1,'NS','gaussmf',[x(45) -x(43)]);
lin6_fuzz=addmf(lin6_fuzz,'output',1,'ZE','gaussmf',[x(47)  0]);
lin6_fuzz=addmf(lin6_fuzz,'output',1,'PS','gaussmf',[x(45) x(43)]);
lin6_fuzz=addmf(lin6_fuzz,'output',1,'PL','gaussmf',[x(46) x(44)]);
figure(3);subplot(223);plotmf(lin6_fuzz,'output',1)

writefis(lin6_fuzz,'lin6_fuzz');
lin6_fuzz=readfis('lin6_fuzz.fis');
lin6_fuzz=rmvar(lin6_fuzz,'input',3);
lin6_fuzz=rmvar(lin6_fuzz,'input',3);
lin6_fuzz=rmvar(lin6_fuzz,'output',2);
writefis(lin6_fuzz,'lin6_fuzz');

% Simulate the system and calculate the ERROR.
MDL='ogata808_fuzzy'; eval(MDL); FT=3;
[T,X,Y]=sim(MDL,[0 FT]);      
% Caluate error
ST1=Y(:,1);ST2=Y(:,2); errorx=Y(:,3); N=length(errorx); 
if (sum(ST1)+sum(ST2))>0
   error=MAX_error;
else   
   error=errorx(N);
end;
PI=(1500 - error);    % Change a min. problem to a max. problem
%fprintf('Got_you=%i\n',Got_you);

if Emin>error & Y(N,6)==FT, 
   Emin=error; 
   VIC=VIC-0.01
   save xxx Emin rulex rulexa Se Sde Su PI
   writefis(lin5_fuzz,'lin5x_fuzz');
   writefis(lin6_fuzz,'lin6x_fuzz');
  % rulex'
  N=length(rulex); 
  fprintf('Rules1=[');
  for I=1:N,
     fprintf('%i ',rulex(I));
  end;
  fprintf(']\n');
   fprintf('Rules2=[');
  for I=1:N,
     fprintf('%i ',rulexa(I));
  end;
  fprintf(']\n');
  fprintf('min error=%.2f, max PI=%.2f  <=== Save now\n',error, PI);   
  fprintf('Se=%.6f; Sde=%.6f; Su=%.6f;\n', Se,Sde, Su);
  fprintf('Sxe=%.6f; Sxde=%.6f; Sxu=%.6f;\n', Sxe,Sxde, Sxu);

end;
% End of xfcn4.m



⌨️ 快捷键说明

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