模糊控制器的設計
clear;
y=0;
h=0.1;
r=10;
sum=0;
x1_0=0;
a=ones(1,2);
b=ones(1,3000);
c=ones(1,3000);
m=newfis(“Fuzzypif”); %建立一個 FIS (Fuzzy Inference System ) 對象
%增加模糊語言變量
m = addvar(m,‘input’,‘error’,[-100,100]);%第一個輸入變量error
%添加模糊語言名稱
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.24 -100]);
m =addmf(m,‘input’,1,‘error<0’,‘gaussmf’,[21.2 -50.5]);
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.2 0]);
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.24 50]);
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.2 99.5]);
m = addvar(m,‘input’,‘de’,[-100,100]);%第二個輸入變量 de
m =addmf(m,‘input’,2,‘de>0’,‘gaussmf’,[42.47 100]);
m =addmf(m,‘input’,2,‘de=0’,‘gaussmf’,[42.47 0]);
m =addmf(m,‘input’,2,‘de<0’,‘gaussmf’,[42.47 -100]);
m = addvar(m,‘output’,‘du’,[-10,10]);%輸出變量 du
m =addmf(m,‘output’,1,‘du<<0’,‘gaussmf’,[2.124 -10]);%
m =addmf(m,‘output’,1,‘du<0’,‘gaussmf’,[2.124 -5.0]);%
m =addmf(m,‘output’,1,‘du=0’,‘gaussmf’,[2.124 0]);%
m =addmf(m,‘output’,1,‘du>0’,‘gaussmf’,[2.124 5.0]);%
m =addmf(m,‘output’,1,‘du>>0’,‘gaussmf’,[2.124 10]);%
rulelist=[
1 0 5 1 1; %模糊控制規則表,共有m+n+2列
3 0 3 1 1; %前兩個數字為m的隸屬度函數号,其次是n的隸屬度函數号
5 0 1 1 1 ; %第m+n+1位為規則的權重,一般設定為1
2 3 5 1 1 ; %第m+n+2位 and為“1”,or為“0”
4 1 1 1 1];
m = addrule(m,rulelist); % 向模糊推理系統添加規則
homework = m;
for i=1:1:3000
x1 = y-r;
if x1>10 %對誤差信号進行限幅
x2=10;
elseif x1<-10 %對誤差信号進行限幅
x2 = -10;
else x2=x1;
end
x2_de = (x1-x1_0)/h;
%a=ones(1,2);
a(1)=x2;
a(2)=x2_de;
x3=evalfis(a,homework);%采用增量控制方法,輸出是deltau
sum =sum+x3;
b(i)=sum;%把每次的控制信号放入一個數組中,以便與延時處理
x4 = y;
if(i-0.5/h)<=0 %對時間零以前置零處理
c(i)=0;
else
c(i)=b(i-0.5/h);
end
%龍格庫塔法是用于非線性常微分方程的解的重要的一類隐式或顯式疊代法%
f1 = (c(i)-x4)/10;
f2 = ((c(i)+h/2)-(x4+hf1/2))/10;
f3 = ((c(i)+h/2)-(x4+hf2/2))/10;
f4 = ((c(i)+h)-(x4+hf3))/10;
x4_dot = x4+h(f1+2f2+2f3+f4)/6;
y = x4_dot;
x(i)=x4;
x1_0 = x1;
end
plot(x,‘r’);
運作結果如下
PID控制器
clear;
kp=10;
ki=1;
kd=2;
y=0;
h = 0.1;
r = 10;
sum=0;
x1_0=0;
a=ones(1,2);
b=ones(1,1500);
c=ones(1,1500);
int_err = 0;
for i=1:1:1500
x1 = y-r; %計算誤差信号
if x1>10
x2 =10;
elseif x1 <-10
x2 = -10;
else x2=x1;
end
x2_de = (x1-x1_0)/h;
err =x2;
int_err = int_err+err;
de = x2_de;
x3=-(kperr+kiint_err+kdde)%求出控制信号,y-r為負,是以加了負号
b(i) = x3;%把每次的控制信号放入一個數組中,便于延時處理
x4 = y;
if(i-0.5/h)<=0
c(i)=0;
else
c(i) = b(i-0.5/h);
end
f1 = (c(i)-x4)/10;
f2 = ((c(i)+h/2)-(x4+hf1/2))/10;
f3 = ((c(i)+h/2)-(x4+hf2/2))/10;
f4 = ((c(i)+h)-(x4+hf3))/10;
x4_dot = x4+h*(f1+2f2+2f3+f4)/6;
y = x4_dot;
x(i)=x4;
x1_0 = x1;
end
plot(x,‘r’)
運作結果如下
結論
對照以上兩幅圖,在此例中,模糊控制器經過1500次後還在調整,而PID經過大約200次就結束調整,且震蕩較少,PID缺點就是超調量較大。