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