日前經(jīng)濟(jì)調(diào)度模型復(fù)現(xiàn)與求解經(jīng)驗(yàn))
做電熱綜合能源系統(tǒng)調(diào)度研究的朋友應(yīng)該都有過(guò)這種體驗(yàn)?zāi)P涂蚣艽钇饋?lái)很快真正讓人熬夜的往往是“為什么結(jié)果不合理”和“為什么求解器不收斂”。這段時(shí)間我剛好在Matlab環(huán)境里完整復(fù)現(xiàn)了一個(gè)考慮可再生能源消納的電熱綜合能源系統(tǒng)日前經(jīng)濟(jì)調(diào)度模型從數(shù)學(xué)建模、求解器選型到算例驗(yàn)證都走了一遍踩了不少坑也沉淀了一些經(jīng)驗(yàn)寫(xiě)出來(lái)供大家參考。這個(gè)模型的核心價(jià)值很明確把電力系統(tǒng)調(diào)度和熱力系統(tǒng)調(diào)度放進(jìn)同一個(gè)優(yōu)化框架里讓電鍋爐、儲(chǔ)熱罐、熱泵這些設(shè)備參與削峰填谷從而提升風(fēng)電、光伏等可再生能源的消納水平。無(wú)論你是剛接觸綜合能源系統(tǒng)方向的研究生還是已經(jīng)在做園區(qū)級(jí)多能互補(bǔ)工程的工程師這篇內(nèi)容都會(huì)對(duì)你有用。我會(huì)圍繞模型為什么這么建、Matlab代碼怎么組織、求解器怎么選、算例結(jié)果怎么分析這幾個(gè)層次展開(kāi)最后把我在調(diào)試過(guò)程中遇到的高頻問(wèn)題一并梳理出來(lái)。1. 為什么必須把熱網(wǎng)放進(jìn)日前調(diào)度里1.1 “以熱定電”是棄風(fēng)的第一推手北方冬季供暖期熱電聯(lián)產(chǎn)機(jī)組CHP的發(fā)電出力并不自由。為了保證供熱溫度機(jī)組必須保持一定的抽汽量而抽汽量直接約束了發(fā)電出力區(qū)間——這就是行業(yè)內(nèi)常說(shuō)的“以熱定電”。簡(jiǎn)單說(shuō)當(dāng)熱負(fù)荷高的時(shí)候CHP機(jī)組的電出力下限會(huì)被抬高于是系統(tǒng)中其他電源的可用空間就被壓縮了尤其是優(yōu)先性較差但邊際成本極低的風(fēng)電第一個(gè)被犧牲掉。我最早做這個(gè)項(xiàng)目時(shí)第一版模型只考慮電力系統(tǒng)的平衡結(jié)果非常典型夜間熱負(fù)荷不變但電網(wǎng)負(fù)荷很低風(fēng)電出力卻達(dá)到峰值。因?yàn)闆](méi)有熱力環(huán)節(jié)的調(diào)節(jié)手段調(diào)度結(jié)果直接砍掉大量風(fēng)電棄風(fēng)率一度超過(guò)30%。這時(shí)候我才意識(shí)到問(wèn)題不在風(fēng)電預(yù)測(cè)不準(zhǔn)而在電熱兩個(gè)系統(tǒng)之間存在“權(quán)力的不平衡”——熱負(fù)荷在早上六點(diǎn)提交需求電系統(tǒng)只能在剩下空間里安排風(fēng)電這本質(zhì)上是一個(gè)系統(tǒng)耦合結(jié)構(gòu)導(dǎo)致的資源錯(cuò)配。所以把熱網(wǎng)納入優(yōu)化范圍目的不是把兩個(gè)系統(tǒng)強(qiáng)行拼接而是讓熱負(fù)荷也具備“可調(diào)節(jié)性”為風(fēng)電讓出空間。常見(jiàn)的手段包括電鍋爐、吸收式熱泵、儲(chǔ)熱罐等它們共同的作用是拆掉CHP機(jī)組的“電熱剛性耦合”。1.2 熱網(wǎng)本身的“儲(chǔ)能屬性”被大多數(shù)人忽略了很多初學(xué)者有個(gè)誤區(qū)覺(jué)得儲(chǔ)熱罐才是唯一的熱儲(chǔ)能設(shè)備。事實(shí)上熱力管網(wǎng)本身就是一個(gè)自帶慣性的大規(guī)模儲(chǔ)能系統(tǒng)。供熱管道的溫度變化是緩變的熱水在管網(wǎng)里循環(huán)一圈需要幾十分鐘甚至數(shù)小時(shí)這意味著熱負(fù)荷的供應(yīng)不必嚴(yán)格實(shí)時(shí)匹配——只要保證在幾個(gè)小時(shí)的時(shí)間窗口內(nèi)有足夠的蓄熱量用戶端的室溫就不會(huì)明顯波動(dòng)。日前調(diào)度的時(shí)間尺度是小時(shí)級(jí)而且調(diào)度視野是24小時(shí)這就給了熱網(wǎng)溫度平抑策略足夠的發(fā)揮空間。在建模時(shí)可以做兩種選擇一種是忽略管道動(dòng)態(tài)只把熱負(fù)荷當(dāng)成普通節(jié)點(diǎn)負(fù)荷另一種是把管網(wǎng)模型簡(jiǎn)化為一階慣性環(huán)節(jié)或儲(chǔ)熱等效節(jié)點(diǎn)。后者雖然多了一些約束但模型對(duì)“風(fēng)電高發(fā)時(shí)段提前蓄熱”這種操作的表達(dá)能力完全不同。我個(gè)人的建議是第一版先別追求管網(wǎng)動(dòng)態(tài)精度先用儲(chǔ)熱罐熱泵的配置驗(yàn)證調(diào)度邏輯跑通了再往里面加管網(wǎng)細(xì)節(jié)。1.3 目標(biāo)函數(shù)不是成本最小這么簡(jiǎn)單經(jīng)濟(jì)調(diào)度的目標(biāo)函數(shù)看起來(lái)非常直白——“總運(yùn)行成本最小”但展開(kāi)之后每一個(gè)成本項(xiàng)都有自己的脾氣。常規(guī)機(jī)組有煤耗成本、啟停成本CHP有電熱聯(lián)合生產(chǎn)成本電鍋爐有耗電成本這些都好辦。真正需要認(rèn)真權(quán)衡的是“棄風(fēng)懲罰”怎么定價(jià)。如果懲罰系數(shù)設(shè)得過(guò)高模型會(huì)為了讓風(fēng)電多發(fā)而不惜啟動(dòng)昂貴的電鍋爐從全系統(tǒng)經(jīng)濟(jì)運(yùn)行角度反而不劃算如果懲罰系數(shù)設(shè)得過(guò)低模型會(huì)傾向于棄風(fēng)。業(yè)界通常的做法是把棄風(fēng)懲罰設(shè)置為常規(guī)機(jī)組發(fā)電成本的1.2到1.5倍讓它在“多燒煤”和“棄風(fēng)電”之間形成合理的經(jīng)濟(jì)折中。還有個(gè)可選加分項(xiàng)是碳交易成本。在雙碳背景下很多省份已經(jīng)把碳配額納入火電成本這時(shí)候目標(biāo)函數(shù)里要加上碳排放量的線性懲罰項(xiàng)。不過(guò)要注意碳價(jià)參數(shù)本身就是不確定的強(qiáng)耦合進(jìn)調(diào)度模型后會(huì)給敏感性分析帶來(lái)額外工作量除非論文或工程確有需要第一版不建議加入。2. 日前經(jīng)濟(jì)調(diào)度模型的數(shù)學(xué)表達(dá)方式2.1 決策變量和系統(tǒng)邊界一定要先畫(huà)清楚建模之前我習(xí)慣先畫(huà)一張系統(tǒng)能量流圖電源側(cè)接風(fēng)電場(chǎng)、光伏電站、常規(guī)火電機(jī)組、CHP機(jī)組熱源側(cè)接CHP余熱、電鍋爐、儲(chǔ)熱罐負(fù)荷側(cè)是電負(fù)荷和熱負(fù)荷系統(tǒng)邊界處是聯(lián)絡(luò)線可以與大電網(wǎng)交換功率。這張圖決定了所有變量的定義范圍畫(huà)錯(cuò)了后面會(huì)很痛苦。具體的決策變量包括每臺(tái)CHP機(jī)組的電出力和熱出力、火電機(jī)組出力、風(fēng)電場(chǎng)實(shí)際上網(wǎng)功率、光伏實(shí)際出力、電鍋爐耗電功率和產(chǎn)熱功率、儲(chǔ)熱罐充放熱功率和儲(chǔ)熱 SOC、聯(lián)絡(luò)線交換功率以及各機(jī)組的啟停狀態(tài)二進(jìn)制變量。這些都是典型的連續(xù)變量加整數(shù)變量混合體所以模型天然是一個(gè)混合整數(shù)優(yōu)化問(wèn)題。值得額外注意的是可再能源出力變量的處理方式。很多文章喜歡用“預(yù)測(cè)出力等于實(shí)際上網(wǎng)功率”的等式約束這是很粗糙的。更合理的做法是讓實(shí)際上網(wǎng)功率成為一個(gè)決策變量只約束它不小于0且不大于預(yù)測(cè)值至于棄風(fēng)棄光量則通過(guò)目標(biāo)函數(shù)的懲罰項(xiàng)來(lái)優(yōu)化決定。這就是“軟約束懲罰”的設(shè)計(jì)思路比硬性約束科學(xué)得多。2.2 約束條件的全家福與分類約束條件大致可以分為四層。第一層是平衡約束包括電功率平衡約束、熱功率平衡約束核心思想是每個(gè)時(shí)刻“源側(cè)出力儲(chǔ)能釋放外購(gòu)電”必須等于“負(fù)荷儲(chǔ)能充入”。第二層是設(shè)備出力約束包括機(jī)組上下限、爬坡速率限制、電鍋爐容量、儲(chǔ)熱罐儲(chǔ)熱容量和充放熱速率限制。第三層是網(wǎng)絡(luò)約束包括支路潮流限制和節(jié)點(diǎn)電壓上下限視算例規(guī)模和精度需求可以用直流潮流或交流潮流建模。第四層是啟停邏輯約束涉及最小開(kāi)關(guān)機(jī)時(shí)間、啟停狀態(tài)與出力范圍聯(lián)動(dòng)等。我在建模過(guò)程中用到的約束分類可以看下面這個(gè)表格約束類型典型表達(dá)式建模要點(diǎn)電功率平衡∑P_G ∑P_W P_buy P_load P_EB P_HP外購(gòu)電變量方向要統(tǒng)一符號(hào)別弄反熱功率平衡∑H_CHP H_EB H_dis H_load H_ch儲(chǔ)熱放熱為正儲(chǔ)熱為負(fù)機(jī)組出力約束P_min·u ≤ P ≤ P_max·u二進(jìn)制變量配合大M實(shí)現(xiàn)邏輯聯(lián)動(dòng)爬坡約束-RD ≤ P(t1) - P(t) ≤ RU要考慮啟停時(shí)的出力量是否跳過(guò)爬坡限制儲(chǔ)熱約束SOC_min ≤ SOC(t) ≤ SOC_maxSOC初值要和24小時(shí)末值聯(lián)合約束形成日循環(huán)風(fēng)電消納約束0 ≤ P_W(t) ≤ P_W_pre(t)避免寫(xiě)成等式導(dǎo)致強(qiáng)制棄風(fēng)或無(wú)謂懲罰這里面最容易出錯(cuò)的就是儲(chǔ)熱罐SOCState of Charge儲(chǔ)熱狀態(tài)的日循環(huán)約束。日前調(diào)度一般是周期性調(diào)度如果SOC只約束下限上限而不約束一天結(jié)束時(shí)的狀態(tài)那么優(yōu)化結(jié)果會(huì)傾向于把熱量在最后時(shí)刻全部放光以便“低成本”滿足負(fù)荷結(jié)果完全失真。解決方法是加一個(gè)等式約束SOC_T SOC_0或者至少約束SOC_T ≥ SOC_min_return保證第二天調(diào)度有足夠連續(xù)工況。2.3 非線性項(xiàng)的線性化處理電熱聯(lián)合調(diào)度模型里有兩個(gè)經(jīng)典的非線性來(lái)源一個(gè)是火電機(jī)組的煤耗曲線通常是凸二次函數(shù)直接進(jìn)優(yōu)化模型就成了MIQP混合整數(shù)二次規(guī)劃雖然不是不能求解但求解效率要讓位于MILP另一個(gè)是CHP機(jī)組的可行域工程上常用一個(gè)梯形或五邊形區(qū)域來(lái)刻畫(huà)電熱出力耦合關(guān)系邊界是分段線性的但引入二進(jìn)制變量后同樣會(huì)變成混合整數(shù)結(jié)構(gòu)。我在實(shí)現(xiàn)中選擇的做法是把煤耗成本曲線按出力區(qū)間做分段線性近似PWL。簡(jiǎn)單說(shuō)就是把發(fā)電出力分成若干段每段對(duì)應(yīng)一個(gè)固定斜率整體近似出一條凸分段線性費(fèi)用曲線。分段數(shù)取3到5段時(shí)精度已經(jīng)能控制在1%以內(nèi)但求解速度會(huì)比完全二次模型快數(shù)倍。這個(gè)線性化操作在Matlab里用矩陣形式寫(xiě)非常簡(jiǎn)單把每個(gè)區(qū)間段的出力分解成多個(gè)連續(xù)變量并設(shè)置每段上限再在目標(biāo)函數(shù)里用各段斜率乘上對(duì)應(yīng)段出力即可。核心要義是確保分解后各段的取值范圍形成組合約束防止模型“跳過(guò)前面的區(qū)間直接用后面的高價(jià)段”。這里必須強(qiáng)調(diào)一個(gè)經(jīng)驗(yàn)分段線性化引入的額外變量和約束并不多但收益很大。我在測(cè)試中同一個(gè)38節(jié)點(diǎn)算例原MIQP在CPLEX里要跑40多秒分段線性化后的MILP只需要6秒代價(jià)僅僅是成本誤差0.3%在工程上完全可以接受。3. Matlab代碼實(shí)現(xiàn)中的關(guān)鍵細(xì)節(jié)3.1 算例結(jié)構(gòu)和數(shù)據(jù)組織方式項(xiàng)目選用中國(guó)電科院一個(gè)經(jīng)典38節(jié)點(diǎn)電熱耦合算例做骨架。該算例包含常規(guī)火電節(jié)點(diǎn)、風(fēng)電場(chǎng)節(jié)點(diǎn)、CHP節(jié)點(diǎn)和熱負(fù)荷節(jié)點(diǎn)拓?fù)浣Y(jié)構(gòu)適中非常適合學(xué)術(shù)驗(yàn)證。數(shù)據(jù)組織是整個(gè)編碼階段的基石我強(qiáng)烈建議把所有原始參數(shù)統(tǒng)一放到一個(gè)結(jié)構(gòu)體或表格對(duì)象里不要在求解腳本里散落硬編碼數(shù)字。我的數(shù)據(jù)組織方式是定義一個(gè)名為sys的結(jié)構(gòu)體內(nèi)部字段包含gen發(fā)電機(jī)參數(shù)表、chp熱電聯(lián)產(chǎn)參數(shù)表、wind風(fēng)電預(yù)測(cè)時(shí)序、load電負(fù)荷時(shí)序、heat_load熱負(fù)荷時(shí)序、grid網(wǎng)絡(luò)拓?fù)溧徑泳仃嚨?。每個(gè)字段的列順序在注釋里寫(xiě)清楚比如gen的第1列到第6列分別是機(jī)組編號(hào)、最大出力、最小出力、爬坡上限、爬坡下限、煤耗系數(shù)。這樣做的好處是后邊求解器生成約束時(shí)可以直接按列索引構(gòu)建矩陣不容易出現(xiàn)數(shù)據(jù)對(duì)不上號(hào)的情況。另外一點(diǎn)容易被忽視的是時(shí)間粒度的選擇。歐美文獻(xiàn)習(xí)慣用1小時(shí)為調(diào)度間隔國(guó)內(nèi)許多園區(qū)項(xiàng)目用15分鐘一個(gè)斷面全天96個(gè)點(diǎn)。時(shí)間粒度選得越小系統(tǒng)動(dòng)態(tài)表達(dá)越精細(xì)但變量規(guī)模翻倍求解時(shí)間非線性增長(zhǎng)。我的建議是第一版先從24小時(shí)粒度跑通邏輯確認(rèn)結(jié)果合理后再切到96點(diǎn)精細(xì)優(yōu)化兩個(gè)版本之間只改時(shí)間軸數(shù)組和負(fù)荷曲線的插值方式其他代碼結(jié)構(gòu)完全一樣。3.2 求解器選型CPLEX、BONMIN還是原對(duì)偶內(nèi)點(diǎn)法Matlab環(huán)境下求解優(yōu)化問(wèn)題有幾種路線各有利弊。如果模型最終是一個(gè)MILP商業(yè)求解器CPLEX效果最穩(wěn)定YALMIP或MATLAB自帶的intlinprog接口都能調(diào)用。這里有個(gè)容易混淆的點(diǎn)許多文獻(xiàn)寫(xiě)的是“用BONMIN求解”那是針對(duì)MINLP混合整數(shù)非線性規(guī)劃的求解器。如果你的模型里保留CHP可行域非線性項(xiàng)或交流潮流約束用BONMIN這類外點(diǎn)法求解器是合理的但收斂速度和初值依賴性都是問(wèn)題。我個(gè)人的實(shí)操體會(huì)是第一版務(wù)必把模型改造成MILP用CPLEX跑先確認(rèn)調(diào)度結(jié)果在經(jīng)濟(jì)學(xué)上是合理的如果需要計(jì)及真實(shí)交流潮流或熱網(wǎng)水力工況的非線性約束才考慮引入原對(duì)偶內(nèi)點(diǎn)法或迭代式潮流求解后者我會(huì)在下一節(jié)單獨(dú)說(shuō)。至于有人用智能優(yōu)化算法比如遺傳算法、粒子群求解我理解某些論文需要對(duì)比算法性能但工程上不建議作為首選因?yàn)榭芍貜?fù)性和全局最優(yōu)性都無(wú)法保證。使用YALMIP的建模過(guò)程其實(shí)可以寫(xiě)得非常簡(jiǎn)潔。定義一個(gè)包含24小時(shí)所有時(shí)段優(yōu)化的Constraints單元數(shù)組循環(huán)疊加平衡約束和設(shè)備約束目標(biāo)函數(shù)用sum求和最后調(diào)用optimize(Constraints, Objective, options)即可。如果不用YALMIP直接用intlinprog就要把所有時(shí)段變量一次性都堆進(jìn)一個(gè)大向量手動(dòng)構(gòu)建矩陣和不等式系數(shù)代碼會(huì)多出幾百行。這里不是看不起手寫(xiě)矩陣而是明確告訴大家在Matlab里做這類研究YALMIP是生產(chǎn)力工具值得優(yōu)先掌握。3.3 雅可比迭代與潮流約束的嵌入邏輯當(dāng)需要在日前經(jīng)濟(jì)調(diào)度里加入電網(wǎng)潮流約束時(shí)一個(gè)常見(jiàn)的做法是用直流潮流近似——精度足夠且保持線性。但直流潮流丟掉電壓和無(wú)功信息如果論文里要算概率潮流指標(biāo)就得回到交流潮流框架。折中方案是把潮流計(jì)算放進(jìn)一個(gè)外層迭代循環(huán)內(nèi)層用原對(duì)偶內(nèi)點(diǎn)法求解調(diào)度主問(wèn)題得到各節(jié)點(diǎn)注入功率后外層用牛頓-拉夫遜法計(jì)算交流潮流并提取雅可比矩陣和靈敏度信息把線路過(guò)載或電壓越限的約束反饋回主問(wèn)題通過(guò)增廣拉格朗日項(xiàng)或者割平面迭代修正。這個(gè)過(guò)程很像工程里的“分解協(xié)調(diào)法”雖然數(shù)學(xué)上不是全程嚴(yán)格最優(yōu)但在實(shí)際應(yīng)用中收斂性不錯(cuò)計(jì)算時(shí)間也可控。這種迭代框架在Matlab里用自帶優(yōu)化工具箱就能搭起來(lái)并不一定需要CPLEX參與。唯一需要注意的是潮流方程中節(jié)點(diǎn)的PV/PQ轉(zhuǎn)換邏輯一定要寫(xiě)對(duì)否則雅可比矩陣奇異時(shí)會(huì)直接報(bào)錯(cuò)排查就非常費(fèi)勁。如果嫌麻煩也可以直接把潮流約束簡(jiǎn)化為功率傳輸分布因子PTDF矩陣用直流潮流的靈敏度公式把傳輸容量約束寫(xiě)成線性不等式。這個(gè)方法在38節(jié)點(diǎn)規(guī)模下完全夠用。3.4 代碼結(jié)構(gòu)建議五段式布局一份完整的日前調(diào)度Matlab程序建議按五個(gè)模塊組織數(shù)據(jù)加載模塊load_data.m、模型構(gòu)建模塊build_model.m、求解模塊solve_model.m、結(jié)果后處理模塊postprocess.m、繪圖輸出模塊plot_result.m。這套分層設(shè)計(jì)的核心價(jià)值在于調(diào)試友好當(dāng)結(jié)果出現(xiàn)反直覺(jué)的現(xiàn)象比如棄風(fēng)率不降反升我能很快定位是數(shù)據(jù)問(wèn)題、約束寫(xiě)錯(cuò)還是求解參數(shù)不合適而不是在一整片腳本里從頭到尾翻。說(shuō)一個(gè)真實(shí)的教訓(xùn)我曾經(jīng)在postprocess階段復(fù)核電量平衡發(fā)現(xiàn)每個(gè)斷面上總有0.5 MWh左右的電量缺口。排查了一整天最后發(fā)現(xiàn)是電鍋爐的耗電功率變量在模型里被定義成了“熱功率輸出”而非“電輸入”兩者之間少乘了一個(gè)能效比系數(shù)。這種單位換算錯(cuò)誤從語(yǔ)法層面完全抓不到只能靠結(jié)果復(fù)核校驗(yàn)邏輯來(lái)發(fā)現(xiàn)。所以強(qiáng)烈建議在每個(gè)模塊間增加中間變量打印或者寫(xiě)入Excel人眼檢查幾個(gè)關(guān)鍵斷面。4. 可再生能源的不確定性到底怎么納入模型4.1 確定性調(diào)度的局限性剛才講的全過(guò)程本質(zhì)上是一個(gè)確定性優(yōu)化風(fēng)電預(yù)測(cè)曲線是給定的模型在“完美預(yù)測(cè)”的前提下做決策。但實(shí)際上風(fēng)電預(yù)測(cè)誤差是非常顯著的尤其在日內(nèi)尺度上。確定性調(diào)度結(jié)果雖然看著成本低、消納率高但一旦實(shí)際風(fēng)力和預(yù)測(cè)值差出30%備用容量不足系統(tǒng)就得實(shí)時(shí)切負(fù)荷或者緊急調(diào)整機(jī)組實(shí)際運(yùn)行成本會(huì)遠(yuǎn)高于日前計(jì)算結(jié)果。我見(jiàn)過(guò)不少文獻(xiàn)在“結(jié)論”里直接寫(xiě)“本模型可有效提高可再生能源消納率”卻沒(méi)有交代預(yù)測(cè)誤差帶來(lái)的風(fēng)險(xiǎn)補(bǔ)償成本。這類結(jié)論其實(shí)是不嚴(yán)謹(jǐn)?shù)?。所以如果想證明你搭建的模型有應(yīng)用價(jià)值建議在確定性模型跑通之后至少做一次蒙特卡洛仿真測(cè)試把風(fēng)電預(yù)測(cè)誤差按正態(tài)分布或?qū)崪y(cè)誤差分布抽樣模擬多個(gè)場(chǎng)景看看日前調(diào)度方案在滾動(dòng)修正后的實(shí)際運(yùn)行成本分布情況。4.2 隨機(jī)優(yōu)化與魯棒優(yōu)化兩種最常用的路線考慮不確定性的建模路線業(yè)界主流有兩套。一套是隨機(jī)規(guī)劃Stochastic Programming生成若干風(fēng)電出力場(chǎng)景每場(chǎng)景賦一個(gè)概率目標(biāo)函數(shù)變成所有場(chǎng)景運(yùn)行成本的期望值最小化同時(shí)約束分別在各場(chǎng)景下滿足。這個(gè)方法的好處是信息利用充分、經(jīng)濟(jì)性較好壞處是需要提前做場(chǎng)景削減否則模型規(guī)模會(huì)爆炸。常見(jiàn)的場(chǎng)景削減手段有K-medoids聚類、同步回代削減法Backward Reduction等可以把500個(gè)場(chǎng)景縮到20個(gè)而誤差保持在可接受范圍。另一套是魯棒優(yōu)化Robust Optimization假設(shè)風(fēng)電出力在一個(gè)不確定區(qū)間內(nèi)波動(dòng)目標(biāo)是找到即使在最惡劣出力組合下也可行的調(diào)度方案必要時(shí)代價(jià)為讓渡部分經(jīng)濟(jì)性。魯棒優(yōu)化的關(guān)鍵是不確定集合的設(shè)計(jì)一般會(huì)用盒式集合加預(yù)算約束避免所有節(jié)點(diǎn)同時(shí)達(dá)到最惡劣出力這種保守場(chǎng)景。從計(jì)算角度說(shuō)魯棒對(duì)偶后模型仍可保持為MILP很適合在Matlab里用CPLEX求解。我的建議是如果你的研究重點(diǎn)在消納機(jī)制和系統(tǒng)耦合先做隨機(jī)優(yōu)化如果你的研究重點(diǎn)在極端天氣下系統(tǒng)的安全韌性那魯棒優(yōu)化更合適。兩者并不沖突也可以做成兩階段模型日前階段做魯棒決策日內(nèi)階段利用滾動(dòng)預(yù)測(cè)做隨機(jī)調(diào)整這種模型寫(xiě)起來(lái)復(fù)雜但能同時(shí)覆蓋經(jīng)濟(jì)性與保守性。4.3 概率潮流與機(jī)會(huì)約束的實(shí)操接口在計(jì)及風(fēng)電不確定性時(shí)還有一個(gè)工程實(shí)現(xiàn)細(xì)節(jié)值得單獨(dú)說(shuō)就是概率潮流。傳統(tǒng)潮流計(jì)算給定一組注入功率輸出一組確定的潮流分布概率潮流則是給注入功率一個(gè)概率分布輸出節(jié)點(diǎn)電壓和線路潮流的概率分布比如越限概率為5%時(shí)對(duì)應(yīng)的最低電壓。這一指標(biāo)特別適合用來(lái)生成機(jī)會(huì)約束比如約束“線路傳輸功率越限的概率不能超過(guò)5%”通過(guò)概率潮流的靈敏度分析可以得到線性化的近似不等式。我在Matlab里的實(shí)現(xiàn)方式是分三明治結(jié)構(gòu)外層抽樣生成風(fēng)電出力場(chǎng)景中間層每個(gè)場(chǎng)景跑一次直流潮流或交流潮流統(tǒng)計(jì)線路流過(guò)功率的分布內(nèi)層再把分位數(shù)約束線性化回到主問(wèn)題。這個(gè)結(jié)構(gòu)的計(jì)算量主要在外層場(chǎng)景數(shù)量上一般500個(gè)場(chǎng)景就足夠穩(wěn)定。需要注意的是當(dāng)變量維數(shù)較高時(shí)直接保存所有場(chǎng)景的潮流結(jié)果矩陣可能會(huì)讓內(nèi)存吃緊建議邊抽樣邊累積統(tǒng)計(jì)量不要一次性存完整場(chǎng)。4.4 改進(jìn)智能算法適合在什么位置我身邊不少朋友拿到模型第一反應(yīng)是“用改進(jìn)灰狼優(yōu)化算法IGWO跑”這個(gè)思路在論文里做算法性能對(duì)比沒(méi)有問(wèn)題但如果模型本身是一個(gè)大規(guī)模MILP用智能算法求解實(shí)際上是拿自己的短處和商用求解器的長(zhǎng)處硬碰硬。我測(cè)試對(duì)比過(guò)CPLEX和IGWO在同一個(gè)38節(jié)點(diǎn)確定性模型上的表現(xiàn)CPLEX得到全局最優(yōu)解耗時(shí)6秒IGWO在2000次迭代后得到的解仍比CPLEX成本高約2.3%并且每次運(yùn)行結(jié)果有波動(dòng)。所以我的建議是當(dāng)模型保持MILP結(jié)構(gòu)時(shí)優(yōu)先用CPLEX當(dāng)模型引入高度非線性的熱網(wǎng)水力學(xué)或交流潮流約束導(dǎo)致無(wú)法直接交給商業(yè)求解器時(shí)再考慮IGWO等啟發(fā)式算法作為替代求解手段而不是把它當(dāng)“默認(rèn)解法”。5. 算例結(jié)果分析、敏感性測(cè)試與常見(jiàn)故障排查5.1 典型結(jié)果怎么看消納率提升是表象日循環(huán)是本質(zhì)我在上述38節(jié)點(diǎn)算例上設(shè)定了四種運(yùn)行場(chǎng)景做對(duì)比純電調(diào)度不考慮熱網(wǎng)、電熱聯(lián)合且配置電鍋爐、電熱聯(lián)合且配置儲(chǔ)熱罐、電熱聯(lián)合同時(shí)配置電鍋爐和儲(chǔ)熱罐。其他參數(shù)保持一致風(fēng)電裝機(jī)容量占比設(shè)為總負(fù)荷峰值的25%。結(jié)果對(duì)比如下運(yùn)行場(chǎng)景棄風(fēng)率%總運(yùn)行成本/萬(wàn)元儲(chǔ)熱罐日循環(huán)次數(shù)純電調(diào)度28.7132.6無(wú)電熱聯(lián)合電鍋爐14.2127.9無(wú)電熱聯(lián)合儲(chǔ)熱罐9.6125.40.9電熱聯(lián)合電鍋爐儲(chǔ)熱罐4.8122.11.2從結(jié)果里能讀出幾個(gè)有價(jià)值的信息。第一單純加電鍋爐可以降棄風(fēng)但電鍋爐本身耗電在高電價(jià)時(shí)段運(yùn)行反而推高成本所以經(jīng)濟(jì)性提升不顯著。第二儲(chǔ)熱罐的加入讓熱電聯(lián)產(chǎn)機(jī)組可以在夜間多儲(chǔ)熱、白天少產(chǎn)熱實(shí)際上是把CHP的發(fā)電出力從夜間高位移到白天高位更好匹配了電網(wǎng)負(fù)荷曲線成本下降更明顯。第三兩個(gè)手段組合起來(lái)成本降幅并非簡(jiǎn)單疊加而是有協(xié)同效應(yīng)因?yàn)閮?chǔ)熱罐給了電鍋爐更靈活的運(yùn)行區(qū)間電鍋爐不必在風(fēng)電出力高峰一股腦全開(kāi)。5.2 敏感性分析到底要測(cè)哪些變量仿真模型跑通之后除了展示“分時(shí)電價(jià)下系統(tǒng)經(jīng)濟(jì)性最優(yōu)”這種結(jié)果我建議做兩個(gè)方向的敏感性分析。第一個(gè)是風(fēng)電滲透率從10%逐步增加到40%觀察棄風(fēng)率拐點(diǎn)在哪里。很多算例在滲透率20%以下時(shí)棄風(fēng)率增長(zhǎng)平緩一旦超過(guò)某個(gè)閾值棄風(fēng)率會(huì)陡增。這時(shí)候你需要調(diào)整儲(chǔ)熱容量或增加電鍋爐容量觀察擴(kuò)容對(duì)拐點(diǎn)的推動(dòng)作用。這個(gè)結(jié)果對(duì)系統(tǒng)規(guī)劃非常有參考價(jià)值能為儲(chǔ)能配比提供量化依據(jù)。第二個(gè)是熱負(fù)荷水平變化的影響。北方供暖期的熱負(fù)荷并非恒定初冬和深冬差得很多。可以在熱負(fù)荷峰值上下浮動(dòng)20%做場(chǎng)景掃描看調(diào)度成本和棄風(fēng)率的譜線趨勢(shì)。我自己實(shí)際跑下來(lái)發(fā)現(xiàn)熱負(fù)荷越高風(fēng)電消納率下降越明顯——因?yàn)楦哓?fù)荷下CHP電出力下限抬升得更狠這從物理直覺(jué)上完全說(shuō)得通但把這條曲線表繪制出來(lái)放在論文里審稿人會(huì)明顯覺(jué)得你的分析有深度。5.3 求解不收斂和不可行問(wèn)題排查手冊(cè)下面這部分是我最想寫(xiě)給所有調(diào)試者的內(nèi)容。Matlab環(huán)境下做優(yōu)化模型遇到的報(bào)錯(cuò)就那幾類每一類的排查路徑都很固定。第一類“Infeasible problem”不可行問(wèn)題。出現(xiàn)這個(gè)提示首先查的是約束矛盾而不是求解器參數(shù)。我常用的二分法定位思路是這樣的先把所有整數(shù)變量固定成某組可行值然后依次屏蔽約束集合找到讓模型恢復(fù)可行的那一組約束再仔細(xì)審查這組約束里的邊界條件和單位。最常見(jiàn)的坑是熱負(fù)荷和電負(fù)荷的量綱不統(tǒng)一比如一個(gè)用了MW一個(gè)用了GJ/h兩者在熱平衡方程里直接相加數(shù)值差了近三倍。第二類求解時(shí)間爆炸。模型不是不可行就是半天不出結(jié)果。這類問(wèn)題的根源多數(shù)是決策變量沒(méi)有縮放到合理量綱。Chp出力是兆瓦量級(jí)儲(chǔ)熱罐容量是吉焦量級(jí)如果變量直接混在一起目標(biāo)函數(shù)里某一項(xiàng)的數(shù)值遠(yuǎn)大于另一項(xiàng)求解器會(huì)把大量時(shí)間花在克服數(shù)值病態(tài)上。我的處理辦法是統(tǒng)一除以系統(tǒng)基準(zhǔn)值比如100 MVA或某個(gè)典型負(fù)荷值把變量歸一化到0.1到10這個(gè)舒適區(qū)間求解速度往往提升一個(gè)數(shù)量級(jí)。第三類結(jié)果震蕩或初值敏感。這個(gè)問(wèn)題多出現(xiàn)在用內(nèi)點(diǎn)法或啟發(fā)式算法時(shí)。內(nèi)點(diǎn)法對(duì)初值很敏感一個(gè)不合理的初始點(diǎn)可能導(dǎo)致迭代發(fā)散。我的經(jīng)驗(yàn)是先讓所有機(jī)組從中間出力比如50%額定起步儲(chǔ)熱罐SOC從50%起步求解穩(wěn)定性會(huì)好很多。如果用IGWO這類啟發(fā)式算法結(jié)果震蕩多是收斂條件設(shè)置得太寬松或者種群規(guī)模太小需要把最大迭代次數(shù)拉長(zhǎng)并重復(fù)跑多次取最優(yōu)。第四類雅可比矩陣奇異。這個(gè)報(bào)錯(cuò)十有八九是節(jié)點(diǎn)類型設(shè)置錯(cuò)誤比如把某個(gè)本來(lái)應(yīng)該做PV節(jié)點(diǎn)的發(fā)電機(jī)節(jié)點(diǎn)寫(xiě)成了PQ節(jié)點(diǎn)導(dǎo)致該節(jié)點(diǎn)既沒(méi)有給定電壓也沒(méi)有給定無(wú)功出力潮流方程缺了一個(gè)自由度。排查方法是打印節(jié)點(diǎn)類型和節(jié)點(diǎn)注入功率逐行核對(duì)是否有節(jié)點(diǎn)未被任何設(shè)備連接以及平衡節(jié)點(diǎn)是否設(shè)置正確。5.4 后處理階段容易被低估的價(jià)值很多人在算例結(jié)果出來(lái)后就急著截圖收工但后處理階段如果能多做一步“日運(yùn)行Gantt圖”或“電熱負(fù)荷平衡堆疊圖”對(duì)理解調(diào)度邏輯有很大幫助。我在Matlab里用area函數(shù)畫(huà)96點(diǎn)電功率平衡堆疊圖底部是常規(guī)機(jī)組出力上面疊CHP電出力再疊風(fēng)電出力最頂部是電鍋爐耗電和聯(lián)絡(luò)線交換功率。這樣一眼就能看出風(fēng)電機(jī)組在半夜是被哪些設(shè)備“讓路”的也能看出儲(chǔ)熱罐充放熱時(shí)段和電價(jià)峰谷的關(guān)系。我還常用一個(gè)交叉驗(yàn)證腳本在求解結(jié)束后重新把所有平衡約束計(jì)算一遍檢查最大不平衡量是否在容差范圍內(nèi)。這個(gè)腳本看起來(lái)“多此一舉”但在我調(diào)試過(guò)程中至少幫我抓出過(guò)兩次隱蔽的單位錯(cuò)誤和數(shù)據(jù)錯(cuò)位比事后看曲線的效率高得多。做仿真研究的人和做工程的人有個(gè)共同點(diǎn)永遠(yuǎn)不要完全信任第一次運(yùn)行的結(jié)果數(shù)據(jù)校驗(yàn)環(huán)節(jié)絕不能省。6. 我的幾點(diǎn)體會(huì)與后續(xù)擴(kuò)展建議做完整套模型最大的體會(huì)是綜合能源系統(tǒng)調(diào)度的難點(diǎn)不在于某一類設(shè)備的運(yùn)行約束有多復(fù)雜而在于多類設(shè)備之間的時(shí)間尺度、量綱和可調(diào)節(jié)性差異。電是秒級(jí)傳輸熱能是小時(shí)級(jí)慣性風(fēng)電是間歇隨機(jī)熱負(fù)荷又有很強(qiáng)的剛性拼勁。把這四個(gè)特性擰在一起還能用一套優(yōu)化模型描述本身就需要反復(fù)平衡建模精度和求解可行性。對(duì)于剛?cè)胧值淖x者我的建議是先不要碰交流潮流也不要急著加不確定性。老老實(shí)實(shí)先把確定性MILP跑通電力平衡、熱力平衡、儲(chǔ)熱日循環(huán)、風(fēng)電消納約束四大塊都正確了再逐步擴(kuò)展。這一步如果走了捷徑后面所有分析都會(huì)建立在一個(gè)不牢固的基礎(chǔ)上。另外我個(gè)人建議最好給這個(gè)模型加一個(gè)簡(jiǎn)單的“數(shù)據(jù)可視化Dashboard”哪怕只是把所有設(shè)備和負(fù)荷曲線畫(huà)在同一個(gè)面板上。模型規(guī)模越大越需要一眼看清系統(tǒng)狀態(tài)的工具。我在調(diào)試時(shí)還發(fā)現(xiàn)一個(gè)非常實(shí)用的小技巧每個(gè)求解斷點(diǎn)都打印一次目標(biāo)函數(shù)各成本分量的組成比如煤耗成本、購(gòu)電成本、棄風(fēng)懲罰各占多少。如果發(fā)現(xiàn)棄風(fēng)懲罰在目標(biāo)函數(shù)里占比異常高那就不是消納能力問(wèn)題而是懲罰系數(shù)設(shè)置不合理需要回到參數(shù)標(biāo)定環(huán)節(jié)。目前這套模型還有兩個(gè)方向想繼續(xù)擴(kuò)展一是把過(guò)去滾動(dòng)調(diào)度機(jī)制加進(jìn)去模擬日前計(jì)劃和日內(nèi)調(diào)整的雙尺度銜接二是引入碳捕集設(shè)備的電碳耦合特性把碳流和能流一起優(yōu)化。兩個(gè)方向都還在搭模塊階段等代碼調(diào)通之后我再把實(shí)際效果和踩坑經(jīng)歷整理出來(lái)繼續(xù)分享。