?? fuzzy_control.m
字號:
function f2=fuzzy_control(InputVector)
%函數實現模糊控制
%在線控制
%被控系統建模,系統的控制對象為K*esp(tds)/(T1s+1)(T2s+1)
num=20;
den=conv([2 1],[3 1]);
td=0.01;
[a1,b,c,d]=tf2ss(num,den); %把拉氏變換轉換為狀態方程 a1為系統狀態陣,由系統參數決定;
%b為系統輸入陣;c為輸出陣;d為直接輸出陣;
% x^=a1*x+b*u;
% y=c*x+d*u; y為輸出向量
x=[0;0];
%系統參數
T=0.01; %采樣時間間隔
h=T;
Nd=td/T; %系統的純延時
N=1000;
R=ones(1,N);%系統的參考輸入
%采用模糊控制器的二階系統仿真
e=0;
de=0;
%量化因子,對系統的靜、動態性能有重要影響.增大Ke,相當于縮小誤差的基本論域,增強誤差的控制作用,導致上升速率加大,超調增大;
%減小Ke,會使系統調節惰性變大;Kec(kd)增大,將增加系統穩定性,但Kec(kd)過大將導致系統的過渡過程時間變長,而Kec(kd)過小可能考之過大的超調和振蕩;
%Ku相當于系統總的放大倍數,Ku增大系統響應速度增大,但過大會產生超調,Ku過小,系統穩態精度變差。
ke=30; %30
kd=3; %20,量化因子
ku=1.2; %,量化因子
for k=1:N
%輸入變量變換至論域
e1=round(ke*e); %x0
de1=round(kd*de); %y0
if e1>=6
e1=6;
elseif e1<=-6
e1=-6;
end
if de1>=6
de1=6;
elseif de1<=-6
de1=-6;
end
e1 = e1 + 7;
de1 = de1 + 7;
out=InputVector(e1,de1); %調用函數計算模糊控制輸出 z0
uu(1,k)=ku*out; %Ku相當于系統總的放大倍數
%延遲環節
if k<=Nd
u=0;
else
u=uu(1,k-Nd);
end
%控制作用于被控系統,計算系統輸出,采用龍格-庫塔法 解一階微分方程
%初始條件為x=x[0]時,y=y[0]
%u為輸入矩陣
%a1為系統狀態陣,由系統參數決定;
%b為系統輸入陣;c為輸出陣;d為直接輸出陣;
% x^=a1*x+b*u; x^為狀態向量
% y=c*x+d*u; y為輸出向量
k0=a1*x+b*u;
k1=a1*(x+h*k0/2)+b*u;
k2=a1*(x+h*k1/2)+b*u;
k3=a1*(x+h*k2)+b*u;
x=x+(k0+2*k1+2*k2+k3)*h/6;
y=c*x+d*u;
%計算系統輸出誤差及誤差倒數
e1=e;
e=R(1,k)-y;
de=(e-e1)/T;
yy(1,k)=y;
end
%------------------------------------------------------------------------
%典型二階環節的控制輸出曲線
kk=[1:N]*T;
figure(2);
% plot(kk,R,'k',kk,yy,'r');
plot(kk,R,'k',10,2,'r');
xlabel('時間(0.01秒)');ylabel('輸出');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -