?? xfcnn3.m
字號:
% xfcn3.m used for ogata808_fuzzy.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
% 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
%==========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;
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;
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=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=max([0.3 lp13]); lp13=min([1.9 lp13]);
lp23=max([0.3 lp23]); lp23=min([1.9 lp23]);
lp33=max([0.3 lp33]); lp33=min([1.9 lp33]);
lp14=max([0.1 lp14]); lp14=min([lp13-0.2 lp14]);
lp24=max([0.1 lp24]); lp24=min([lp23-0.2 lp24]);
lp34=max([0.1 lp34]); lp34=min([lp33-0.2 lp34]);
lp13=round4dp(lp13); lp14=round4dp(lp14); lp23=round4dp(lp23);
lp24=round4dp(lp24); lp33=round4dp(lp33); lp34=round4dp(lp34);
post=ones(25,2);
rule_list=[fro rulex' post];
lin5_fuzz=addrule(lin5_fuz2,rule_list);
%lin5_fuzz=addrule(lin5_fuz2,rule_list);
II=1;
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;
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);
[TIME,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=(2500 - error); % Change a min. problem to a max. problem
%fprintf('Got_you=%i\n',Got_you);
fprintf('Total execution time=%.2f, Final time=%.2f, Emin=%.2f\n',TIME(N), FT, Emin);
DDT=TIME(N)-FT; EKK=Emin; ERR=error;
if DDT==0 & (EKK>ERR)
Emin=error;
x(1:25)=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=%.6f; Sde=%.6f; Su=%.6f;\n', Se,Sde, Su);
fprintf('K1=%.6f; K2=%.6f; ', K1,K2);
fprintf('K3=%.6f;\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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -