📄 fuzzyobj.asv
字号:
function BsJ=fuzzyobj(Kpidi,BsJ,ts,sys,objdiffer)
global rin yout timef
ts=0.001;
%sys=;
dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');
Rule=[ 7 7 7 7 6 4 4
7 7 7 7 6 4 4
6 6 6 5 4 3 3
6 6 5 4 3 2 2
6 6 5 4 3 2 2
5 5 4 3 2 2 2
4 4 2 1 1 1 1
4 4 2 1 1 1 1];
rin=1.0;
u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
x=[0,0,0]';
B=0;
e=0;
ce=0;
error_1=0;
tu=1;
s=0;
P=100;
a=Kpidi(1);
b=Kpidi(2);
c=Kpidi(3);
for k=1:1:P
timef(k)=k*ts;
r(k)=rin;
x_sum=0;
y_sum=0.001;
for j=-3:1:3 %模糊规则匹配
c=k;
ce=k;
x_sum=x_sum+trig(e,a,b,c)*trig(ce,a,b,c)*Rule(4,j+4);
y_sum=y_sum+trig(e,a,b,c)*trig(e,a,b,c);
end
u(k)=x_sum/y_sum;
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
eval(objdiffer);
%yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
error(k)=r(k)-yout(k);
%------------ Return of PID parameters -------------
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);
e=error(k); % Calculating P
ce=(error(k)-error_1)/ts; % Calculating D
x(3)=x(3)+error(k)*ts;
error_2=error_1;
error_1=error(k);
if s==0
if yout(k)>0.95&yout(k)<1.05
tu=timef(k);
s=1;
end
end
end
for i=1:1:P
Ji(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;
B=B+Ji(i);
if i>1
erry(i)=yout(i)-yout(i-1);
if erry(i)<0
B=B+100*abs(erry(i));
end
end
end
BsJ=B+0.2*tu*10;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -