📄 xfcn3a.m
字号:
% xfcn3a.m used for ogata808_fuzzy.m file.
function PI=xfcn3a(x)
% must be defined since those are used in Simulink model.
global lin5_fuzz check1pp Se Sde Su K1 K2 K3 rulex Emin MAX_error Count
% load fuzzy controller without rules. Rules are integers from 0 to 5.
%lin5_fuz0=readfis('lin5_fuz0.fis');
lin5_fuz2=readfis('lin5_fuz2.fis');
lin5_fuz2=readfis('check1pp');
Count=Count+1;
% Transfer x to parameters.
fro=[1 1;1 2;1 3
2 1;2 2;2 3
3 1;3 2;3 3
4 1;4 2;4 3
5 1;5 2;5 3];
%=========================================================
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=x(26); Sde=x(27);Su=x(28);
K1=x(29); K2=x(30); K3=x(31);
x(35)=max([0.05 x(35)]); x(35)=min([x(35), 2.]);
x(36)=max([0.05 x(36)]); x(36)=min([x(36), 2.]);
x(37)=max([0.05 x(37)]); x(37)=min([x(37), 2.]);
x(40)=max([0.05 x(40)]); x(40)=min([x(40), 2.]);
x(41)=max([0.05 x(41)]); x(41)=min([x(41), 2.]);
x(42)=max([0.05 x(42)]); x(42)=min([x(42), 2.]);
x(45)=max([0.05 x(45)]); x(45)=min([x(45), 2.]);
x(46)=max([0.05 x(46)]); x(46)=min([x(46), 2.]);
x(47)=max([0.05 x(47)]); x(47)=min([x(47), 2.]);
x(34)=max([0.5 x(34)]); x(34)=min([x(34), 1.5]); % 0.2<x2<1.5
x(39)=max([0.5 x(39)]); x(39)=min([x(39), 1.5]); % 0<x1<x2
x(44)=max([0.5 x(44)]); x(44)=min([x(44), 1.5]);
x(33)=max([0.0 x(33)]); x(33)=min([x(34)-0.5, x(33)]);
x(38)=max([0.0 x(38)]); x(38)=min([x(39)-0.5, x(38)]);
x(43)=max([0.0 x(43)]); x(43)=min([x(44)-0.5, x(43)]);
% The following two are for checking only.
%==========The best =========================================
%rulex=[1 1 3 3 1 4 3 1 1 1 4 4 3 2 2 5 5 5 3 2 5 3 3 5 5 ];
%Se=60;Sde=43;Su=0.64; % GA the best, uk=uk-1+duk
%K1=0.308232; K2=0.318421; K2=0.041365;
%Rules=[2 4 1 2 1 4 1 1 3 3 3 1 3 5 3 3 3 5 5 2 5 4 5 2 4 ];
%Se=89.047790; Sde=59.673903; Su=26.271883;
%K1=6.119292; K2=2.471314; K3=0.915497;
%=========================================================
post=ones(25,2);
rule_list=[fro rulex' post];
%lin5_fuzz=addrule(lin5_fuz0,rule_list);
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,'check');
% Simulate the system and calculate the ERROR.
MDL='linmot6_fuzzy'; eval(MDL); FT=0.4;
[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;
save xxx Emin rulex Se Sde Su PI
x(1:25)=rulex; save xxxx x % Save best x for new new run use
% rulex
N=length(rulex);
fprintf('\nRules=[');
for I=1:N,
fprintf('%i ',rulex(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('K1=%.6f; K2=%.6f; ', K1,K2);
fprintf('K3=%.6f;\n', K3);
writefis(lin5_fuzz,'d:\ga_chang\check1');
end;
% End of xfcn3.m
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -