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

📄 xfcn3.m

📁 其中提到遺傳學的程式碼與應用提供給次淚相向的研究者參考下載
💻 M
字号:
% xfcn3.m used for xfuzzy_ga.m file.

function PI=xfcn3(x)
% must be defined since those are used in Simulink model.
global lin5_fuzz lin5_fuz2 check1 Se Sde Su K1 K2 K3 rulex  Emin ...
   MAX_error Count  xxx mfs Ts Td FT N_RULES

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

% Transfer x to parameters.
fro=[];
%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];
 fro=[1 1;1 2;1 3
    2 1;2 2; 2 3;
    3 1;3 2;3 3];
 %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
%==========The best =========================================
%rulex=[1 2 1 1 1 4 4 4 4 4 1 3 3 3 5 2 2 2 2 2 5 5 5 4 5 ];
%rulex=[1 1 1 1 1 1 1 1 1 1 1 1 3 5 5 5 5 5 5 5 5 5 5 5 5 ];
%=========================================================
%IX=1:12;
%rulex(IX)=Count; fprintf('===>Count=%i\n',Count);
%rulex(IX)=fix(x(IX)); 
%rulex(26*ones(size(IX))-IX)=6*ones(1,length(IX))-rulex(IX);
%rulex(13)=3;
rulex=[];IX=1:4; rulex(IX)=fix(x(IX)); rulex(5)=2;
rulex(10*ones(size(IX))-IX)=4*ones(1,length(IX))-rulex(IX);
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(rulex>3); if ~isempty(i), rulex(i)=3*ones(size(i)); end;
%Se=round4dp(x(26)); Sde=round4dp(x(27));Su=round4dp(x(28));
%K1=round4dp(x(29)); K2=round4dp(x(30)); K3=round4dp(x(31));
Se=round4dp(x(10)); Sde=round4dp(x(11));Su=round4dp(x(12));
K1=round4dp(x(13)); K2=round4dp(x(14)); K3=round4dp(x(15));

%Se=22.383200; Sde=136.041800; Su=1.513500;
%K1=0.779900; K2=4.165500; K3=0.147900;

% GMF.m file to find Gaussian
% Use Trap and Trig MFs
%lp13=x(32);lp14=x(33); lp23=x(34);lp24=x(35); lp33=x(36); lp34=x(37);
lp13=x(16);lp14=x(17); lp23=x(18);lp24=x(19); lp33=x(20); lp34=x(21);
lp13=max([0.2 lp13]); lp13=min([1.9 lp13]);
lp23=max([0.2 lp23]); lp23=min([1.9 lp23]);
lp33=max([0.2 lp33]); lp33=min([1.9 lp33]);
lp14=max([0.05 lp14]); lp14=min([lp13-0.1 lp14]);
lp24=max([0.05 lp24]); lp24=min([lp23-0.1 lp24]);
lp34=max([0.05 lp34]); lp34=min([lp33-0.1 lp34]);
lp14=max([0.3 lp14]); lp14=min([1.9 lp14]);
lp24=max([0.3 lp24]); lp24=min([1.9 lp24]);
lp34=max([0.3 lp34]); lp34=min([1.9 lp34]);
if lp14>lp13, lp14=lp13; end;
if lp24>lp23, lp24=lp23; end;
if lp34>lp33, lp34=lp33; end;
lp13=round4dp(lp13); lp14=round4dp(lp14); lp23=round4dp(lp23);
lp24=round4dp(lp24); lp33=round4dp(lp33); lp34=round4dp(lp34);

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

II=2;
if II==1,
lin5_fuzz=addvar(lin5_fuzz,'input','ek',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'NL','trapmf',[-2 -2 -lp13 -lp14]);                             %'gaussmf',[lv1 -lm1]);          %[x(36) -x(34)]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'NS','trimf',[-lp13 -lp14 0]);                             %'gaussmf',[sv1 -sm1]);         %[x(35) -x(33)]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'ZE','trimf',[-lp14 0 lp14]);                             %'gaussmf',[zv1, 0]);               %[x(37)  0]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'PS','trimf',[0 lp14 lp13]);                             %'gaussmf',[sv1 sm1]);            %[x(35) x(33)]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'PL','trapmf',[lp14 lp13 2 2]);                             %'gaussmf',[lv1 lm1]);             %[x(36) x(34)]);

lin5_fuzz=addvar(lin5_fuzz,'input','dek',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'NL','trapmf',[-2 -2 -lp23 -lp24]);                             %'gaussmf',[lv2 -lm2]);           %[x(41) -x(40)]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'NS','trimf',[-lp23 -lp24 0]);                             %'gaussmf',[sv2 -sm2]);          %[x(40) -x(38)]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'ZE','trimf',[-lp24 0 lp24]);                             %'gaussmf',[zv2 0]);                 %[x(42)  0]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'PS','trimf',[0 lp24 lp23]);                             %'gaussmf',[sv2 sm2]);            %   [x(40) x(38)]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'PL','trapmf',[lp24 lp23 2 2]);                             %'gaussmf',[lv2 lm2]);             %[x(41) x(40)]);

lin5_fuzz=addvar(lin5_fuzz,'output','duk',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'NL','trapmf',[-2 -2 -lp33 -lp34]);                             %'gaussmf',[lv3 -lm3]);                %[x(46) -x(44)]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'NS','trimf',[-lp33 -lp34 0]);                             %'gaussmf',[sv3 -sm3]);                %[x(45) -x(43)]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'ZE','trimf',[-lp34 0 lp34]);                             %'gaussmf',[zv3 0]);                      %[x(47)  0]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'PS','trimf',[0 lp34 lp33]);                             %'gaussmf',[sv3 sm3]);                %[x(45) x(43)]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'PL','trapmf',[lp34 lp33 2 2]);     %'gaussmf',[lv3 lm3]);                %[x(46) x(44)]);

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);
end;
if II==2,
lin5_fuzz=addvar(lin5_fuzz,'input','ek',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'NL','trapmf',[-2 -2 -lp13 0]);                             %'gaussmf',[lv1 -lm1]);          %[x(36) -x(34)]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'ZE','trimf',[-lp13 0 lp13]);                             %'gaussmf',[zv1, 0]);               %[x(37)  0]);
lin5_fuzz=addmf(lin5_fuzz,'input',1,'PL','trapmf',[0 lp13 2 2]);                             %'gaussmf',[lv1 lm1]);             %[x(36) x(34)]);

lin5_fuzz=addvar(lin5_fuzz,'input','dek',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'NL','trapmf',[-2 -2 -lp23 0]);                             %'gaussmf',[lv2 -lm2]);           %[x(41) -x(40)]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'ZE','trimf',[-lp23 0 lp23]);                             %'gaussmf',[zv2 0]);                 %[x(42)  0]);
lin5_fuzz=addmf(lin5_fuzz,'input',2,'PL','trapmf',[0 lp23 2 2]);                             %'gaussmf',[lv2 lm2]);             %[x(41) x(40)]);

lin5_fuzz=addvar(lin5_fuzz,'output','duk',[-2 2]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'NL','trapmf',[-2 -2 -lp33 0]);                             %'gaussmf',[lv3 -lm3]);                %[x(46) -x(44)]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'ZE','trimf',[-lp33 0 lp33]);                             %'gaussmf',[zv3 0]);                      %[x(47)  0]);
lin5_fuzz=addmf(lin5_fuzz,'output',1,'PL','trapmf',[0 lp33 2 2]);     %'gaussmf',[lv3 lm3]);                %[x(46) x(44)]);

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);
end;
%writefis(lin5_fuzz,'check');
figure(2);subplot(221);plotmf(lin5_fuzz,'input',1)
figure(2);subplot(222);plotmf(lin5_fuzz,'input',2)
figure(2);subplot(223);plotmf(lin5_fuzz,'output',1)

% Simulate the system and calculate the ERROR.
MDL='linmot6_fuzzy'; eval(MDL); 
[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,7)==FT, 
   Emin=error; 
   x(1:N_RULES)=rulex; save xxxx x   % Save best x for new new run use
  % rulex
  fprintf('\nmin error=%.6f, max PI=%.6f  <=== Save now\n',error, PI);   
  N=length(rulex); 
  fprintf('Rules=[');
  for I=1:N,
     fprintf('%i ',rulex(I));
  end;
  fprintf('];\n');
  fprintf('Se=%.4f; Sde=%.4f; Su=%.4f;\n', Se,Sde, Su);
  fprintf('K1=%.4f; K2=%.4f; ', K1,K2);
  fprintf('K3=%.4f;\n', K3);
  writefis(lin5_fuzz,'d:\ga_chang\check1');
  %xx=[zv1 zv2 zv3 sv1 sv2 sv3 lv1 lv2 lv3 sm1 sm2 sm3 lm1 lm2 lm3];
  xx=[lp13 lp14 lp23 lp24 lp33 lp34];
  N=length(xx); 
  fprintf('MFs=[');
  for I=1:N,
     fprintf('%.4f ',xx(I));
  end;
  fprintf('];\n');
  mfs=xx;
  save xxx Emin rulex Se Sde Su K1 K2 K3 PI mfs
  %keyboard
end;
% End of xfcn3.m



⌨️ 快捷键说明

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