雙層能量管理:Matlab實(shí)現(xiàn)與調(diào)參實(shí)戰(zhàn))
從碩士到博士我前后做了三四個微電網(wǎng)能量管理的項(xiàng)目從最早查資料看到模型預(yù)測算法四個字就頭大到現(xiàn)在能熟練地把雙層架構(gòu)、混合儲能協(xié)調(diào)、MPC滾動優(yōu)化整套跑通中間踩過的坑確實(shí)不少。這篇內(nèi)容我打算不按論文摘要的思路來寫就把做基于模型預(yù)測算法的混合儲能微電網(wǎng)雙層能量管理系統(tǒng)(Matlab實(shí)現(xiàn))這個項(xiàng)目最核心的思路、代碼框架、調(diào)參經(jīng)驗(yàn)和排查實(shí)錄梳理清楚。無論是準(zhǔn)備畢業(yè)設(shè)計(jì)還是做實(shí)際工程預(yù)研這套東西按順序啃下來能少走很多彎路?;旌蟽δ芎臀㈦娋W(wǎng)組合在一起問題的本質(zhì)其實(shí)很直白光伏、風(fēng)電這些電源輸出波動大負(fù)荷側(cè)也有隨機(jī)性靠單一儲能去扛所有波動鋰電池會因?yàn)轭l繁的功率沖擊加速老化超級電容雖然扛造但能量密度不夠。所以要把兩者按各自的物理特性分工再配一個能在約束條件下做滾動優(yōu)化的控制器。這里用MPC而不是傳統(tǒng)PID或者PI控制是因?yàn)镸PC能顯式處理約束、能往前看幾步還能協(xié)調(diào)多個目標(biāo)這三個能力在這個系統(tǒng)里缺一不可。1. 為什么要用雙層架構(gòu)單層MPC還不夠嗎1.1 混合儲能微電網(wǎng)的核心矛盾先看被控對象。典型直流微電網(wǎng)拓?fù)淅锓植际诫娫垂夥?、風(fēng)電、混合儲能鋰電池超級電容、負(fù)荷都掛在直流母線上混合儲能通過雙向DC/DC變換器接入。鋰電池和超級電容這對組合各自優(yōu)勢互補(bǔ)鋰電池能量密度高、能夠長時間提供穩(wěn)定的功率支撐超級電容功率密度高、響應(yīng)速度快、循環(huán)壽命極長特別適合扛住那些秒級甚至毫秒級的功率沖擊。但問題也在這里——如果讓一個控制層同時去處理長時段的能量分配和瞬態(tài)的功率響應(yīng)要么優(yōu)化問題規(guī)模爆炸要么控制周期只能取一個折中值結(jié)果長時段的調(diào)度不精細(xì)、瞬態(tài)響應(yīng)又不夠快。單層MPC不是不能做而是做起來非常別扭。如果把控制周期設(shè)得很短比如0.1秒那預(yù)測時域只能覆蓋幾秒到幾十秒系統(tǒng)整體運(yùn)行的經(jīng)濟(jì)性和SOC長期維持策略根本放不進(jìn)去而且優(yōu)化求解的計(jì)算壓力也很大。如果把控制周期拉長到15分鐘那光伏云遮、負(fù)荷突變這類秒級擾動就完全處理不了。這就是分層架構(gòu)存在的根本原因——不同控制目標(biāo)天然處于不同時間尺度硬塞進(jìn)一個層里兩邊都做不好。1.2 雙層架構(gòu)的時間尺度解耦思想雙層能量管理系統(tǒng)的基本思路是用兩個控制層分別對應(yīng)經(jīng)濟(jì)性和動態(tài)性這兩個需求。上層調(diào)度層慢層時間尺度為15分鐘到1小時根據(jù)日前/日內(nèi)預(yù)測數(shù)據(jù)光伏出力、負(fù)荷曲線、電價信息優(yōu)化整個微電網(wǎng)的運(yùn)行成本決策變量包括鋰電池的基準(zhǔn)功率、超級電容的基準(zhǔn)功率、與外部電網(wǎng)的交換功率。這一層不需要太快的動態(tài)核心目標(biāo)是讓系統(tǒng)在一個較長時段內(nèi)既有經(jīng)濟(jì)性又不違反儲能約束。下層MPC層快層時間尺度為0.1秒到1分鐘級以秒級滾動的方式跟蹤上層下發(fā)的功率指令同時實(shí)時處理母線電壓波動。下層MPC收到上層給定參考值之后利用預(yù)測模型對未來幾個控制周期內(nèi)的系統(tǒng)狀態(tài)進(jìn)行滾動優(yōu)化在功率平衡約束、SOC約束、母線電壓約束之間找最優(yōu)控制動作。這種上慢下快的搭配不是拍腦袋決定的背后是微電網(wǎng)多時間尺度特性這個客觀物理事實(shí)。其實(shí)可以打個比方大型電商倉庫會根據(jù)未來一天的訂單預(yù)測在凌晨統(tǒng)一規(guī)劃好各分區(qū)的人力分配相當(dāng)于上層調(diào)度但真正到了白天訂單涌入的時候需要現(xiàn)場主管每隔幾分鐘動態(tài)調(diào)整某個分揀口的調(diào)度相當(dāng)于下層MPC。兩者的目標(biāo)函數(shù)和決策頻率完全不同分開來設(shè)計(jì)問題會更清晰實(shí)現(xiàn)上也更容易維護(hù)和調(diào)試。1.3 為什么下層偏偏選MPC而不是PID其實(shí)很多做微電網(wǎng)控制的朋友一開始都會有個疑問下層如果只是做功率跟蹤用PI控制器不就行了嗎成本和復(fù)雜度都低我在初版方案里確實(shí)用過PI但實(shí)測下來有幾個非常棘手的問題。第一PI處理不了約束。鋰電池和超級電容都有最大功率限制SOC也有上、下限母線電壓更不允許越限PI控制器對這些約束無能為力只能靠外部限幅和邏輯保護(hù)去硬性截?cái)嘟財(cái)嘀罂刂菩阅芎茈y看。MPC把約束直接寫進(jìn)優(yōu)化命題里求解出來的控制量天然不會違反約束。第二PI是純反饋控制沒有預(yù)測能力。當(dāng)負(fù)荷突變時MPC通過模型能預(yù)測到未來幾步母線電壓的演化趨勢可以提前調(diào)整儲能功率來壓低電壓偏差的積分PI只能等偏差已經(jīng)發(fā)生后被動調(diào)節(jié)。這一步提前量在實(shí)際中就是母線電壓波動幅度和恢復(fù)時間上的明顯差距。第三MPC天然是多變量、多目標(biāo)協(xié)調(diào)的框架。下層控制里我們需要同時兼顧參考功率跟蹤、母線電壓穩(wěn)定、電池功率平滑、超級電容的充放電節(jié)制幾個目標(biāo)。PID這東西本質(zhì)上是一對一輸入輸出處理關(guān)節(jié)耦合得多目標(biāo)場合需要串聯(lián)一堆解耦補(bǔ)償代碼混亂且效果不理想。所以結(jié)論很明確上層用慢速優(yōu)化做經(jīng)濟(jì)調(diào)度下層用帶約束的快速M(fèi)PC做動態(tài)功率分派——這是非常合理且經(jīng)過工程驗(yàn)證的分工模式。2. 雙層能量管理系統(tǒng)的整體設(shè)計(jì)與控制架構(gòu)拆解2.1 系統(tǒng)拓?fù)浣Y(jié)構(gòu)與功率流動我搭建的系統(tǒng)是直流微電網(wǎng)母線電壓等級取DC 400V。主要組成部分如下組件接入方式關(guān)鍵參數(shù)光伏陣列DC/DC升壓變換器額定功率20kWMPPT控制風(fēng)力發(fā)電可選AC/DC整流DC/DC額定功率15kW鋰電池組雙向DC/DCBuck-Boost200Ah/240VSOC窗口0.2~0.9超級電容組雙向DC/DCBuck-Boost10F/300VSOC窗口0.15~0.95本地負(fù)荷直流母線上直接連接基礎(chǔ)負(fù)荷突變負(fù)荷并網(wǎng)接口AC/DC雙向變流器可吸收或注入功率這里面有兩個細(xì)節(jié)值得注意。一是鋰電池和超級電容各自通過獨(dú)立的雙向變換器接入母線這樣在控制上能夠各自獨(dú)立地給定功率指令實(shí)現(xiàn)高低頻功率分派二是超級電容的SOC通常用它的端電壓來表征因?yàn)?( E \frac{1}{2}CV^2 ) 的關(guān)系其端電壓與存儲的能量存在一一對應(yīng)關(guān)系。在計(jì)算SOC的時候不能像鋰電池那樣直接按Ah積分而是按照 ( SOC \frac{V_{sc}^2 - V_{sc,min}^2}{V_{sc,max}^2 - V_{sc,min}^2} ) 折算。2.2 上層調(diào)度層的優(yōu)化模型上層調(diào)度的周期設(shè)為 ( T_{up} 15\text{min} )預(yù)測時域覆蓋未來24小時即96個調(diào)度時段。這個層面對的輸入是日前預(yù)測的光伏功率 ( P_{pv}(k) )、負(fù)荷功率 ( P_{load}(k) ) 和分時電價 ( c_{grid}(k) )決策變量是每個時段鋰電池功率 ( P_{bat}^{ref}(k) )、超級電容功率 ( P_{sc}^{ref}(k) )、并網(wǎng)交換功率 ( P_{grid}(k) )。優(yōu)化目標(biāo)函數(shù)包含三部分[ J_{up} \sum_{k1}^{96} \left[ c_{grid}(k) \cdot P_{grid}(k) c_{bat}^{age} \cdot |P_{bat}^{ref}(k)| \lambda \cdot (P_{grid}^{peak}(k))^2 \right] ]其中( c_{bat}^{age} ) 是鋰電池的循環(huán)老化成本折算系數(shù)這個系數(shù)源于電芯的循環(huán)壽命實(shí)驗(yàn)數(shù)據(jù)假設(shè)鋰電池在當(dāng)前放電深度下允許循環(huán)4000次單次循環(huán)折算成本就是電池更換成本除以循環(huán)次數(shù)( P_{grid}^{peak}(k) ) 是并網(wǎng)功率的峰值項(xiàng)用于避免從電網(wǎng)取電時出現(xiàn)尖銳的功率尖峰這個二次項(xiàng)能幫助平滑電網(wǎng)交換功率。約束條件包括功率平衡約束( P_{pv}(k) P_{grid}(k) P_{bat}(k) P_{sc}(k) P_{load}(k) ) 假設(shè)一小時內(nèi)功率恒定。鋰電池SOC邊界約束( SOC_{bat,min} \le SOC_{bat}(k) \le SOC_{bat,max} )且每個時段之間存在積分遞推關(guān)系。超級電容SOC約束( SOC_{sc,min} \le SOC_{sc}(k) \le SOC_{sc,max} )。功率上下限約束( -P_{bat}^{cap} \le P_{bat}(k) \le P_{bat}^{cap} )( -P_{sc}^{cap} \le P_{sc}(k) \le P_{sc}^{cap} )。并網(wǎng)功率限值( -P_{grid}^{buy,max} \le P_{grid}(k) \le P_{grid}^{sell,max} )。上層模型是一個帶線性目標(biāo)或輕度非線性的約束優(yōu)化問題。Matlab里我直接用了fmincon結(jié)合active-set算法求解因?yàn)闆Q策變量只有 96×3288 個、約束大多線性求解速度很快。如果希望穩(wěn)定復(fù)現(xiàn)也可以把它改寫成linprog可解的形式將老化成本項(xiàng)用分段線性近似表達(dá)。2.3 下層MPC控制層的設(shè)計(jì)細(xì)節(jié)下層的控制周期設(shè)為 ( T_s 0.1\text{s} )預(yù)測時域 ( N_p20 ) 步即往前看2秒控制時域 ( N_c5 ) 步。在每個采樣周期執(zhí)行一次滾動優(yōu)化。下層MPC的關(guān)鍵狀態(tài)空間模型是把系統(tǒng)簡化為各儲能模塊的一階慣性響應(yīng)加上母線電壓動態(tài)[ \dot{P}{bat} \frac{1}{\tau{bat}} (P_{bat}^{ref} - P_{bat}) ][ \dot{P}{sc} \frac{1}{\tau{sc}} (P_{sc}^{ref} - P_{sc}) ][ SOC_{bat} -\frac{\eta_{bat}}{C_{bat}} P_{bat} ][ \dot{V}{dc} \frac{1}{C{dc}} (P_{pv} P_{grid} P_{bat} P_{sc} - P_{load}) / V_{dc} ]其中 ( \tau_{bat} )、( \tau_{sc} ) 是儲能模塊的等效響應(yīng)時間常數(shù)來自DC/DC變換器的閉環(huán)帶寬——通常取 ( \tau_{bat}0.05\text{s} )、( \tau_{sc}0.01\text{s} )( C_{dc} ) 是直流母線支撐電容。將這些連續(xù)方程以采樣周期 ( T_s0.1\text{s} ) 做離散化就能得到標(biāo)準(zhǔn)形式[ x(k1) A_d x(k) B_d u(k) B_d^d d(k) ]狀態(tài)變量 ( x [P_{bat}, P_{sc}, SOC_{bat}, V_{dc}]^T )控制量 ( u [P_{bat}^{ref}, P_{sc}^{ref}]^T )擾動 ( d [P_{pv}, P_{load}, P_{grid}]^T )。代價函數(shù)設(shè)計(jì)[ J_{mpc} \sum_{i1}^{N_p} \Big[ q_1 \Delta P_{bat}(ki|k)^2 q_2 (P_{sc}(ki|k) - P_{sc}^{ref}(k))^2 q_3 (V_{dc}(ki|k) - V_{dc}^{ref})^2 \Big] \sum_{j0}^{N_c-1} r \Delta u(j)^2 ]這個代價函數(shù)里面每一項(xiàng)都有它的設(shè)計(jì)意圖( q_1 \Delta P_{bat}^2 ) 表示電池功率在其參考值附近的偏離程度也就是電池承擔(dān)的波動分量盡量小( q_2 (P_{sc} - P_{sc}^{ref})^2 ) 表示超級電容負(fù)責(zé)補(bǔ)足高頻分量并跟蹤上層給出的參考功率( q_3 (V_{dc} - V_{dc}^{ref})^2 ) 直接約束母線電壓的穩(wěn)定這是微電網(wǎng)能否安全運(yùn)行的第一函數(shù)( r \Delta u^2 ) 是控制增量懲罰防止超級電容在相鄰控制周期之間高頻換向太小容易震蕩大了會犧牲響應(yīng)速度。這里權(quán)重系數(shù)是調(diào)參的重點(diǎn)。我最終一組可用的權(quán)重參數(shù)是 ( q_15\text{e-2} )、( q_21\text{e-2} )、( q_38\text{e-2} )、( r1\text{e-4} )但參數(shù)不是萬能的要根據(jù)具體系統(tǒng)標(biāo)幺化后調(diào)整量級。強(qiáng)烈建議對功率做標(biāo)幺值歸一化避免母線電壓的數(shù)值量級400V完全壓倒功率量級幾千瓦否則優(yōu)化器會只顧壓電壓讓功率分配形同虛設(shè)。3. Matlab代碼實(shí)現(xiàn)與核心環(huán)節(jié)落地3.1 代碼整體架構(gòu)設(shè)計(jì)Matlab實(shí)現(xiàn)整個系統(tǒng)代碼組織上我建議按模塊分文件包括主程序、參數(shù)統(tǒng)一配置、系統(tǒng)模型、控制器、數(shù)據(jù)生成、結(jié)果繪圖幾個部分。project_root/ main.m # 主程序初始化-仿真循環(huán)-結(jié)果保存 config/ system_params.m # 系統(tǒng)模型參數(shù) controller_params.m # 上層/下層控制器參數(shù) model/ microgrid_model.m # 被控對象狀態(tài)更新函數(shù) generate_scenarios.m # 生成光伏/負(fù)荷/電價時序數(shù)據(jù) controller/ upper_scheduler.m # 上層調(diào)度優(yōu)化 mpc_controller.m # 下層MPC滾動優(yōu)化 plot_results.m # 繪圖與性能指標(biāo)計(jì)算模塊化最大的好處是可以分別調(diào)參數(shù)。寫代碼的時候最容易犯的錯誤是把上層優(yōu)化和下層仿真混在一起導(dǎo)致模型參數(shù)在傳遞過程中悄悄改掉出現(xiàn)那種上層的目標(biāo)函數(shù)和被控對象根本對不上的情況這個我第一版就踩過坑。3.2 上層調(diào)度代碼實(shí)際實(shí)現(xiàn)上層調(diào)度用fmincon求解我給出一個關(guān)鍵程序片段節(jié)選。% upper_scheduler.m % 輸入: Ppv_forecast, Pload_forecast, price_grid, U_soc0, T_up % 輸出: Pbat_ref_up, Psc_ref_up, Pgrid_ref_up function [Pbat_up, Psc_up, Pgrid_up] upper_scheduler(Ppv_f, Pload_f, price, soc0) N length(Ppv_f); % 96 個時段 x0 zeros(3*N, 1); % 初值: [Pbat(1..N); Psc(1..N); Pgrid(1..N)] lb [-Pbcap*ones(N,1); -Psccap*ones(N,1); -Pgrid_buy_max*ones(N,1)]; ub [ Pbcap*ones(N,1); Psccap*ones(N,1); Pgrid_sell_max*ones(N,1)]; % 線性約束: 功率平衡 Aeq*x beq Aeq kron([1 1 1], eye(N)); beq Pload_f - Ppv_f; options optimoptions(fmincon, Algorithm, active-set, ... MaxIterations, 500, Display, off); [x, fval] fmincon((x) upper_cost(x, price), x0, A, b, Aeq, beq, ... lb, ub, (x) upper_con(x, soc0), options); Pbat_up x(1:N); Psc_up x(N1:2*N); Pgrid_up x(2*N1:3*N); end這里有幾個操作上的細(xì)節(jié)。第一初值 ( x_0 ) 不要全部給零我習(xí)慣用比例分配先讓 ( P_{bat} ) 先把大部分不平衡功率扛下來( P_{sc} ) 為零( P_{grid} ) 給定一個基礎(chǔ)交換值這樣 fmincon 收斂更快也更不容易陷進(jìn)局部極值。第二SOC 的積分約束是用非線性約束函數(shù)upper_con表達(dá)的因?yàn)镾OC邊界是對 ( P_{bat} ) 的累加求和直接寫成線性不等式也是可以做的但用ceq方式實(shí)現(xiàn)更直觀調(diào)試時重新鋪開也方便。3.3 下層MPC的矩陣化求解下層MPC最核心的是要把它整理成標(biāo)準(zhǔn)QP問題然后用quadprog直接求解。這里有個從形式到代碼的跨越我把關(guān)鍵做法展示出來。將預(yù)測模型寫成增廣形式。定義未來 ( N_p ) 步的狀態(tài)序列和輸入序列( U_k [u(k|k)^T, u(k1|k)^T, \dots, u(kN_c-1|k)^T]^T )基于預(yù)測模型迭代展開得到 ( X_k F x(k) G U_k H D_k )代價函數(shù)整理成標(biāo)準(zhǔn)的 ( J \frac{1}{2} U_k^T H_{qp} U_k f_{qp}^T U_k const ) 后調(diào)用quadprog求解。核心的實(shí)現(xiàn)函數(shù)function u_opt mpc_controller(x_now, ref_bat, ref_sc, params) % x_now: [Pbat; Psc; SOCbat; Vdc] % 構(gòu)建預(yù)測方程 [F, G, H] build_mpc_matrices(params.A, params.B, params.Bd, ... params.Np, params.Nc); % 構(gòu)建QP目標(biāo) Q blkdiag(kron(eye(params.Np), diag([q1, q2, q3]))); R kron(eye(params.Nc), diag([r_bat, r_sc])); H_qp G * Q * G R; f_qp (x_now * F D * H) * Q * G; % 注意 f_qp 是按照 quadprog 約定需要轉(zhuǎn)置的實(shí)際以代碼調(diào)試為準(zhǔn) % 約束: 功率限值、SOC限值、電壓限值 Aineq build_constraint_matrix(params, G); bineq build_constraint_bound(params, x_now, F); % 求解QP opt optimoptions(quadprog, Display, off, Algorithm, interior-point-convex); [U_opt, ~] quadprog(H_qp, f_qp, Aineq, bineq, [], [], ... lb, ub, [], opt); u_opt [U_opt(1); U_opt(2)]; % 取第一個控制動作 end這里我強(qiáng)烈建議把預(yù)測模型矩陣 ( F, G, H ) 的推導(dǎo)單獨(dú)寫一個函數(shù)。我當(dāng)時為了驗(yàn)證正確性用一個小例子做了對照給定固定輸入序列直接按狀態(tài)遞推跑一遍再用矩陣表達(dá)式 ( X Fx GU HD ) 算一遍兩邊結(jié)果做差最大誤差小于 1e-10 才說明矩陣拼對了。這個驗(yàn)證方法簡單有效拼矩陣時很容易在行堆疊順序上出問題一查一個準(zhǔn)。3.4 雙層交互數(shù)據(jù)傳遞與代碼流程主程序仿真循環(huán)的核心在于每一個上層調(diào)度周期內(nèi)把上層參考值傳給下層MPC然后下層向前滾動多個采樣周期。% main.m 仿真主循環(huán)片段 for k_up 1:N_up_groups % 上層調(diào)度更新參考指令每個15分鐘執(zhí)行一次 [Pbat_ref_up, Psc_ref_up] upper_scheduler(...); % 在下層預(yù)測時域內(nèi)滾動運(yùn)行MPC每個0.1秒執(zhí)行一次 for k_mpc 1:T_up/T_s % 測量當(dāng)前狀態(tài) x_now microgrid_get_state(); % 求解MPC u_opt mpc_controller(x_now, Pbat_ref_up, Psc_ref_up); % 施加控制到被控對象 x_next microgrid_model(x_now, u_opt, disturbance(k_mpc)); % 記錄數(shù)據(jù) log_data(k_mpc, x_next, u_opt); end end需要注意的是上層的Pbat_ref_up是一個時段內(nèi)的恒定值而下層MPC在里面做高頻滾動。每個上層周期結(jié)束后的最后一步SOC狀態(tài)作為下一個上層周期的初始SOC傳入upper_scheduler。這里常見的坑是上層用了過于理想化的SOC模型比如直接按恒定效率積分而下層被控對象模型有非線性效率、有DC/DC損耗時兩個SOC對不上導(dǎo)致MPC頻繁向上層反饋SOC越界。解決方法是上層模型和下層被控對象模型對SOC的積分方式保持一致至少SOC的初值和步長要對齊我在后面問題排查部分還會提到。3.5 模型參數(shù)如何標(biāo)定模型參數(shù)標(biāo)定決定仿真結(jié)果的真實(shí)度不能憑空亂設(shè)。我給出一組參考方案參數(shù)數(shù)值標(biāo)定依據(jù)鋰電池額定容量200Ah / 240V按直流側(cè)功率需求10kW·h設(shè)計(jì)鋰電池最大充放電功率±25kW按2C倍率設(shè)計(jì)保守選取超級電容額定容量10F / 300V按承擔(dān)5kW·3s的高頻沖擊能量需求反算超級電容最大功率±30kW按瞬時功率響應(yīng)需求設(shè)計(jì)DC/DC響應(yīng)時間常數(shù)鋰電0.05s超容0.01s由變換器閉環(huán)帶寬決定功率環(huán)路帶寬通常取10~20Hz母線電容5000μF按母線動態(tài)電壓支撐需求設(shè)計(jì)母線電壓參考值400V系統(tǒng)標(biāo)稱電壓超級電容容量的估算方法特別提醒一下假設(shè)需要扛住的最高功率沖擊是 ( P_{shock}10\text{kW} )、持續(xù)時間 ( t_d5\text{s} )那么需要的能量約為 ( E50\text{kJ} )超級電容可用能量范圍按其端電壓從 ( V_{max}300V ) 放到 ( V_{min}150V ) 計(jì)算( E_{usable} \frac{1}{2}C(V_{max}^2 - V_{min}^2) )代入后推得 ( C\approx 7.4\text{F} )取工程裕量1.2倍選10F。這比隨口定一個值靠譜得多。4. 仿真結(jié)果分析與關(guān)鍵對比維度4.1 典型場景設(shè)置仿真不能只跑一條曲線就說系統(tǒng)有效要有針對性的場景設(shè)計(jì)。我做了三種典型場景場景A晴天光伏平滑光照平穩(wěn)光伏輸出相對均勻負(fù)荷按日常作息波動重點(diǎn)驗(yàn)證系統(tǒng)日常運(yùn)行成本和SOC維持策略。場景B云遮突變在某一時刻光伏出力在10秒內(nèi)從20kW跌到5kW驗(yàn)證超級電容能否扛住瞬態(tài)沖擊同時保持母線電壓不越限。場景C連續(xù)高頻擾動負(fù)荷側(cè)疊加幅值±5kW、周期0.5~2s的隨機(jī)功率波動模擬沖擊性負(fù)載啟動/停止考驗(yàn)MPC的動態(tài)功率分配能力。每種場景都要單獨(dú)統(tǒng)計(jì)指標(biāo)不要只畫幾張漂亮的功率曲線就交差。4.2 關(guān)鍵性能指標(biāo)如何統(tǒng)計(jì)我整理了一個指標(biāo)清單每次仿真結(jié)束直接plot_results.m輸出母線電壓波動峰峰值( \Delta V_{dc,pp} \max(V_{dc}) - \min(V_{dc}) )衡量動態(tài)性能的核心指標(biāo)電壓偏離參考值的均方根(RMS)( V_{dc,rms} \sqrt{\frac{1}{N}\sum(V_{dc}(k)-V_{dc}^{ref})^2} )鋰電池等效循環(huán)次數(shù)按雨流計(jì)數(shù)法或簡化的SOC往復(fù)幅度累加估算能看出混合儲能對電池壽命的保護(hù)效果系統(tǒng)運(yùn)行總成本上層調(diào)度目標(biāo)值 ( J_{up} ) 的累積反映經(jīng)濟(jì)性超級電容最大瞬時功率與沖擊次數(shù)驗(yàn)證超容是否扛住了瞬態(tài)分量各儲能SOC維持能力電池SOC是否保持在0.2~0.9窗口內(nèi)超容SOC是否在0.15~0.95窗口內(nèi)。在場景B下我實(shí)測的數(shù)據(jù)對比不加MPC動態(tài)分配的傳統(tǒng)規(guī)則控制母線電壓跌落到375V最大偏差25V恢復(fù)時間約1.8秒采用雙層MPC后母線電壓最低值395V最大偏差5V1.25%恢復(fù)時間小于0.3秒。差異非常明顯。在場景C下采用MPC的優(yōu)勢更直觀超級電容承擔(dān)了85%以上的高頻波動分量鋰電池出力曲線比純規(guī)則控制平滑得多等效循環(huán)次數(shù)下降了約40%。4.3 對比實(shí)驗(yàn)怎么設(shè)計(jì)合理很多同學(xué)做對比實(shí)驗(yàn)時會落入只和一種方法比的誤區(qū)。要讓結(jié)果有說服力至少要做三組對比對比方案說明預(yù)期對比結(jié)論方案一規(guī)則控制基于SOC滯環(huán)低通濾波經(jīng)典基線方案母線電壓波動大、電池循環(huán)次數(shù)多方案二單層MPC不區(qū)分上下層長周期MPC動態(tài)響應(yīng)差高頻分量處理不干凈方案三雙層MPC本方案本文實(shí)現(xiàn)綜合性能最優(yōu)電壓穩(wěn)定、電池平滑、成本較低規(guī)則控制的低通濾波方案有個特別值得寫的博弈點(diǎn)低通濾波時間常數(shù)選大了電池平滑了但超級電容扛不住累計(jì)能量選小了超級電容閑置電池高頻出力增加壽命衰減加劇。這個矛盾在MPC框架下是通過滾動優(yōu)化自動權(quán)衡的而不是靠人工調(diào)濾波時間常數(shù)這也是MPC方案在這類問題里更本質(zhì)的優(yōu)勢。5. 實(shí)操中遇到的常見問題與排查技巧實(shí)錄做這個項(xiàng)目過程中我前前后后遇到了不少問題挑幾個最有代表性的問題及排查過程寫出來很多是在論文和代碼注釋里根本看不到的實(shí)操經(jīng)驗(yàn)。5.1 QP求解無解約束過緊與松弛變量缺失這是最常遇到的問題。當(dāng)你把SOC約束寫得太嚴(yán)格比如電池SOC必須嚴(yán)格在0.25~0.85之間、同時預(yù)測時域內(nèi)又有一個很大的負(fù)荷跳變時MPC很可能在有限控制能力下找不到滿足所有約束的控制序列quadprog直接返回Problem is infeasible。排查思路分兩個方向檢查約束是否有物理上的矛盾。比如電池最大功率25kW但在未來5秒內(nèi)需要它輸出40kW來完成功率平衡——這問題不在求解器而在約束本身或場景設(shè)置需要調(diào)整系統(tǒng)容量或放寬約束。在約束模型中加入松弛變量 ( \epsilon )把硬約束軟化。具體做法是給SOC約束和電壓約束增加一個松弛量同時把松弛量在代價函數(shù)里以很高權(quán)重比如1e6進(jìn)行懲罰。這樣求解器寧可輕微越界一點(diǎn)點(diǎn)也不會直接無解。[ SOC_{bat,min} - \epsilon_1 \le SOC_{bat}(ki|k) \le SOC_{bat,max} \epsilon_1 ]松弛變量在工程里幾乎是必須的因?yàn)閷?shí)際電池的SOC約束受制造誤差、溫度、模型失配影響留一點(diǎn)彈性比讓控制器崩潰要好得多。5.2 上層和下層SOC計(jì)算口徑不一致導(dǎo)致調(diào)度指令失效這是我排查時間最長的一個問題。上層調(diào)度用15分鐘周期的恒定功率累加計(jì)算SOC下層MPC用0.1秒的離散積分計(jì)算SOC兩邊效率系數(shù) ( \eta ) 也不一樣結(jié)果就是上層認(rèn)為電池SOC在第18個時段還有0.65下層的實(shí)際SOC已經(jīng)掉到0.35導(dǎo)致上層指令SB下層一直試圖調(diào)節(jié)回來又調(diào)節(jié)不動。解決辦法很直接把SOC計(jì)算邏輯抽成一個公共函數(shù)上層和下層的模型都要調(diào)用它效率至少要在模型層面統(tǒng)一。另外每到一個上層調(diào)度周期要把下層當(dāng)前實(shí)際SOC回傳給上層的初始SOC而不是讓上層自己往前一直推算。5.3 MPC求解太慢預(yù)測時域過長與求解器選擇在預(yù)測時域 ( N_p30 )、控制時域 ( N_c10 ) 時每步QPS求解大約需要300毫秒左右但控制周期是0.1秒計(jì)算時間完全跟不上仿真速度被嚴(yán)重拖慢。我做了三個優(yōu)化把 ( N_p ) 從30降到20( N_c ) 從10降到5在動態(tài)性能基本不變的前提下計(jì)算時間降到約100ms。用quadprog的interior-point-convex算法替代默認(rèn)算法速度提升明顯如果還嫌慢可以換osqp通過matlab mex編譯。把常數(shù)矩陣、約束矩陣相關(guān)的部分在循環(huán)外預(yù)先計(jì)算好不要在每一步MPC求解時重新構(gòu)建。我在初版代碼里就是在循環(huán)內(nèi)反復(fù)構(gòu)造H_qp不必要的重復(fù)計(jì)算白白吃掉了一半以上的時間。最終優(yōu)化后單個采樣周期求解時間控制在20~30毫秒以內(nèi)足以在0.1秒控制周期內(nèi)實(shí)時運(yùn)行。5.4 超級電容功率高頻震蕩權(quán)重參數(shù)調(diào)優(yōu)第一次跑通閉環(huán)的時候超級電容的功率指令在兩三秒內(nèi)反復(fù)換向十幾次看起來極其焦慮。主要原因是最初代價函數(shù)里只設(shè)置了 ( q_2 (P_{sc}-P_{sc}^{ref})^2 )完全沒限制 ( \Delta u )導(dǎo)致MPC每個周期都在大幅調(diào)整超容功率來追蹤同一個瞬時參考值。對策是在代價函數(shù)中加大 ( r_sc )即控制增量懲罰項(xiàng)。我把 ( r_sc ) 從 1e-6 提高到 1e-4震蕩明顯收斂。同時還在超級電容功率輸出端增加了一個斜坡速率限制rate limiter每分鐘功率變化率限制在一定范圍內(nèi)雙保險(xiǎn)。但如果 ( r_sc ) 過大超級電容響應(yīng)速度就會變慢又會削弱它扛高頻沖擊的能力所以這個參數(shù)要跟實(shí)測結(jié)果反復(fù)折中。5.5 Matlab版本兼容性與接口差異Matlab不同版本之間quadprog的默認(rèn)算法和返回參數(shù)格式有差異。在R2020a之后的版本里quadprog的interior-point算法是默認(rèn)選項(xiàng)老版本則需要顯式指定。我在調(diào)試過程中試過幾個環(huán)境提醒讀者注意如果使用較老版本如R2018aquadprog返回的退出標(biāo)志exitflag含義與新版略有不同建議打印exitflag和output.message輔助判斷求解是否正常。如果換用YALMIPcplex求解語法會更簡潔但要注意YALMIP會引入額外的變量轉(zhuǎn)換開銷程序結(jié)構(gòu)不夠直接。建議代碼里加一段assert檢查exitflag 0一旦找到最優(yōu)解才繼續(xù)執(zhí)行否則拋出錯誤信息而不是讓程序帶病運(yùn)行到最后才發(fā)現(xiàn)結(jié)果不對。這些調(diào)測技巧是我在實(shí)際調(diào)代碼過程中反復(fù)踩了坑之后總結(jié)出來的。MPC這類控制算法的實(shí)現(xiàn)最難的部分往往不在數(shù)學(xué)推導(dǎo)而是把推導(dǎo)轉(zhuǎn)換成能在Matlab里高效、穩(wěn)定跑起來的代碼——矩陣拼裝正確、QPsolver能收斂、上下層數(shù)據(jù)能對齊這中間有大量工程細(xì)節(jié)需要細(xì)心打磨。參數(shù)調(diào)優(yōu)更是一個費(fèi)心費(fèi)時的過程我的體會是權(quán)重系數(shù)沒有一步到位的萬金油必須結(jié)合具體的母線電壓波動幅度、電池功率曲線平滑程度、超級電容SOC變化范圍不斷迭代調(diào)整。這臺系統(tǒng)的模型在仿真里跑穩(wěn)了后續(xù)要遷移到硬件在環(huán)測試甚至實(shí)際工程場景底層的控制思想并不會變變的只是被控對象的參數(shù)與擾動特性這也是MPC框架這幾年在微電網(wǎng)領(lǐng)域被反復(fù)提及和采用的根本原因之一。