模糊PID基本原理及matlab仿真實現(新手!新手!新手!)

有關模糊pid的相關知識就把本身從剛接觸到仿真出結果看到的大部分資料總結一下,以及一些本身的ps算法

 

如下未說明的都爲轉載內容數組

 

1.轉自  https://blog.csdn.net/weixin_36340979/article/details/79168052編輯器

在講解模糊PID前,咱們先要了解PID控制器的原理(本文主要介紹模糊PID的運用,對PID控制器的原理不作詳細介紹)。PID控制器(比例-積分-微分控制器)是一個在工業控制應用中常見的反饋迴路部件,由比例單元P、積分單元I和微分單元D組成。PID控制的基礎是比例控制;積分控制可消除穩態偏差,但可能增長超調;微分控制可加快大慣性系統響應速度以及減弱超調趨勢。函數

 

1.1傳統PID控制工具

 

 

 

 傳統PID控制器自出現以來,憑藉其結構簡單、穩定性好、工做可靠、調整方便等優勢成爲工業控制主要技術。當被控對象的結構和參數具備必定的不肯定性,沒法對其創建精確的模型時,採用PID控制技術尤其方便。PID控制原理簡單、易於實現,可是其參數整定異常麻煩。對於小車的速度控制系統而言,因爲其爲時變非線性系統不一樣時刻須要選用不一樣的PID參數,採用傳統的PID控制器,很難使整個運行過程具備較好的運行效果。學習

 

1.2模糊PID控制測試

 

 模糊PID控制,即利用模糊邏輯並根據必定的模糊規則對PID的參數進行實時的優化,以克服傳統PID參數沒法實時調整PID參數的缺點。模糊PID控制包括模糊化,肯定模糊規則,解模糊等組成部分。小車經過傳感器採集賽道信息,肯定當前距賽道中線的誤差E以及當前誤差和上次誤差的變化ec,根據給定的模糊規則進行模糊推理,最後對模糊參數進行解模糊,輸出PID控制參數。優化

 

 

 

2.1模糊化.net

 

 模糊控制器主要由三個模塊組成:模糊化,模糊推理,清晰化。具體以下圖所示。而咱們將一步步講解如何將模糊PID算法運用到智能車上。(最好用筆一步步本身寫一遍!!!)命令行

 

 

 首先咱們的智能車會採集到賽道的相關數據,例如攝像頭車,其採集到的數據通過算法處理以後會獲得與中線的誤差E,以及當前誤差和上次誤差的變化(差值)EC兩個值(即此算法爲2維輸入,同理也能夠是1維和3維,但2維更適合智能車)。例如此時車偏離中線的距離爲150,而上一時刻偏離中線的距離爲120,則E爲150,EC爲150 - 120 = 30。

 其次咱們要對這兩個值進行模糊化。這裏咱們對E進行舉例。攝像頭車採集回來的E是有範圍的,即與中線的誤差是在一個區間內可行的。在這裏咱們假設該區間爲-240到240,即小車偏離中線的最大距離爲240,正負即爲左右。再假設中線誤差變化率的可行區間爲-40到+40。

 

        接着咱們要對這兩個值進行模糊化。我如今將E的區間(-240 到 240)分紅8個部分,那麼他們分別爲-240 ~ -180,-180 ~ -120 ,-120 ~ -60,-60 ~ 0,0 ~ 60,60 ~ 120,120 ~ 180,180 ~ 240。而後咱們把-180,-120,-60,0,60,120,180分別用NB,NM,NS,ZO,PS,PM,PB表示(我的理解N爲negative,P爲positive,B爲big,M爲middle,S爲small,ZO爲zero)。例如,當E = 170時,此時的E屬於PM和PB之間,而此時的E也會對應2(或1)個隸屬度。E隸屬於PM(120)的百分比爲(180 - 170) /  (180 - 120) = 1 / 6 ,而同理隸屬於PB(180)的百分比爲(170 - 120) / (180 - 120) = 5 / 6  。意思就是120到180進行線性分割了,E離PM和PB哪一個更近,則隸屬於哪一個就更大(當輸出值E大於180(PB)時,則隸屬度爲1,隸屬度值爲PB,即E徹底隸屬於PB,同理當E小於 - 180 (NB)時也同樣)。同理也能夠對EC進行模糊化。

 

2.2 模糊推理

       對於採集回來的E和EC,咱們能夠推出它們各所佔的隸屬度,此時咱們能夠根據模糊規則表去找出輸出值所對應的隸屬度。

 

 

     咱們假設爲E的兩個隸屬度值爲PM、PB,E屬於PM的隸屬度爲a(a < 1),則屬於PB的隸屬度爲(1 - a)。再假設EC的兩個隸屬度值爲NB、NM,EC屬於NM的隸屬度爲b,則屬於NB的隸屬度爲(1 - b)。而在假設中,E屬於PM的隸屬度爲a,EC屬於NB的隸屬度爲( 1 - b ),則輸出值屬於ZO的隸屬度爲a *( 1 - b )(看圖)。

 

 

       同理咱們能夠得出,當輸出值屬於ZO的另外兩個隸屬度爲a * b, ( 1 - a ) * ( 1 - b) ,而輸出值屬於NS的隸屬度爲( 1 - a ) * 1 - b。

       在這裏咱們先證實一個條件,將這四個隸屬度加起來,恰好等於1。這是由於

        (a + (1 - a)) * (b + (1 - b)) = a * b + ( 1 - a ) *  b  + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b )   (下圖)

       即一個十字相乘的概念。這個等式說明輸出值的隸屬度之和等於1(第三步求解的時候須要用到隸屬度之和)。

 

 

所以,咱們知道了輸出值爲ZO的隸屬度和爲 a * b + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b ) ,輸出值爲NS的隸屬度爲 ( 1 - a ) *  b 。

 

2.3 清晰化

       對於輸出值,咱們一樣採用給予隸屬度的辦法。例如,咱們把輸出值假設爲[1000,1400](即舵機的擺角值範圍)的區間一樣劃分爲八個部分,即7個隸屬值NB,NM,NS,ZO,PS,PM,PB。根據上一步所得出的結論,咱們就能夠用隸屬度乘以相應的隸屬值算出輸出值的解,即 (a * b + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b ) ) * ZO   +    ( 1 - a ) *  b * NS。到此爲止,整個模糊過程就結束了。

     

3 模糊PID

      咱們已經知道了整個模糊的過程,但上述的過程還不夠完美。由於咱們的輸出值只有一個輸出,並無實現PID。所以咱們能夠先對E和EC進行模糊化,而後分別對kp和ki和kd(PID的三個參數)進行求解,再套入公式。

 

 

     通常的咱們也能夠只用kp,kd,不用ki。而模糊規則表通常的論文已經基本給出。所以帶入算法以後咱們的難度也只是在於調節kp,kd,和適當調節規則表。固然調節的難度會大於普通的PID,由於還要定kp,kd的輸出範圍,調得很差可能效果並無普通的PID好。

 

4. 部分解釋

     4.1對於部分論文所說的重心法解模糊,其實就是上述方法。公式以下。

 

      式中μ(Zi) * Zi至關於文章上面的(a * b + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b ) ) * ZO   +    ( 1 - a ) *  b * NS,即隸屬度乘以隸屬度值之和,而μ(Zi)之和就是輸出值的隸屬度之和,咱們已經證實它是等於1的

 

 

PS:模糊控制表在相關書籍中都有,都是前輩的經驗,通常的無需修改便可,不過若是本身要配本身的數據也能夠本身配,邏輯關係理清楚就能夠了,反正我本身理來理去仍是挺鍛鍊對pid三個變量的理解的,固然不止pid,模糊控制也能夠單獨使用,很靈活的,重點就是各個參數範圍肯定,這是影響模糊控制最重要的因素。

 

 

2.轉自  https://blog.csdn.net/akunainiannian/article/details/41130347

matlab版本:matlab2010b

第一步:利用matlab模糊控制工具箱設計模糊控制器。

一、在matlab命令窗口中輸入 fuzzy ,產生以下窗口。

二、肯定模糊控制器結構,即根據具體的系統肯定輸入、輸出量。

這裏咱們能夠選取標準的二維控制結構,即輸入爲偏差e和偏差變化ec,輸出爲控制量u。輸入變量的添加經過 Edit -> Add Variable -> Input 實現。

三、語言值及隸屬函數的肯定。

首先咱們要肯定描述輸入輸出變量語言值的模糊子集,如{NB,NM,NS,ZE,PS,PM,PB},並設置輸入輸出變量的論域,例如咱們設置偏差E、偏差變化EC的論域爲[-6 6],控制量U的論域爲[-10 10];而後爲模糊語言變量選取相應的隸屬度函數。經過 Edit -> Membership Functions 打開隸屬度函數編輯器,而後分別對輸入輸出變量定義論域範圍,添加隸屬函數,以E爲例,設置論域範圍爲[-6 6],添加隸屬函數的個數爲7。(注:隸屬度函數編輯器初始時已爲每一個變量定義了3個隸屬函數,再經過 Edit -> Add MFs 添加隸屬函數時,個數選擇4便可)

四、模糊控制規則的制定。

對於咱們這個二維控制結構以及相應的輸入模糊集,咱們能夠制定49條模糊控制規則。

五、解模糊。

模糊控制器的輸出量是一個模糊集合,經過解模糊化方法判決出一個確切的精確量,解模糊化方法不少,咱們這裏選取重心法。

六、保存創建的模糊控制器。

File -> Export -> To File,文件名爲 fuzzy_control。

第二步:創建Simulink模型。

一、在matlab命令窗口中輸入simulink,產生以下窗口。

二、新建模糊控制器模型,樣式以下。

三、在matlab命令窗口下輸入 fuzzy = readfis('fuzzy_control') ,將以前創建的模糊控制器加載到工做空間,並將Fuzzy Logic Contrtoller的參數設置爲fuzzy。

四、保存該模型,命名爲 fuzzy_model

第三步:系統測試界面的設置。

一、經過 Tools -> System Test -> Launch System Test 進入系統測試界面。

二、添加測試模型。

鼠標選中Main Test ,菜單欄 Insert -> Test Element -> Simulink ,選擇第二步中創建的模型 fuzzy_model 。

三、變量定義。

在Test Vectors 項裏定義兩個測試向量,變量名分別爲 input一、input2,input1 = [-6:1:6], input2 = [-6:1:6];在Test Variables 裏定義測試變量,變量名爲output。

四、變量映射。

把測試向量input一、input2分別映射到模糊控制器的輸入口 in一、in2,作爲輸入測試信號。把測試變量 output 映射到模糊控制器輸出口out1。設置後的界面以下:

輸入測試向量到模糊模型輸入口映射:

 

模糊控制器輸出保存映射:

五、測試數據保存。

在測試界面點Save Results項,設置以下:

六、運行測試,注意在Main Test(169 Iterations)(169次迭代,運算代價),等待測試結束。

第四步:模糊控制查詢表的生成

一、系統測試結果保存在 stresults.ResultsDataSet.output 中,爲169*1 cell的單元數組。(注:單元cell爲 [n*1 double] 結構,表示系統被測試了n次)。

二、在matlab命令窗口下輸入 test_data = stresults.ResultsDataSet.output ,將測試結果另存在變量 test_data 中。

三、測試結果格式轉換。

因爲所建的二維查詢表爲13行13列,所需的數據應該爲13*13 double數組,但由於test_data爲 169*1 cell 的單元數組,沒法直接做爲表格數據輸入,所以需先進行格式轉換。

在matlab命令窗口下輸入 table_data = Cell2Array( test_data ,  1 , 13 , 13 ) ,調用Cell2Array函數,取每一個單元數組中的第一行元素,即第一次測試數據,返回結果保存在 table_data 中。

源碼以下:

 

四、新建二維查詢表模型,樣式以下:

五、點開二維查詢表進行以下設置:

六、點 Edit 按鈕,便可查看所生成的表格。 

 

PS:以上兩篇就是我基本完成的教程了,matlab由於本身不怎麼熟,因此折騰了挺久的,基本就是從matlab什麼都不懂到能夠完成這個仿真,而後我也把新手可能出現的一些問題講講吧。

 

看了第一篇以後到matlab模糊控制器的設置保存應該問題不大,以後就是創建仿真模型,由於歷來沒用過因此一竅不通,個人版本是2016b,界面也和上面的有些不一樣,但是吃了點苦頭,因此如下就是給新手看看的,不要笑我教的簡單哈

首先,simulink界面不一樣,個人是新版的

是這樣的界面,剛開始一臉懵逼不知道怎麼創建仿真模型

以後隨便點一個創建一個新的就好

這個界面以後點那個Library Browser,裏面有須要的元素,你就按上面那個圖把元素都複製過來就好

注意那個fuzzy的圖標,改變輸出的個數是雙擊它有選項,我當初找了半天硬是找不到,,

把該加的東西都放進去,鏈接好

而後在matlab命令行裏把以前保存的模型讀取出來

用readfis命令把以前保存的數據賦給變量fuzzy,模型名字大家取得是什麼就寫什麼

以後在仿真fuzzy圖形上雙擊,把參數設成fuzzy,就是上面的步驟

 

最後就是test了,很坑啊,matlab2016a以後的版本就沒有那個功能了,因此得用下別人的軟件來作最後的測試,以後就看着慢慢設置就好,我只作到了測試運行那一步,由於參數還要調整因此就沒到以後導表

 

大概就這麼多了,其實都是給新手講的,也想給本身留着複習複習,還有感謝各位在csdn裏留下的各類學習資料,謝謝

相關文章
相關標籤/搜索