PID原理及調參經驗
什麼是PID以及為什麼要用PID
PID是一種控制演算法,舉個比較簡單的例子,給你一個任務,讓一個漏水的水缸保持一半的水,在沒有學習任何演算法情況下,我們一般會一直去觀察水位是高於還是低於中間水位,低於中間水位時你就會開水龍頭,高於中間水位時你就會關水龍頭,這樣就可以讓水位一直保持在中間水位附近。這也是一種控制。從上面的例子以及結合下圖我們引入幾個重要的概念。
在上面的例子中我們用眼睛去觀察水位到了哪個位置,其實眼睛就是個測量元件,是用來觀察的,輸入就是中間水位,我們用眼睛去比較實際的水位是不是高於或者低於中間水位,在我們的大腦裡面運算調節,通過執行機構也就是我們的手,來調節水龍頭的閥門也就是輸出,從而使水位一直在中間水位附近,當然,肯定有人會問,為什麼會漏水呢?因為在實際工程中都會有一些損耗,比如電機摩擦的阻力,電磁損耗等。
u(k)=Kp * e( k )+ Ki * e( r ) + Kd * [e(k)-e(k-1]
PID的離散公式如上,Kp為比例係數,ki為積分系數,Kd為微分系數,e(k)為本次偏差,e(k-1)為上次偏差,e( r )為系統開始執行到結束所累加的誤差,u(k)為輸出,具體的數學推導請讀者自行百度。
既然是要學習,那麼現在我們我們用PID演算法來對水位進行具體的控制。我們規定中間水位為5m,將水龍頭和水缸分離,以水缸的水位作為單位,水缸的刻度精度為0.01m,水缸每秒的漏水量為0.1m水位,每次加水的時間為1s。現在,我們先只使用比例控制,也就是,u(k)=Kpe(k),我們每次的加水量u(k)等於比例係數Kp當前的水位與設定水位的偏差e(k),我們讓kp=0.4。假設現在水缸裡沒有水,根據上面的公式,我們第一次觀察到的偏差為5-0=5m,所以我們第一次加水量為,5x0.4=2.0m,現在第一次加水完畢之後,減去漏水量0.1m,所以現在水缸裡實際水量為2.0-0.1=1.9m,依次類推,我們得到下表,用MATLAB直接做圖,如下圖
通過觀察表格我們發現,從第14次加水之後,也就是當水缸裡的水位達到4.75m的時候,水缸的水位不再變化,為什麼水位不再上升呢?我們來算一下,中間水位為5m,我們在第13次加水之後觀察到的偏差為5-4.75=0.25,在乘以Kp,也就等於0.1m,到了這時候,我們加入的水剛好等於漏掉的水,水位不再上升。這裡我們引入一個新的概念,穩態誤差。簡單理解就是當我們只採用了比例調節,我們的輸出剛好等於損耗時,系統達到平衡,但是我們的輸入和輸出之間仍然有偏差的,我們就稱之為穩態誤差。
但是需要加13次水才可以到達平衡,響應速度慢,而且還存在穩態誤差,那我們可不可以通過放大比例係數Kp來快速到達設定水位且消除穩態誤差呢?這裡我們讓Kp=1.8,看看會發生什麼
結果顯示,系統響應明顯加快,穩態誤差從0.25m減少到了5-4.93=0.07m,所以增大比例係數Kp可以減小穩態誤差,但是不能消除,而且Kp過大輸出會在設定值也就是我們的中間水位之間震盪,這樣的結果顯然不是我們想要的。
因為從公式中我們可以看出比例調節是一種有差調節,也就是隻有當e(k)不等於零的時候,才會有輸出值,當e(k)=0時,實際水位等於中間水位,系統輸出為零,但是實際水位會一直中間水位嗎?不會,因為會漏水。所以無論我們選取的Kp值有多大,穩態誤差都會存在。那麼我們應該在系統不震盪的情況下,儘量增大Kp的值,讓系統的響應變快,減少穩態誤差。最終選定了Kp=1.0,結果如下,穩態誤差為0.11m,且只需加兩次水就可以達到平衡。
所以我們對比三次實驗可以得出結論:Kp越大,系統的響應越快,但是系統容易震盪,穩定性變差;Kp越小,響應時間越慢,調節時間變長,所以Kp的選取應該在系統不震盪,超調量不大的情況下往大調。
那麼問題來了,穩態誤差存在,水位還是沒達到設定水位,怎麼樣才能正確地消除穩態誤差呢?上面公式中的積分項e( r )為系統開始執行到結束所累加的誤差,但是誤差不能毫無限度的累加,需要對其限幅,我們需要根據系統的實際情況選擇合適的限幅值,這裡我們令e( r )=[-2,2],現在我們嘗試看看加入積分項能不能消除穩態誤差。我們將Kp=1.0,ki=0.1。如上例進行計算,我們得到表格。
通過觀察表格我們發現,最終實際水位最終會基本達到中間水位,在比例控制的基礎上加入積分控制就可以消除穩態誤差。但是加了37次水才可以讓實際水位等於設定水位,而且會引起超調。我們試著把Ki增大,令Kp=1.0,ki=0.3,結果如下
結果我們發現,增大Ki之後,只需要加16次水就可以設定水位,但是超調量變大了。在將Ki增大,令Kp=1.0,Ki=0.5,結果如下
結果我們發現,繼續增大Ki之後,只需要加11次水就可以設定水位,但是超調量變得更大了。我們對比三次實驗可以得出結論,增大Ki會引起超調,Ki越大,超調量越大,但是回覆更快,減小Ki超調量減小,但是回覆變慢,所以Ki引數的選取應該根據系統的實際情況。
但是有沒有辦法能夠讓超調量減少呢?當然有,那就是微分項,微分的公式為Kd*[e(k)-e(k-1],e(k)為本次偏差,e(k-1)為上次偏差,從公式上理解為,當本次偏差大於上次偏差時,微分項就會輸出來抑制這種偏差偏大的趨勢,起到一種預判的作用,既然是這樣,上例中積分超調變化算是一種誤差變大的趨勢,為了能夠更好地讓讀者理解微分項的作用,我們直接對比沒有微分項Kp=0.6,ki=0.5,Kd=0與有微分項時Kp=0.6,ki=0.5,Kd=0.1的資料與波形對比
無微分項的表格
無微分項的波形
有微分項的表格
有微分項的波形
通過對比我們發現,加入微分項之後,超調量比之前小了,說明微分確實能夠減少超調量,但是通過觀察資料你會發現,沒有微分項的時候,水位一直在平衡位置有小幅度的震盪,但是在加入微分項之後就消失了。這是因為加入微分項可以改善系統的動態效能,也就是當已經到達平衡之後又出現偏差時,當前偏差減去上次偏差不為零,微分項有輸出,會去抑制這種變化,讓系統保持平衡。
到這裡,總結一下,在整定比例係數Kp時,Kp越大,系統的響應越快,但是系統容易震盪,穩定性變差;Kp越小,響應時間越慢,調節時間變長,所以Kp的選取應該在系統不震盪,超調量不大的情況下往大調;在整定積分系數Ki時,增大Ki會引起超調,Ki越大,超調量越大,但是回覆更快,減小Ki超調量減小,但是回覆變慢,所以Ki引數的選取應該根據系統的實際情況;增加微分項可以減少超調量,而且可以改善系統的動態效能。但在實際工程應用中,可以根據實際情況使用PI調節或者PID調節。
相關文章
- 驗證碼原理及驗證
- Git 使用經驗及心得Git
- [轉帖]基礎篇:JVM調優原理相關的知識和經驗分享JVM
- 建模調參
- lightgbm調參
- 校驗支付寶PID正規表示式
- SpringBoot初體驗及原理解析Spring Boot
- 建模與調參
- PID
- 智慧控制基礎實驗3:數字PID控制
- Presto記憶體調優及原理(基礎篇)REST記憶體
- 微前端調研及簡析SPA實現原理前端
- IEEE Access投稿步驟及投稿經驗
- matlab模糊控制工具箱使用和模糊控制pid例項參考Matlab
- 大資料經典學習路線(及供參考)大資料
- 無源互調分析儀PIM Analyzer原理及應用
- PID控制
- 前端學習路線及面試經驗前端面試
- LightGBM核心解析與調參
- 15.調參(Tuning hyperparameters)
- 使用argparse進行調參
- 常見的PID的演算法及程式碼示例演算法
- Web前端經典面試試題及答案(參考連結)Web前端面試
- TiDB 查詢優化及調優系列(四)查詢執行計劃的調整及優化原理TiDB優化
- PGA自動管理原理深入分析及效能調整(五)
- PGA自動管理原理深入分析及效能調整(一)
- PGA自動管理原理深入分析及效能調整(六)
- CRC校驗查表法原理及實現(CRC-16)
- 生產管理-移動端品質檢驗及裝置管理-行業經驗及方案行業
- 卷積神經網路的原理及Python實現卷積神經網路Python
- pid,sid相互查詢,根據PID查詢sqlSQL
- 【nginx】invalid PID number ““ in “/usr/local/nginx/logs/nginx.pid“Nginx
- Lucene底層原理和最佳化經驗分享(1)-Lucene簡介和索引原理索引
- Spark 模型選擇和調參Spark模型
- AI崗位秋招紀實:演算法原理紮實才是王道,而不是調參AI演算法
- vue元件通訊--注意事項及經驗總結Vue元件
- vue元件通訊–注意事項及經驗總結Vue元件
- 全連線神經網路的原理及Python實現神經網路Python