天天看點

【優化求解】基于麻雀算法優化PID參數matlab源碼

一、PID控制簡介

PID( Proportional Integral Derivative)控制是最早發展起來的控制政策之一,由于其算法簡單、魯棒性好和可靠性高,被廣泛應用于工業過程控制,尤其适用于可建立精确數學模型的确定性控制系統。

在工程實際中,應用最為廣泛的調節器控制規律為比例、積分、微分控制,簡稱PID控制,又稱PID調節,它實際上是一種算法。PID控制器問世至今已有近70年曆史,它以其結構簡單、穩定性好、工作可靠、調整友善而成為工業控制的主要技術之一。當被控對象的結構和參數不能完全掌握,或得不到精确的數學模型時,控制理論的其它技術難以采用時,系統控制器的結構和參數必須依靠經驗和現場調試來确定,這時應用PID控制技術最為友善。即當我們不完全了解一個系統和被控對象,或不能通過有效的測量手段來獲得系統參數時,最适合用PID控制技術。PID控制,實際中也有PI和PD控制。PID控制器就是根據系統的誤差,利用比例、積分、微分計算出控制量進行控制的。

從信号變換的角度而言,超前校正、滞後校正、滞後-超前校正可以總結為比例、積分、微分三種運算及其組合。

PID調節器的适用範圍:PID調節控制是一個傳統控制方法,它适用于溫度、壓力、流量、液位等幾乎所有現場,不同的現場,僅僅是PID參數應設定不同,隻要參數設定得當均可以達到很好的效果。均可以達到0.1%,甚至更高的控制要求。

PID控制的不足

  1. 在實際工業生産過程往往具有非線性、時變不确定,難以建立精确的數學模型,正常的PID控制器不能達到理想的控制效果;

  2. 在實際生産現場中,由于受到參數整定方法煩雜的困擾,正常PID控制器參數往往整定不良、效果欠佳,對運作工況的适應能力很差。

二、PID控制器各校正環節

任何閉環控制系統的首要任務是要穩(穩定)、快(快速)、準(準确)的響應指令。PID調整的主要工作就是如何實作這一任務。

  增大比例系數P将加快系統的響應,它的作用于輸出值較快,但不能很好穩定在一個理想的數值,不良的結果是雖較能有效的克服擾動的影響,但有餘差出現,過大的比例系數會使系統有比較大的超調,并産生振蕩,使穩定性變壞。積分能在比例的基礎上消除餘差,它能對穩定後有累積誤差的系統進行誤差修整,減小穩态誤差。微分具有超前作用,對于具有容量滞後的控制通道,引入微分參與控制,在微分項設定得當的情況下,對于提高系統的動态性能名額,有着顯著效果,它可以使系統超調量減小,穩定性增加,動态誤差減小。

綜上所述,P—比例控制系統的響應快速性,快速作用于輸出,好比"現在"(現在就起作用,快),I—積分控制系統的準确性,消除過去的累積誤差,好比"過去"(清除過去積怨,回到準确軌道),D—微分控制系統的穩定性,具有超前控制作用,好比"未來"(放眼未來,未雨綢缪,穩定才能發展)。當然這個結論也不可一概而論,隻是想讓初學者更加快速的了解PID的作用。

  在調整的時候,你所要做的任務就是在系統結構允許的情況下,在這三個參數之間權衡調整,達到最佳控制效果,實作穩快準的控制特點。

比例控制可快速、及時、按比例調節偏差,提高控制靈敏度,但有靜差,控制精度低。積分控制能消除偏差,提高控制精度、改善穩态性能,但易引起震蕩,造成超調。微分控制是一種超前控制,能調節系統速度、減小超調量、提高穩定性,但其時間常數過大會引入幹擾、系統沖擊大,過小則調節周期長、效果不顯著。比例、積分、微分控制互相配合,合理選擇PID調節器的參數,即比例系數KP、積分時間常數τi和微分時間常數τD,可迅速、準确、平穩的消除偏差,達到良好的控制效果。

  1. 比例環節

成比例地反映控制系統的偏差信号e(t),偏差一旦産生,控制器立即産生控制作用,以減小偏差。當僅有比例控制時系統輸出存在穩态誤差(Steady-state error)。

P參數越小比例作用越強,動态響應越快,消除誤差的能力越強。但實際系統是有慣性的,控制輸出變化後,實際y(t)值變化還需等待一段時間才會緩慢變化。由于實際系統是有慣性的,比例作用不宜太強,比例作用太強會引起系統振蕩不穩定。P參數的大小應在以上定量計算的基礎上根據系統響應情況,現場調試決定,通常将P參數由大向小調,以能達到最快響應又無超調(或無大的超調)為最佳參數。

  優點:調整系統的開環比例系數,提高系統的穩态精度,減低系統的惰性,加快響應速度。

  缺點:僅用P控制器,過大的開環比例系數不僅會使系統的超調量增大,而且會使系統穩定裕度變小,甚至不穩定。

  

  2. 積分環節

控制器的輸出與輸入誤差信号的積分成正比關系。主要用于消除靜差,提高系統的無差度。積分作用的強弱取決于積分時間常數T,T越大,積分作用越弱,反之則越強。

  為什麼要引進積分作用?

比例作用的輸出與誤差的大小成正比,誤差越大,輸出越大,誤差越小,輸出越小,誤差為零,輸出為零。由于沒有誤差時輸出為零,是以比例調節不可能完全消除誤差,不可能使被控的PV值達到給定值。必須存在一個穩定的誤差,以維持一個穩定的輸出,才能使系統的PV值保持穩定。這就是通常所說的比例作用是有差調節,是有靜差的,加強比例作用隻能減少靜差,不能消除靜差(靜差:即靜态誤差,也稱穩态誤差)。

為了消除靜差必須引入積分作用,積分作用可以消除靜差,以使被控的y(t)值最後與給定值一緻。引進積分作用的目的也就是為了消除靜差,使y(t)值達到給定值,并保持一緻。

積分作用消除靜差的原理是,隻要有誤差存在,就對誤差進行積分,使輸出繼續增大或減小,一直到誤差為零,積分停止,輸出不再變化,系統的PV值保持穩定,y(t)值等于u(t)值,達到無差調節的效果。

但由于實際系統是有慣性的,輸出變化後,y(t)值不會馬上變化,須等待一段時間才緩慢變化,是以積分的快慢必須與實際系統的慣性相比對,慣性大、積分作用就應該弱,積分時間I就應該大些,反之而然。如果積分作用太強,積分輸出變化過快,就會引起積分過頭的現象,産生積分超調和振蕩。通常I參數也是由大往小調,即積分作用由小往大調,觀察系統響應以能達到快速消除誤差,達到給定值,又不引起振蕩為準。

對一個自動控制系統,如果在進入穩态後存在穩态誤差,則稱這個控制系統是有穩态誤差的或簡稱有差系統(System with Steady-state Error)。為了消除穩态誤差,在控制器中必須引入“積分項”。積分項對誤差取決于時間的積分,随着時間的增加,積分項會增大。這樣,即便誤差很小,積分項也會随着時間的增加而加大,它推動控制器的輸出增大使穩态誤差進一步減小,直到等于零。是以,比例+積分(PI)控制器,可以使系統在進入穩态後無穩态誤差。PI控制器不但保持了積分控制器消除穩态誤差的“記憶功能”,而且克服了單獨使用積分控制消除誤差時反應不靈敏的缺點。

  優點:消除穩态誤差。

  缺點:積分控制器的加入會影響系統的穩定性,使系統的穩定裕度減小。

  3. 微分環節

反映偏差信号的變化趨勢,并能在偏差信号變得太大之前,在系統中引入一個有效的早期修正信号,進而加快系統的動作速度,減少調節時間。在微分控制中,控制器的輸出與輸入誤差信号的微分(即誤差的變化率)成正比關系。

  為什麼要引進微分作用?

前面已經分析過,不論比例調節作用,還是積分調節作用都是建立在産生誤差後才進行調節以消除誤差,都是事後調節,是以這種調節對穩态來說是無差的,對動态來說肯定是有差的,因為對于負載變化或給定值變化所産生的擾動,必須等待産生誤差以後,然後再來慢慢調節予以消除。

但一般的控制系統,不僅對穩定控制有要求,而且對動态名額也有要求,通常都要求負載變化或給定調整等引起擾動後,恢複到穩态的速度要快,是以光有比例和積分調節作用還不能完全滿足要求,必須引入微分作用。比例作用和積分作用是事後調節(即發生誤差後才進行調節),而微分作用則是事前預防控制,即一發現y(t)有變大或變小的趨勢,馬上就輸出一個阻止其變化的控制信号,以防止出現過沖或超調等。

D越大,微分作用越強,D越小,微分作用越弱。系統調試時通常把D從小往大調,具體參數由試驗決定。

如:由于給定值調整或負載擾動引起y(t)變化,比例作用和微分作用一定等到y(t)值變化後才進行調節,并且誤差小時,産生的比例和積分調節作用也小,糾正誤差的能力也小,誤差大時,産生的比例和積分作用才增大。因為是事後調節動态名額不會很理想。而微分作用可以在産生誤差之前一發現有産生誤差的趨勢就開始調節,是提前控制,是以及時性更好,可以最大限度地減少動态誤差,使整體效果更好。但微分作用隻能作為比例和積分控制的一種補充,不能起主導作用,微分作用不能太強,太強也會引起系統不穩定,産生振蕩,微分作用隻能在P和I調好後再由小往大調,一點一點試着加上去。

自動控制系統在克服誤差的調節過程中可能會出現振蕩甚至失穩。其原因是由于存在有較大慣性元件(環節)或有滞後(delay)元件,具有抑制誤差的作用,其變化總是落後于誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時,抑制誤差的作用就應該是零。這就是說,在控制器中僅引入“比例”項往往是不夠的,比例項的作用僅是放大誤差的幅值,而目前需要增加的是“微分項”,它能預測誤差變化的趨勢。這樣,具有比例+微分的控制器,就能夠提前使抑制誤差的控制作用等于零,甚至為負值,進而避免了被控量的嚴重超調。是以對有較大慣性或滞後的被控對象,比例+微分(PD)控制器能改善系統在調節過程中的動态特性。PD控制隻在動态過程中才起作用,對恒定穩态情況起阻斷作用。是以,微分控制在任何情況下都不能單獨使用。

  優點:使系統的響應速度變快,超調減小,振蕩減輕,對動态過程有“預測”作用。

在低頻段,主要是PI控制規律起作用,提高系統型别,消除或減少穩态誤差;在中高頻段主要是PD規律起作用,增大截止頻率和相角裕度,提高響應速度。是以,控制器可以全面地提高系統的控制性能。

三、PID控制器的參數整定

PID控制器的參數整定是控制系統設計的核心内容。它是根據被控過程的特性确定PID控制器的比例系數、積分時間和微分時間的大小。PID控制器參數整定的方法很多,概括起來有兩大類:

  1. 理論計算整定法

它主要是依據系統的數學模型,經過理論計算确定控制器參數。這種方法所得到的計算資料未必可以直接用,還必須通過工程實際進行調整和修改。

  2. 工程整定方法

它主要依賴工程經驗,直接在控制系統的試驗中進行,且方法簡單、易于掌握,在工程實際中被廣泛采用。PID控制器參數的工程整定方法,主要有臨界比例法、反應曲線法和衰減法。三種方法各有其特點,其共同點都是通過試驗,然後按照工程經驗公式對控制器參數進行整定。但無論采用哪一種方法所得到的控制器參數,都需要在實際運作中進行最後調整與完善。現在一般采用的是臨界比例法。利用該方法進行 PID控制器參數的整定步驟如下:

  (1)首先預選擇一個足夠短的采樣周期讓系統工作;

  (2)僅加入比例控制環節,直到系統對輸入的階躍響應出現臨界振蕩,記下這時的比例放大系數和臨界振蕩周期;

  (3)在一定的控制度下通過公式計算得到PID控制器的參數。

  PID調試一般原則

  a.在輸出不振蕩時,增大比例增益P。

  b.在輸出不振蕩時,減小積分時間常數Ti。

  c.在輸出不振蕩時,增大微分時間常數Td。

  PID調試一般步驟

  a. 确定比例增益P

  确定比例增益P 時,首先去掉PID的積分項和微分項,一般是令Ti=0、Td=0(具體見PID的參數設定說明),使PID為純比例調節。輸入設定為系統允許的最大值的60%~70%,由0逐漸加大比例增益P,直至系統出現振蕩;再反過來,從此時的比例增益P逐漸減小,直至系統振蕩消失,記錄此時的比例增益P,設定PID的比例增益P為目前值的60%~70%。比例增益P調試完成。

  b. 确定積分時間常數Ti

  比例增益P确定後,設定一個較大的積分時間常數Ti的初值,然後逐漸減小Ti,直至系統出現振蕩,之後在反過來,逐漸加大Ti,直至系統振蕩消失。記錄此時的Ti,設定PID的積分時間常數Ti為目前值的150%~180%。積分時間常數Ti調試完成。

  c. 确定微分時間常數Td

  微分時間常數Td一般不用設定,為0即可。若要設定,與确定 P和Ti的方法相同,取不振蕩時的30%。

  d. 系統空載、帶載聯調,再對PID參數進行微調,直至滿足要求。

變速積分的基本思想是,設法改變積分項的累加速度,使其與偏差大小相對應:偏差越大,積分越慢;反之則越快,有利于提高系統品質。

四、麻雀算法

優化問題是科學研究和工程實踐領域中的熱門問題。智能優化算法大多是受到人類智能、生物群體社會性或自然現象規律的啟發,在解空間内進行全局優化。麻雀算法于2020年由薛建凱[1]首次提出,是基于麻雀種群的覓食和反捕食行為的一種新型智能優化算法。

麻雀搜尋算法的具體步驟描述以及公式介紹:

建構麻雀種群:

【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼

其中,d表示待優化問題的維數,n表示麻雀種群的數量。所有麻雀種群的适應度函數可以表示成如下形式:

【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼

其中,Fx表示适應度函數值。

麻雀算法中的麻雀具有兩大類分别是發現者和加入者,發現者負責為整個種群尋找食物并為加入者提供覓食的方向,是以,發現者的覓食搜尋範圍要比加入者的覓食搜尋範圍大。在每次疊代過程中,發現者按照公式(3)進行疊代。

【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼

其中,t表示目前疊代次數,Xij表示第i個麻雀種群在第j維中的位置資訊,阿爾法表示的0到1的随機數,itermax表示最大疊代次數,Q表示一個服從正态分布的随機數,L是一個1*d并且元素全為1的矩陣,R2屬于0-1表示麻雀種群位置的預警值,ST屬于0.5-1表示麻雀種群位置的安全值。

當R2<ST時表示 預警值小于安全值,此時覓食環境中沒有捕食者,發現者可以進行廣泛搜尋操作;當R2>ST時意味着種群中有部分麻雀已經發現捕食者,并向種群中的其他麻雀發出預警,所有麻雀都需要飛往安全區域進行覓食。

在覓食過程中,部分加入者會時刻監視發現者,當發現者發現更好的食物,加入者會與其進行争奪,若成功,會立即獲得該發現者的食物,否則加入者按照公式(4)進行位置更新。

【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼

其中,XP表示目前發現者所發現的最優位置,Xworst表示目前全局最差的位置,A表示其元素随機指派為1或-1的1*d的矩陣并且滿足一下關系:

L仍然是一個1*d并且元素全為1的矩陣。當i>n/2時這表明第i個加入者沒有獲得食物,處于饑餓狀态,此時需要飛往其他地方進行覓食,以獲得更多的能量。

在麻雀種群中,意識到危險的麻雀數量占總數的10%到20%,這些麻雀的位置是随機産生的,按照公式(5)對意識到危險的麻雀的位置進行不斷更新。

【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼

其中,Xbest表示目前全局最優位置,是服從标準正态分布的随機數用來作為步長控制參數,貝塔是一個屬于-1到1的随機數,fi表示目前麻雀個體的适應度值,fg表示全局最佳适應度值,fw表示全局最差适應度值,像左耳朵一樣的這個是讀"一不洗諾"嗎?"一不洗諾"表示一個避免分母為0的常數。當fi>fg時表示此時麻雀處于種群邊緣,極易受到捕食者的攻擊,當fi=fg時表示處于種群中間的麻雀也受到了危險,此時需要靠近其他麻雀以減少被捕食的風險。

五、示範代碼

function [FoodFitness,FoodPosition,Convergence_curve]=SSA(N,Max_iter,lb,ub,dim,fobj)
if size(ub,1)==1
    ub=ones(dim,1)*ub;
    lb=ones(dim,1)*lb;
end
Convergence_curve = zeros(1,Max_iter);
%Initialize the positions of salps
SalpPositions=initialization(N,dim,ub,lb);
FoodPosition=zeros(1,dim);
FoodFitness=inf;
%calculate the fitness of initial salps
for i=1:size(SalpPositions,1)
    SalpFitness(1,i)=fobj(SalpPositions(i,:));
end
[sorted_salps_fitness,sorted_indexes]=sort(SalpFitness);
for newindex=1:N
    Sorted_salps(newindex,:)=SalpPositions(sorted_indexes(newindex),:);
end
FoodPosition=Sorted_salps(1,:);
FoodFitness=sorted_salps_fitness(1);
%Main loop
l=2; % start from the second iteration since the first iteration was dedicated to calculating the fitness of salps
while l<Max_iter+1
    c1 = 2*exp(-(4*l/Max_iter)^2); % Eq. (3.2) in the paper
    for i=1:size(SalpPositions,1)
        SalpPositions= SalpPositions';
        if i<=N/2
            for j=1:1:dim
                c2=rand();
                c3=rand();
                %%%%%%%%%%%%% % Eq. (3.1) in the paper %%%%%%%%%%%%%%
                if c3<0.5 
                    SalpPositions(j,i)=FoodPosition(j)+c1*((ub(j)-lb(j))*c2+lb(j));
                else
                    SalpPositions(j,i)=FoodPosition(j)-c1*((ub(j)-lb(j))*c2+lb(j));
                end
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            end
        elseif i>N/2 && i<N+1
            point1=SalpPositions(:,i-1);
            point2=SalpPositions(:,i);
            SalpPositions(:,i)=(point2+point1)/2; % % Eq. (3.4) in the paper
        end
        SalpPositions= SalpPositions';
    end
    for i=1:size(SalpPositions,1)
        Tp=SalpPositions(i,:)>ub';Tm=SalpPositions(i,:)<lb';SalpPositions(i,:)=(SalpPositions(i,:).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;
        SalpFitness(1,i)=fobj(SalpPositions(i,:));
        if SalpFitness(1,i)<FoodFitness
            FoodPosition=SalpPositions(i,:);
            FoodFitness=SalpFitness(1,i); 
        end
    end
    Convergence_curve(l)=FoodFitness;
    l = l + 1;
end      
【優化求解】基于麻雀算法優化PID參數matlab源碼

六、仿真結果

【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼
【優化求解】基于麻雀算法優化PID參數matlab源碼

繼續閱讀