元自適應(yīng)PID:Hedd學習規(guī)則與Simulink仿真實踐)
簡介單神經(jīng)元自適應(yīng)PID有監(jiān)督Hedd仿真資料包面向自動控制、智能算法方向的研究者與工程師聚焦傳統(tǒng)PID在非線性、時變系統(tǒng)下參數(shù)整定困難的問題利用單神經(jīng)元網(wǎng)絡(luò)實現(xiàn)增益在線自整定并通過有監(jiān)督方式優(yōu)化權(quán)重更新。壓縮包內(nèi)共6個文件包括2個Simulink模型slx、2個MATLAB腳本m以及2個Word文檔docx分別對應(yīng)連續(xù)系統(tǒng)與離散系統(tǒng)的仿真實現(xiàn)、核心算法代碼和理論說明。整個資源僅35KB輕量易用目前已有268人學習下載。通過該資源可快速掌握單神經(jīng)元自適應(yīng)PID的建模思路、有監(jiān)督學習機制及硬件在環(huán)仿真驗證方法適合課程設(shè)計、畢業(yè)設(shè)計或控制算法入門參考。1. 單神經(jīng)元自適應(yīng)PID用一個神經(jīng)元替掉三個回路做電機轉(zhuǎn)速、加熱爐溫度或者壓力調(diào)節(jié)的工程師大多經(jīng)歷過同一個坎PID參數(shù)在現(xiàn)場調(diào)得好好的工況一變超調(diào)就回來重新整定又得折騰半天。傳統(tǒng)自適應(yīng)控制理論漂亮可真落到項目里模型辨識還沒做完交付周期已經(jīng)撐不住了。單神經(jīng)元自適應(yīng)PID正好卡在這個縫里——它只有一個神經(jīng)元三個權(quán)值對應(yīng)PID的P、I、D三路增益靠有監(jiān)督Hedd學習規(guī)則在線修正不依賴對象模型Simulink里搭一個仿真半小時內(nèi)能跑通。下面把這個仿真拆開講控制器結(jié)構(gòu)怎么連、Hedd學習規(guī)則怎么寫、參數(shù)怎么定、發(fā)散時先查哪里最后給一套可以反復用的驗證腳本。2. 單神經(jīng)元PID的結(jié)構(gòu)設(shè)計與有監(jiān)督Hedd學習規(guī)則2.1 神經(jīng)元先替PID干一次加權(quán)求和傳統(tǒng)PID的輸出是一組固定系數(shù)的組合比例項壓當前誤差積分項消靜差微分項預(yù)測誤差趨勢。單神經(jīng)元PID做的事情在數(shù)學形式上幾乎一樣只是把三個固定增益換成了神經(jīng)元的三個權(quán)值。輸入 x1、x2、x3 分別接誤差、誤差積分、誤差微分輸出是三個輸入對權(quán)值的加權(quán)和。權(quán)值在每拍閉環(huán)結(jié)束后更新一次等效的 Kp、Ki、Kd 隨著工況在線變化這就是“自適應(yīng)”三個字的來源。這個結(jié)構(gòu)只有一個節(jié)點計算量小到可以在STM32這類單片機上實時跑裸機控制里加一個定時器中斷就能執(zhí)行。無人機串級PID中內(nèi)環(huán)參數(shù)難以手工整定常見的做法也是把內(nèi)環(huán)PID換成單神經(jīng)元自適應(yīng)PID外環(huán)仍然用普通PID讓內(nèi)環(huán)自己適應(yīng)姿態(tài)變化。相比級聯(lián)PID需要靠經(jīng)驗給內(nèi)環(huán)定參數(shù)單神經(jīng)元的優(yōu)勢是不需要被控對象模型只需要誤差和輸入輸出信號天然適合模型不清楚、參數(shù)會漂移的現(xiàn)場回路。為什么不做多層神經(jīng)網(wǎng)絡(luò)多層網(wǎng)絡(luò)需要訓練數(shù)據(jù)或者觀測器收斂時間不可控在實時控制回路里一個S函數(shù)延遲都可能引起振蕩。單神經(jīng)元本質(zhì)上是把“神經(jīng)網(wǎng)絡(luò)控制”裁剪到只剩一個可學習節(jié)點保留了在線調(diào)整能力去掉了訓練開銷。這也是這類方案在工程仿真里反復被拿出來對比的原因。2.2 有監(jiān)督Hedd規(guī)則誤差拿來做監(jiān)督信號Hedd學習規(guī)則可以理解為Hebb思想加監(jiān)督信號Hebb學習強調(diào)“一起激活的連接要增強”而這里權(quán)值更新的依據(jù)不是單純的相關(guān)性而是閉環(huán)誤差 e(k)。誤差小的時候權(quán)值基本不動誤差大的時候權(quán)值朝使誤差減小的方向修正。這樣控制器會在運行中自動找回合適的增益組合。我使用如下形式的權(quán)值更新式wi(k1) wi(k) eta(i) * e(k) * du(k) * xi(k)其中 wi(k) 是第 i 路權(quán)值eta(i) 是對應(yīng)學習率e(k) 是當前誤差du(k) 是控制器輸出增量xi(k) 是第 i 個輸入。乘上 du(k) 的目的是把控制動作的方向也作為監(jiān)督信號如果誤差為正而控制器輸出在減小說明這個方向的調(diào)整不利于消除誤差權(quán)值就會被反向修正。有些實現(xiàn)把 du(k) 換成誤差變化量 e(k)-e(k-1)兩種寫法在慢對象上收斂效果接近但帶 du 的形式在對象存在純滯后時更穩(wěn)定因為控制增量的變化比誤差變化更早反映執(zhí)行機構(gòu)的狀態(tài)。學習率 eta 分三路設(shè)置而不是共用一個值。比例路學習率影響響應(yīng)速度積分路學習率影響靜差消除微分路學習率影響阻尼統(tǒng)一用一個值很容易出現(xiàn)“上升變快了但高頻抖動也來了”的尷尬情況。這個細節(jié)在后面的參數(shù)表里展開。2.3 增量式輸出與三路輸入的定義單神經(jīng)元PID輸出采用增量式結(jié)構(gòu)du K * sum(wi .* x); % 神經(jīng)元輸出增量 u u du; % 對控制量累加x 的三路輸入定義為x1 e(k); % 比例項信息 x2 e(k) x2_prev; % 積分項累加 x3 (e(k) - e_prev) / Ts; % 微分項近似用增量式而不是位置式有一層實際考慮位置式輸出直接給執(zhí)行機構(gòu)一旦積分項累積失控控制量會一次性跳變增量式每一拍只輸出變化量即使丟掉一兩拍執(zhí)行機構(gòu)也能維持上一拍的位置對帶閥門的機構(gòu)更友好。下面是這套控制器的主要參數(shù)清單后續(xù)仿真里的初值都從這張表出發(fā)。參數(shù)含義初值參考K神經(jīng)元輸出增益整體放大系數(shù)0.11.0eta(1)比例路學習率0.050.4eta(2)積分路學習率0.020.2eta(3)微分路學習率0.010.3wi三個權(quán)值初值0.1 左右Ts采樣周期對象時間常數(shù)的 1/101/203. 用Simulink和m腳本搭一套可復現(xiàn)的有監(jiān)督Hedd仿真3.1 Simulink各模塊的連接與求解器設(shè)置常見做法是在Simulink里搭一個固定步長離散仿真模塊連接順序是Step信號源進入Sum塊做誤差計算誤差三路分別接入MATLAB FunctionMATLAB Function輸出控制增量du經(jīng)過Unit Delay模塊和一個Sum累加得到實際控制量u之后接Saturation限幅再傳給被控對象模型對象輸出反饋回Sum形成閉環(huán)另外分一路到Scope觀察響應(yīng)曲線。啟動仿真第一件事不是改參數(shù)而是設(shè)置求解器。在Model Settings里把求解器類型從Variable-step改成Fixed-step求解器選discreteFixed-step size填0.01。如果不改變步長求解器會在一個控制周期內(nèi)多次調(diào)用MATLAB Function權(quán)值在同一拍里被更新很多次等效學習率被放大幾十倍結(jié)果就是仿真發(fā)散——這不是算法問題是求解器配置問題很多單神經(jīng)元PID仿真“跑不起來”都是這個原因。MATLAB Function內(nèi)部接口可以這樣組織輸入是誤差及其積分微分輸出是增量權(quán)值用persistent變量保持function du snpid_block(e, ei_sum, ed, p) % p.K 神經(jīng)元增益p.eta(1:3) 三個學習率 persistent wi if isempty(wi) wi [0.1 0.1 0.1]; end x [e, ei_sum, ed]; du p.K * (wi * x); % 有監(jiān)督Hedd權(quán)值更新 wi wi p.eta .* e .* du .* x; wi min(max(wi, -5), 5); % 限幅 end這里把權(quán)值限幅直接寫進了函數(shù)避免在參數(shù)面板里額外接模塊。du作為增量輸出外部再用Unit Delay累加函數(shù)內(nèi)部不保存上一拍的控制量邏輯更清晰也方便單獨測試權(quán)值更新部分。3.2 不依賴Simulink的最小復現(xiàn)腳本如果身邊只有MATLAB基礎(chǔ)環(huán)境或者想先確認算法本身沒問題我習慣先跑一個純m腳本。被控對象選用三階慣性環(huán)節(jié)頻域特性更接近溫度或壓力對象也更容易暴露積分路參數(shù)過大的發(fā)散行為。%% 單神經(jīng)元自適應(yīng)PID有監(jiān)督Hedd仿真獨立腳本 clear; clc; Ts 0.01; T_end 10; N T_end / Ts 1; t (0:N-1) * Ts; r ones(1, N); r(1:100) 0; % 1s后給單位階躍 % 被控對象離散化G(s) 1/(s1)^3 s tf(s); Gd c2d(1/(s1)^3, Ts, zoh); [num, den] tfdata(Gd, v); % 控制器參數(shù)初值 K 0.6; eta [0.30 0.15 0.10]; wi [0.1 0.1 0.1]; w_lo -5; w_hi 5; u_lo -1; u_hi 1; y zeros(1, N); u zeros(1, N); e zeros(1, N); ei_sum 0; e_prev 0; for k 1:N-1 e(k) r(k) - y(k); % 當前誤差 ei_sum ei_sum e(k) * Ts; % 積分項累加 x [e(k), ei_sum, (e(k) - e_prev) / Ts];% 三路輸入 du K * (wi * x); % 神經(jīng)元增量輸出 u(k1) u(k) du; u(k1) min(max(u(k1), u_lo), u_hi); % 控制量限幅 % 被控對象差分方程三階zoh離散模型 if k 3 y(k1) -den(2)*y(k) - den(3)*y(k-1) - den(4)*y(k-2) ... num(2)*u(k) num(3)*u(k-1) num(4)*u(k-2); else y(k1) 0; % 前幾拍沒有歷史數(shù)據(jù) end % 有監(jiān)督Hedd權(quán)值更新 for i 1:3 wi(i) wi(i) eta(i) * e(k) * du * x(i); wi(i) min(max(wi(i), w_lo), w_hi); end e_prev e(k); end figure; subplot(2,1,1); plot(t, r, --, t, y, -); ylabel(y); grid on; legend(指令,響應(yīng)); xlim([0 T_end]); subplot(2,1,2); plot(t, u); ylabel(控制量 u); grid on; xlabel(t/s);代碼里c2d用的zoh保持器這是執(zhí)行機構(gòu)通常的零階保持特性比tustin變換更接近真實離散控制場景。差分方程中num和den是離散傳遞函數(shù)的分子分母系數(shù)長度為4對應(yīng)三階對象。控制器每拍執(zhí)行順序是先算誤差再算三路輸入然后計算增量并累加最后用誤差、增量、輸入三者一起更新權(quán)值。順序不能亂如果先更新權(quán)值再用新權(quán)值計算du等效于把當前拍的誤差重復利用了兩次學習過程會明顯變快但更容易振蕩。3.3 Simulink側(cè)常用的參數(shù)傳遞與監(jiān)視方式復雜一點的仿真會把參數(shù)定義在模型工作區(qū)里MATLAB Function通過參數(shù)對象傳入而不是把數(shù)值硬編碼在函數(shù)內(nèi)部。這樣改一組參數(shù)不需要打開函數(shù)編輯器。監(jiān)視權(quán)值變化時從函數(shù)單獨輸出wi數(shù)組接一個Demux和Scope就能看到三路權(quán)值如何自適應(yīng)調(diào)整當對象特性變化時權(quán)值曲線會明顯移動這是判斷控制器“確實在學習”的最直觀證據(jù)。4. 仿真發(fā)散與參數(shù)整定單神經(jīng)元PID最容易踩的3個坑4.1 K過大的典型發(fā)散形式與Ziegler-Nichols思路的區(qū)別單神經(jīng)元PID的K參數(shù)類似傳統(tǒng)PID的總增益但它不是直接乘在誤差上而是乘在神經(jīng)元輸出增量上所以K影響的是每拍控制量變化的步長。K設(shè)到2以上仿真往往表現(xiàn)為等幅振蕩曲線像鋸齒一樣來回沖K小于0.05時輸出緩慢逼近10秒仿真結(jié)束可能還沒到目標值。傳統(tǒng)Ziegler-Nichols方法要先加大比例增益找到臨界振蕩點再按經(jīng)驗公式回退單神經(jīng)元PID不必走這套流程。K從0.1開始每輪仿真增加0.1看響應(yīng)曲線的上升時間和是否出現(xiàn)初期的振鈴現(xiàn)象一般三次就能定下來。K值依賴對象的時間常數(shù)溫度對象時間常數(shù)幾百秒K可以小到0.01電機轉(zhuǎn)速這類快速對象K反而要給到0.5以上腳本里要注意對象的量綱。4.2 三路學習率的分工與經(jīng)驗范圍學習率直接決定權(quán)值每拍變化的幅度。下面是不同對象的參數(shù)調(diào)整側(cè)重點適合仿真初期對照使用。對象類型eta(1) 比例路eta(2) 積分路eta(3) 微分路主要風險溫度/壓力慢對象0.100.300.050.100.010.05積分率過大引發(fā)低頻振蕩電機轉(zhuǎn)速中等對象0.200.400.080.150.050.10比例率過大會超調(diào)快速伺服/流量對象0.050.200.020.050.100.30微分率過大會放大噪聲調(diào)試時先固定比例路觀察階躍響應(yīng)有沒有等幅振蕩有振蕩就降eta(1)響應(yīng)慢就升K這個環(huán)節(jié)和普通PID整定手感一致。靜差一直存在的場景優(yōu)先加eta(2)而不是加積分輸入項的限幅范圍因為積分路學習率太小會讓權(quán)值長時間停留在當前值附近等效的Ki根本跟不上對象漂移。微分路在仿真中幾乎不會引起問題但中式慢對象里微分權(quán)值會異常增大因為微分輸入項本身長期接近零誤差的微小變化就會帶來較大的相對波動這時需要給權(quán)值限幅收緊。4.3 “仿真發(fā)散”時先檢查什么仿真發(fā)散的表現(xiàn)分三類對象輸出直線沖頂不回頭輸出等幅振蕩且幅度越來越大控制量長期貼在限幅上下沿。遇到這些情況按順序排查先看Scope里u曲線是否在±1的限幅上來回頂再看三路權(quán)值是否被推到±5限幅墻上最后檢查誤差積分項是否已經(jīng)累積到遠超對象需要的量級。積分累積過大是很隱蔽的問題。限幅后誤差一直存在權(quán)值按 e(k)dux 的規(guī)律持續(xù)更新積分路的權(quán)值會不斷朝同一方向增長等效Ki越滾越大形成正反饋。一個實用的處理辦法是在飽和期間停止或減半更新權(quán)值% 限幅飽和時降低權(quán)值更新強度防止積分權(quán)值跑偏 if u_lo u(k1) u(k1) u_hi wi wi eta .* e(k) .* du .* x; else wi wi 0.5 * eta .* e(k) .* du .* x; end注意這個判斷用u(k1)也就是已經(jīng)限幅后的值如果u已經(jīng)貼邊說明執(zhí)行機構(gòu)到頂繼續(xù)讓權(quán)值同向增長沒有意義減半更新的同時等待誤差反向即可。還有一類發(fā)散是從Simulink里把變步長求解器忘了改回來優(yōu)先檢查求解器設(shè)置再回到這節(jié)的參數(shù)問題。5. 從仿真到可用單神經(jīng)元PID的驗證腳本與小技巧5.1 用自動掃描腳本縮小K和eta的初步范圍手動調(diào)參試幾輪能穩(wěn)住但說不好是不是局部最優(yōu)。固定步長仿真跑一輪只要幾十毫秒掃描整個參數(shù)空間也只需幾分鐘。把上一章的仿真主體封裝成函數(shù)輸入K和eta輸出誤差序列再用ITAE指標做排序最省事。function itae run_snpid_sim(K, eta, Ts) % 返回ITAE指標 % ... 主體代碼與第3章循環(huán)一致 ... end best_itae inf; for K 0.1:0.1:1.0 for et1 0.1:0.1:0.5 for et2 0.05:0.05:0.25 itae run_snpid_sim(K, [et1, et2, 0.1], 0.01); if itae best_itae best_itae itae; best_K K; best_eta [et1, et2, 0.1]; end end end end fprintf(K%.2f eta[%.2f %.2f %.2f] ITAE%.4f\n, ... best_K, best_eta, best_itae);ITAE對誤差持續(xù)時間的懲罰比ISE更重優(yōu)先抑制長時間靜差符合控制系統(tǒng)整定習慣。掃描得到的參數(shù)需要回到Simulink里帶限幅驗證一次腳本中如果沒寫限幅得到的參數(shù)在真實執(zhí)行機構(gòu)條件下不一定成立。5.2 檢驗自適應(yīng)性直接改被控對象參數(shù)參數(shù)確定后把被控對象從1/(s1)^3改成1/(1.5s1)^3重新運行同一套仿真觀察響應(yīng)是否仍然收斂。權(quán)值曲線在這一步會重新分布說明控制器在根據(jù)誤差調(diào)整參數(shù)。如果響應(yīng)發(fā)散回到第4章的排查流程重點看學習率是否需要整體縮小。仿真發(fā)散在參數(shù)掃描階段就能避免這里只是最后確認。5.3 一個容易被忽略的工程細節(jié)微分輸入項在離散實現(xiàn)里除以Ts仿真步長固定時沒問題但移植到單片機后定時器周期如果有抖動微分項會突然變大。常見做法是把輸入定義成不除Ts的差分形式讓采樣周期在權(quán)值里被吸收再配合限幅處理。從仿真到實物的差距往往不在算法本體的收斂性而在這些定時、限幅、單位換算的細節(jié)上仿真通過只是第一步。本文還有配套的精品資源點擊獲取