天天看點

基于matlab的正常模糊控制器與PID控制器的比較模糊控制器的設計PID控制器運作結果如下結論

模糊控制器的設計

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’);

運作結果如下

基于matlab的正常模糊控制器與PID控制器的比較模糊控制器的設計PID控制器運作結果如下結論

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’)

運作結果如下

基于matlab的正常模糊控制器與PID控制器的比較模糊控制器的設計PID控制器運作結果如下結論

結論

對照以上兩幅圖,在此例中,模糊控制器經過1500次後還在調整,而PID經過大約200次就結束調整,且震蕩較少,PID缺點就是超調量較大。

繼續閱讀