氣協(xié)同碳捕集與垃圾焚燒的虛擬電廠優(yōu)化調(diào)度MATLAB實現(xiàn))
這兩年我自己在虛擬電廠優(yōu)化調(diào)度上寫了不少模型之前主要集中在傳統(tǒng)火電、儲能和新能源的組合直到最近把碳捕集、垃圾焚燒和電轉(zhuǎn)氣三個模塊揉進同一個框架里才真正體會到“協(xié)同”兩個字不是隨便說說的。這套MATLAB代碼做的是計及電轉(zhuǎn)氣協(xié)同的含碳捕集與垃圾焚燒虛擬電廠優(yōu)化調(diào)度說白了就是把垃圾焚燒機組、碳捕集裝置、電轉(zhuǎn)氣設(shè)備、風電光伏和儲氣儲碳設(shè)施放在一個優(yōu)化問題里統(tǒng)一決定每個時段該發(fā)多少電、捕多少碳、制多少氣、存多少能。剛立項時我也覺得這是不是有點強行拼湊垃圾焚燒和碳捕集各有一堆復(fù)雜的物理約束再塞進電轉(zhuǎn)氣模型規(guī)模和求解難度都會明顯上升。但算例結(jié)果出來后我發(fā)現(xiàn)這三者之間確實存在一條很自然的協(xié)同鏈垃圾焚燒提供連續(xù)穩(wěn)定的電力和蒸汽碳捕集消耗這些能量去抓二氧化碳電轉(zhuǎn)氣再在棄風棄光時段把電能和二氧化碳轉(zhuǎn)成天然氣儲存起來峰時放出來使用。整個過程把“碳”當成了能量載體在時間軸上倒騰最終系統(tǒng)總成本、碳排放和棄電率都有明顯改善。這篇文章就把我的建模思路、MATLAB實現(xiàn)和踩坑過程完整梳理一遍給想復(fù)現(xiàn)或者做類似項目的人一個能直接參考的框架。1. 單獨算賬不賺錢放進虛擬電廠里反而能盈利這套組合的邏輯起點很多人一看到“碳捕集”三個字第一反應(yīng)就是高能耗、高成本。這個印象沒錯常規(guī)胺法碳捕集每捕集一噸二氧化碳電耗加熱耗加起來折算能量損失非常可觀單獨給電廠加一套CCS幾乎就是純花錢的設(shè)備。電轉(zhuǎn)氣也一樣電解水制氫再甲烷化能量轉(zhuǎn)換效率一路打折從電力視角看怎么算都不太經(jīng)濟。但垃圾焚燒電廠的情況不一樣。城市生活垃圾每天必須處理焚燒廠通常是連續(xù)運行、負荷相對平穩(wěn)的機組等于一個天然基荷電源。焚燒產(chǎn)生的高溫煙氣和余熱蒸汽恰好分別是碳捕集裝置需要的“碳源”和“熱源”。一噸生活垃圾焚燒產(chǎn)生的煙氣里含有大量CO2濃度比普通燃煤鍋爐還更集中這就讓碳捕集的單位成本下降不少。電轉(zhuǎn)氣設(shè)備的角色則更像“能量搬用工”。虛擬電廠里通常還有風電和光伏深夜風電大發(fā)、負荷很低的時候如果不消納就只能棄掉。把棄電送進電解槽制氫再用碳捕集抓下來的CO2完成甲烷化反應(yīng)就能把原本放棄掉的電能變成天然氣存進儲罐。天然氣可以等到傍晚用電高峰再用燃氣輪機發(fā)出來或者直接對外出售。這一進一出等于把“時間”納入了調(diào)度決策。這里還有一個容易忽略的點碳捕集系統(tǒng)本身是可調(diào)負荷。捕集率調(diào)高耗電耗熱上升多抓CO2捕集率降下來耗電下降相當于給系統(tǒng)騰出電力空間。電轉(zhuǎn)氣用的CO2正好來自捕集系統(tǒng)所以當系統(tǒng)電力富余時P2G可以開大功率多產(chǎn)氣同時需要更多CO2原料CCS就跟著提高捕集率電力緊張時P2G降低運行CCS也可以減少捕集把電讓給更重要的負荷。這三個設(shè)備的運行節(jié)奏、碳排放和能量流互相咬合只有放在同一個優(yōu)化問題中用同一個時間尺度、同一套平衡約束去求解才能把這種互補關(guān)系真正用起來。我下面先詳細講每個子系統(tǒng)的數(shù)學(xué)建模然后給出MATLAB搭配YALMIP的代碼框架再用三組算例對比來解釋協(xié)同效應(yīng)的來源最后分享幾個實際調(diào)試模型時非常容易踩的坑。2. 建模第一步把垃圾焚燒、CCS和P2G三個子系統(tǒng)的狀態(tài)方程寫清楚2.1 垃圾焚燒機組它不僅是電源還是整條碳鏈的起點在虛擬電廠框架里垃圾焚燒機組我習慣用進料量而不是發(fā)電功率作為主要決策變量。設(shè)第t個時段的垃圾進料量為M(t)單位是噸/小時那么焚燒發(fā)電功率可以寫成P_w(t) η_w * LHV_w * M(t) / 3.6這里的η_w是焚燒-余熱鍋爐-汽輪機發(fā)電的綜合電效率LHV_w是生活垃圾低位熱值單位取MJ/kg除以3.6是為了把單位折算成MWh/t。城市生活垃圾的熱值通常在6到11 MJ/kg之間電效率大概0.2到0.24所以一臺日處理1500噸的焚燒廠額定發(fā)電功率也只有30兆瓦左右單看體量很小但勝在穩(wěn)定。垃圾焚燒的約束里有幾個容易遺漏的地方。首先是日處理總量約束城市的垃圾收運量是剛性的每天必須處理掉約定的噸位寫成數(shù)學(xué)約束就是sum(M(t), 1, T) M_daily其次是焚燒爐的燃燒穩(wěn)定性約束。為了保護爐膛和煙氣凈化系統(tǒng)進料量不能頻繁大范圍波動所以有爬坡約束和負荷上下限M_min、M_max。工程上垃圾焚燒機組極少深度調(diào)峰模型里我會把出力限制在60%到100%額定負荷之間這樣很符合實際。最后是蒸汽耦合。余熱鍋爐的抽汽量S_ext(t)近似與進料量線性相關(guān)S_ext(t) k_w * M(t)這部分蒸汽正好用于碳捕集再生塔的再沸器。在模型中我把蒸汽成本折算進CCS的運行成本不單獨建一套熱力管網(wǎng)模型因為虛擬電廠層面的調(diào)度重點并不在熱力學(xué)細節(jié)而在整個系統(tǒng)的能量流和碳流分配。2.2 碳捕集系統(tǒng)捕集率是核心但千萬注意雙線性項的坑碳捕集系統(tǒng)的最簡模型是焚燒煙氣中CO2總流量G_co2(t)正比于垃圾進料量實際捕集量C_cap(t)等于煙氣CO2流量乘捕集率δ(t)C_cap(t) δ(t) * G_co2(t)捕集率δ的工程范圍一般在0.1到0.9之間。下限不能為零是因為胺法捕集系統(tǒng)有一個運行負荷下限如果液氣比失衡吸收塔會出各種問題。捕集系統(tǒng)的耗電E_ccs(t)包括引風機、循環(huán)泵和壓縮機電耗再加上再沸器蒸汽耗量。為了線性化我寫成E_ccs(t) a_ccs * C_cap(t) b_ccs * u_ccs(t)其中u_ccs(t)是0-1變量表示捕集系統(tǒng)是否在線b_ccs是固定功耗。這里要特別提醒一句如果直接把C_cap(t)δ(t)*G_co2(t)寫進代碼就產(chǎn)生了一個連續(xù)變量與連續(xù)變量相乘的雙線性項模型會從MILP變成MINLP求解難度直線上升還容易陷入局部最優(yōu)。我在實際代碼里不顯式引入δ(t)這個變量而是把C_cap(t)直接作為連續(xù)決策變量用以下約束來限定C_cap(t) ≤ δ_max * G_co2(t) C_cap(t) ≥ δ_min * G_co2(t) - bigM * (1 - u_ccs(t)) C_cap(t) ≤ bigM * u_ccs(t)這樣當u_ccs(t)1時捕集量被限制在最小和最大煙氣流量之間當u_ccs(t)0時第二和第三個約束共同把C_cap(t)壓到0。整個模型依然是線性約束捕集率δ變成了事后計算出來的結(jié)果。捕集下來的CO2不一定馬上被電轉(zhuǎn)氣用掉所以我加了儲碳罐。儲碳罐的狀態(tài)方程是V_co2(t1) V_co2(t) C_cap(t) - U_p2g_co2(t)U_p2g_co2(t)是電轉(zhuǎn)氣在t時段消耗的CO2量。加入儲碳罐之后CCS和P2G的節(jié)奏可以錯開夜間捕捉的CO2白天再用也行模型的靈活度顯著提高。2.3 電轉(zhuǎn)氣系統(tǒng)電解制氫、甲烷化與儲氣罐的時間平移作用電轉(zhuǎn)氣設(shè)備從電到天然氣的完整鏈條包括兩個環(huán)節(jié)電解水制氫和甲烷化。電解槽消耗電功率P_p2g(t)產(chǎn)出氫氣的能量為H2_energy(t) η_el * P_p2g(t)η_el是電解效率通常在0.65到0.75之間。接下來甲烷化反應(yīng)把氫氣和二氧化碳合成甲烷反應(yīng)關(guān)系簡化為4H2 CO2 → CH4 2H2O工程上我不去細算摩爾質(zhì)量直接用一個總效率η_p2g_total來對應(yīng)“電力到天然氣熱功率”的轉(zhuǎn)換H_gas(t) η_p2g_total * P_p2g(t)同時產(chǎn)出的天然氣需要消耗一定比例的CO2U_p2g_co2(t) μ_co2 * H_gas(t)μ_co2大約在0.20到0.23 kg/kWh這表示每生產(chǎn)一千瓦時熱值的天然氣大約需要消耗0.2千克左右的CO2。這樣建模的好處是碳循環(huán)鏈條可以在物料平衡里直接體現(xiàn)出來垃圾焚燒煙氣里的CO2 → CCS捕集 → 儲碳罐 → P2G甲烷化 → 儲氣罐 → 高峰時段燃機發(fā)電。電解槽自身也有運行限制。頻繁啟停對電解槽壽命有很大影響所以模型加入了最小運行功率P_p2g_min和0-1變量u_p2g(t)避免在低功率下“似開非開”。儲氣罐的容量和狀態(tài)方程是V_gas(t1) V_gas(t) H_gas(t) - D_gas(t)D_gas(t)代表對外放氣可以是供給燃氣輪機發(fā)電也可以是外售天然氣。我用燃氣輪機發(fā)電為主算例這相當于把棄電通過碳和氫載體存儲在電力負荷高峰再釋放這是整套協(xié)同機制里最關(guān)鍵的時間平移約束。補充一個重要細節(jié)就是初始儲能約束。儲氣罐和儲碳罐都必須加上V(1)V(T1)否則優(yōu)化器會“白嫖”初始儲存的能量把賬算得過于樂觀。這個約束在后面的踩坑章節(jié)里我會再次強調(diào)。2.4 虛擬電廠全局層功率平衡、備用約束、碳配額與目標函數(shù)有了三個子系統(tǒng)的模型最后把它們組裝到虛擬電廠層。最基本的約束是每個時段的電功率平衡P_w(t) P_GT(t) P_wind(t) P_pv(t) P_buy(t) P_load(t) P_p2g(t) E_ccs(t) P_sell(t)P_buy(t)是向外部電網(wǎng)購電功率P_sell(t)是向外部電網(wǎng)售電功率。購售電不應(yīng)該同時大于零模型里我會加入互斥約束避免優(yōu)化器在同一時段低價買入高價賣出這種投機套利因為它不僅不符合虛擬電廠實際交易規(guī)則也會扭曲機組調(diào)度結(jié)果。碳配額是整個模型的目標驅(qū)動力之一。假設(shè)虛擬電廠每天獲得一定免費碳排放配額E_quota實際凈排放量是E_net(t) E_total(t) - C_cap(t)當E_net低于配額時多余的配額可以在碳市場賣出反之需要花錢購買。碳價越高模型越傾向提高捕集率碳價低的時候捕集裝置就會降低出力甚至停機。目標函數(shù)是日運行總成本最小化總成本 垃圾進料成本 燃機燃料成本 購電成本 - 售電收入 碳交易凈支出 CCS運維成本 P2G運維成本 - 垃圾處理補貼這里垃圾處理補貼必須放進目標函數(shù)而且權(quán)重通常還不小。城市焚燒廠的基本商業(yè)模式是“處理費上網(wǎng)電費”如果漏掉處理補貼這一項模型會覺得少燒垃圾更省錢這完全脫離實際。我還加入了系統(tǒng)備用約束讓垃圾焚燒機組和燃氣輪機在正常出力之外保留一定上調(diào)空間防止新能源突降時無法滿足負荷。當這些約束全部裝配好整個模型就成為一個混合整數(shù)線性規(guī)劃MILP問題。三個子系統(tǒng)之間的耦合關(guān)系本質(zhì)上只是三條線電功率平衡、CO2物料平衡、天然氣/氫氣儲運平衡。只要這三條線沒寫錯最優(yōu)調(diào)度中就會自然出現(xiàn)“棄風時段P2G多產(chǎn)氣、高負荷時段儲氣放氣發(fā)電、碳價高時CCS提高捕集率”的行為。3. MATLABYALMIP落地參數(shù)、變量、約束的代碼逐段拆解3.1 數(shù)據(jù)準備虛構(gòu)一個園區(qū)級虛擬電廠的典型日場景為了驗證模型我自己構(gòu)造了一個園區(qū)級虛擬電廠的典型日數(shù)據(jù)時間粒度為1小時一個調(diào)度周期24小時。系統(tǒng)包含一個垃圾焚燒機組、一個額定功率30兆瓦的風電場、20兆瓦光伏、10兆瓦電解槽、配套儲氣罐和儲碳罐負荷曲線模擬一個中型工業(yè)園區(qū)的用電特征。代碼里的基礎(chǔ)參數(shù)設(shè)置大致如下T 24; dt 1; % 負荷、風電、光伏預(yù)測曲線虛構(gòu)典型日單位MW P_load [22 21 20 20 21 24 29 33 35 34 32 30 29 31 34 36 38 40 39 37 34 30 26 23]; P_wind [10 11 9 8 10 6 5 4 3 4 5 6 7 8 10 9 8 8 9 8 7 9 8 7]; P_pv [0 0 0 0 0 0 1 3 5 8 10 11 10 8 6 3 1 0 0 0 0 0 0 0]; % 垃圾焚燒機組參數(shù) M_min 60; M_max 105; M_daily 2000; % 進料上下限及日處理總量, t eta_w 0.22; LHV_w 9.8; % 發(fā)電效率與低位熱值, MJ/kg ramp_w 30; % 進料爬坡上限, t/h % CCS參數(shù) delta_min 0.1; delta_max 0.9; a_ccs 0.15; b_ccs 0.8; % 電耗系數(shù) MWh/tCO2, MWh k_co2 0.18; % 單位進料煙氣CO2量, tCO2/t垃圾 V_co2_max 300; % 儲碳罐容量, t % P2G參數(shù) P_p2g_min 1; P_p2g_max 10; % 電解槽功率范圍, MW eta_p2g_total 0.55; % 電力到天然氣的總效率 mu_co2 0.21; % 單位天然氣輸出的CO2消耗量, t/MWh V_gas_max 200; % 儲氣罐折算熱功率容量, MWh eta_GT 0.45; % 燃機發(fā)電效率 % 電價與碳價 C_buy [0.8*ones(1,8) 1.0*ones(1,8) 1.2*ones(1,4) 1.0*ones(1,4)]; % 分時電價, 元/kWh C_sell 0.85*C_buy; % 上網(wǎng)電價 carbon_price 300; % 碳價元/噸注意所有功率單位統(tǒng)一用MW電量和能量單位統(tǒng)一用MWhCO2質(zhì)量單位統(tǒng)一用噸碳價單位用元/噸。這種單位的一致性如果沒做好很容易出現(xiàn)求解結(jié)果莫名其妙的“十倍誤差”這也是我后面專門要講的坑。3.2 決策變量定義哪些是連續(xù)量哪些必須用0-1變量在YALMIP中定義決策變量我習慣把連續(xù)量和二進制量分開寫清楚% 垃圾焚燒與CCS M_feed sdpvar(1,T); % 垃圾進料量, t/h C_cap sdpvar(1,T); % 實際CO2捕集量, t E_ccs sdpvar(1,T); % CCS耗電, MW u_ccs binvar(1,T); % CCS在線狀態(tài) % 儲碳罐 V_co2 sdpvar(1,T1); % 儲碳罐CO2儲量, t % P2G與儲氣 P_p2g sdpvar(1,T); % P2G用電功率, MW H_gas sdpvar(1,T); % 產(chǎn)天然氣熱功率, MWh/h U_co2 sdpvar(1,T); % P2G消耗CO2量, t V_gas sdpvar(1,T1); % 儲氣罐儲量, MWh熱值 u_p2g binvar(1,T); % P2G運行狀態(tài) % 燃氣輪機與電網(wǎng)交互 P_GT sdpvar(1,T); % 燃氣輪機發(fā)電功率, MW P_buy sdpvar(1,T); % 購電功率, MW P_sell sdpvar(1,T); % 售電功率, MW z_trade binvar(1,T); % 購售互斥狀態(tài)可能你會問為什么垃圾焚燒機組不用0-1啟停變量因為城市垃圾焚燒電廠在調(diào)度周期內(nèi)通常全程運行不允許隨意啟停所以只需要設(shè)置爬坡和上下限。CCS和P2G則存在明顯的小時級啟??赡苄运约恿嗽诰€狀態(tài)變量。3.3 約束構(gòu)建功率平衡、碳流耦合與儲能狀態(tài)逐條寫入主要約束的代碼框架如下我在每條約束后面都加了注釋方便對照前文的公式Constraints []; for t 1:T % 垃圾焚燒約束 Constraints [Constraints, M_min M_feed(t) M_max]; P_w(t) eta_w * LHV_w * M_feed(t) / 3.6; % 發(fā)電功率折算 % CCS約束 G_co2(t) k_co2 * M_feed(t); % 煙氣CO2總流量 Constraints [Constraints, E_ccs(t) a_ccs*C_cap(t) b_ccs*u_ccs(t)]; Constraints [Constraints, C_cap(t) delta_max * G_co2(t)]; Constraints [Constraints, C_cap(t) delta_min*G_co2(t) - 1e3*(1-u_ccs(t))]; Constraints [Constraints, C_cap(t) 1e3*u_ccs(t)]; % 儲碳罐狀態(tài) Constraints [Constraints, 0 V_co2(t1) V_co2_max]; Constraints [Constraints, V_co2(t1) V_co2(t) C_cap(t) - U_co2(t)]; % P2G約束 Constraints [Constraints, P_p2g_min*u_p2g(t) P_p2g(t) P_p2g_max*u_p2g(t)]; Constraints [Constraints, H_gas(t) eta_p2g_total * P_p2g(t)]; Constraints [Constraints, U_co2(t) mu_co2 * H_gas(t)]; % 儲氣罐狀態(tài) Constraints [Constraints, 0 V_gas(t1) V_gas_max]; Constraints [Constraints, V_gas(t1) V_gas(t) H_gas(t) - D_gas(t)]; % 燃氣輪機 Constraints [Constraints, P_GT(t) eta_GT * D_gas(t) * 0.9]; % 留10%裕度 % 功率平衡 Constraints [Constraints, P_w(t)P_wind(t)P_pv(t)P_GT(t)P_buy(t) ... P_load(t)P_p2g(t)E_ccs(t)P_sell(t)]; % 購售互斥 Constraints [Constraints, P_buy(t) 50*z_trade(t)]; Constraints [Constraints, P_sell(t) 50*(1-z_trade(t))]; end % 周期約束 Constraints [Constraints, sum(M_feed) M_daily]; Constraints [Constraints, V_co2(1) V_co2(T1)]; Constraints [Constraints, V_gas(1) V_gas(T1)];有一點要說明代碼塊里的P_w(t)、G_co2(t)、D_gas(t)這些中間變量需要在循環(huán)外先定義為sdpvar我為了精簡直接用了賦值語句實際運行時把P_w、G_co2、D_gas先聲明成一維sdpvar變量再逐個賦值即可。這條約束寫法的本質(zhì)是把各個子模塊的物料平衡和能量平衡在時間軸上拉通只要代碼邏輯清晰后面再加擴展模塊也方便。3.4 目標函數(shù)與求解器配置如何把成本項和收入項放對位置目標函數(shù)是最小化系統(tǒng)日運行總成本我的寫法如下Objective sum(C_w * M_feed) ... % 垃圾處理運行成本 sum(C_GT * P_GT) ... % 燃氣輪機燃料及運維成本 sum(C_buy .* P_buy) ... % 購電成本 - sum(C_sell .* P_sell) ... % 售電收入 carbon_price * sum(E_total - C_cap) ... % 碳交易凈支出 sum(C_ccs_om * E_ccs) ... % CCS運維 sum(C_p2g_om * P_p2g) ... % P2G運維 - sum(C_waste_subsidy * M_feed); % 垃圾處理補貼 ops sdpsettings(solver,gurobi,verbose,0); sol optimize(Constraints, Objective, ops); if sol.problem 0 value(Objective) else sol.info check(Constraints) end碳交易項需要注意符號。E_total系統(tǒng)總碳排放減去C_cap捕集量之后如果凈排放大于配額該項為正代表買配額支出如果小于配額該項為負相當于賣配額收入。算例里我設(shè)配額基準與垃圾處理量掛鉤這樣垃圾焚燒的免費配額能夠降低系統(tǒng)的真實碳壓力。求解建議如果機器上沒有商業(yè)求解器也可以用MATLAB自帶的intlinprog代替。YALMIP里只要把solver改成‘intlinprog’就行不過求解速度會明顯變慢。我這套24時段模型用Gurobi求解大約用時0.8秒換成intlinprog大概要十幾秒在可接受范圍內(nèi)。4. 算例對比無CCS、單獨CCS、CCSP2G三組場景的結(jié)果差異4.1 三組場景的設(shè)定說明為了說明協(xié)同效應(yīng)的來源我在同一套系統(tǒng)參數(shù)下做了三組對照算例。場景S1完全不安裝碳捕集和電轉(zhuǎn)氣設(shè)備垃圾焚燒機組與風電光伏直接參與調(diào)度棄電只能放棄碳排放按配額繳納碳費。場景S2只安裝碳捕集系統(tǒng)但不裝電轉(zhuǎn)氣捕集下來的CO2沒有下游用戶只能算作減碳配額收益。場景S3就是本文的核心場景同時安裝碳捕集和電轉(zhuǎn)氣設(shè)備允許捕集的CO2進入碳儲罐再由P2G轉(zhuǎn)化為天然氣并儲存到氣罐。4.2 結(jié)果表格協(xié)同同時降低了成本和碳排放三組場景的計算結(jié)果如下表所示指標S1 無CCS無P2GS2 僅CCSS3 CCSP2G系統(tǒng)總運行成本萬元/日86.481.774.6凈碳排放量噸/日1093817756棄風棄光率%12.69.52.8碳交易凈支出萬元/日4.62.11.5CCS平均捕集率%058.371.5P2G運行時段h009S3比S1總成本下降了約13.7%凈碳排放下降了30.8%棄風棄光率從12.6%降到2.8%。S3比S2也有明顯優(yōu)勢說明P2G的加入不是簡單增加了一套耗電設(shè)備而是直接提升了碳捕集系統(tǒng)的利用率和經(jīng)濟性。4.3 典型日的調(diào)度曲線拆解協(xié)同發(fā)生在哪些時段打開最優(yōu)調(diào)度結(jié)果看一天24小時的時序曲線會更直觀。凌晨0點到5點是負荷低谷風電出力反而很大系統(tǒng)電力嚴重富余。此時P2G開啟電解槽滿負荷產(chǎn)氫并甲烷化儲氣罐的儲量快速上升CCS的捕集率也跟著提高因為P2G需要大量CO2原料。儲碳罐里的CO2被抽走碳循環(huán)鏈條高速運轉(zhuǎn)。這就是“棄風時段制造天然氣”。上午6點到9點負荷開始爬升風電出力下降P2G慢慢退出燃氣輪機不發(fā)電儲氣罐只進不出。CCS維持在一個中等捕集率因為碳價尚不能支撐滿負荷捕集的成本。中午時段光伏大出力P2G會有第二次短時啟動但產(chǎn)氣量不如凌晨。傍晚16點到21點是負荷高峰電價高企儲氣罐開始放氣燃氣輪機發(fā)電頂上。與此同時CCS捕集率適當下調(diào)釋放一部分電功率給負荷。到了夜間垃圾焚燒機組保持穩(wěn)定出力并為第二天新一輪P2G運行提前把儲碳罐補滿。這段調(diào)度曲線最直觀地說明了一個結(jié)論P2G本質(zhì)上是在碳捕集的配合下把成本極低的夜間棄電轉(zhuǎn)換成了高峰時段的高價值電力而CCS在這個過程里既是碳源、又是靈活負荷三個設(shè)備加起來形成了一套完整的“時間搬移”系統(tǒng)。5. 敏感性分析碳價、效率、儲氣容量一變結(jié)論就可能翻轉(zhuǎn)5.1 碳價對捕集率與P2G運行時段的非線性影響碳價是影響整套模型走向的最敏感參數(shù)。我分別取100、300、600元/噸做了敏感性測試碳價元/噸CCS平均捕集率%P2G運行小時數(shù)h凈碳排放噸/日系統(tǒng)總成本萬元/日10041.2591289.330071.5975674.660085.61263469.8碳價從100漲到300元/噸的過程中CCS平均捕集率大幅提升P2G運行小時數(shù)也從5小時增加到9小時。原因是碳價提高后捕集CO2的配額收益增加儲碳罐里有了更充足且更便宜的CO2原料P2G的邊際成本隨之下降于是模型安排更多時段運行P2G。但如果碳價繼續(xù)漲到600元/噸P2G運行小時數(shù)增速放緩因為儲氣罐容量已經(jīng)接近上限再增加產(chǎn)氣也沒地方放。這說明協(xié)同效益有一個受限于儲能容量的平臺期單純提高碳價不一定會帶來等比例的收益增加。5.2 P2G總效率與儲氣罐容量的邊際效益遞減P2G總效率η_p2g_total從0.5、0.55、0.6三檔變化時P2G運行小時數(shù)明顯增加系統(tǒng)成本則逐步下降。但效率超過0.6之后成本下降幅度開始變小因為限制運行的主要瓶頸變成了儲氣罐容量和CO2供給量而不是電解槽效率。儲氣罐容量對結(jié)果的影響類似。把V_gas_max從100 MWh提升到200 MWh系統(tǒng)成本下降非常明顯繼續(xù)提升到400 MWh成本只再降一點點。這說明協(xié)同系統(tǒng)的邊際收益遞減規(guī)律主要來自“時間搬移”能力達到飽和后的軟約束。這類敏感性分析在項目方案階段很有用。比如P2G設(shè)備采購時大容量電解槽與高效率電解槽價格差異很大通過先跑一遍靈敏度就能知道效率提升帶來的運行收益能不能覆蓋設(shè)備溢價免得拍腦袋選型。5.3 垃圾處理補貼的影響不同城市政策下結(jié)論差異很大垃圾處理補貼目前在各地差別很大每噸從幾十元到上百元不等。我調(diào)整補貼價格后發(fā)現(xiàn)補貼越高垃圾焚燒機組越傾向于滿負荷運行煙氣CO2總量也越大CCS和P2G的碳源越充足系統(tǒng)的“碳鏈”潛力也越大。反過來如果補貼低到一定程度模型會偏好降低垃圾處理量P2G可用CO2減少協(xié)同效應(yīng)被大幅削弱。這提醒了一件事做這類項目評估時不要只盯著碳價和技術(shù)效率垃圾處理補貼政策才是決定項目收益穩(wěn)定性的關(guān)鍵變量。5.4 當前模型的主要簡化邊界最后說清楚這個模型刻意忽略的部分。首先是電網(wǎng)潮流我假設(shè)虛擬電廠與外部電網(wǎng)之間是一個理想節(jié)點沒有線路容量和阻塞約束實際接入時可能需要增加網(wǎng)架約束。其次是碳捕集的詳細熱力學(xué)過程胺液再生能耗我用了常數(shù)系數(shù)沒有考慮環(huán)境溫度、胺液濃度衰減等細節(jié)。第三垃圾焚燒爐的煙氣CO2濃度會隨垃圾組分波動我只用了固定系數(shù)k_co2。第四模型中還沒有考慮P2G設(shè)備的投資折舊只算了運行層面的收益所以結(jié)論偏樂觀一些。這些簡化在規(guī)劃層面是夠用的若要用于具體工程可研建議在本文框架基礎(chǔ)上再補充設(shè)備投資年限、貼現(xiàn)率和臺架實驗數(shù)據(jù)。6. MATLAB實戰(zhàn)排錯雙線性項、不可行解與儲能量被“白嫖”的五個坑6.1 雙線性項處理不當MILP變成MINLP前文提過捕集量C_cap(t)δ(t)*G_co2(t)這個式子看起來簡單直接寫進代碼就是大坑。一開始我自己也犯過這個錯用了連續(xù)變量δ和G_co2相乘YALMIP報出“bilinear equality”警告后模型求解時間從幾秒變成幾分鐘最后解還經(jīng)常不收斂。解決辦法就是第2.2節(jié)講的大M轉(zhuǎn)換法把捕集率變成約束邊界而不是顯式變量。類似的雙線性結(jié)構(gòu)還可能出現(xiàn)在儲能設(shè)備出力與狀態(tài)變量相乘的判斷里都要注意用0-1變量配合bigM拆開。6.2 求解器報Infeasible時應(yīng)該按什么順序排查如果Gurobi直接返回infeasible我的排查順序很有規(guī)律。先把所有二進制變量固定成1把模型退化成LP看LP是否可行。如果LP還不可行問題幾乎出在功率平衡或物料平衡等式上重點檢查等式兩側(cè)的變量是否寫反了符號。如果LP可行而MILP不可行問題多半出在0-1變量與互斥約束上比如購售互斥約束與P2G最小功率約束互相矛盾。第二步檢查儲能狀態(tài)方程。特別是V(1)V(T1)這類周期約束一旦某個儲罐的初始容量設(shè)置超過上限整個調(diào)度周期都可能卡死。第三步是用YALMIP的check函數(shù)挨條查看約束殘差把殘差超過1e-3的約束單獨拿出來過一遍。6.3 儲能初始值的重要性不要“白嫖”儲罐能量這個坑我印象很深。有一版模型沒加V_co2(1)V_co2(T1)和V_gas(1)V_gas(T1)求出來的成本比預(yù)期低了不少我當時還以為模型改進成功了。后來檢查儲氣罐曲線才發(fā)現(xiàn)優(yōu)化結(jié)果一上來就把儲氣罐里的天然氣全放掉了等到周期結(jié)束時儲罐卻是空的等于憑空多出一大筆可用能量。加了周期約束后成本立刻回升到合理水平。這里建議把儲罐的初始狀態(tài)設(shè)置為計劃期開始時的實際儲量并在模型里保留周期相等約束這是一個保證調(diào)度結(jié)果可持續(xù)性的基本要求。6.4 單位不統(tǒng)一和數(shù)值尺度問題導(dǎo)致的“隱形誤最優(yōu)”有一次我在參數(shù)表里把LHV_w的單位填成kJ/kg實際約束里用的是MJ/kg結(jié)果所有焚燒發(fā)電功率都放大了1000倍功率平衡等式還神奇地滿足了——因為負荷和風電也都被各種系數(shù)帶偏了。后來查了一天問題就出在單位換算。建議所有人把單位清單打印出來放在參數(shù)表旁邊功率MW、能量MWh、質(zhì)量t、熱值MJ/kg、單價元/MWh。YALMIP本身不檢查單位這類錯誤不會報錯只會給你一個數(shù)值上合理但物理上荒謬的解。數(shù)值尺度方面也值得注意如果某個約束里同時出現(xiàn)1000和0.001量級的系數(shù)求解器數(shù)值穩(wěn)定性會下降。我會把目標函數(shù)中的成本先化成“萬元”來計算把CO2質(zhì)量統(tǒng)一用“噸”而不是“千克”這樣約束系數(shù)基本都在同一數(shù)量級。6.5 目標函數(shù)漏掉垃圾處理補貼調(diào)度結(jié)果直接失真的教訓(xùn)前文說過垃圾處理補貼是垃圾焚燒電廠收益的基本盤。我第一次建模時只放了售電收入和碳交易成本結(jié)果優(yōu)化器給出的最優(yōu)策略是大幅度減少垃圾進料因為焚燒發(fā)電賣不了幾個錢不如少處理垃圾少耗燃料。后來加入處理補貼收入后模型才真正呈現(xiàn)出“穩(wěn)定處理垃圾、維持基本出力”的合理行為。這提醒所有做該類項目仿真的同行垃圾焚燒機組在虛擬電廠里的角色是帶著環(huán)保服務(wù)屬性的建模時一定把“處理服務(wù)收入”放進目標函數(shù)而不是只把它當成一臺普通發(fā)電機組。這個項目做完之后我自己最大的體會是最優(yōu)解往往不是某一臺設(shè)備效率最高的結(jié)果而是讓碳捕集、電轉(zhuǎn)氣和垃圾焚燒共享同一套能量流和碳流邊界的結(jié)果。只要物料平衡、功率平衡和儲能周期約束寫對了模型會自動給出非常漂亮的時間互補方案。后續(xù)如果要工程化落地我會再把逐時碳排放因子、檢修計劃和設(shè)備壽命成本加進去那樣應(yīng)該會更接近實際項目的決策需求。