現(xiàn)最小方差自校正控制:從理論到工程實(shí)戰(zhàn))
簡(jiǎn)介本資源是一套面向自動(dòng)控制專業(yè)高年級(jí)本科生及研究生的自校正控制STCMATLAB實(shí)現(xiàn)代碼包聚焦最小方差控制MVC這一經(jīng)典自適應(yīng)策略解決系統(tǒng)模型時(shí)變、參數(shù)不確定下的實(shí)時(shí)控制器在線整定問(wèn)題適用于工業(yè)過(guò)程控制、機(jī)器人伺服系統(tǒng)等需強(qiáng)魯棒性的仿真與教學(xué)場(chǎng)景。壓縮包共7個(gè)MATLAB源文件.m總大小僅7KB結(jié)構(gòu)精煉包含直接法與間接法兩類最小方差自校正控制器GMVSTC/MVSTC系列、通用最小方差控制核心算法GMVC/MVC以及關(guān)鍵數(shù)學(xué)工具sindiophantine.m用于求解Diophantine方程以完成控制器參數(shù)解析。已有256人學(xué)習(xí)下載讀者可完整復(fù)現(xiàn)從系統(tǒng)辨識(shí)、控制器設(shè)計(jì)到在線參數(shù)更新的全流程深入理解最小二乘優(yōu)化、隨機(jī)過(guò)程建模與自適應(yīng)律實(shí)現(xiàn)機(jī)制并直接調(diào)用各模塊進(jìn)行對(duì)比實(shí)驗(yàn)與性能分析。1. 從“STC.zip”說(shuō)起一個(gè)經(jīng)典控制算法的工程實(shí)踐最近在整理舊硬盤時(shí)翻到了一個(gè)名為“STC.zip”的壓縮包。這個(gè)文件名瞬間把我拉回了學(xué)生時(shí)代和早期工作階段那時(shí)為了搞懂“最小方差控制”和“自校正控制”在MATLAB里折騰了無(wú)數(shù)個(gè)日夜。STC即自校正控制它不僅僅是控制理論課本里的一個(gè)章節(jié)更是連接經(jīng)典PID與現(xiàn)代自適應(yīng)控制的一座非常實(shí)用的橋梁。對(duì)于從事自動(dòng)化、機(jī)電一體化或者任何涉及動(dòng)態(tài)系統(tǒng)控制的工程師來(lái)說(shuō)理解并能在MATLAB中實(shí)現(xiàn)STC意味著你手里多了一把處理參數(shù)未知或時(shí)變系統(tǒng)的“瑞士軍刀”。這個(gè)壓縮包里通常裝著的是一個(gè)完整的MATLAB仿真項(xiàng)目可能包含了系統(tǒng)辨識(shí)的腳本、最小方差控制器的設(shè)計(jì)代碼、自校正算法的迭代邏輯以及用于驗(yàn)證性能的Simulink模型。它的核心價(jià)值在于將“最小方差”這個(gè)最優(yōu)性能指標(biāo)與“自校正”這種在線調(diào)整能力結(jié)合起來(lái)讓控制器在面對(duì)模型不精確或環(huán)境變化時(shí)依然能保持優(yōu)良的控制效果。無(wú)論你是控制理論的學(xué)習(xí)者還是需要解決實(shí)際工程中“模型不準(zhǔn)”難題的開(kāi)發(fā)者通過(guò)剖析這樣一個(gè)項(xiàng)目都能獲得從理論到代碼落地的完整認(rèn)知。接下來(lái)我就結(jié)合這個(gè)典型的“STC.zip”項(xiàng)目結(jié)構(gòu)為你拆解最小方差自校正控制的原理、MATLAB實(shí)現(xiàn)的關(guān)鍵步驟以及那些只有親手調(diào)試過(guò)才能領(lǐng)悟的實(shí)戰(zhàn)經(jīng)驗(yàn)。2. 最小方差控制追求極致性能的數(shù)學(xué)本質(zhì)在深入自校正之前我們必須先理解它的性能基石——最小方差控制。這個(gè)名字聽(tīng)起來(lái)就很“最優(yōu)”它的目標(biāo)非常直接設(shè)計(jì)一個(gè)控制器使得系統(tǒng)輸出與期望設(shè)定值之間的誤差的方差達(dá)到最小。這里的“方差”衡量的是誤差的波動(dòng)大小最小方差控制本質(zhì)上是一種隨機(jī)最優(yōu)控制它特別擅長(zhǎng)處理受到隨機(jī)干擾的系統(tǒng)。2.1 核心問(wèn)題模型CARMA模型絕大多數(shù)最小方差控制的理論都基于一個(gè)稱為受控自回歸滑動(dòng)平均模型。這是一個(gè)描述線性離散時(shí)間系統(tǒng)的標(biāo)準(zhǔn)模型A(z^{-1})y(k) z^{-d} B(z^{-1})u(k) C(z^{-1})e(k)其中y(k)是k時(shí)刻的系統(tǒng)輸出。u(k)是k時(shí)刻的控制輸入。e(k)是均值為零、方差為σ2的白噪聲序列代表不可測(cè)的隨機(jī)干擾。z^{-1}是后移算子即z^{-1}y(k) y(k-1)。d是系統(tǒng)的純滯后時(shí)延步數(shù)。A, B, C是關(guān)于z^{-1}的多項(xiàng)式例如A(z^{-1}) 1 a1*z^{-1} ... ana*z^{-na}。這個(gè)模型的意義在于它將系統(tǒng)輸出分解為兩部分一部分是由過(guò)去輸入u(k-d)及其更早值決定的確定性響應(yīng)另一部分是由當(dāng)前及過(guò)去的白噪聲e(k)決定的隨機(jī)擾動(dòng)。最小方差控制器的任務(wù)就是通過(guò)巧妙地選擇u(k)來(lái)抵消未來(lái)d步之后噪聲對(duì)輸出的影響。2.2 控制器推導(dǎo)丟番圖方程的關(guān)鍵作用最小方差控制器的設(shè)計(jì)核心在于解決一個(gè)多項(xiàng)式恒等式——丟番圖方程C(z^{-1}) A(z^{-1})F(z^{-1}) z^{-d}G(z^{-1})這里F和G是待求的多項(xiàng)式F的階次是d-1G的階次是na-1。這個(gè)方程的意義是將噪聲多項(xiàng)式C分解為兩部分一部分A*F與系統(tǒng)模型A相關(guān)另一部分z^{-d}G則包含了時(shí)延信息。求解出F和G后最小方差控制律可以表示為u(k) - [G(z^{-1}) / (B(z^{-1})F(z^{-1}))] y(k)這個(gè)公式看起來(lái)復(fù)雜但其物理思想很直觀控制器根據(jù)當(dāng)前的輸出y(k)和歷史信息蘊(yùn)含在多項(xiàng)式G/F中計(jì)算出一個(gè)控制量u(k)使得在d步后系統(tǒng)輸出能最好地跟蹤設(shè)定值通常設(shè)為零即調(diào)節(jié)問(wèn)題同時(shí)最小化隨機(jī)噪聲帶來(lái)的波動(dòng)。注意這里隱含了一個(gè)重要假設(shè)——多項(xiàng)式B的所有零點(diǎn)都在單位圓內(nèi)即系統(tǒng)是最小相位的。如果B含有單位圓外的不穩(wěn)定零點(diǎn)直接使用上述控制律會(huì)導(dǎo)致控制器不穩(wěn)定此時(shí)需要采用廣義最小方差控制等改進(jìn)方法。在初次仿真時(shí)務(wù)必構(gòu)造一個(gè)最小相位對(duì)象來(lái)驗(yàn)證基礎(chǔ)算法。2.3 MATLAB實(shí)現(xiàn)基礎(chǔ)解算丟番圖方程在MATLAB中實(shí)現(xiàn)上述理論第一步就是求解丟番圖方程。雖然MATLAB沒(méi)有直接求解該方程的函數(shù)但我們可以利用多項(xiàng)式卷積和線性方程組來(lái)求解。假設(shè)我們已知多項(xiàng)式A,C的系數(shù)以及時(shí)延d。% 假設(shè)已知參數(shù) A [1, a1, a2, ..., ana]; % A(z^{-1})的系數(shù)從z^0項(xiàng)開(kāi)始 C [1, c1, c2, ..., cnc]; d 3; % 系統(tǒng)時(shí)延 na length(A) - 1; nc length(C) - 1; % F的階次為 d-1 G的階次為 na-1 deg_F d - 1; deg_G na - 1; % 構(gòu)建線性方程組 Ax b % 方程 C A*F z^{-d}*G 等價(jià)于對(duì)比z^{-i}項(xiàng)的系數(shù) total_eqs max(nc, nad-1) 1; % 需要考慮的最高階次 A_matrix zeros(total_eqs, deg_F1 deg_G1); b_vector zeros(total_eqs, 1); % 填充系數(shù)矩陣和向量 for i 0:total_eqs-1 % 填充F多項(xiàng)式部分與A卷積 for j 0:deg_F if (i-j) 0 (i-j) na A_matrix(i1, j1) A(i-j1); end end % 填充G多項(xiàng)式部分滯后d步 for j 0:deg_G if i (j d) A_matrix(i1, deg_F1 j1) 1; end end % 填充b向量C的系數(shù) if i nc b_vector(i1) C(i1); end end % 求解線性方程組得到F和G的系數(shù) x A_matrix \ b_vector; F_coeff x(1:deg_F1); G_coeff x(deg_F2:end); % 顯示結(jié)果 disp(多項(xiàng)式 F 的系數(shù):); disp(F_coeff); disp(多項(xiàng)式 G 的系數(shù):); disp(G_coeff);這段代碼提供了求解丟番圖方程的一種直接方法。在實(shí)際的“STC.zip”工程中這部分往往被封裝成一個(gè)獨(dú)立的函數(shù)如[F, G] diophantine(A, C, d)供主程序反復(fù)調(diào)用。理解這個(gè)求解過(guò)程對(duì)于后續(xù)調(diào)試和修改算法至關(guān)重要。3. 自校正控制讓控制器“學(xué)會(huì)”適應(yīng)未知系統(tǒng)最小方差控制器的性能嚴(yán)重依賴于模型的準(zhǔn)確性即多項(xiàng)式A,B,C的系數(shù)必須已知。但現(xiàn)實(shí)中很多系統(tǒng)的模型參數(shù)是未知或者緩慢變化的。這就是自校正控制大顯身手的地方。STC的基本思想可以概括為“邊辨識(shí)邊控制”在每個(gè)控制周期在線估計(jì)系統(tǒng)的模型參數(shù)然后立即用這些最新的估計(jì)值來(lái)重新計(jì)算并更新最小方差控制器的參數(shù)。3.1 自校正控制的兩類基本策略根據(jù)參數(shù)估計(jì)與控制器設(shè)計(jì)結(jié)合的緊密程度主要有兩種策略間接自校正控制這是最直觀、也最常用的方法。它明確分為兩個(gè)步驟步驟一在線參數(shù)估計(jì)。在每個(gè)采樣時(shí)刻k收集最新的輸入輸出數(shù)據(jù){u(k), y(k)}利用遞推最小二乘法等估計(jì)算法實(shí)時(shí)更新模型參數(shù)A, B, C的估計(jì)值?, B?, ?。步驟二控制器參數(shù)重設(shè)計(jì)。利用步驟一得到的?, B?, ?求解新的丟番圖方程得到當(dāng)前時(shí)刻的控制器多項(xiàng)式F?, ?進(jìn)而計(jì)算控制量u(k)。 這種方法結(jié)構(gòu)清晰模塊化好但計(jì)算量相對(duì)較大因?yàn)槊恳徊蕉夹枰庖淮蝸G番圖方程。直接自校正控制這種方法更為巧妙。它不顯式地估計(jì)系統(tǒng)模型參數(shù)而是將控制器參數(shù)如上文中的G/F的系數(shù)作為待估計(jì)的直接對(duì)象。通過(guò)重新參數(shù)化系統(tǒng)方程可以將系統(tǒng)輸出表示為控制器參數(shù)的線性函數(shù)然后直接用RLS等算法在線估計(jì)這些控制器參數(shù)。估計(jì)完成后控制量u(k)可以直接由這些參數(shù)和測(cè)量值計(jì)算得出省去了求解丟番圖方程的步驟。這種方法計(jì)算效率高但理論推導(dǎo)和實(shí)現(xiàn)稍復(fù)雜且對(duì)閉環(huán)系統(tǒng)的持續(xù)激勵(lì)性要求更高。在大多數(shù)教學(xué)和初期工程實(shí)踐中“STC.zip”項(xiàng)目通常實(shí)現(xiàn)的是間接自校正控制因?yàn)樗子诶斫夂驼{(diào)試能清晰地展示從系統(tǒng)辨識(shí)到控制器設(shè)計(jì)的完整流程。3.2 MATLAB中的遞推最小二乘法實(shí)現(xiàn)RLS是STC中在線參數(shù)估計(jì)的靈魂。其核心公式如下% 初始化 theta_hat zeros(n, 1); % 參數(shù)向量初始估計(jì)n為參數(shù)個(gè)數(shù) P eye(n) * large_number; % 協(xié)方差矩陣初始值取一個(gè)大數(shù)如1e6 lambda 0.95; % 遺忘因子0λ1λ越小遺忘舊數(shù)據(jù)越快 % 在每個(gè)采樣時(shí)刻k執(zhí)行 phi [-y(k-1), -y(k-2), ..., u(k-d), u(k-d-1), ..., e_hat(k-1), ...]; % 數(shù)據(jù)向量 e_hat(k) y(k) - phi * theta_hat_old; % 先驗(yàn)預(yù)測(cè)誤差 % RLS更新 K P_old * phi / (lambda phi * P_old * phi); theta_hat theta_hat_old K * e_hat(k); P (1/lambda) * (P_old - K * phi * P_old);這里的phi是數(shù)據(jù)向量包含了過(guò)去的輸入、輸出和估計(jì)的噪聲殘差。theta_hat就是我們要估計(jì)的A, B, C多項(xiàng)式系數(shù)。遺忘因子lambda用于賦予新數(shù)據(jù)更高權(quán)重使算法能夠跟蹤緩慢變化的參數(shù)。在MATLAB中實(shí)現(xiàn)一個(gè)穩(wěn)健的RLS模塊需要注意幾點(diǎn)一是數(shù)據(jù)向量phi的構(gòu)造必須與模型結(jié)構(gòu)嚴(yán)格對(duì)應(yīng)二是初始協(xié)方差矩陣P要足夠大以保證收斂速度三是對(duì)于CARMA模型其中的e_hat(k-1)項(xiàng)需要使用上一時(shí)刻的估計(jì)殘差這構(gòu)成了一個(gè)“增廣最小二乘法”結(jié)構(gòu)是處理C≠1情況的關(guān)鍵。4. 構(gòu)建完整的MATLAB自校正控制仿真工程一個(gè)典型的“STC.zip”項(xiàng)目其主仿真腳本或Simulink模型會(huì)遵循一個(gè)清晰的流程。下面我們分步拆解并注入關(guān)鍵的實(shí)現(xiàn)細(xì)節(jié)。4.1 第一步定義被控對(duì)象與仿真環(huán)境首先我們需要一個(gè)“真實(shí)”的系統(tǒng)作為被控對(duì)象同時(shí)設(shè)定仿真參數(shù)。clear; clc; close all; % 1. 定義真實(shí)被控對(duì)象 (CARMA模型) % 例如A(z^{-1})y(k) z^{-3} B(z^{-1})u(k) C(z^{-1})e(k) A_true [1, -1.5, 0.7]; % 1 - 1.5z^{-1} 0.7z^{-2} B_true [1, 0.5]; % 1 0.5z^{-1} C_true [1, -0.2]; % 1 - 0.2z^{-1} 代表有色噪聲 d_true 3; % 真實(shí)時(shí)延 na length(A_true)-1; nb length(B_true)-1; nc length(C_true)-1; % 2. 仿真參數(shù)設(shè)置 total_steps 1000; % 總仿真步數(shù) setpoint 0; % 設(shè)定值調(diào)節(jié)問(wèn)題 lambda 0.98; % RLS遺忘因子 var_noise 0.01; % 白噪聲e(k)的方差 % 3. 初始化數(shù)據(jù)存儲(chǔ)數(shù)組 y zeros(total_steps, 1); u zeros(total_steps, 1); y_hat zeros(total_steps, 1); % 模型預(yù)測(cè)輸出 time 1:total_steps;這里我們故意讓C_true不是1以模擬更一般的隨機(jī)干擾環(huán)境。lambda0.98是一個(gè)比較折中的值既能跟蹤變化又不會(huì)因?yàn)檫z忘太快而導(dǎo)致估計(jì)抖動(dòng)過(guò)大。4.2 第二步初始化自校正控制器參數(shù)在仿真循環(huán)開(kāi)始前需要對(duì)估計(jì)參數(shù)、控制器參數(shù)和RLS算法進(jìn)行初始化。% 4. 參數(shù)初始化 % 4.1 待估參數(shù)向量 theta [a1, a2, ..., b0, b1, ..., c1, c2, ...]^T n_params na nb 1 nc; % A(不含a01) B C(不含c01) theta_hat zeros(n_params, 1); % 初始估計(jì)全為零 P 1e6 * eye(n_params); % 初始協(xié)方差矩陣 phi zeros(n_params, 1); % 數(shù)據(jù)向量 % 4.2 初始化噪聲殘差估計(jì)隊(duì)列 e_hat zeros(total_steps, 1); % 估計(jì)的噪聲殘差 % 需要足夠長(zhǎng)的歷史數(shù)據(jù)來(lái)構(gòu)造phi初始值設(shè)為零 max_lag max([na, nbd_true-1, nc]) 5; % 留一些余量 y_buffer zeros(max_lag, 1); u_buffer zeros(max_lag, 1); e_buffer zeros(max_lag, 1);注意n_params的計(jì)算它對(duì)應(yīng)了A去掉首項(xiàng)1、B全部和C去掉首項(xiàng)1的所有系數(shù)。max_lag用于確定數(shù)據(jù)緩沖區(qū)的長(zhǎng)度確保能取到足夠久遠(yuǎn)的歷史數(shù)據(jù)。4.3 第三步主仿真循環(huán)——辨識(shí)與控制交替進(jìn)行這是整個(gè)自校正控制的核心。在每個(gè)采樣時(shí)刻我們依次執(zhí)行產(chǎn)生真實(shí)輸出、構(gòu)造數(shù)據(jù)向量、RLS參數(shù)更新、求解丟番圖方程、計(jì)算控制量。for k max_lag1 : total_steps % --- 1. 模擬真實(shí)系統(tǒng)輸出 --- % 生成白噪聲 e_k sqrt(var_noise) * randn; % 計(jì)算真實(shí)輸出 (利用緩沖區(qū)歷史數(shù)據(jù)) y_true -A_true(2:end) * y_buffer(end-na1:end) ... B_true * [u_buffer(end-d_true1); u_buffer(end-d_true)] ... % 根據(jù)B的階次調(diào)整 C_true * [e_k; e_buffer(end)]; % C_true [1, c1] y(k) y_true; % --- 2. 構(gòu)造RLS數(shù)據(jù)向量 phi --- % phi [-y(k-1), -y(k-2), ..., u(k-d), u(k-d-1), ..., e_hat(k-1), ...] idx 1; % A部分參數(shù)對(duì)應(yīng)的數(shù)據(jù) phi(idx:idxna-1) -y_buffer(end-na1:end); idx idx na; % B部分參數(shù)對(duì)應(yīng)的數(shù)據(jù) (注意時(shí)延d需要估計(jì)這里先用一個(gè)初始猜測(cè)d_hat) d_hat 3; % 假設(shè)已知或已估出 phi(idx:idxnb) u_buffer(end-d_hat-nb1: end-d_hat1); % 調(diào)整索引確保維度 idx idx nb 1; % C部分參數(shù)對(duì)應(yīng)的數(shù)據(jù) phi(idx:idxnc-1) e_buffer(end-nc1:end); % --- 3. RLS參數(shù)更新 (增廣最小二乘) --- % 先驗(yàn)預(yù)測(cè)誤差 y_hat_prior phi * theta_hat; e_hat_prior y(k) - y_hat_prior; e_hat(k) e_hat_prior; % RLS增益更新 K P * phi / (lambda phi * P * phi); theta_hat theta_hat K * e_hat_prior; P (1/lambda) * (P - K * phi * P); % 從theta_hat中解析出當(dāng)前估計(jì)的A, B, C多項(xiàng)式系數(shù) A_hat [1; theta_hat(1:na)]; B_hat theta_hat(na1 : na1nb); C_hat [1; theta_hat(na1nb1 : end)]; % --- 4. 基于估計(jì)參數(shù)設(shè)計(jì)最小方差控制器 --- % 求解丟番圖方程: C_hat A_hat * F z^{-d_hat} * G [F_coeff, G_coeff] diophantine(A_hat, C_hat, d_hat); % 調(diào)用封裝好的函數(shù) % 計(jì)算控制量 u(k) - (G/F) * y(k) / (B_hat*F) 在零設(shè)定值下 % 需要將多項(xiàng)式除法轉(zhuǎn)化為差分方程計(jì)算。一種簡(jiǎn)化方法是利用估計(jì)模型進(jìn)行一步預(yù)測(cè)。 % 更直接的方法是使用控制器多項(xiàng)式進(jìn)行濾波計(jì)算。 % 這里展示一種基于控制器結(jié)構(gòu)的計(jì)算 % u(k) - (G(z^{-1}) / (B_hat(z^{-1})F(z^{-1}))) * y(k) % 可以轉(zhuǎn)化為 B_hat(z^{-1})F(z^{-1}) u(k) -G(z^{-1}) y(k) % 這是一個(gè)差分方程可以求解出當(dāng)前的u(k) % 假設(shè) B_hat*F 和 G 已知提取首項(xiàng)系數(shù) BF conv(B_hat, F_coeff); bf0 BF(1); % B*F 的零階項(xiàng)系數(shù) if abs(bf0) 1e-10 warning(BF多項(xiàng)式首項(xiàng)系數(shù)接近零控制器奇異); bf0 sign(bf0)*1e-5 1e-10; end % 計(jì)算差分方程的右邊部分使用歷史數(shù)據(jù) RHS -filter(G_coeff, 1, y_buffer); % G作用于歷史輸出得到當(dāng)前時(shí)刻的貢獻(xiàn) RHS_k RHS(end); % 取最新值 % 計(jì)算左邊除當(dāng)前u(k)外的歷史項(xiàng)貢獻(xiàn) LH_hist -BF(2:end) * u_buffer(end-length(BF)2:end); % 求解當(dāng)前控制量 u(k) (RHS_k LH_hist) / bf0; % --- 5. 限幅與更新緩沖區(qū) --- % 對(duì)控制量進(jìn)行物理限幅 u_max 5; u_min -5; u(k) max(min(u(k), u_max), u_min); % 更新數(shù)據(jù)緩沖區(qū)FIFO y_buffer [y_buffer(2:end); y(k)]; u_buffer [u_buffer(2:end); u(k)]; e_buffer [e_buffer(2:end); e_hat(k)]; % 存儲(chǔ)預(yù)測(cè)輸出可選用于分析 y_hat(k) y_hat_prior; end這個(gè)循環(huán)體是工程實(shí)現(xiàn)的關(guān)鍵包含了大量細(xì)節(jié)真實(shí)系統(tǒng)模擬使用預(yù)設(shè)的A_true, B_true, C_true和隨機(jī)噪聲生成y(k)這代表了我們要控制的“未知”真實(shí)對(duì)象。數(shù)據(jù)向量構(gòu)造必須嚴(yán)格按照模型結(jié)構(gòu)排列歷史數(shù)據(jù)。這里假設(shè)時(shí)延d_hat已知或已通過(guò)其他方法估計(jì)在實(shí)際中時(shí)延估計(jì)本身也是一個(gè)課題。RLS更新采用了增廣最小二乘用估計(jì)的殘差e_hat來(lái)代替不可測(cè)的真實(shí)噪聲e(k)這是處理C≠1的標(biāo)準(zhǔn)方法??刂破饔?jì)算這是最容易出錯(cuò)的地方。將多項(xiàng)式分式的控制律轉(zhuǎn)化為可計(jì)算的差分方程并注意處理BF多項(xiàng)式首項(xiàng)系數(shù)為零的奇異情況。示例中使用了filter函數(shù)和直接卷積求和兩種方式來(lái)計(jì)算歷史項(xiàng)的貢獻(xiàn)??刂屏肯薹魏螌?shí)際執(zhí)行器都有飽和特性必須在算法中加入限幅否則仿真可能發(fā)散或者結(jié)果沒(méi)有工程參考價(jià)值。4.4 第四步結(jié)果可視化與性能分析仿真結(jié)束后我們需要通過(guò)圖表來(lái)評(píng)估自校正控制的效果。% 繪圖 figure(Position, [100, 100, 1200, 800]); subplot(3,1,1); plot(time, y, b-, LineWidth, 1.2); grid on; xlabel(采樣時(shí)刻 k); ylabel(系統(tǒng)輸出 y(k)); title(自校正控制下系統(tǒng)輸出); legend(輸出); subplot(3,1,2); plot(time, u, r-, LineWidth, 1.2); grid on; xlabel(采樣時(shí)刻 k); ylabel(控制輸入 u(k)); title(控制輸入信號(hào)); legend(控制量); subplot(3,1,3); plot(time, e_hat, g-, LineWidth, 1.0); grid on; xlabel(采樣時(shí)刻 k); ylabel(估計(jì)殘差 e\_hat(k)); title(在線估計(jì)的噪聲殘差); legend(殘差); % 分析參數(shù)收斂情況 figure; theta_true [-1.5; 0.7; 1; 0.5; -0.2]; % 對(duì)應(yīng)[A(2:end); B; C(2:end)] for i 1:n_params subplot(n_params, 1, i); plot(time(max_lag1:end), theta_hat_history(i, max_lag1:end), b-); hold on; plot([time(max_lag1), time(end)], [theta_true(i), theta_true(i)], r--, LineWidth, 1.5); grid on; ylabel([\theta_, num2str(i)]); if i1, title(參數(shù)估計(jì)收斂過(guò)程); end if in_params, xlabel(采樣時(shí)刻 k); end legend(估計(jì)值, 真實(shí)值); end % 計(jì)算性能指標(biāo) output_variance var(y(round(total_steps/2):end)); % 取后半段穩(wěn)態(tài)方差 control_energy sum(u.^2)/total_steps; fprintf(系統(tǒng)輸出穩(wěn)態(tài)方差: %.4f\n, output_variance); fprintf(控制能量 (平均平方和): %.4f\n, control_energy);通過(guò)輸出曲線我們可以觀察系統(tǒng)是否被鎮(zhèn)定在設(shè)定值附近控制輸入是否平滑合理。參數(shù)收斂圖是調(diào)試自校正控制器最重要的工具之一它能直觀顯示RLS算法是否正常工作、估計(jì)值能否收斂到真實(shí)參數(shù)附近。如果參數(shù)不收斂或發(fā)散就需要回頭檢查數(shù)據(jù)向量構(gòu)造、RLS初始化、或者被控對(duì)象是否滿足持續(xù)激勵(lì)條件。5. 實(shí)戰(zhàn)中的關(guān)鍵技巧與避坑指南基于“STC.zip”這樣的項(xiàng)目進(jìn)行學(xué)習(xí)和開(kāi)發(fā)必然會(huì)遇到各種問(wèn)題。下面分享幾個(gè)從實(shí)際調(diào)試中總結(jié)出的核心經(jīng)驗(yàn)。5.1 持續(xù)激勵(lì)讓參數(shù)估計(jì)“看得見(jiàn)”系統(tǒng)自校正控制要成功一個(gè)絕對(duì)必要的前提是持續(xù)激勵(lì)。簡(jiǎn)單說(shuō)就是控制輸入u(k)不能太平淡比如恒為零或常數(shù)必須包含足夠豐富的頻率成分才能“激發(fā)”出系統(tǒng)的所有動(dòng)態(tài)模態(tài)讓RLS算法有機(jī)會(huì)學(xué)習(xí)到所有參數(shù)。% 不好的做法初始階段控制量全為零或很小 % u(k) 0; % 推薦做法在控制器啟動(dòng)初期或在設(shè)定值中疊加一個(gè)持續(xù)激勵(lì)信號(hào) persistent excite_counter; if isempty(excite_counter) excite_counter 0; end excite_counter excite_counter 1; % 方法1前N步使用PRBS偽隨機(jī)二進(jìn)制序列或白噪聲作為激勵(lì) if k 200 u_excite 0.5 * (2*(rand0.5)-1); % 幅值為0.5的PRBS u(k) u_excite; % 暫時(shí)覆蓋控制器輸出的u(k) % 注意此時(shí)仍需進(jìn)行參數(shù)估計(jì)但控制律不生效或混合生效 end % 方法2在設(shè)定值上疊加小幅度持續(xù)激勵(lì)適用于跟蹤問(wèn)題 setpoint_with_excite setpoint 0.1 * sin(0.05*k) 0.05*(rand-0.5); % 然后將控制器設(shè)計(jì)為跟蹤 setpoint_with_excite 而非零。如果系統(tǒng)本身是開(kāi)環(huán)穩(wěn)定的可以在控制器投入運(yùn)行前先施加一段時(shí)間的激勵(lì)信號(hào)進(jìn)行“開(kāi)環(huán)辨識(shí)”獲得較好的初始參數(shù)估計(jì)然后再切換到自校正控制模式。這能顯著提高閉環(huán)初始階段的穩(wěn)定性和性能。5.2 時(shí)延d的估計(jì)一個(gè)容易被忽略的致命細(xì)節(jié)在之前的代碼中我們假設(shè)時(shí)延d_hat是已知的。但在實(shí)際中時(shí)延可能未知或不準(zhǔn)確。錯(cuò)誤的時(shí)延估計(jì)會(huì)導(dǎo)致數(shù)據(jù)向量phi錯(cuò)位進(jìn)而引起嚴(yán)重的參數(shù)估計(jì)偏差和控制性能惡化甚至導(dǎo)致系統(tǒng)失穩(wěn)。如何估計(jì)時(shí)延d階躍響應(yīng)法在開(kāi)環(huán)狀態(tài)下給系統(tǒng)一個(gè)階躍輸入觀察輸出開(kāi)始發(fā)生明顯變化的時(shí)刻與輸入時(shí)刻的差值即為時(shí)延的粗略估計(jì)。這在MATLAB中可以通過(guò)step函數(shù)或簡(jiǎn)單的仿真實(shí)現(xiàn)。互相關(guān)分析法采集一段開(kāi)環(huán)的輸入輸出數(shù)據(jù){u(k), y(k)}計(jì)算它們的互相關(guān)函數(shù)。互相關(guān)函數(shù)峰值出現(xiàn)的滯后位置就是時(shí)延d的一個(gè)估計(jì)。[corr_seq, lags] xcorr(y_data - mean(y_data), u_data - mean(u_data), coeff); [~, max_idx] max(abs(corr_seq)); d_estimated lags(max_idx); % 注意lags可能為負(fù)取絕對(duì)值并考慮因果關(guān)系 if d_estimated 0 d_estimated 0; % 時(shí)延不能為負(fù) end作為參數(shù)一同估計(jì)可以將時(shí)延d也作為一個(gè)待優(yōu)化參數(shù)但這會(huì)使得問(wèn)題非線性通常需要更復(fù)雜的辨識(shí)方法如模型預(yù)測(cè)誤差法。在自校正控制中一個(gè)實(shí)用的策略是先用方法1或2離線估計(jì)一個(gè)d的初始值然后在在線運(yùn)行中監(jiān)控預(yù)測(cè)誤差。如果發(fā)現(xiàn)誤差持續(xù)很大可以嘗試在合理范圍內(nèi)微調(diào)d_hat的值觀察性能是否改善。5.3 閉環(huán)穩(wěn)定性與參數(shù)收斂的監(jiān)控自校正控制是典型的非線性時(shí)變系統(tǒng)其閉環(huán)穩(wěn)定性沒(méi)有通用的保證。在仿真和實(shí)際調(diào)試中必須建立監(jiān)控機(jī)制。監(jiān)控預(yù)測(cè)誤差e_hat(k)應(yīng)該是一個(gè)均值為零、方差較小的白噪聲序列如果模型結(jié)構(gòu)正確。如果e_hat的均值顯著偏離零或方差持續(xù)很大說(shuō)明模型失配嚴(yán)重。監(jiān)控參數(shù)變化觀察theta_hat的歷史曲線。參數(shù)應(yīng)該收斂到某個(gè)穩(wěn)定值附近小幅波動(dòng)。如果參數(shù)持續(xù)漂移或發(fā)散很可能意味著持續(xù)激勵(lì)不足、遺忘因子lambda過(guò)小、或者存在未建模動(dòng)態(tài)。監(jiān)控控制量控制輸入u(k)不應(yīng)出現(xiàn)高頻大幅度的抖振或持續(xù)飽和。出現(xiàn)這種情況可能是控制增益過(guò)大或者估計(jì)模型不準(zhǔn)確導(dǎo)致控制器設(shè)計(jì)出了問(wèn)題。引入死區(qū)或參數(shù)凍結(jié)作為一種保護(hù)機(jī)制可以設(shè)置一個(gè)誤差死區(qū)。當(dāng)輸出誤差|y(k)-setpoint|小于某個(gè)閾值時(shí)暫停參數(shù)更新即凍結(jié)theta_hat只運(yùn)行固定參數(shù)的最小方差控制。這可以在系統(tǒng)接近穩(wěn)態(tài)時(shí)避免不必要的參數(shù)調(diào)整帶來(lái)的擾動(dòng)。5.4 從仿真到實(shí)際應(yīng)用的鴻溝“STC.zip”項(xiàng)目在仿真中跑通只是萬(wàn)里長(zhǎng)征第一步。將其應(yīng)用于實(shí)際硬件如STC單片機(jī)、PLC、嵌入式系統(tǒng)時(shí)會(huì)遇到更多挑戰(zhàn)計(jì)算能力限制RLS和丟番圖方程求解涉及矩陣運(yùn)算對(duì)計(jì)算資源要求較高。在單片機(jī)上實(shí)現(xiàn)時(shí)可能需要采用計(jì)算量更小的遞推算法如遞推增廣最小二乘的簡(jiǎn)化形式。降低采樣頻率或參數(shù)更新頻率。使用定點(diǎn)數(shù)運(yùn)算替代浮點(diǎn)數(shù)以提升速度。數(shù)值精度問(wèn)題遞推算法中的協(xié)方差矩陣P可能因舍入誤差失去正定性導(dǎo)致算法發(fā)散。需要引入平方根濾波或UD分解等數(shù)值魯棒的RLS算法變體。采樣與執(zhí)行非理想性實(shí)際采樣存在量化誤差執(zhí)行器有死區(qū)和飽和傳感器有噪聲。仿真中的理想假設(shè)不再成立。需要在算法中考慮這些因素例如在數(shù)據(jù)預(yù)處理中加入低通濾波在控制律中加入抗積分飽和機(jī)制。代碼實(shí)現(xiàn)與調(diào)試將MATLAB算法移植到C代碼時(shí)要特別注意數(shù)組索引、數(shù)據(jù)類型的轉(zhuǎn)換。建議先在PC上用C語(yǔ)言重寫(xiě)仿真驗(yàn)證無(wú)誤后再移植到目標(biāo)硬件。利用串口打印關(guān)鍵變量如theta_hat,u(k),y(k)進(jìn)行實(shí)時(shí)監(jiān)控是硬件調(diào)試中最有效的手段。6. 擴(kuò)展與變體超越基礎(chǔ)最小方差自校正當(dāng)你掌握了基礎(chǔ)的STC之后可以針對(duì)更復(fù)雜的場(chǎng)景探索其變體廣義最小方差控制通過(guò)引入一個(gè)對(duì)控制量的加權(quán)項(xiàng)在輸出方差和控制能量之間取得平衡并且可以處理非最小相位系統(tǒng)。其性能指標(biāo)變?yōu)镴 E{[y(kd) - setpoint]^2 ρ * u(k)^2}其中ρ是控制加權(quán)系數(shù)。多變量自校正控制對(duì)于多輸入多輸出系統(tǒng)原理類似但參數(shù)估計(jì)和控制器設(shè)計(jì)涉及矩陣多項(xiàng)式計(jì)算和理論復(fù)雜度大大增加。MATLAB的System Identification Toolbox和Control System Toolbox提供了相關(guān)函數(shù)的基礎(chǔ)。與模型預(yù)測(cè)控制的結(jié)合GMPV控制可以看作是一種有限時(shí)域的開(kāi)環(huán)最優(yōu)控制而STC是無(wú)限時(shí)域的閉環(huán)最優(yōu)控制??梢詫TC在線辨識(shí)出的模型提供給一個(gè)MPC控制器進(jìn)行滾動(dòng)優(yōu)化結(jié)合兩者的優(yōu)點(diǎn)?;剡^(guò)頭看“STC.zip”不僅僅是一段代碼它代表了一種解決問(wèn)題的范式面對(duì)模型不確定性不是放棄最優(yōu)控制理論而是通過(guò)在線學(xué)習(xí)來(lái)動(dòng)態(tài)地逼近最優(yōu)。這個(gè)過(guò)程充滿了挑戰(zhàn)從持續(xù)激勵(lì)的設(shè)計(jì)、時(shí)延的估計(jì)到數(shù)值穩(wěn)定性的處理、實(shí)際硬件的部署每一步都需要理論和經(jīng)驗(yàn)的結(jié)合。我個(gè)人的體會(huì)是吃透這樣一個(gè)項(xiàng)目比泛泛地學(xué)習(xí)十個(gè)控制算法更有價(jià)值。當(dāng)你成功地將仿真中的曲線變?yōu)閷?shí)際設(shè)備穩(wěn)定運(yùn)行的轟鳴時(shí)那種對(duì)控制理論深刻而具體的理解是任何教科書(shū)都無(wú)法給予的。最后一個(gè)小建議在動(dòng)手實(shí)現(xiàn)時(shí)不妨從最簡(jiǎn)單的例子開(kāi)始比如一階系統(tǒng)C1確保每個(gè)模塊都工作正常然后再逐步增加復(fù)雜度增加階數(shù)、引入有色噪聲C≠1、加入時(shí)延這樣能幫你清晰地定位問(wèn)題所在高效地完成調(diào)試。本文還有配套的精品資源點(diǎn)擊獲取