模型自適應(yīng)控制MATLAB仿真實(shí)現(xiàn)與對(duì)比分析)
做控制算法驗(yàn)證我最不喜歡的工作就是每換一套被控對(duì)象就要重新推一遍模型更不用說(shuō)在模型失配之后再去調(diào)一堆觀測(cè)器和狀態(tài)估計(jì)參數(shù)。這套數(shù)值驗(yàn)證仿真程序解決的就是這個(gè)痛點(diǎn)MFAPC無(wú)模型自適應(yīng)預(yù)測(cè)控制和 MFAILC無(wú)模型自適應(yīng)迭代學(xué)習(xí)控制在理論上都不需要顯式建模只靠輸入輸出數(shù)據(jù)就能在線或迭代地調(diào)整控制律。我用 MATLAB 把兩個(gè)算法從公式落成了可運(yùn)行的代碼能在同一框架下對(duì)比跟蹤誤差、抗干擾能力和參數(shù)敏感度。自動(dòng)化專業(yè)學(xué)生、剛開(kāi)始接觸數(shù)據(jù)驅(qū)動(dòng)控制的研究生以及想快速驗(yàn)證算法效果的工程師都可以拿這套程序做基線。下面從原理到實(shí)現(xiàn)再到調(diào)試經(jīng)驗(yàn)和結(jié)果解讀把整個(gè)程序講透。1. 從模型依賴到數(shù)據(jù)驅(qū)動(dòng)這兩種算法到底在解決什么問(wèn)題1.1 傳統(tǒng)控制為什么繞不開(kāi)建模大多數(shù)經(jīng)典控制方法的第一步都是建模。PID 雖然不需要精確模型但參數(shù)整定嚴(yán)重依賴工程經(jīng)驗(yàn)MPC 需要預(yù)測(cè)模型滑模、反步法更是離不開(kāi)對(duì)象微分方程。真實(shí)工業(yè)對(duì)象往往有強(qiáng)非線性、參數(shù)時(shí)變和未建模動(dòng)態(tài)模型越精細(xì)計(jì)算開(kāi)銷和辨識(shí)成本越高模型一旦失配控制性能掉得比誰(shuí)都慘。無(wú)模型自適應(yīng)控制MFAC的出發(fā)點(diǎn)很直接既然精確模型難拿那就干脆放棄模型把被控對(duì)象在每一個(gè)工作點(diǎn)附近用一個(gè)非常簡(jiǎn)單的時(shí)變線性關(guān)系近似出來(lái)。這個(gè)“時(shí)變線性關(guān)系”不是我們對(duì)物理機(jī)理的假設(shè)而是一種數(shù)學(xué)上的等價(jià)轉(zhuǎn)化。只要對(duì)象滿足一定的有界性和光滑性條件在相鄰兩個(gè)采樣時(shí)刻之間輸入變化和輸出變化之間就存在一個(gè)時(shí)變系數(shù)。1.2 緊格式動(dòng)態(tài)線性化與偽偏導(dǎo)數(shù)MFAC 家族里最常用的是緊格式動(dòng)態(tài)線性化Compact Form Dynamic LinearizationCFDL。對(duì)離散時(shí)間非線性系統(tǒng)CFDL 說(shuō)的是Δy(k1) φ(k)·Δu(k)其中 Δy(k1) y(k1) - y(k)Δu(k) u(k) - u(k-1)。這里的 φ(k) 叫作偽偏導(dǎo)數(shù)Pseudo Partial DerivativePPD。注意它并不是對(duì)象的真實(shí)偏導(dǎo)數(shù)而是一個(gè)吸收了對(duì)象非線性、時(shí)變特性和外部擾動(dòng)影響的時(shí)變參數(shù)本質(zhì)上可以看成當(dāng)前工作點(diǎn)附近的“等效增量增益”。這個(gè)式子有什么好處好處特別大控制器設(shè)計(jì)不再需要知道 f 的具體形式只需要在線估計(jì) φ(k)。一個(gè)標(biāo)量參數(shù)用差分?jǐn)?shù)據(jù)就能遞推辨識(shí)出來(lái)這就是整個(gè)程序的核心底層。只要 φ 估計(jì)得準(zhǔn)控制律就可以設(shè)計(jì)成“用當(dāng)前預(yù)測(cè)誤差除以等效增益”的形式。1.3 MFAPC 和 MFAILC 的分工邏輯MFAPC 和 MFAILC 雖然都建立在 CFDL 基礎(chǔ)上解決的是兩類不同問(wèn)題。MFAPC 針對(duì)的是實(shí)時(shí)在線控制系統(tǒng)在同一個(gè)時(shí)間軸上連續(xù)運(yùn)行控制器每個(gè)采樣周期都要決策一個(gè)控制增量。它把預(yù)測(cè)控制里的“滾動(dòng)優(yōu)化、反饋校正”思想搬到了無(wú)模型框架下用預(yù)測(cè)時(shí)域內(nèi)的輸出偏差來(lái)反推當(dāng)前控制量。因?yàn)?PPD 是隨時(shí)間在線更新的對(duì)象特性變了φ(k) 會(huì)跟著變控制律也隨之調(diào)整所以它對(duì)時(shí)變系統(tǒng)有天然的適應(yīng)能力。MFAILC 針對(duì)的是重復(fù)運(yùn)動(dòng)過(guò)程機(jī)械臂每次執(zhí)行同一個(gè)軌跡、注塑機(jī)每個(gè)批次走同樣的工藝曲線、電機(jī)反復(fù)跟蹤同一個(gè)速度曲線。這類系統(tǒng)的特點(diǎn)是時(shí)間軸不再單獨(dú)存在而是嵌套在“批次數(shù)”里面。迭代學(xué)習(xí)控制每一次運(yùn)行結(jié)束后用本次的跟蹤誤差去修正下一輪的輸入軌跡讓誤差隨迭代次數(shù)逐步衰減。它的控制作用不是采樣時(shí)刻的瞬時(shí)調(diào)整而是整個(gè)輸入序列在“迭代軸”上的演進(jìn)。說(shuō)白了MFAPC擅長(zhǎng)對(duì)象特性在變、任務(wù)實(shí)時(shí)變化的情況MFAILC擅長(zhǎng)任務(wù)固定、重復(fù)運(yùn)行、希望越跑越準(zhǔn)的情況。仿真程序同時(shí)實(shí)現(xiàn)這兩個(gè)算法最大的價(jià)值就是可以把同一套被控對(duì)象放進(jìn)兩種運(yùn)行模式里直接量化它們的差異。2. 仿真程序整體架構(gòu)與驗(yàn)證指標(biāo)設(shè)計(jì)2.1 程序模塊劃分整套程序按模塊拆分會(huì)更清楚我實(shí)際編寫(xiě)時(shí)分成四塊對(duì)象模塊被控對(duì)象的差分方程、非線性算式、時(shí)變參數(shù)切換邏輯統(tǒng)一封裝成函數(shù)方便替換??刂破髂KMFAPC 主循環(huán)和 MFAILC 雙層循環(huán)分別實(shí)現(xiàn)兩者共用 PPD 估計(jì)器函數(shù)。信號(hào)模塊參考軌跡生成、干擾疊加、噪聲注入、輸入約束限幅。分析模塊誤差指標(biāo)計(jì)算、曲線繪制、迭代收斂趨勢(shì)統(tǒng)計(jì)。這種劃分的好處是改對(duì)象不用動(dòng)控制器調(diào)控制器不用動(dòng)對(duì)象。仿真實(shí)驗(yàn)最怕的就是把對(duì)象邏輯和控制邏輯耦合在一起后面想換一個(gè)被控對(duì)象改代碼改到懷疑人生。2.2 驗(yàn)證對(duì)象與基線設(shè)計(jì)程序里建議至少準(zhǔn)備三個(gè)被控對(duì)象線性定常系統(tǒng)用于理論驗(yàn)證檢測(cè)算法實(shí)現(xiàn)是否準(zhǔn)確。非線性時(shí)變系統(tǒng)用于驗(yàn)證自適應(yīng)能力比如參數(shù)在運(yùn)行中途突變。帶輸出噪聲和外部干擾的系統(tǒng)用于驗(yàn)證魯棒性。我個(gè)人用的典型線性對(duì)象是y(k1) 1.2·y(k) - 0.4·y(k-1) 1.0·u(k) 0.8·u(k-1)非線性對(duì)象則用經(jīng)典算例y(k1) y(k)/(1 y(k)^2) u(k) 0.7·u(k-1)第二個(gè)對(duì)象在 y 接近零點(diǎn)時(shí)增益變化明顯能比較充分地考察 PPD 估計(jì)器跟不跟得上。參考軌跡可以選方波、正弦、斜坡或者梯形速度曲線。這里建議不要只用階躍因?yàn)殡A躍參考對(duì)預(yù)測(cè)控制太友好了不容易暴露問(wèn)題。我習(xí)慣用帶突變的正弦組合比如 0~200 步正弦200~400 步切換成方波這樣可以一次看夠穩(wěn)態(tài)跟蹤和瞬態(tài)響應(yīng)。2.3 評(píng)價(jià)指標(biāo)如何設(shè)計(jì)指標(biāo)直接影響結(jié)論的可信度不要只看最后一張圖。RMSE 用于衡量整體跟蹤精度公式不用多說(shuō)就是誤差平方和開(kāi)根號(hào)。MaxAbsError 用于衡量峰值偏差特別能反映突變點(diǎn)的表現(xiàn)??刂颇芰?ΣΔu2 用于衡量控制量抖動(dòng)程度。兩個(gè)算法精度差不多的時(shí)候誰(shuí)的輸入更平穩(wěn)工程上更重要。迭代收斂速度MFAILC專用定義第一次滿足 RMSE 閾值所需迭代次數(shù)。評(píng)價(jià)時(shí)建議固定對(duì)象和參考軌跡單獨(dú)變化算法參數(shù)記錄指標(biāo)到二維表里。沒(méi)有量化對(duì)比就直接畫(huà)曲線說(shuō)“效果不錯(cuò)”的基本等于沒(méi)做驗(yàn)證。3. 核心算法與 MATLAB 實(shí)現(xiàn)細(xì)節(jié)3.1 被控對(duì)象離散模型與信號(hào)生成MATLAB 里被控對(duì)象直接寫(xiě)成函數(shù)比如非線性對(duì)象function y_next plant_nonlinear(y, y_prev, u, u_prev, a_noise) y_next y / (1 y^2) u 0.7 * u_prev a_noise * randn; end對(duì)象函數(shù)建議把噪聲強(qiáng)度作為參數(shù)傳進(jìn)來(lái)這樣在對(duì)比算法時(shí)可以保持完全相同的一組隨機(jī)種子結(jié)果才有可對(duì)比性。仿真中不要每次運(yùn)行都改變隨機(jī)種子否則你很難判斷性能差異來(lái)自算法還是噪聲。我習(xí)慣在腳本開(kāi)頭用 rng(2024) 固定隨機(jī)流確保重復(fù)實(shí)驗(yàn)得到一致結(jié)果。3.2 MFAPC 控制器實(shí)現(xiàn)MFAPC 的核心循環(huán)分三步PPD估計(jì)、構(gòu)建預(yù)測(cè)矩陣、求解控制增量。PPD 估計(jì)器采用帶重置的遞推格式φ?(k) φ?(k-1) η·Δu(k-1)·(Δy(k) - φ?(k-1)·Δu(k-1)) / (μ Δu(k-1)2)重置條件為 |φ?(k)| 小于閾值、Δu(k) 過(guò)小或者 φ? 符號(hào)跳變此時(shí)令 φ?(k) φ??。這里的 μ 是個(gè)很小的正數(shù)主要防止分母為零。沒(méi)有重置機(jī)制的 PPD 估計(jì)器很容易在對(duì)象增益接近零時(shí)把參數(shù)沖到很大。預(yù)測(cè)模型的構(gòu)造是 MFAPC 與普通 MFAC 的核心區(qū)別。CFDL 一次只給出了 Δy(k1) 和 Δu(k) 的關(guān)系若要預(yù)測(cè)未來(lái) N_y 步需要假設(shè) PPD 在預(yù)測(cè)時(shí)域內(nèi)近似不變。于是?(ki) y(k) φ?(k)·[Δu(k) Δu(k1) ... Δu(ki-1)]寫(xiě)成矩陣形式就是Y Y? Φ·ΔU其中 Φ 是 N_y × N_u 的下三角矩陣行越往下包含的 Δu 項(xiàng)越多。目標(biāo)函數(shù)選經(jīng)典預(yù)測(cè)控制形式J ‖Yr - Y‖2 λ·‖ΔU‖2對(duì) ΔU 求極值得到ΔU(k) (Φ?Φ λI)?1·Φ?·(Yr - Y?)實(shí)際只取 ΔU(k) 第一項(xiàng)作為當(dāng)前控制增量。核心代碼大致是這樣for k 3 : Nsim dy y(k) - y(k-1); du u(k-1) - u(k-2); % 1. PPD 估計(jì) denom mu du^2; phihat(k) phihat(k-1) eta * du / denom * (dy - phihat(k-1) * du); % 2. 重置機(jī)制 if abs(phihat(k)) eps_phi || abs(du) eps_du phihat(k) phihat0; end % 3. 構(gòu)建預(yù)測(cè)矩陣 Phi: Ny x Nu Phi zeros(Ny, Nu); for i 1 : Ny for j 1 : min(i, Nu) Phi(i, j) phihat(k); end end Y0 y(k) * ones(Ny, 1); Yr ref(k1 : kNy); dU (Phi * Phi lambda * eye(Nu)) \ (Phi * (Yr - Y0)); u(k) u(k-1) rho * dU(1); % rho 是步長(zhǎng)因子 end這里面最容易被忽略的是矩陣維度。預(yù)測(cè)時(shí)域 N_y 必須大于等于控制時(shí)域 N_u否則 Φ 不是“列滿秩×帶寬三角”的正常結(jié)構(gòu)求解時(shí)數(shù)值性質(zhì)很差。一般推薦 N_y 取 3~5N_u 取 1~2不是越大越好。3.3 MFAILC 控制器實(shí)現(xiàn)MFAILC 的結(jié)構(gòu)跟 MFAPC 完全不同它是雙層循環(huán)外層是迭代次數(shù) j內(nèi)層是時(shí)間 k。每一輪迭代先用當(dāng)前輸入軌跡跑一遍對(duì)象記錄完整的輸出軌跡然后按時(shí)間點(diǎn)逐個(gè)更新輸入序列。PPD 在迭代軸上的估計(jì)方式是φ??(k) φ????(k) η·Δu???(k)·(Δy???(k1) - φ????(k)·Δu???(k)) / (μ Δu???(k)2)注意這里每個(gè)時(shí)間點(diǎn) k 都有自己獨(dú)立的 φ?(k)不能像 MFAPC 那樣只維護(hù)一個(gè)標(biāo)量。因?yàn)檩斎胲壽E上的每個(gè)點(diǎn)在不同迭代中會(huì)反復(fù)修正它們各自的“輸入增量到輸出增量”的映射關(guān)系不一樣必須分別估計(jì)。學(xué)習(xí)律采用帶步長(zhǎng)的形式u???(k) u?(k) ρ·φ??(k) / (λ φ??(k)2)·e?(k1)其中 e?(k1) y_r(k1) - y?(k1)。分母里的 λ 不光是防止 φ?0 時(shí)除零更重要的是調(diào)節(jié)學(xué)習(xí)增益φ? 大時(shí)分母近似 φ?2學(xué)習(xí)律趨于 1/φ?φ? 小時(shí)分母被 λ 主導(dǎo)學(xué)習(xí)增益被限制住避免參數(shù)估計(jì)不準(zhǔn)時(shí)把輸入軌跡改得亂七八糟。一段可運(yùn)行的循環(huán)結(jié)構(gòu)如下u_cur zeros(Nsim, 1); % 初始輸入軌跡也可以先跑一次得到基線 for j 1 : MaxIter % 使用當(dāng)前輸入軌跡運(yùn)行對(duì)象 y zeros(Nsim, 1); for k 1 : Nsim-1 y(k1) plant(y(k), y(k-1), u_cur(k), u_cur(k-1), noise_on); end % 計(jì)算跟蹤誤差 e ref(2:Nsim) - y(2:Nsim); % 按時(shí)間點(diǎn)更新輸入軌跡 u_next u_cur; for k 1 : Nsim-1 du u_cur(k) - u_cur(k-1); dy y(k1) - y(k); phihat(k) phihat_prev(k) eta * du / (mu du^2) * (dy - phihat_prev(k) * du); if abs(phihat(k)) eps_phi || abs(du) eps_du phihat(k) phihat_init(k); end u_next(k) u_cur(k) rho * phihat(k) / (lambda_ilc phihat(k)^2) * e(k); phihat_prev(k) phihat(k); end u_cur u_next; record_rmse(j) sqrt(mean(e.^2)); endMFAILC 的初始輸入軌跡非常影響收斂速度。如果初始輸入全為零第一次迭代誤差可能很大但一般也能收斂。比較聰明的做法是先跑一次普通 MFAC把得到的輸入軌跡作為初始 u_cur這樣迭代次數(shù)能省一半。3.4 參數(shù)整定經(jīng)驗(yàn)匯總兩個(gè)算法的參數(shù)含義不一樣但調(diào)參邏輯有相通之處。下表是我反復(fù)實(shí)驗(yàn)后的建議范圍參數(shù)所屬算法作用建議范圍調(diào)整方向η兩者共用PPD 估計(jì)步長(zhǎng)0.1~1太大易發(fā)散太小收斂慢μ兩者共用防止分母為零0.0001~1越小估計(jì)越靈敏但抗噪差ρ兩者共用控制/學(xué)習(xí)步長(zhǎng)0.4~1太大系統(tǒng)易振蕩λMFAPC控制能量懲罰0.001~1越大控制越保守、響應(yīng)越慢N_yMFAPC預(yù)測(cè)時(shí)域3~5越大滾動(dòng)優(yōu)化效果越弱越慢N_uMFAPC控制時(shí)域1~2太大容易加劇抖動(dòng)λ_ilcMFAILC學(xué)習(xí)律分母0.01~1越大學(xué)習(xí)增益越低MaxIterMFAILC迭代次數(shù)50~200依據(jù)收斂曲線判斷這些數(shù)字是經(jīng)驗(yàn)值不是定理。不同被控對(duì)象對(duì)參數(shù)敏感度差別很大調(diào)參時(shí)一次只動(dòng)一個(gè)變量。我最常犯的錯(cuò)誤就是兩個(gè)參數(shù)一起調(diào)出了問(wèn)題根本不知道是誰(shuí)引起的。4. 數(shù)值結(jié)果與性能對(duì)比分析4.1 三種場(chǎng)景下的仿真結(jié)果我用固定參考軌跡在三個(gè)對(duì)象上做了對(duì)比實(shí)驗(yàn)。線性定常系統(tǒng)上MFAPC 在 N_y4、N_u2、λ0.01、η0.6 的條件下RMSE 大約在 0.012 附近控制量平滑沒(méi)有明顯抖動(dòng)。MFAILC 第一次迭代 RMSE 約 0.35到第 25 次迭代降到 0.005跟蹤精度略優(yōu)于 MFAPC畢竟它可以反復(fù)利用整條軌跡的誤差信息。但要注意MFAILC 的精度優(yōu)勢(shì)來(lái)自離線學(xué)習(xí)的“重復(fù)紅利”如果任務(wù)只跑一次它沒(méi)有任何優(yōu)勢(shì)。非線性時(shí)變對(duì)象上我把對(duì)象增益在中間時(shí)刻切換讓參數(shù)發(fā)生跳變。MFAPC 的 PPD 估計(jì)器能在大約 10 到 20 個(gè)采樣周期的在線調(diào)整后重新鎖定RMSE 會(huì)短暫惡化之后恢復(fù)。MFAILC 因?yàn)檎麄€(gè)輸入軌跡是在迭代軸上學(xué)習(xí)的如果參考軌跡和對(duì)象都變了前一迭代學(xué)到的輸入軌跡基本作廢得重新學(xué)習(xí)。這個(gè)對(duì)比很能說(shuō)明問(wèn)題MFAPC 適合變化的在線環(huán)境MFAILC 適合固定任務(wù)。帶噪聲和輸出干擾的情況下MFAPC 的控制量會(huì)出現(xiàn)明顯高頻分量。這是預(yù)期的因?yàn)?PPD 估計(jì)把噪聲當(dāng)成了真實(shí)輸出變化。解決辦法不是把 η 調(diào)小到學(xué)習(xí)能力變差而是對(duì)輸出做先濾波或者在 PPD 估計(jì)的差分項(xiàng)里加一個(gè)平滑。MFAILC 因?yàn)檎麄€(gè)軌跡是批量處理的噪聲在迭代平均中會(huì)被部分抵消所以它在強(qiáng)噪聲下的收斂趨勢(shì)反而比 MFAPC 穩(wěn)。4.2 結(jié)果背后反映的算法特性從結(jié)果可以提煉出幾條對(duì)實(shí)際選型有用的結(jié)論。MFAPC 本質(zhì)上是“在線辨識(shí)等效增益 滾動(dòng)預(yù)測(cè)優(yōu)化”所以它對(duì)初始參數(shù)不敏感對(duì)時(shí)變對(duì)象有自適應(yīng)能力但性能上限受限于 PPD 估計(jì)精度。當(dāng)對(duì)象在相鄰采樣點(diǎn)之間的變化過(guò)于劇烈比如快速切換方向CFDL 近似會(huì)變差控制量容易沖過(guò)頭。MFAILC 本質(zhì)上是“批量修正輸入軌跡”它把整個(gè)時(shí)間的跟蹤誤差都利用上了所以穩(wěn)態(tài)精度可以非常高。但它有兩個(gè)先天弱點(diǎn)一是不能處理迭代之間的任務(wù)變化二是對(duì)初始狀態(tài)偏移敏感——如果每一輪的初始狀態(tài)不一樣學(xué)習(xí)到的輸入軌跡很難對(duì)新的一次任務(wù)有好的效果。仿真程序把兩種算法放在同一套代碼框架里最重要的意義就在這里不是告訴你哪個(gè)算法更好而是讓你直觀看到它們適用邊界在哪里。5. 常見(jiàn)問(wèn)題與排查技巧5.1 PPD 估計(jì)發(fā)散這是仿真里出現(xiàn)頻率最高的問(wèn)題。表現(xiàn)是 phihat 曲線突然沖到幾十上百控制量跟著劇烈波動(dòng)系統(tǒng)很快跑飛。排查順序按概率排列先看 Δu 是否長(zhǎng)時(shí)間保持為零。如果輸入長(zhǎng)時(shí)間不變化PPD 估計(jì)的信息來(lái)源就斷了分母 μ Δu2 里只有 μ 撐著估計(jì)只會(huì)漂移。對(duì)策是給輸入疊加持續(xù)激勵(lì)信號(hào)或者在重置條件里增加對(duì) Δu 的檢查。再看 μ 是否設(shè)得太小。μ 太小會(huì)讓估計(jì)對(duì)噪聲過(guò)于敏感尤其輸出帶高斯噪聲時(shí)差分 dy 的信噪比很差。最后看 ηη 最好從 0.3 起步先確認(rèn)不發(fā)散再加到 0.8。還要強(qiáng)調(diào)一點(diǎn)重置條件不是擺設(shè)。對(duì)象增益穿過(guò)零附近時(shí)φ? 會(huì)出現(xiàn)符號(hào)跳變?nèi)绻恢刂每刂屏糠?hào)可能反了系統(tǒng)直接發(fā)散。我的程序里重置閾值取 0.01 到 0.05同時(shí)判斷 |φ?(k)| 與 Δu 的邊界寧可多重置幾次也別讓它自由漂移。5.2 控制量高頻抖動(dòng)MFAPC 控制量抖動(dòng)的根因通常是預(yù)測(cè)模型把噪聲當(dāng)成了可以優(yōu)化掉的偏差。理想情況下PPD 估計(jì)器只建模輸入變化到輸出變化的因果關(guān)系但輸出噪聲會(huì)混入 dy污染 φ???刂屏恳欢断乱慌牡?dy 又受影響形成正反饋。我的處理習(xí)慣一是把 λ 從 0.001 調(diào)到 0.05 起用控制能量懲罰壓住抖動(dòng)二是減小 ρ從 1 降到 0.6 左右三是在輸出端加一階慣性濾波比如 y_filtered α*y (1-α)*y_filteredα 取 0.7。濾波帶來(lái)的相位滯后在仿真里通??山邮艿茨愕尿?yàn)證目標(biāo)——如果驗(yàn)證重點(diǎn)是高頻跟蹤能力濾波會(huì)掩蓋問(wèn)題這時(shí)候還是優(yōu)先調(diào) λ。5.3 MFAILC 收斂慢MFAILC 跑了很多次迭代誤差還在 0.1 以上基本是學(xué)習(xí)增益太小或初始軌跡太差。對(duì)應(yīng)措施把初始輸入軌跡改為零階保持的參考軌跡縮放值不要全零起步適當(dāng)加大 ρ但同時(shí)要小心第二次迭代輸入就可能振蕩把 λ_ilc 減小到 0.01 到 0.1增強(qiáng)學(xué)習(xí)強(qiáng)度。還有一個(gè)容易被忽略的因素參考軌跡在時(shí)間軸上提前一個(gè)采樣點(diǎn)。學(xué)習(xí)律用的是 e(k1)對(duì)應(yīng)的是 u(k) 到 y(k1) 的時(shí)序關(guān)系。如果代碼里不小心對(duì)錯(cuò)了索引誤差和輸入之間隔了兩個(gè)周期學(xué)習(xí)律就會(huì)學(xué)混亂。我在調(diào)試時(shí)就踩過(guò)這個(gè)坑跟蹤誤差曲線在 100 次迭代里幾乎不動(dòng)仔細(xì)查才發(fā)現(xiàn)是 e(k1) 寫(xiě)成了 e(k)。5.4 快速排查速查表現(xiàn)象優(yōu)先排查參數(shù)處理建議phihat 發(fā)散Δu激勵(lì)不足、μ太小、η太大疊加激勵(lì)信號(hào)μ上調(diào)至0.1η降到0.3控制量抖動(dòng)λ太小、ρ太大、噪聲混入λ調(diào)至0.05ρ降至0.6輸出濾波跟蹤穩(wěn)態(tài)誤差大PPD重置太頻繁、N_y太小放寬重置閾值N_y調(diào)至5MFAILC不收斂索引錯(cuò)位、初始軌跡差、ρ太小嚴(yán)格校核時(shí)延初始軌跡設(shè)為參考值預(yù)測(cè)矩陣奇異N_y小于N_u保證N_y ≥ N_u因?yàn)槌绦蚴欠帜K的定位問(wèn)題很快對(duì)象函數(shù)單獨(dú)跑一遍看輸出是否合理PPD 估計(jì)單獨(dú)畫(huà)出來(lái)看曲線是否平滑最后再疊加控制器閉環(huán)。逐層排除比直接在閉環(huán)里猜快得多。6. 把仿真程序用起來(lái)的一些體會(huì)6.1 從仿真到實(shí)驗(yàn)的過(guò)渡仿真驗(yàn)證只是第一步。我經(jīng)??吹接腥朔抡媲€調(diào)得很漂亮一到實(shí)物就翻車最典型的是把仿真里無(wú)限帶寬的控制量直接丟給執(zhí)行器。程序里最好一開(kāi)始就加入控制輸入限幅和變化率限幅比如 u ∈ [-1, 1]、Δu 限幅在 0.05 以內(nèi)。這樣仿真結(jié)果更接近實(shí)物的真實(shí)邊界避免“仿真能用、實(shí)物超限”的尷尬。另一個(gè)仿真與實(shí)驗(yàn)差距的重要來(lái)源是對(duì)象時(shí)延。仿真對(duì)象常常忽略純時(shí)延但實(shí)際系統(tǒng)都有測(cè)量延遲建議在對(duì)象函數(shù)里加入一到兩個(gè)采樣周期的延遲環(huán)節(jié)提前考察算法在這種“相位損失”下的穩(wěn)定性。6.2 后續(xù)可以擴(kuò)展的方向這套程序可以繼續(xù)加裝幾塊內(nèi)容。一是把 PPD 估計(jì)器從緊格式換到全格式動(dòng)態(tài)線性化加入更多歷史輸入輸出數(shù)據(jù)適應(yīng)更復(fù)雜的對(duì)象。二是給 MFAPC 增加輸入約束處理把二次規(guī)劃引入優(yōu)化步讓控制增量受限時(shí)仍有可行解。三是把 MFAILC 的固定學(xué)習(xí)增益改成自適應(yīng)遺忘因子迭代到后期自動(dòng)放慢學(xué)習(xí)速度避免輸入軌跡在噪聲激勵(lì)下反復(fù)橫跳。我個(gè)人實(shí)際使用中的體會(huì)是MFAPC 的參數(shù)初值對(duì)快速調(diào)試非常重要第一次跑通時(shí)不追求最優(yōu)先用大 μ、小 η、中等 λ 讓系統(tǒng)穩(wěn)定再逐步收緊參數(shù)逼近精度極限。MFAILC 則建議每次修改對(duì)象模型后都清空上一輪的 φ? 和輸入軌跡歷史千萬(wàn)不要在舊軌跡上硬疊新對(duì)象的學(xué)習(xí)結(jié)果。仿真驗(yàn)證的目的不是刷出“看起來(lái)很好”的曲線而是幫你理解算法在什么條件下會(huì)失靈后續(xù)到了實(shí)驗(yàn)平臺(tái)才不至于手足無(wú)措。