📄 xfcn3.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 + -