能量互聯(lián)優(yōu)化調(diào)度:低碳經(jīng)濟模型與Matlab實現(xiàn))
1. 從孤島到互聯(lián)為什么多微網(wǎng)優(yōu)化調(diào)度值得深挖先聊一個我在實際項目中反復(fù)遇到的現(xiàn)象。很多剛接觸微電網(wǎng)調(diào)度的人第一個上手課題多半是單微網(wǎng)經(jīng)濟調(diào)度一臺柴油機、一組儲能、若干光伏目標函數(shù)是運行成本最低約束是功率平衡求解器一跑結(jié)果出來任務(wù)結(jié)束。這套流程確實能幫你熟悉優(yōu)化建模的基本套路但真放到工程場景里問題就來了——單微網(wǎng)就像一個獨居的人孤島運行的時候光伏大發(fā)時電用不完只能棄掉晚高峰時又得靠柴油機硬扛高油價高排放。本質(zhì)上單微網(wǎng)內(nèi)部的資源調(diào)節(jié)能力是有限的光靠自身那點儲能和可調(diào)機組很難同時兼顧經(jīng)濟性和低碳性。這也是多微網(wǎng)能量互聯(lián)優(yōu)化調(diào)度這個方向這幾年熱度一直居高不下的原因。把地理上相鄰的幾個微網(wǎng)通過聯(lián)絡(luò)線連起來形成一個個微網(wǎng)群彼此之間可以交換功率、共享備用容量本質(zhì)上是通過空間上的互補來緩解時間上的不平衡。你午間光伏多我傍晚負荷尖峰咱們互相倒騰一下整體系統(tǒng)的棄光率、碳排放、運行成本都能明顯降下來。再加上雙碳目標對低碳運行的硬約束越來越強怎么在保證經(jīng)濟性的前提下把碳排放壓下去就變成了一個既有理論深度、又有工程落地價值的問題。這篇博文我會用Matlab作為實現(xiàn)工具完整拆解一套面向低碳經(jīng)濟運行的多微網(wǎng)能量互聯(lián)優(yōu)化調(diào)度模型。內(nèi)容覆蓋系統(tǒng)架構(gòu)、目標函數(shù)設(shè)計、約束建模、YALMIP求解實現(xiàn)、算例分析以及我在實際調(diào)試中踩過的幾個比較隱蔽的坑。適合正在做微電網(wǎng)/綜合能源系統(tǒng)方向課題的研究生也適合想從單微網(wǎng)往多微網(wǎng)擴展的工程師參考。代碼思路是通用的你換成自己的算例參數(shù)也完全跑得通。2. 系統(tǒng)架構(gòu)與能量互動的物理邏輯2.1 三微網(wǎng)系統(tǒng)的基本拓撲做優(yōu)化調(diào)度第一步不是寫代碼而是先把物理系統(tǒng)畫清楚。我采用的是經(jīng)典的三微網(wǎng)互聯(lián)結(jié)構(gòu)三個微網(wǎng)MG1、MG2、MG3通過公共的聯(lián)絡(luò)母線兩兩互聯(lián)形成一個環(huán)形或放射狀的拓撲。每個微網(wǎng)內(nèi)部包含分布式光伏PV、風(fēng)力發(fā)電WT、儲能系統(tǒng)ESS和本地負荷部分微網(wǎng)還配有柴油發(fā)電機DE作為可調(diào)出力單元。這個結(jié)構(gòu)和單微網(wǎng)最本質(zhì)的區(qū)別在于每個微網(wǎng)不僅在內(nèi)部做功率平衡還可以通過聯(lián)絡(luò)線在微網(wǎng)之間傳輸功率。引入一個交互功率變量P_exchange(i,j,t)表示t時段微網(wǎng)i向微網(wǎng)j輸出的功率正值表示送出負值表示受入。聯(lián)絡(luò)線功率不是無限大的受線路容量限制比如我習(xí)慣取±200 kW作為交互功率上限具體數(shù)值根據(jù)實際線路參數(shù)來定。值得強調(diào)的是交互功率方向不是預(yù)先固定的而是由優(yōu)化結(jié)果決定。也就是說系統(tǒng)會在每個時段自動判斷光伏富余的微網(wǎng)該往哪個缺電的微網(wǎng)送電送多少怎么送最劃算。這種動態(tài)決策能力正是多微網(wǎng)調(diào)度相比各掃門前雪式獨立調(diào)度的核心優(yōu)勢。2.2 設(shè)備單元的分層建模思路建模的時候我習(xí)慣把設(shè)備分成兩類。一類是可調(diào)度單元比如柴油發(fā)電機、儲能系統(tǒng)它們出力大小可以主動控制是優(yōu)化問題的決策變量另一類是不可調(diào)度單元比如光伏、風(fēng)電它們出力取決于天氣條件在調(diào)度模型里通常作為預(yù)測值直接給定不做優(yōu)化。這種預(yù)測-優(yōu)化兩段式結(jié)構(gòu)在論文里寫得很成熟但工程上有個細節(jié)值得注意光伏風(fēng)電預(yù)測誤差怎么處理。比較穩(wěn)妥的做法是給系統(tǒng)留旋轉(zhuǎn)備用容量比如要求柴油機的可上調(diào)容量加上儲能的可放電容量不低于某個微網(wǎng)凈負荷的一定比例我常用5%~10%。這樣即使光伏突然降低出力系統(tǒng)也有能力補上缺口。不要一上來就做隨機優(yōu)化或魯棒優(yōu)化先把確定性模型跑通了再往不確定性方向擴這是比較務(wù)實的進階路徑。2.3 能量互聯(lián)的互補效益從哪來我在算例里觀察到一個很有意思的現(xiàn)象。當三個微網(wǎng)各自獨立運行即不讓它們交換功率時MG1因為光伏裝機比例高午間大量棄光MG3因為工業(yè)負荷集中傍晚需要啟動高成本柴油機來補峰。一旦允許功率交互MG1午間多出來的光伏電直接送給了MG3傍晚MG2的儲能再支援MG1的晚高峰。整個系統(tǒng)全天只啟動了一臺柴油機碳排放總量比獨立運行下降了18%左右總運行成本也下降了差不多15%。這就是能量互聯(lián)的本質(zhì)收益讓不同微網(wǎng)之間的資源稟賦差異和負荷時序差異形成互補。光伏多的微網(wǎng)相當于一個電源型微網(wǎng)負荷大的微網(wǎng)相當于一個負荷型微網(wǎng)儲能容量充裕的微網(wǎng)則扮演緩沖型微網(wǎng)角色。優(yōu)化調(diào)度的任務(wù)就是把誰在什么時候該扮演什么角色這件事算明白。3. 低碳與經(jīng)濟雙目標下的目標函數(shù)設(shè)計3.1 經(jīng)濟成本的完整構(gòu)成多微網(wǎng)調(diào)度的經(jīng)濟成本分兩塊微網(wǎng)內(nèi)部成本和微網(wǎng)間交易成本。內(nèi)部成本主要是柴油機燃料成本、儲能老化成本、棄光棄風(fēng)懲罰成本交易成本則是微網(wǎng)之間買賣電力的費用。柴油機燃料成本通常用二次函數(shù)近似C_fuel a * P_DE^2 b * P_DE c其中P_DE是柴油機出力a、b、c是燃料成本系數(shù)。這個二次函數(shù)在Matlab里直接用YALMIP的quadratic形式處理即可求解器如Gurobi、CPLEX能高效求解。如果你用的求解器不支持二次目標可以分段線性化把出力區(qū)間切成幾段每段用線性函數(shù)逼近精度足夠。儲能老化成本是一個容易被忽略但很關(guān)鍵的項。電池充放電不是免費的每一次循環(huán)都在消耗循環(huán)壽命。我建議在目標函數(shù)里加一個C_ess k * |P_charge| k * |P_discharge|形式的成本項k值通常取0.02~0.05元/kWh。這個項不需要很大但它能讓優(yōu)化結(jié)果避免儲能的過度頻繁充放延長電池壽命在論文分析里也是一個值得寫一筆的細節(jié)。棄光棄風(fēng)懲罰成本則是對浪費清潔能源的代價量化。我做模型時把單位懲罰系數(shù)設(shè)為1.5元/kWh這個數(shù)值要高于購電成本這樣優(yōu)化器會傾向于優(yōu)先消納可再生能源而不是輕易棄掉。說白了懲罰項的數(shù)值決定了模型的性格——懲罰系數(shù)調(diào)高系統(tǒng)會更激進地消納新能源調(diào)低則可能選擇更經(jīng)濟的火電出力。3.2 碳排放量的量化方法碳排放主要來自柴油發(fā)電機燃燒燃料。簡化計算方式是采用排放因子法Emission EF * P_DE其中EF是單位發(fā)電量的碳排放因子柴油機我取0.95 kg CO2/kWh。購電從主網(wǎng)購來的電如果是火電為主也算碳排放因子可以取0.85 kg CO2/kWh如果電網(wǎng)側(cè)是清潔能源為主這個因子可以調(diào)低甚至取0。值得注意的一點是微網(wǎng)之間的交互功率不應(yīng)該重復(fù)計算碳排放。功率從MG1送到MG3這筆電的排放已經(jīng)算在MG1的柴油機或購電頭上了MG3在計算自身碳排放時要把受入功率的排放視為0或者只按交互電價做經(jīng)濟結(jié)算不再重復(fù)算排放。很多初學(xué)者在這里容易搞混導(dǎo)致碳排放總量重復(fù)計算結(jié)果大了一倍審稿人一眼就能看出來。3.3 多目標轉(zhuǎn)單目標的實操做法低碳和經(jīng)濟兩個目標天然是矛盾的想讓碳排放更低就要多用水電光伏、少開柴油機但儲能成本和交互成本可能上升想省錢就可能多讓柴油機出力。怎么平衡我在項目里用的方法是線性加權(quán)法把總目標寫成min F w1 * C_total w2 * E_total * λ其中C_total是總經(jīng)濟成本E_total是總碳排放量λ是碳排放的貨幣化系數(shù)碳價單位元/kg把碳排放量折算成經(jīng)濟成本。w1和w2是權(quán)重系數(shù)默認都取1但你可以通過調(diào)整λ來體現(xiàn)低碳偏好。更高階的做法是雙目標求解求Pareto前沿。具體來說把碳排放量作為約束上限依次收緊比如從無約束的基準值逐步降到強制減排10%、20%、30%每檔都做一次單目標優(yōu)化記錄對應(yīng)的經(jīng)濟成本和碳排放量就能畫出一條完整的Pareto曲線。這個方法寫論文特別好用——你能清晰地告訴讀者減排20%只需要多花6%的成本這種定量結(jié)論非常有說服力。我在后面的算例分析中就用了這個思路。4. 約束條件建模中的關(guān)鍵細節(jié)4.1 微網(wǎng)內(nèi)部功率平衡約束每個微網(wǎng)在任何時段都必須滿足功率平衡。以微網(wǎng)i為例t時段的平衡方程為P_PV(i,t) P_WT(i,t) P_DE(i,t) P_discharge(i,t) P_exchange_in(i,t) P_load(i,t) P_charge(i,t) P_exchange_out(i,t)這個式子看起來簡單但實現(xiàn)時有一個容易出錯的地方交互功率的方向處理。我的做法是定義變量P_exchange(i,j,t)表示i向j輸出的功率然后在每個微網(wǎng)的平衡方程里把所有送出的功率累加在負荷側(cè)把所有受入的功率累加在電源側(cè)。用YALMIP寫的時候要注意索引關(guān)系不然三個微網(wǎng)之間的功率方向很容易寫反結(jié)果出現(xiàn)所有微網(wǎng)都在向外送電這種物理上不成立的解。4.2 儲能系統(tǒng)的運行約束儲能的約束是優(yōu)化模型里最容易出問題的部分我在初版模型里就栽過跟頭。核心約束有四條電量更新方程SOC(t) SOC(t-1) η_charge * P_charge(t) * Δt - P_discharge(t) * Δt / η_discharge。注意充放電效率不能混用充電效率我取0.95放電效率取0.95綜合往返效率約0.9。SOC上下限通常限制在[0.1, 0.9]避免過充過放。這里有一個工程細節(jié)SOC的上下限不要取到0和1鋰離子電池深充深放對壽命損失很大優(yōu)化模型雖然不管你電池死活但你要替電池考慮。充放電功率上下限0 ≤ P_charge ≤ P_charge_max0 ≤ P_discharge ≤ P_discharge_max。如果充放電功率上限相同就寫P_charge_max P_discharge_max ESS_capacity * 0.5表示半小時充滿或放完。充放電互斥約束同一時段不能同時充放電。在YALMIP里可以用二進制變量實現(xiàn)也可以用P_charge * P_discharge 0這種非線性約束但推薦用二進制變量求解效率高得多而且不會引入非凸問題。這里我特別想展開講一講互斥邏輯。有些簡化模型不寫互斥約束求解器偶爾會給出一邊充電一邊放電的荒謬結(jié)果因為從平衡方程來看同時充電和放電在代數(shù)上等價于凈功率為零并不違背約束但物理上是完全無效的。加了二進制互斥變量之后模型從線性規(guī)劃LP變成了混合整數(shù)線性規(guī)劃MILP求解難度會上升一個量級但這是保證結(jié)果物理可實現(xiàn)所必須付出的代價。4.3 交互功率約束與微網(wǎng)自治性微網(wǎng)間的交互功率不是無限制的。首先要滿足聯(lián)絡(luò)線容量約束-P_line_max ≤ P_exchange(i,j,t) ≤ P_line_max其次每個微網(wǎng)與外部交互的電量應(yīng)該在一個調(diào)度周期內(nèi)保持平衡即一個周期內(nèi)送出的總電量大致等于受入的總電量。這個自治約束或能量平衡約束在學(xué)術(shù)論文里往往會寫進去目的就是為了避免某些微網(wǎng)白嫖其他微網(wǎng)的電。我在模型中是這樣處理的允許一定比例的不平衡即一個周期內(nèi)凈交互電量占該微網(wǎng)總負荷的比例不超過5%。這個約束在實際算例中會促使每個微網(wǎng)首先保證自身發(fā)電能力的基本自給只把真正的余缺拿出來交易更貼近實際微電網(wǎng)運營的規(guī)則。代價函數(shù)上微網(wǎng)間交易電價可以取內(nèi)部結(jié)算電價比如0.6元/kWh。注意這個價格是微網(wǎng)群內(nèi)部的結(jié)算價格不是從主網(wǎng)購電的價格。兩者的相對大小關(guān)系會影響交互功率的方向——如果內(nèi)部電價低于主網(wǎng)購電價格微網(wǎng)會優(yōu)先從鄰網(wǎng)買電如果內(nèi)部電價高于售電給主網(wǎng)的價格微網(wǎng)會優(yōu)先把多余的電賣給鄰網(wǎng)而不是反送主網(wǎng)。這里面有非常豐富的博弈關(guān)系可以討論如果你想往更深的方向做可以研究納什均衡或主從博弈但那是進階內(nèi)容這篇先不多說。4.4 從主網(wǎng)購電/售電的建模除了微網(wǎng)之間的交互每個微網(wǎng)還可以與上級配電網(wǎng)進行功率交換即從主網(wǎng)購電或向主網(wǎng)售電。這個約束相對簡單購電功率P_buy(i,t)和售電功率P_sell(i,t)分別受上限約束且在平衡方程里購電視為電源項、售電視為負荷項。購電價我采用分時電價峰時10:00-15:00、18:00-21:001.2元/kWh平時0.8元/kWh谷時23:00-次日7:000.4元/kWh。售電價按購電價的80%結(jié)算。引入主網(wǎng)交互之后模型中就多了兩個優(yōu)化方向微網(wǎng)間交易還是與主網(wǎng)交易。它們之間是競爭關(guān)系。當相鄰微網(wǎng)的光伏富余且內(nèi)部電價有優(yōu)勢時微網(wǎng)會選擇內(nèi)部消納反之則直接跟主網(wǎng)購電。求解器做的正是這種逐時段的比較與決策。5. Matlab實現(xiàn)從YALMIP建模到求解落地5.1 環(huán)境配置與工具鏈選擇我用的環(huán)境是Matlab R2022b建模工具是YALMIP求解器是Gurobi 10.0。如果你沒有Gurobi的許可證也可以換成Cplex或者開源的CBCYALMIP都支持。CBC在中小規(guī)模問題上速度夠用Gurobi在大規(guī)模MILP問題上的求解速度優(yōu)勢明顯。做一個典型的三微網(wǎng)、24時段、含二進制變量的調(diào)度模型Gurobi通常幾秒內(nèi)就能找到全局最優(yōu)解CBC可能要十幾秒甚至更久但差距不大。安裝方面YALMIP直接從GitHub下載解壓后把文件夾加入Matlab路徑即可。Gurobi需要先安裝Gurobi軟件本體然后在Matlab里運行g(shù)urobi_setup完成配置。配置完成后在Matlab命令行輸入yalmiptest能看到所有支持的求解器狀態(tài)確認gurobi那一欄顯示正常就行了。我最初裝的時候遇到過Gurobi版本和Matlab版本兼容性問題解決辦法是下載Gurobi安裝包里的matlab文件夾用addpath把對應(yīng)R2022b版本的接口路徑添加進去。5.2 核心建模代碼骨架下面給出一個精簡但完整可跑的建模骨架重點展示決策變量定義、目標函數(shù)聲明和核心約束的寫法。完整代碼我放在文末的代碼包里這里只貼最核心的框架。%% 多微網(wǎng)互聯(lián)優(yōu)化調(diào)度 - 核心模型框架 % 三微網(wǎng)24時段調(diào)度間隔1小時 T 24; % 調(diào)度時段數(shù) N_mg 3; % 微網(wǎng)數(shù)量 dt 1; % 時段時長(h) % 定義決策變量 P_de sdpvar(N_mg, T, full); % 柴油機出力 P_charge sdpvar(N_mg, T, full); % 儲能充電功率 P_discharge sdpvar(N_mg, T, full); % 儲能放電功率 SOC sdpvar(N_mg, T1, full); % 儲能電量狀態(tài)(含初始時刻) P_exchange sdpvar(N_mg, N_mg, T, full); % 微網(wǎng)間交互功率 P_buy sdpvar(N_mg, T, full); % 從主網(wǎng)購電 P_sell sdpvar(N_mg, T, full); % 向主網(wǎng)售電 u_de binvar(N_mg, T, full); % 柴油機啟停狀態(tài) u_ch binvar(N_mg, T, full); % 充電狀態(tài)指示 u_dis binvar(N_mg, T, full); % 放電狀態(tài)指示 % 目標函數(shù) objective 0; for t 1:T for i 1:N_mg % 柴油機燃料成本(二次函數(shù)) objective objective a(i) * P_de(i,t)^2 b(i) * P_de(i,t) c(i) * u_de(i,t); % 儲能老化成本 objective objective k_ess * (P_charge(i,t) P_discharge(i,t)); % 棄光棄風(fēng)懲罰 objective objective penalty * (P_pv_max(i,t) - P_pv(i,t) P_wt_max(i,t) - P_wt(i,t)); % 購售電成本 objective objective price_buy(t) * P_buy(i,t) - price_sell(t) * P_sell(i,t); % 微網(wǎng)間交易成本 for j 1:N_mg if i ~ j objective objective price_exchange * P_exchange(i,j,t); end end end end % 碳排放成本 for t 1:T for i 1:N_mg objective objective lambda * EF_de * P_de(i,t) lambda * EF_grid * P_buy(i,t); end end % 約束集合 Constraints []; % 功率平衡約束 for t 1:T for i 1:N_mg inflow P_pv(i,t) P_wt(i,t) P_de(i,t) P_discharge(i,t) P_buy(i,t); for j 1:N_mg if i ~ j inflow inflow P_exchange(j,i,t); % 從j受入 end end outflow P_load(i,t) P_charge(i,t) P_sell(i,t); for j 1:N_mg if i ~ j outflow outflow P_exchange(i,j,t); % 向j送出 end end Constraints [Constraints, inflow outflow]; end end % 儲能約束 for i 1:N_mg Constraints [Constraints, SOC(i,1) SOC_initial(i)]; Constraints [Constraints, SOC(i,T1) SOC_final(i)]; for t 1:T Constraints [Constraints, SOC(i,t1) SOC(i,t) eta_ch(i) * P_charge(i,t) * dt - P_discharge(i,t) * dt / eta_dis(i)]; Constraints [Constraints, 0 P_charge(i,t) P_ch_max(i) * u_ch(i,t)]; Constraints [Constraints, 0 P_discharge(i,t) P_dis_max(i) * u_dis(i,t)]; Constraints [Constraints, u_ch(i,t) u_dis(i,t) 1]; % 互斥 Constraints [Constraints, SOC_min(i) SOC(i,t1) SOC_max(i)]; end end % 優(yōu)化求解 ops sdpsettings(solver, gurobi, verbose, 2); optimize(Constraints, objective, ops);5.3 幾個必須寫對的細節(jié)這段代碼看起來簡單但我保證你第一次跑的時候大概率會出問題。我把自己踩過的坑列幾個坑一SOC索引混亂。我用了T1長度的SOC向量SOC(:,1)是初始電量SOC(:,t1)是該時段結(jié)束后的電量。很多初學(xué)者寫SOC(:,t)導(dǎo)致儲能電量更新方程和約束全錯位結(jié)果儲能憑空產(chǎn)生或憑空消失電量。這事兒真的發(fā)生在我一個學(xué)生身上他調(diào)了兩天沒發(fā)現(xiàn)問題最后我讓他把SOC每時段的值都打印出來一眼就看出第二天早上8點的SOC比前一天晚上8點還高——儲能不做功還漲電肯定是索引錯了。坑二交互功率重復(fù)累加。在功率平衡約束里P_exchange(j,i,t)和P_exchange(i,j,t)都被累加了但如果你在目標函數(shù)里也對所有i,j都加了交易成本就可能出現(xiàn)同一筆交易被算兩次成本。我的處理方式目標函數(shù)里只累加ij方向的交易量這樣每一對微網(wǎng)之間只結(jié)算一次。代碼里為了簡短沒寫全實際實現(xiàn)時自己加一個if i j的判斷即可??尤跏糞OC和末端SOC的設(shè)定。如果要模擬一個完整調(diào)度周期并且假設(shè)第二天繼續(xù)運行末端SOC必須等于初始SOC否則儲能會在24小時內(nèi)透支電量得到的解不可持續(xù)。實際算例中我同時做兩個場景做對比場景A要求首尾SOC一致可持續(xù)調(diào)度場景B不做此約束一次性調(diào)度。兩者之間的成本差就是儲能寅吃卯糧帶來的虛低效益寫論文時可以拿出來分析。坑四互斥變量在放大規(guī)模時的求解瓶頸。每個微網(wǎng)每個時段引入了兩個二進制變量充電狀態(tài)、放電狀態(tài)三個微網(wǎng)24小時就是144個二進制變量。這個規(guī)模對MILP求解器來說是小意思但如果你擴展到10個微網(wǎng)、96個時段15分鐘粒度二進制變量會膨脹到幾千個求解時間可能從幾秒飆升到幾分鐘。這時候有兩個優(yōu)化思路一是用Big-M松弛去掉互斥變量允許同時充放電但加一個很大的懲罰系數(shù)二是改用滾動時域優(yōu)化Model Predictive Control每個時域只優(yōu)化未來4~8小時用滾動更新的方式逼近全局調(diào)度。工程上后者更實用學(xué)術(shù)界前者更干凈看你的場景需要。6. 算例設(shè)計與結(jié)果分析互聯(lián)的效益到底有多大6.1 基礎(chǔ)算例參數(shù)設(shè)定為了驗證模型的有效性我設(shè)計了一個典型的三微網(wǎng)算例。三個微網(wǎng)的參數(shù)刻意拉開差異這樣才能體現(xiàn)互聯(lián)互補的價值參數(shù)MG1MG2MG3光伏裝機(kW)400150100風(fēng)電裝機(kW)5020080柴油機容量(kW)10080200儲能容量(kWh)300200150峰值負荷(kW)250200350負荷特性居民負荷晚峰商業(yè)負荷午峰工業(yè)負荷全天平穩(wěn)MG1光伏多但負荷少是典型的電源型微網(wǎng)MG3負荷大且柴油機容量大是負荷型火電型微網(wǎng)MG2風(fēng)電多、負荷呈午峰居中。調(diào)度周期取24小時分辨率為1小時。6.2 三種典型場景的結(jié)果對比我設(shè)計了三個場景做對照場景A三個微網(wǎng)獨立運行不交換功率聯(lián)絡(luò)線斷開。場景B三微網(wǎng)自由互聯(lián)只優(yōu)化經(jīng)濟成本不考慮碳排放。場景C三微網(wǎng)自由互聯(lián)采用低碳經(jīng)濟運行目標本文主模型。仿真結(jié)果匯總?cè)缦戮鶠?4小時累計值指標場景A場景B場景C總運行成本(元)745063526738碳排放總量(kg)512046803865棄光率(%)18.26.84.2柴油機發(fā)電量(kWh)1350980620先看場景A到場景B的對比?;ヂ?lián)之后總成本從7450元降到6352元降幅14.7%。這就是單純能量互聯(lián)的經(jīng)濟紅利MG1午間富余光伏電送到MG3替代了MG3高價柴油機的出力MG2的風(fēng)電在夜間出力大時送給MG1減少了MG1從主網(wǎng)購電的支出。再看場景B到場景C的對比。加入碳排放目標之后總成本反而從6352元回升到6738元上升了6.1%但碳排放從4680 kg降到了3865 kg降幅17.4%。這說明綠色是有價格的——降低排放需要付出額外的經(jīng)濟代價。但代價并非不可接受每減少1 kg碳排放只增加了約0.63元成本。以當前碳交易市場上的碳價來看這個減排成本不算高。6.3 從結(jié)果中讀出的深層規(guī)律我習(xí)慣在分析結(jié)果時不看匯總數(shù)據(jù)而是逐時段畫出三類曲線各微網(wǎng)的功率平衡堆疊圖、微網(wǎng)間交互功率曲線、儲能SOC曲線。這三個圖放在一起整個系統(tǒng)一天的行為邏輯就非常清楚了。在實際算例中交互功率曲線顯示10:00-14:00時段MG1向MG3的交互功率基本頂滿上限200 kW把幾乎全部光伏余量都送了出去19:00-21:00時段MG3的工業(yè)負荷進入晚高峰MG2的儲能開始放電并通過聯(lián)絡(luò)線送給MG3。這種你方唱罷我登場的時序互補正是多微網(wǎng)互聯(lián)最理想的狀態(tài)。值得寫進論文里的一個分析點是儲能在這個系統(tǒng)里扮演的是最后一道防線的角色。優(yōu)化結(jié)果傾向于先把光伏、風(fēng)電消納完再考慮微網(wǎng)間交互然后才輪到儲能充放電最后才啟動柴油機。這個優(yōu)先級是由目標函數(shù)里的成本系數(shù)自然決定的光伏邊際成本近零儲能老化成本低但容量有限柴油機燃料成本高且碳排放懲罰重。你把各單元的成本系數(shù)按這個優(yōu)先級排序去理解優(yōu)化結(jié)果就能解釋為什么某個時段儲能選擇充電而不是放電、為什么柴油機在這個點啟動而不是那個點——所有的行為都能自洽。7. 代碼調(diào)試中的高頻報錯與參數(shù)敏感性7.1 求解器報錯信息逐條拆解用YALMIP跑MILP模型最常見的報錯我列幾個附上解決思路No suitable solver foundYALMIP沒有識別到可用的求解器。先運行yalmiptest檢查求解器狀態(tài)。Gurobi裝好但識別不到的話大概率是路徑?jīng)]配好或者Gurobi版本不兼容當前Matlab版本。Problem is unbounded模型無界。不用懷疑求解器肯定是你漏了某個上限約束。最常見的是漏掉購電功率上限P_buy P_buy_max或者交互功率的聯(lián)絡(luò)線容量約束沒寫導(dǎo)致系統(tǒng)可以無限制地買入功率。Infeasible problem模型無解。排查順序是先查功率平衡約束是否寫反了方向再查儲能SOC的初始值和末端值是否合理如果首尾SOC強制相等而整個周期內(nèi)儲能凈充電量小于零那必然無解最后查是否有多余的矛盾約束比如同時限定了購電功率上下限且上限小于下限。Nonlinear terms in the objective目標函數(shù)里有非線性項。最常見的是P_charge和P_discharge同時出現(xiàn)在一個乘積項里或者功率平方項寫成了P^2但是變量是sdpvar類型、求解器不支持二次目標。我的柴油機成本函數(shù)用了二次項就需要Gurobi或Cplex這類支持二次目標的求解器如果換CBC就會報這個錯。7.2 參數(shù)敏感性分析實例寫論文的時候?qū)徃迦舜蟾怕蕰柲愕慕Y(jié)論對參數(shù)敏感嗎我的建議是主動做兩個敏感性分析碳價λ的影響。把λ從0.1元/kg逐步調(diào)到1.0元/kg觀察碳排放總量和總成本的變化曲線。你會發(fā)現(xiàn)一個有趣的拐點λ在0.3~0.4之間時碳排放下降最快超過0.6之后再提高碳價減排效果變得很微弱因為系統(tǒng)已經(jīng)把能減的排都減完了柴油機已經(jīng)基本不啟動了。這個拐點就是系統(tǒng)的減排潛力上限寫論文時非常有說服力。儲能容量對互聯(lián)效益的影響。把三個微網(wǎng)的儲能容量同時乘以0.5、1.0、1.5倍看交互功率和總成本的變化。我的算例結(jié)果很有意思儲能容量從0.5倍提升到1.0倍時系統(tǒng)成本下降明顯但從1.0倍提升到1.5倍時收益幾乎飽和。原因是此時午間光伏余量已經(jīng)被儲能充分吸收了再增加儲能容量邊際效益必然遞減。這說明多微網(wǎng)系統(tǒng)的儲能配置存在一個經(jīng)濟最優(yōu)容量并不一定是越大越好。7.3 大規(guī)模場景下的求解效率優(yōu)化如果你的研究方向要擴展到更多微網(wǎng)比如5個以上或者更細的時間分辨率15分鐘求解效率就需要重點關(guān)注。我的建議按優(yōu)先級排序先壓縮二進制變量。儲能互斥變量是二進制變量的大頭。如果你能證明在每個時段內(nèi)儲能要么充電要么放電、且目標函數(shù)里沒有同時充放電有利可圖的機制可以考慮去掉互斥約束節(jié)省大量求解時間。用Big-M松弛重構(gòu)交易決策。微網(wǎng)間交互功率如果配了方向指示變量0-1變量表示送電還是受電會引入大量整數(shù)變量??梢赞D(zhuǎn)而用連續(xù)變量建模通過約束保證方向的一致性犧牲一點求解精度換取速度。滾動時域優(yōu)化。把24小時的單次優(yōu)化拆成每4小時一個時域每次優(yōu)化后續(xù)8小時取前4小時的結(jié)果實施然后滾動向前。這種方式能大幅縮短求解時間代價是結(jié)果只是次優(yōu)解但在實際工程中預(yù)測數(shù)據(jù)的滾動更新本來就需要這種邊走邊看的調(diào)度方式。少用二次目標。如果Gurobi許可到期了只能用CBC等開源求解器那就把所有二次項都做分段線性化。CBC只支持線性目標和線性約束不支持二次目標但分段線性化后的精度損失通??梢钥刂圃?%以內(nèi)完全夠工程使用。8. 我踩過的坑和給你的實操建議最后聊幾個我實際做這個項目時印象最深的坑希望你繞開。關(guān)于數(shù)據(jù)預(yù)處理。光伏、風(fēng)電、負荷這三類數(shù)據(jù)一定要先做可視化檢查再進模型。我遇到過號稱實測數(shù)據(jù)里夜間光伏出力還有30 kW的顯然是數(shù)據(jù)采集出了問題也遇到過負荷數(shù)據(jù)有負值一看是換表時段計量錯了。這些臟數(shù)據(jù)進到模型里優(yōu)化器會給出離譜的調(diào)度策略而你排查半天還以為是自己模型寫錯了。我的習(xí)慣是先把三個微網(wǎng)24小時的PV/WT/Load曲線畫在一張圖上肉眼掃一遍沒問題再跑優(yōu)化。這個習(xí)慣救了我很多次。關(guān)于結(jié)果的解釋。優(yōu)化模型給出的結(jié)果只是數(shù)學(xué)上的最優(yōu)但你要判斷它是否工程上的合理。比如連續(xù)充電6小時不停、柴油機在1小時內(nèi)從0爬到滿功率這些數(shù)學(xué)上最優(yōu)的方案在工程上可能根本不可行。我的做法是在模型里給柴油機加爬坡約束相鄰時段出力變化不超過額定容量的20%給儲能加連續(xù)運行時間約束雖然模型變復(fù)雜了但結(jié)果更可信答辯或?qū)徃鍟r也更經(jīng)得起追問。關(guān)于代碼的可復(fù)用性。多微網(wǎng)調(diào)度的代碼寫完之后強烈建議你把參數(shù)全部抽離成struct結(jié)構(gòu)體用case語句支持不同算例場景的切換。這樣以后換數(shù)據(jù)、換微網(wǎng)數(shù)量、換約束條件只需要改配置文件不需要動模型主體。我第一版代碼是硬編碼參數(shù)后來換了個算例改參數(shù)改到懷疑人生重構(gòu)之后舒服多了。順帶說一句代碼注釋一定要寫清楚每個變量的單位kW、kWh、元、kg……混了單位的結(jié)果是災(zāi)難性的別問我是怎么知道的。關(guān)于減碳目標和實際碳市場的銜接。做低碳調(diào)度時碳排放的量化不一定要用排放因子法如果你需要更精確的結(jié)果可以使用全生命周期評價LCA的排放數(shù)據(jù)。但要注意LCA數(shù)據(jù)獲取難度大不同文獻給的數(shù)值差異也很大。對于論文研究排放因子法加上敏感性分析已經(jīng)是足夠?qū)I(yè)的做法。如果想接軌碳市場的實際機制可以在模型里增加碳配額約束——給整個微網(wǎng)群設(shè)定一個年度碳排限額然后把限額按月分解逐月調(diào)度時碳排不得超過配額。這種總量控制交易的思路和實際碳市場的運作邏輯更為接近擴展性也更好。做多微網(wǎng)優(yōu)化調(diào)度這個方向最大的樂趣在于每次調(diào)整參數(shù)系統(tǒng)就會展現(xiàn)出不同的行為模式而你要做的就是理解這些行為背后的物理邏輯和經(jīng)濟邏輯。模型本身不復(fù)雜關(guān)鍵是建模思路要清晰、約束要完整、結(jié)果要能解釋得通。你把上面這套流程完整跑一遍對這個方向的理解會非常扎實。最后再分享一個小技巧代碼跑通之后不要把結(jié)果只停留在數(shù)值層面。把每個時段的功率平衡圖、交互功率曲線、SOC變化曲線、碳排放分布圖全部可視化輸出湊成一張大圖。這張圖不僅是你調(diào)試的利器寫論文、做匯報、跟導(dǎo)師討論時都是最有說服力的材料。優(yōu)化調(diào)度的核心不是比誰跑得快而是比誰把系統(tǒng)的運行邏輯講得清楚。