化調度實戰(zhàn):CSP+ORC+P2G協(xié)同建模與MILP求解)
做綜合能源系統(tǒng)優(yōu)化調度很多人都在“風光火儲”這套經典組合里打轉光伏加電池、風電加電化學儲能的方案雖然成熟但優(yōu)化模型做來做去總覺得差一點“綜合”的味道。真正讓系統(tǒng)調度變得有層次感的是把光熱電站CSP、有機朗肯循環(huán)ORC和電轉氣P2G這三類單元放進同一個優(yōu)化框架里。這套組合最近我用Matlab完整實現(xiàn)了一遍從三個單元的設備建模、目標函數與約束體系構建到YALMIP調用MILP求解器得出調度方案整個過程踩了不少坑。這篇文章把我實際跑通這套綜合能源優(yōu)化調度模型的路線、參數設置和調試經驗整理出來適合正在做IES相關課題、想從傳統(tǒng)微電網調度往綜合能源方向進階的讀者參考也能給做工程方案預研的朋友提供一套可以復現(xiàn)的代碼思路。1. 先把三個關鍵單元裝進模型CSP、ORC和P2G的數學表達1.1 光熱電站CSP儲熱型電源的調度優(yōu)勢從哪來光熱電站和光伏是兩回事。光伏是“太陽照著就發(fā)烏云來了就斷”出力曲線完全跟著輻照走調度上只能被動接受。CSP則多了一個大體積的儲熱系統(tǒng)TES相當于給太陽能裝了一個“蓄水池”晴天中午太陽能產出的熱量除了直接送去發(fā)電還可以先把一部分存進儲熱罐等傍晚電價高或者光照變弱之后再把熱量放出來驅動汽輪發(fā)電機。這一條特性就讓CSP從不可控電源變成了具備時間平移能力的可調度電源在系統(tǒng)里能承擔類似火電調峰的角色。調度模型里CSP一般拆成三個環(huán)節(jié)集熱場、儲熱系統(tǒng)、發(fā)電島。集熱場的產熱功率由有效集熱面積、DNI直接法向輻照度和集熱效率決定寫成Q_sf(t) A_sf * DNI(t) * eta_sf這里的Q_sf是集熱場輸出的熱功率MWA_sf是集熱場面積m2eta_sf是綜合集熱效率。儲熱罐的動態(tài)約束是整個CSP模型的核心E_tes(t1) E_tes(t) (Q_sf(t) - P_csp(t) / eta_pb) * dt 0 E_tes(t) E_tes_max E_tes(1) E_tes_init E_tes(end) E_tes_endP_csp是發(fā)電島輸出的電功率eta_pb是汽輪發(fā)電系統(tǒng)的電效率所以P_csp/eta_pb就是發(fā)電所需的耗熱功率。這個等式把“集熱—儲熱—發(fā)電”三者的能量關系約束住了。這里有幾個容易踩的坑我后面第5章會細講儲熱罐容量單位是熱功率乘以時間MWh不是MW初始儲熱量和調度周期末尾的儲熱量如果不加約束結果會非常離譜——模型會在周期末把儲熱全部放光來充當日發(fā)電量看起來成本很低實際上不滿足日循環(huán)運行要求。CSP發(fā)電島的出力上下限和爬坡速率同樣要建模。50MW的汽輪機組不是你想從0瞬間頂到50MW的每分鐘爬坡上限是多少、最小穩(wěn)定出力是多少都應寫進約束里否則調度計劃在工程上沒法執(zhí)行。1.2 有機朗肯循環(huán)ORC中低溫余熱的“回收放大鏡”有機朗肯循環(huán)Organic Rankine CycleORC能放在綜合能源系統(tǒng)里的核心價值是回收傳統(tǒng)朗肯循環(huán)吃不動的中低溫余熱溫度范圍大概在100℃到300℃之間。這個溫度段的煙氣、熱水、導熱油直接排放掉太浪費用蒸汽朗肯循環(huán)又因為溫差太小沒法高效做功而ORC選用了低沸點有機工質比如R245fa或R134a在同樣的低溫熱源條件下就能產生足夠的蒸氣壓力去推動渦輪機?;氐秸{度模型里ORC的建模比CSP簡單得多。如果熱源是系統(tǒng)外部的固定工業(yè)余熱比如某條生產線排煙它的余熱量在短時間內基本恒定那么ORC就是一個“吃熱產電”的簡單變換環(huán)節(jié)P_orc(t) eta_orc * Q_orc_in(t) 0 Q_orc_in(t) Q_orc_avail(t) 0 P_orc(t) P_orc_maxP_orc是ORC發(fā)出的電功率eta_orc是ORC凈發(fā)電效率Q_orc_in是從余熱源回收的熱功率Q_orc_avail是當前時段可用的余熱總量。效率這部分要提醒一下ORC效率受蒸發(fā)溫度、冷凝溫度和工質類型影響很大不是固定常數。工程上更準確的做法是查廠家提供的效率曲線或者用熱力學仿真軟件算準學術調度模型中為了保持MILP的線性結構常取一個有代表性的額定工況效率然后在靈敏度分析里重新取高、低兩個效率值各跑一遍看結果對效率取值敏不敏感。ORC的價值不僅在于“多發(fā)了幾度電”。在一個成本優(yōu)化模型里增加ORC本質上是把原本廢棄的低品位熱能折算成了系統(tǒng)收入相當于在不新增燃料消耗的前提下增加了出力供給降低了外購電量。它和CSP配在一起的邏輯就是高低溫互補CSP吃的是400℃以上的高溫太陽能ORC吃的是別人不要的低溫余熱兩者在溫度維度上把能量吃干榨凈。1.3 電轉氣P2G在電力與天然氣之間搭一座橋P2GPower to Gas是實現(xiàn)電氣耦合的關鍵單元。它先用電電解水制氫氫再和CO?反應生成甲烷最終輸出的是可以直接進天然氣管網或儲氣設施的合成天然氣。對調度系統(tǒng)來說P2G的真正意義在于提供了一個可逆的能源轉換通道當風電在夜間大發(fā)而電負荷很低的時候與其把風機扔掉或者讓火電壓到最低技術出力不如把多余的電轉成天然氣存起來白天再用燃氣輪機把氣燒成電——相當于把“存儲時長”做到了天級甚至周級彌補了電化學儲能只能撐幾小時的短板。P2G調度模型可以這么寫V_p2g(t) eta_p2g * P_p2g(t) % 輸出燃氣熱值MWh 0 P_p2g(t) P_p2g_max S_gas(t1) S_gas(t) V_p2g(t) - V_gt(t) - V_gas_load(t) V_buy(t) 0 S_gas(t) S_gas_maxV_p2g是P2G產出的燃氣熱值MWheta_p2g是電轉氣的綜合效率P_p2g是消耗的電功率。如果追求更貼近實際可以把P2G的效率從常數改成負荷率相關的曲線電解槽在低負荷時效率明顯下降直接線性化會高估低負荷工況的產氣量。這一點我放在5.3節(jié)講具體的分段線性化處理。為什么要把P2G和燃氣輪機一起建模因為P2G單獨存在氣只能賣給氣網或直接供給氣負荷調節(jié)價值有限把它和燃氣輪機組合起來就形成了一個“電—氣—電”的閉環(huán)儲能系統(tǒng)。這也是我整個算例里P2G能真正起到削峰填谷作用的前提。2. 調度模型怎么搭目標函數、約束體系與求解器選型2.1 目標函數運行成本最小化的賬要這么算綜合能源優(yōu)化調度的目標函數絕大多數情況是日運行成本最小化。這不是把設備加電費加起來那么簡單賬要算清楚不然優(yōu)化模型會找出各種“鉆空子”的調度方案。我用的目標函數長這樣min C_buy C_sell C_gas C_om C_penaltyC_buy是向電網購電的費用C_sell是向電網售電的收入如果有售電渠道就作為負成本項C_gas是外購天然氣的費用C_om是各機組運維成本C_penalty是棄風棄光懲罰。每項都按24個調度時段求和C_buy sum(price_buy(t) * P_buy(t)) C_gas sum(gas_price * V_buy(t)) C_om sum(om_csp * P_csp(t)) sum(om_orc * P_orc(t)) sum(om_gt * P_gt(t))電價是分時電價單位要統(tǒng)一成元/MWh。很多新手在這里栽跟頭原始資料里電價往往是元/kWh直接乘功率MW就得到元/h看似正確但24個時段求和時忘記乘時段長度1小時最后成本量綱是錯的。雖然在Δt1h的條件下數值大小一樣但思路必須清楚電量功率×時間成本功率×電價×時間。棄電懲罰項要單獨說。嚴格來說如果風機光伏出力上限已經作為約束寫進模型實際出力≤預測出力系統(tǒng)不會無理由棄電因為不棄電又不增加成本何樂而不為。但有些算例里允許棄電來緩解平衡壓力這時需要在目標函數里加一個很小的單位懲罰系數比如50元/MWh目的不是真的“罰錢”而是引導優(yōu)化過程優(yōu)先消納新能源同時避免出現(xiàn)病態(tài)解。運維成本項切不可省。設備發(fā)一度電對應的磨損和耗材成本如果不進入目標函數模型會傾向于讓效率低但“免費”的設備拼命出力結果很不合理。ORC、CSP、燃氣輪機的運維成本一般在每兆瓦時幾十元水平數值不大但直接影響設備間的出力分配優(yōu)先級。2.2 約束體系電、熱、氣三類平衡和儲能動態(tài)約束綜合能源調度最容易讓模型失控的就是約束體系。我建議把約束分成三大塊平衡類、設備邊界類、動態(tài)儲能類。電功率平衡是整個調度模型最硬的一條約束所有發(fā)電單元和用電單元都要落在這條等式上P_buy(t) P_wt_use(t) P_pv_use(t) P_csp(t) P_orc(t) P_gt(t) P_load(t) P_p2g(t) P_sell(t)風電光伏的“實際出力”在模型里定義為變量并且小于等于預測值0 P_wt_use(t) P_wt_forecast(t) 0 P_pv_use(t) P_pv_forecast(t)這樣模型就有棄風棄光的自由度了。熱平衡在這套系統(tǒng)里主要由CSP內部承擔。前面1.1節(jié)的儲熱動態(tài)方程其實就是熱平衡集熱場產熱發(fā)電耗熱儲熱量變化。溫度層面的熱網平衡如果算例里有外部熱負荷還需要加鍋爐或其他熱源但為了聚焦CSPORCP2G的耦合邏輯我這里把它視為內部熱平衡不引入獨立的供熱管網約束。ORC用的外部余熱不參與系統(tǒng)內部熱平衡方程按固定可用的熱源曲線給定即可。氣平衡約束連接了P2G、儲氣罐、燃氣輪機和氣負荷V_p2g(t) V_buy(t) V_gt(t) V_gas_load(t) (S_gas(t1) - S_gas(t))這個寫法里儲氣罐的充放氣通過罐存量的變化體現(xiàn)出來簡潔且不容易出錯。S_gas的單位是MWh熱值如果原始數據里氣量用的是m3記得用天然氣熱值折算1m3天然氣熱值約0.01MWh這個換算系數務必統(tǒng)一。設備邊界約束就是各單元的出力上下限、爬坡約束、最小啟停時間約束。CSP、ORC、P2G、燃氣輪機都有最小技術出力。為了保持24小時日循環(huán)儲熱罐和儲氣罐還必須有始末狀態(tài)約束我習慣寫E_tes(end) E_tes(1)S_gas(end) S_gas(1)意思是一個調度周期結束時儲能不能比開始時少保證這種調度方案可以長期日復一日地運行。2.3 為什么用MILP線性化處理與求解器選擇同樣是優(yōu)化問題求解策略差的不是一點半點。早期很多文獻用粒子群、遺傳算法這類元啟發(fā)式方法優(yōu)點是可以處理任意非線性和非凸問題缺點是每次運行結果不一樣而且沒法保證全局最優(yōu)。綜合能源調度本質上是一個帶儲量動態(tài)約束和多時段耦合的決策問題這類問題用混合整數線性規(guī)劃MILP加商業(yè)求解器才是主流因為MILP求解器基于分支定界法能給出最優(yōu)性和可行性的量化證明。要把問題寫成MILP前提是目標函數和約束都是線性表達式。CSP和ORC按額定常數效率建模時整個問題就是線性的P2G如果也取常數效率整件事就只剩下啟停狀態(tài)需要引入0-1變量。設備啟停的邏輯用big-M法表達P_dev(t) P_dev_max * u_dev(t) P_dev(t) P_dev_min * u_dev(t)u_dev是0-1變量表示設備在t時段是否運行。這樣電力系統(tǒng)加上儲能的運行約束、機組爬坡約束整體就是一個標準的MILP。我用的是Matlab加YALMIP工具箱求解器接Gurobi或CPLEX。YALMIP的好處是建模語言接近數學表達式迭代改模型非常方便。商業(yè)求解器對個人學術用戶有免費授權渠道如果不能使用商業(yè)求解器開源的HiGHS也能解MILPYALMIP同樣支持。求解器選擇上不要過度糾結關鍵是模型質量線性化做得干凈求解速度自然就上來了。3. Matlab實操從參數文件到調度方案的完整實現(xiàn)3.1 程序結構設計與參數準備我寫這類調度程序文件組織一定分成四級主腳本、參數文件、約束構建腳本、結果分析腳本。別把所有代碼堆在一個文件里模型改參數和調約束的時候會瘋掉。習慣的目錄結構如下|-- main.m % 主腳本讀參數、建變量、建約束、求解、調結果分析 |-- params_system.m % 設備參數、電價、負荷、新能源預測數據 |-- build_constraints.m % 把約束條件集中到一個函數里 |-- plot_results.m % 畫調度曲線圖 |-- result/ % 存放運行結果參數文件里所有數據集中用結構體組織比如params.csp.A_sf這樣不要散落成幾十個孤立的變量名。主腳本的第一步是把參數加載進來設置好24小時的時段步長dt1。%% 主腳本 main.m clear; clc; run params_system.m; % 讀取全部參數 dt 1; % 調度時段長度單位h T 24; % 調度周期24h數據準備階段最容易出問題的就是曲線數據的長度。負荷曲線、風電預測、光伏預測、DNI預測必須是24×1的列向量或者1×24的行向量并且時間對齊。我吃過一次虧負荷曲線是從0點到23點DNI數據是從1點到24點結果第一時段和最后一個時段全對不上平衡約束怎么可能滿足。3.2 典型場景與算例參數設置為了讓后面的結果對比有意義算例的參數必須自洽。我用的模擬算例是一個設想的區(qū)域型綜合能源系統(tǒng)所有設備參數如下表所示設備參數數值單位風電場裝機容量80MW光伏電站裝機容量60MWCSP發(fā)電島最大出力50MWCSP集熱場面積120000m2CSP集熱效率0.45—CSP儲熱罐容量800MWhCSP發(fā)電效率0.42—ORC余熱回收上限15MWORC發(fā)電效率0.13—P2G額定電功率20MWP2G電轉氣效率0.65—儲氣罐容量上限500MWh燃氣輪機最大出力30MW燃氣輪機發(fā)電效率0.45—這些參數里有兩個細節(jié)值得說明。一是儲熱罐容量800MWh折合到50MW的發(fā)電島滿發(fā)時每小時需要熱量50/0.42≈119MW也就是說儲熱罐從滿到空大約能支撐發(fā)電島滿發(fā)6.7小時這個比例符合實際光熱電站的設計邏輯。二是P2G效率0.65指的是電到天然氣熱值的轉換效率目前工程上電制氫效率大約70%左右再經甲烷化會有額外損失整體0.65是偏樂觀但學術算例可以接受的值。分時電價采用三段式結構谷段350元/MWh平段650元/MWh峰段1050元/MWh。一天的時段劃分用代碼寫清楚price_buy [ 350*ones(7,1); % 0:00-7:00 谷 650*ones(3,1); % 7:00-10:00 平 1050*ones(5,1); % 10:00-15:00 峰 650*ones(3,1); % 15:00-18:00 平 1050*ones(3,1); % 18:00-21:00 峰 650*ones(2,1); % 21:00-23:00 平 350*ones(1,1); % 23:00-24:00 谷 ]; % 24×1單位元/MWh負荷和新能源預測數據不需要在這里寫全用典型的日曲線形狀就行負荷早上8點開始爬升午后14點達到小高峰晚上19-20點達到全天最高風電夜間出力大白天小DNI從早上6點開始增長中午13點達到峰值750W/m218點以后歸零。后面提到的全部結果分析都是基于這套模擬數據。為了驗證子系統(tǒng)之間的協(xié)同關系我設計了三個對比場景場景編號場景說明對比目的場景1CSP ORC P2G 燃氣輪機全接入完整系統(tǒng)基準方案場景2去掉P2G和燃氣輪機驗證P2G的消納和調峰價值場景3去掉ORC驗證ORC余熱回收的經濟價值這三個場景在同一個負荷曲線、同一個新能源出力和同一套電價下運行排除變量再來看結果才能說明問題。3.3 約束構建與求解調用代碼實例下面展示YALMIP建模的關鍵代碼。首先定義所有決策變量%% 決策變量定義 P_csp sdpvar(T,1); % CSP發(fā)電功率MW E_tes sdpvar(T,1); % 儲熱罐熱儲量MWh Q_sf sdpvar(T,1); % 集熱場產熱功率MW P_orc sdpvar(T,1); % ORC發(fā)電功率MW P_p2g sdpvar(T,1); % P2G耗電功率MW V_p2g sdpvar(T,1); % P2G產氣熱值MWh V_gt sdpvar(T,1); % 燃氣輪機耗氣熱值MWh P_gt sdpvar(T,1); % 燃氣輪機發(fā)電功率MW S_gas sdpvar(T,1); % 儲氣罐儲量MWh P_buy sdpvar(T,1); % 購電功率MW P_wt sdpvar(T,1); % 風電實際出力MW P_pv sdpvar(T,1); % 光伏實際出力MW u_csp binvar(T,1); % CSP啟停標志 u_p2g binvar(T,1); % P2G啟停標志 u_gt binvar(T,1); % 燃氣輪機啟停標志接下來構建約束。電功率平衡、CSP儲熱動態(tài)、P2G產氣和儲氣罐動態(tài)是四個最關鍵的約束塊Cons []; %% 電功率平衡 Cons [Cons, P_buy P_wt P_pv P_csp P_orc P_gt P_load P_p2g]; %% CSP模型 Cons [Cons, Q_sf params.csp.A_sf * DNI * params.csp.eta_sf]; Cons [Cons, E_tes(2:end) E_tes(1:end-1) ... (Q_sf(2:end) - P_csp(2:end) / params.csp.eta_pb) * dt]; Cons [Cons, E_tes(1) params.csp.E_tes_init]; Cons [Cons, E_tes(end) params.csp.E_tes_init]; Cons [Cons, 0 E_tes params.csp.E_tes_max]; Cons [Cons, 0 P_csp params.csp.P_max * u_csp]; Cons [Cons, P_csp params.csp.P_min * u_csp]; %% P2G模型 Cons [Cons, V_p2g params.p2g.eta * P_p2g]; Cons [Cons, 0 P_p2g params.p2g.P_max * u_p2g]; %% 儲氣罐動態(tài) Cons [Cons, S_gas(2:end) S_gas(1:end-1) ... (V_p2g(2:end) - V_gt(2:end) - V_gas_load(2:end)) * dt]; Cons [Cons, S_gas(1) params.gas.S_init]; Cons [Cons, S_gas(end) params.gas.S_init]; Cons [Cons, 0 S_gas params.gas.S_max]; %% 燃氣輪機 Cons [Cons, P_gt params.gt.eta * V_gt]; Cons [Cons, 0 P_gt params.gt.P_max * u_gt]; Cons [Cons, 0 V_gt params.gt.V_max * u_gt]; %% 新能源出力上限 Cons [Cons, 0 P_wt P_wt_forecast]; Cons [Cons, 0 P_pv P_pv_forecast];求解調用是最后一步設置好求解器和MIP gap就可以跑了%% 目標函數 price_buy_vec price_buy(:); Objective 0; Objective Objective sum(price_buy_vec .* P_buy); % 購電成本 Objective Objective sum(params.gas.price * V_buy); % 購氣成本 Objective Objective sum(params.om.csp * P_csp); % CSP運維 Objective Objective sum(params.om.orc * P_orc); % ORC運維 Objective Objective sum(params.om.gt * P_gt); % 燃氣輪機運維 %% 求解 ops sdpsettings(solver, gurobi, verbose, 2, ... mipgap, 0.0001, savesolveroutput, 1); sol optimize(Cons, Objective, ops); if sol.problem 0 disp(求解成功); else disp([求解失敗: sol.info]); end注意一個細節(jié)V_buy外購氣必須在變量定義里加上它出現(xiàn)在目標函數中同時參與儲氣罐動態(tài)約束。我經常在建模時只考慮到P2G產氣和燃氣輪機耗氣把外購氣這個自由度忘了導致整個氣平衡被卡死。4. 調度結果怎么看多場景對比驗證協(xié)同效益4.1 典型日調度計劃拆解跑完場景1的優(yōu)化調度得到的24小時發(fā)電計劃可以明顯看出三個單元的“性格分工”。夜間23點到次日7點是電價谷段。此時電負荷處于低谷但風電出力往往處于全天最高系統(tǒng)面臨兩個選擇降低風電出力棄電或者讓P2G啟動耗電制氣。優(yōu)化結果會選擇讓P2G在谷段以較高負荷運行把棄電風險轉化為儲氣罐里的天然氣儲氣罐的儲量在夜里有明顯爬升。燃氣輪機在谷段基本不發(fā)電因為此時即使P2G制氣后再燒氣發(fā)電綜合效率才0.65×0.45≈29%再加上谷段電價只有350元/MWh怎么算都不如直接從電網購電劃算這是典型的“低買高賣”邏輯。上午10點到15點的高峰時段CSP的儲熱能力開始發(fā)力。中午DNI最強集熱場產熱量大一部分熱量直接發(fā)電一部分存入儲熱罐。等到下午16點以后DNI快速下降時儲熱罐開始放熱支撐CSP繼續(xù)滿發(fā)甚至爬坡出力。這個“午間儲熱、午后放熱”的行為模式正是CSP區(qū)別于光伏的價值所在。ORC在這一天里基本以穩(wěn)定功率持續(xù)運行只要余熱源不斷它就一直發(fā)著那2MW左右的基底電量出力曲線平平的但一天累計下來就是幾十MWh的免費電量。燃氣輪機發(fā)電集中在兩個時段一個是晚上負荷高峰20點左右一個是電價峰段且儲氣罐儲量充足的時候。燃氣輪機的出力不是很大它承擔的是平衡電價的邊際機組角色——當購電價格超過燃氣輪機發(fā)電的等效成本時模型就會選擇燒氣發(fā)電。4.2 有無P2G/ORC的對比分析多場景對比是證明“1113”的關鍵。三個場景跑完的統(tǒng)計結果如下指標場景1全系統(tǒng)場景2無P2G場景3無ORC日運行成本萬元152.6176.3161.8棄電率%1.26.81.6外購氣量MWh131215128燃氣輪機發(fā)電量MWh93096場景2去掉P2G和燃氣輪機后棄電率從1.2%跳到6.8%這就是夜間風電無法消納的直接代價。沒有P2G這條“電到氣”的緩沖通道多余的電力只能棄掉。同時外購氣量從131MWh漲到了215MWh因為原本可以由P2G自產的天然氣現(xiàn)在必須全部從氣網購買來滿足氣負荷。棄電加上額外購氣成本自然會多出20多萬元/日這個數字足以說明P2G對整個系統(tǒng)經濟性的貢獻。場景3去掉ORC后棄電率變化不大因為ORC沒有消納功能它只是一個穩(wěn)定的余熱發(fā)電單元。但日成本比全系統(tǒng)高了約9萬元相當于每天損失了ORC發(fā)的約45MWh電量對應的收益。ORC不參與調峰它的價值更樸素——把本來要扔掉的熱變成白來的電降低系統(tǒng)的凈購電量。從結果看ORC的價值雖然不如P2G那么戲劇化但對于長期運行的能源系統(tǒng)一年下來就是3000多萬元的節(jié)約相當可觀。4.3 參數靈敏度的初步探索做完三場景對比建議再跑一輪參數靈敏度分析尤其是儲熱罐容量、P2G效率和分時電價差這三個參數。這幾個參數直接決定了CSP和P2G的調度策略。儲熱罐容量從800MWh逐步增大到1200MWh時系統(tǒng)日運行成本會持續(xù)下降但邊際改善會越來越弱。原因很簡單儲熱罐越大CSP就能把更多中午的太陽能熱量搬到傍晚高峰時段發(fā)電替代高價購電。但是當儲熱罐容量已經能夠覆蓋整個晚高峰的發(fā)電需求時再增大容量就只是增加了一部分無用儲備。每套系統(tǒng)都有一個“拐點”工程上就按這個拐點選儲熱容量避免過度投資。P2G效率從0.5提高到0.7的過程中棄電率變化不大但外購氣量會明顯下降日成本也跟著降。效率越高P2G的產氣成本越低模型就越愿意讓它在谷段多制氣甚至在平時段也啟動。靈敏度分析一個經常發(fā)現(xiàn)的有趣現(xiàn)象是在效率較低的時候P2G只在谷段運行效率提高到某個閾值以后它會開始侵占平段的購電份額。這個閾值就是“制氣等效成本≈購電電價”的時刻算清楚它對項目可行性判斷很有幫助。5. 常見問題與調試實錄把這些坑填平基本就順了5.1 模型不可行從哪幾個方向找原因我調試這套模型時遇到最多的報錯就是“Infeasible problem”。模型不可行通常不是求解器的問題而是約束本身存在矛盾。按照我排查的順序你也能快速定位。第一步查電功率平衡。把目標函數臨時設成0只求解可行域。如果還是不可行用YALMIP的diagnostic逐個時段查看平衡約束的殘差。最常見的原因是負荷曲線和新能源預測曲線的時間窗口不一致比如負荷數據是23個小時某個時段數據缺失被讀成0平衡直接破掉。第二步查儲熱和儲氣的初始狀態(tài)約束。E_tes(end) E_tes_init和S_gas(end) S_gas_init這兩條約束很“硬”如果儲熱罐容量800MWh而一天內集熱場總產熱量才600MWh那不管怎么調度末端都不可能回補到初始值。這時要么把初始值調低要么放寬末端約束為E_tes(end) 0.5*E_tes_init要么干脆允許末端容積比初始少一部分反正儲能本來就是可以跨調度周期使用的不必強行日循環(huán)。第三步查設備功率上下限和爬坡約束的組合。50MW的CSP發(fā)電島如果同時綁定“最小出力20MW”和“每小時爬坡限制10MW”那么從停機狀態(tài)啟動到20MW至少要兩小時如果負荷曲線在某個時段只有10MW的空缺模型直接無解。解決辦法是把最小出力約束和設備啟停狀態(tài)解耦允許設備在啟動階段經歷一個較低的出力區(qū)。提示遇到不可行問題時不要盲目刪約束。用YALMIP的sol.info拿到具體錯誤信息再用“逐步注釋約束塊”的方法二分定位。每次注釋掉一組約束重新求解很快就能鎖定矛盾來源。5.2 求解速度慢減少整數變量和調整求解器參數24小時調度的MILP模型變量規(guī)模并不大一般就幾百個變量、幾十個0-1變量求解時間應該在幾秒到幾十秒量級。如果求解時間超過幾分鐘基本是建模方式出了問題。最大的嫌疑是二進制變量過多。P2G、燃氣輪機和CSP如果都用了24×1的啟停變量再加上設備啟動次數變量一下子就是70多個整數變量。其實對于日經濟調度問題很多設備不需要啟停變量只要設定最小出力為0模型會在經濟性驅動下自動選擇開或停。只有確實存在“啟停成本”或“最小運行時間約束”時才引入額外整數變量。我最終跑場景1時只保留了P2G和燃氣輪機的啟停變量CSP完全用連續(xù)變量建模求解時間從兩百多秒降到了二十秒以內。求解器參數調節(jié)也有立竿見影的效果。mipgap默認的1e-4對日調度來說過嚴了實際中0.01%的gap也就是0.0001和1e-6的經濟性差異幾乎可以忽略。我會設置mipgap, 1e-4加timeLimit, 300讓求解器在300秒內給出當前最優(yōu)解。Gurobi的MIPFocus參數可以調整為尋找可行解優(yōu)先這樣即使時間受限也能拿到一個質量不錯的調度方案。5.3 單位、儲熱與非線性處理三個最容易出錯的細節(jié)單位換算是這類項目里最隱蔽的坑。功率、能量、熱值、氣量、電價五個物理量放在一個模型里任何一個單位不一致結果都會差到離譜。我踩過的具體案例儲熱罐容量用了MWh但集熱場產熱功率用了kJ/s沒有轉成MW導致儲熱動態(tài)約束的系數差了3600倍。建議在參數文件開頭用一個total_unit的注釋塊把所有單位寫清楚每個變量名后面后綴單位比如P_csp_MW、E_tes_MWh雖然變量名長了但調試起來省心太多。儲熱罐的建模精細程度直接影響結果可信度。最簡單的單罐能量模型忽略了儲熱罐的散熱損失和充放熱的速率限制。在日調度尺度散熱損失大約占儲熱量的1%-2%每天可以折算成儲熱平衡方程里的一個漏熱系數E_tes(t1) E_tes(t) * (1 - eta_loss) (Q_sf(t) - P_csp(t)/eta_pb) * dteta_loss取0.01-0.02比較合理。此外還應限制每小時的充放熱速率不要讓它超過某個上限否則優(yōu)化結果可能出現(xiàn)“中午一個小時內給儲熱罐充進去200MWh”這種實際設備做不到的極端操作。P2G效率的常數處理在第1章我提過這里給出工程上的改進方向。電解槽在30%負荷時效率可能只有滿負荷的80%直接按常數效率算會高估低負荷時的產氣量導致模型過度使用P2G。改進方法是把P2G的輸入功率分成三段每一段用不同的效率系數并用0-1變量控制段的啟用順序P_p2g P_seg1 P_seg2 P_seg3 V_p2g eta1 * P_seg1 eta2 * P_seg2 eta3 * P_seg3 0 P_seg1 10*u1 0 P_seg2 5*u2 0 P_seg3 5*u3 u1 u2 u3最后一條約束u1u2u3保證了第三段不可能在第二段沒啟用時單獨啟用也就是負荷段必須按順序進入。這是分段線性化的一個標準寫法雖然會增加幾個整數變量但對模型精度提升非常明顯。如果你的系統(tǒng)對產氣量精度要求高這一步值得做。整套模型跑下來我最深的體感是綜合能源調度項目的功夫一半在建模一半在查錯純粹寫代碼的時間其實只占三成。CSP儲熱方程的時間耦合、P2G和燃氣輪機之間的氣平衡耦合、儲熱罐末端狀態(tài)約束這三處只要有一處沒對齊求解器就會用“不可行”三個字教你做人。建議第一次跑的時候別急著把全部單元塞進去先跑一個“風機光伏電網購電”的微電網調度跑通了再加CSP再加ORC和P2G每加一個單元就跑一遍三場景對比。這樣出問題時定位清晰也對每個單元在系統(tǒng)里的真實作用有了直觀判斷。我個人習慣是每次調完參數都把三個場景的結果貼在同一張圖上對比著看而不是只看單場景的調度曲線——很多單元的價值只有對比才看得出來。