組儲(chǔ)熱改造下的低碳經(jīng)濟(jì)調(diào)度Matlab實(shí)現(xiàn))
考慮火電機(jī)組儲(chǔ)熱改造的電力系統(tǒng)低碳經(jīng)濟(jì)調(diào)度這幾年做電力系統(tǒng)優(yōu)化調(diào)度方向的課題有一個(gè)繞不開的痛點(diǎn)新能源占比越來越高但火電依然承擔(dān)著調(diào)峰和供熱的主力角色。尤其是北方地區(qū)熱電聯(lián)產(chǎn)機(jī)組占比極大以熱定電的剛性約束讓機(jī)組在冬季深調(diào)能力非常有限棄風(fēng)棄光問題在供暖期集中爆發(fā)。儲(chǔ)熱改造就是針對這一矛盾的核心手段之一——在火電機(jī)組側(cè)加裝儲(chǔ)熱罐把熱負(fù)荷和電出力解耦給機(jī)組騰出更多調(diào)節(jié)空間。而低碳經(jīng)濟(jì)調(diào)度則是在傳統(tǒng)經(jīng)濟(jì)調(diào)度框架之上進(jìn)一步疊加碳配額、碳交易成本、碳流追蹤等因素把碳排放變成調(diào)度決策中的可量化成本從而引導(dǎo)系統(tǒng)走向更低碳的運(yùn)行方式。這篇文章總結(jié)的是我用Matlab實(shí)現(xiàn)考慮火電機(jī)組儲(chǔ)熱改造的電力系統(tǒng)低碳經(jīng)濟(jì)調(diào)度的全過程從模型拆解、約束構(gòu)建、代碼實(shí)現(xiàn)到調(diào)試排坑。面向的讀者是正在做電力系統(tǒng)優(yōu)化調(diào)度、儲(chǔ)能/儲(chǔ)熱配置、低碳經(jīng)濟(jì)調(diào)度相關(guān)畢業(yè)設(shè)計(jì)或課題研究的學(xué)生和工程師。如果你手上正缺一套能跑通的思路框架或者對Yalmip建模、Cplex求解MILP問題還不太熟這篇文章應(yīng)該能幫你省不少時(shí)間。1. 項(xiàng)目核心思路拆解1.1 儲(chǔ)熱改造到底在改什么很多人第一次接觸儲(chǔ)熱改造這個(gè)概念時(shí)容易把它和電網(wǎng)側(cè)的儲(chǔ)能電站混淆。這里要先把物理對象搞清楚?;痣姍C(jī)組儲(chǔ)熱改造改造對象是熱電廠。傳統(tǒng)熱電聯(lián)產(chǎn)機(jī)組CHP在采暖期必須保證供熱出力而供熱出力又和電出力強(qiáng)耦合——典型的抽凝式機(jī)組電出力范圍被熱出力限制在一個(gè)狹窄區(qū)間內(nèi)這就是所謂以熱定電。你想多發(fā)電熱也得跟著多產(chǎn)你想少發(fā)電熱又供不上。風(fēng)電大發(fā)需要火電壓出力時(shí)熱電機(jī)組往往壓不下去只能眼睜睜棄風(fēng)。加裝儲(chǔ)熱罐之后熱負(fù)荷不再是必須由鍋爐產(chǎn)熱即時(shí)滿足而是可以拆成兩部分一部分直接由機(jī)組供熱另一部分由儲(chǔ)熱罐放熱供給。反過來機(jī)組在需要的時(shí)候也可以多產(chǎn)熱把熱量存進(jìn)罐里等熱負(fù)荷高峰再放出來。相當(dāng)于給熱力系統(tǒng)加了一個(gè)緩沖池?zé)岷碗姷膹?qiáng)耦合關(guān)系被打破了。從數(shù)學(xué)上講改造前機(jī)組電出力P和熱出力H之間存在一個(gè)剛性可行域改造后可行域在儲(chǔ)熱罐SOC的調(diào)節(jié)下發(fā)生了變化。調(diào)度模型里需要考慮的不再是單個(gè)時(shí)段的電熱耦合而是一個(gè)跨時(shí)段的熱量轉(zhuǎn)移約束。這對模型的動(dòng)態(tài)建模能力提出了要求也是整個(gè)項(xiàng)目建模的核心難點(diǎn)之一。1.2 低碳經(jīng)濟(jì)調(diào)度解決了什么問題傳統(tǒng)經(jīng)濟(jì)調(diào)度的目標(biāo)很單純讓系統(tǒng)總運(yùn)行成本最低主要就是煤耗成本。但雙碳目標(biāo)下只算煤耗賬是不夠的。碳排放要進(jìn)入成本函數(shù)才會(huì)影響調(diào)度決策。低碳經(jīng)濟(jì)調(diào)度做的其實(shí)就是兩件事的折中保證供電和供熱的經(jīng)濟(jì)性同時(shí)盡可能降低系統(tǒng)碳排放。常見的做法有幾種引入碳交易機(jī)制給每個(gè)機(jī)組分配碳排放配額實(shí)際排放超過配額的部分需要購買配額低于配額的部分可以出售獲利將碳捕集設(shè)備的能耗和收益納入調(diào)度模型在目標(biāo)函數(shù)中加入碳稅或碳價(jià)的顯式項(xiàng)。這個(gè)項(xiàng)目采用的是第一種思路即基于碳配額與碳交易成本的建模方式。每個(gè)火電機(jī)組根據(jù)出力水平計(jì)算實(shí)際碳排放量再與政府分配的配額對比差值乘以碳價(jià)計(jì)入目標(biāo)函數(shù)。配額分配方式常用基準(zhǔn)線法也就是基于機(jī)組類型和發(fā)電量給出一個(gè)排放基準(zhǔn)。這樣的建模方式有一個(gè)明顯優(yōu)勢目標(biāo)函數(shù)仍然是線性或者分段線性的配合混合整數(shù)線性規(guī)劃MILP求解器可以直接求解不需要引入復(fù)雜的非線性求解器計(jì)算效率和收斂性都有保障。1.3 為什么用Matlab來做我見過不少人在Python和Matlab之間反復(fù)糾結(jié)客觀講兩者都能做但Matlab在這個(gè)項(xiàng)目中確實(shí)有不可替代的便利性。首先是Yalmip工具箱。它提供了一個(gè)極其簡潔的建模層讓你幾乎不需要關(guān)心求解器底層的接口細(xì)節(jié)。寫約束就是一個(gè)個(gè)直觀的公式比如Constraints [Constraints, Pgen Pmin];這種寫法跟數(shù)學(xué)表達(dá)式幾乎沒有區(qū)別。對于做電力系統(tǒng)調(diào)度研究的同學(xué)來說Yalmip幾乎是最短路徑。其次是Cplex求解器的Matlab接口相當(dāng)成熟MILP求解能力非常穩(wěn)定。電力系統(tǒng)調(diào)度問題本質(zhì)上是帶0-1變量的混合整數(shù)線性規(guī)劃機(jī)組啟停、儲(chǔ)熱罐充放狀態(tài)是最典型的0-1決策變量。Cplex處理這類問題的速度值得信賴我用它跑過24時(shí)段、幾十臺(tái)機(jī)組的算例完全不擔(dān)心性能。另外Matlab的可視化能力和矩陣運(yùn)算能力也省了很多事。調(diào)度結(jié)果要畫機(jī)組出力曲線、風(fēng)電出力曲線、SOC曲線、碳排放量曲線Matlab幾行代碼就搞定數(shù)據(jù)分析和結(jié)果診斷的效率非常高。2. 低碳經(jīng)濟(jì)調(diào)度模型的關(guān)鍵建模細(xì)節(jié)2.1 目標(biāo)函數(shù)的結(jié)構(gòu)設(shè)計(jì)目標(biāo)函數(shù)是調(diào)度的指揮棒寫得好不好決定模型行為是否符合預(yù)期。這個(gè)項(xiàng)目的目標(biāo)函數(shù)有四個(gè)關(guān)鍵部分。第一項(xiàng)是煤耗成本。機(jī)組煤耗量和出力基本呈二次函數(shù)關(guān)系但Cplex只能處理線性和二次規(guī)劃MILP要求目標(biāo)函數(shù)是線性的所以我們對二次煤耗曲線做分段線性化近似。實(shí)際操作中我常用F a*P^2 b*P c的形式將P的區(qū)間切分成若干段每段用線性函數(shù)代替分段越多精度越高但變量也越多。10段以內(nèi)精度已經(jīng)完全夠用。第二項(xiàng)是碳交易成本。COST_carbon P_carbon * (E_actual - E_allowance)其中E_actual是機(jī)組實(shí)際碳排放量E_allowance是分配的配額P_carbon是碳價(jià)。如果實(shí)際排放低于配額這項(xiàng)成本為負(fù)相當(dāng)于系統(tǒng)通過賣碳獲得收益。碳價(jià)的取值對調(diào)度結(jié)果影響很大我在實(shí)驗(yàn)中常用的基準(zhǔn)范圍是30~80元/噸靈敏度分析時(shí)在這個(gè)區(qū)間內(nèi)掃值觀察機(jī)組出力和風(fēng)電消納的變化趨勢。第三項(xiàng)是棄風(fēng)懲罰成本。風(fēng)電的邊際成本幾乎為零調(diào)度中原則上應(yīng)全額消納但實(shí)際受限于系統(tǒng)調(diào)峰能力和線路傳輸能力必須棄掉一部分。給棄風(fēng)設(shè)置懲罰成本本質(zhì)上是給少棄風(fēng)一個(gè)優(yōu)先級讓模型在多個(gè)可行方案中優(yōu)先選擇風(fēng)電消納更多的方案。懲罰系數(shù)的設(shè)置需要遠(yuǎn)高于煤耗和碳成本單價(jià)否則模型會(huì)把棄風(fēng)當(dāng)作理性的最優(yōu)解。第四項(xiàng)是儲(chǔ)熱系統(tǒng)的運(yùn)行成本這部分相對較小主要是儲(chǔ)放熱過程中的損耗、維護(hù)成本等。如果暫不考慮這些也可以設(shè)為0讓模型自然地為了降低煤耗和碳排而使用儲(chǔ)熱。2.2 儲(chǔ)熱系統(tǒng)建模儲(chǔ)熱罐的建模是整個(gè)模型的核心也是這個(gè)項(xiàng)目和普通經(jīng)濟(jì)調(diào)度模型最大的區(qū)別所在。儲(chǔ)熱罐本質(zhì)上是能量在時(shí)間維度上的移動(dòng)裝置。它不產(chǎn)生能量只扮演時(shí)間搬運(yùn)工的角色。模型里我用一個(gè)狀態(tài)變量SOC(t)表示t時(shí)段結(jié)束時(shí)儲(chǔ)熱罐的儲(chǔ)熱量單位MWh它的動(dòng)態(tài)方程非常簡單SOC(t) SOC(t-1) eta_charge * Q_ch(t) - Q_dis(t) / eta_discharge - Q_loss(t)其中Q_ch(t)是t時(shí)段的充熱功率即機(jī)組向儲(chǔ)熱罐注入的熱功率Q_dis(t)是放熱功率即儲(chǔ)熱罐向外輸出供熱的熱功率eta_charge和eta_discharge分別是充放熱效率一般取0.9左右。注意放熱等式里除法方向不能搞反因?yàn)榉艧釙r(shí)儲(chǔ)熱罐輸出給用戶的是有效熱量罐內(nèi)實(shí)際消耗的熱量會(huì)大于輸出熱量。約束方面儲(chǔ)熱罐有三個(gè)關(guān)鍵邊界條件儲(chǔ)熱量上下限SOC_min SOC(t) SOC_max充放熱功率上下限0 Q_ch(t) Q_ch_max、0 Q_dis(t) Q_dis_max以及調(diào)度周期始末儲(chǔ)熱量相等的要求保證一個(gè)調(diào)度周期內(nèi)儲(chǔ)能狀態(tài)守恒。這里有個(gè)非常容易踩坑的點(diǎn)充熱和放熱不能同時(shí)進(jìn)行。物理上當(dāng)然可以同時(shí)充放但無意義的對充對放會(huì)浪費(fèi)能量并且讓結(jié)果變得不經(jīng)濟(jì)。要建模這個(gè)約束需要引入0-1變量b寫成0 Q_ch(t) b(t) * Q_ch_max 0 Q_dis(t) (1-b(t)) * Q_dis_max這才是典型的MILP建模手法。如果沒有這對互補(bǔ)約束模型可能給出同時(shí)充放熱的偽最優(yōu)解。2.3 火電機(jī)組運(yùn)行約束火電部分的約束分兩類一類是傳統(tǒng)機(jī)組約束一類是熱電聯(lián)產(chǎn)機(jī)組約束。傳統(tǒng)凝汽式機(jī)組的約束比較基礎(chǔ)出力上下限約束P_min P(t) P_max、爬坡約束-DR P(t) - P(t-1) UR、最小啟停時(shí)間約束。其中爬坡約束在含風(fēng)電的調(diào)度模型中尤其重要風(fēng)電出力的波動(dòng)性直接考驗(yàn)機(jī)組的爬坡能力。熱電聯(lián)產(chǎn)機(jī)組的約束需要格外注意。對抽凝式機(jī)組電出力P和熱出力H的可行域是一個(gè)多邊形的凸包并不是簡單的矩形。典型的可行域約束如下P_min 0.5 * H(t) P(t) P_max - 0.1 * H(t) H_min H(t) H_max第一行是關(guān)鍵——隨著熱出力增加電出力可行區(qū)間會(huì)整體收窄。這就是以熱定電數(shù)學(xué)化的核心表達(dá)。加裝儲(chǔ)熱罐之后機(jī)組的實(shí)際熱出力 H(t) 會(huì)被拆分為兩部分直供熱出力 H_direct(t) 和儲(chǔ)熱充熱 H_storage(t)即H(t) H_direct(t) H_storage(t)。而系統(tǒng)滿足的熱負(fù)荷則是H_direct(t) H_discharge(t) H_load(t)。這個(gè)拆分讓熱負(fù)荷不再直接鎖定機(jī)組的電出力當(dāng)風(fēng)電大發(fā)需要機(jī)組壓電出力時(shí)可以讓儲(chǔ)熱罐承擔(dān)更多放熱任務(wù)機(jī)組熱出力降低電出力可行域順勢擴(kuò)大風(fēng)電消納空間自然打開。2.4 碳配額與碳交易建模碳交易建模要注意兩個(gè)細(xì)節(jié)一個(gè)是配額的計(jì)算方式一個(gè)是碳成本如何進(jìn)入目標(biāo)函數(shù)。配額的分配方式我采用的是行業(yè)基準(zhǔn)線法即對每臺(tái)機(jī)組設(shè)定一個(gè)單位電量的碳排放基準(zhǔn)值配額等于基準(zhǔn)值乘以發(fā)電量E_allowance E_base * P(t)實(shí)際碳排放量的計(jì)算基本是線性的煤耗量乘以排放系數(shù)再考慮機(jī)組運(yùn)行效率。由于煤耗量本身就是出力的函數(shù)實(shí)際排放量也可以表達(dá)為出力的線性函數(shù)。當(dāng)實(shí)際排放量大于配額時(shí)系統(tǒng)需要在碳市場購買差額小于配額時(shí)多余的配額可以出售。不管哪種情況碳成本都是線性的放進(jìn)目標(biāo)函數(shù)沒有任何問題。我個(gè)人在實(shí)驗(yàn)中更關(guān)注的是碳價(jià)變化對調(diào)度結(jié)構(gòu)的敏感性——碳價(jià)提高時(shí)系統(tǒng)傾向于降低高碳機(jī)組出力、增加低碳機(jī)組出力和風(fēng)電消納、加大儲(chǔ)熱罐利用以優(yōu)化機(jī)組運(yùn)行點(diǎn)。這套邏輯在靈敏度分析中可以作為檢驗(yàn)?zāi)P驼_性的一個(gè)重要依據(jù)。3. Matlab實(shí)現(xiàn)過程與代碼架構(gòu)解析3.1 程序整體框架拿到項(xiàng)目第一步不是急著敲代碼而是先把程序架構(gòu)想清楚。市面上的電力調(diào)度Matlab代碼五花八門但好代碼的共性是一致的數(shù)據(jù)結(jié)構(gòu)清晰、模型與求解分離、結(jié)果輸出規(guī)范。我采用的框架分為五個(gè)模塊數(shù)據(jù)輸入模塊機(jī)組參數(shù)、負(fù)荷曲線、風(fēng)電出力曲線、熱負(fù)荷曲線、碳價(jià)、配額基準(zhǔn)、儲(chǔ)熱罐參數(shù)全部集中在數(shù)據(jù)文件里參數(shù)預(yù)處理模塊把原始數(shù)據(jù)整理成Yalmip建模需要的格式比如時(shí)序數(shù)據(jù)、機(jī)組索引、分段線性化的斷點(diǎn)坐標(biāo)模型構(gòu)建模塊定義決策變量、目標(biāo)函數(shù)、約束條件求解與結(jié)果提取模塊調(diào)用Cplex求解檢查求解狀態(tài)提取各變量結(jié)果結(jié)果分析與可視化模塊繪制出力曲線、SOC曲線、碳排放柱狀圖等。模塊之間盡量解耦數(shù)據(jù)參數(shù)在預(yù)處理時(shí)統(tǒng)一校驗(yàn)避免后面模型構(gòu)建時(shí)因?yàn)榫S度不匹配來回返工。3.2 Yalmip變量定義與約束構(gòu)建定義變量是整個(gè)建模環(huán)節(jié)最核心的一步。Yalmip里需要區(qū)分連續(xù)變量和二進(jìn)制變量。連續(xù)變量機(jī)組電出力、熱出力、儲(chǔ)熱罐充放熱功率、SOC、風(fēng)電實(shí)際出力或者棄風(fēng)量、碳排放量等。二進(jìn)制變量機(jī)組啟停狀態(tài)、儲(chǔ)熱罐充放熱狀態(tài)。舉個(gè)例子定義24時(shí)段、N臺(tái)機(jī)組的連續(xù)變量矩陣Pgen sdpvar(N, 24, full); % 電出力 Hgen sdpvar(N, 24, full); % 熱出力 Qch sdpvar(N, 24, full); % 充熱功率 Qdis sdpvar(N, 24, full); % 放熱功率 SOC sdpvar(N, 24, full); % 儲(chǔ)熱罐熱儲(chǔ)狀態(tài) Pw sdpvar(1, 24, full); % 風(fēng)電實(shí)際出力 delta binvar(N, 24, full); % 儲(chǔ)熱充放互斥狀態(tài)注意sdpvar第三個(gè)參數(shù)寫成full明確告訴Yalmip這是普通稠密變量矩陣。如果不寫Yalmip默認(rèn)建立稀疏結(jié)構(gòu)后續(xù)索引時(shí)報(bào)錯(cuò)會(huì)讓人抓狂。約束的構(gòu)建遵循先等式后不等式、先單機(jī)后系統(tǒng)的順序方便排錯(cuò)。系統(tǒng)功率平衡約束一定不能遺漏它連接了電源和負(fù)荷Constraints [Constraints, sum(Pgen,1) Pw P_load(1:24)];這里的sum(Pgen,1)是在時(shí)間維度上對所有機(jī)組出力求和得到每個(gè)時(shí)段的總電出力。熱功率平衡類似Constraints [Constraints, sum(Hgen,1) - sum(Qch,1) sum(Qdis,1) H_load(1:24)];時(shí)序索引要小心P_load如果是從Excel讀進(jìn)來的行向量維度是1×24和sum(Pgen,1)維度一致但如果你讀進(jìn)來的是24×1的列向量兩個(gè)向量維度就錯(cuò)開了Yalmip會(huì)直接報(bào)錯(cuò)或者隱式廣播最后結(jié)果完全不對。3.3 核心約束的Yalmip寫法儲(chǔ)熱罐SOC動(dòng)態(tài)方程在Yalmip里寫起來非常直觀循環(huán)上每個(gè)時(shí)段for t 2:24 Constraints [Constraints, SOC(:,t) SOC(:,t-1) eta_ch * Qch(:,t) - Qdis(:,t)/eta_dis]; end Constraints [Constraints, SOC(:,1) SOC_init eta_ch * Qch(:,1) - Qdis(:,1)/eta_dis];注意SOC初值SOC_init的設(shè)定很關(guān)鍵。如果把初值設(shè)得太低系統(tǒng)第一時(shí)段會(huì)約束過緊設(shè)得太高末時(shí)段可能被迫多放熱。更合理的做法是設(shè)置周期始末SOC相等約束Constraints [Constraints, SOC(:,24) SOC(:,1)];同時(shí)為了避免第一時(shí)段就不可行可以適當(dāng)放寬SOC初值范圍允許它在一定區(qū)間內(nèi)自由選擇。充放熱互斥約束用二進(jìn)制變量實(shí)現(xiàn)Constraints [Constraints, Qch delta * Qch_max]; Constraints [Constraints, Qdis (1-delta) * Qdis_max];注意這里delta是N×24的矩陣每臺(tái)機(jī)組每個(gè)時(shí)段都有一個(gè)獨(dú)立的0-1變量。如果你想讓整個(gè)系統(tǒng)共享一個(gè)儲(chǔ)熱罐比如只對一臺(tái)參考機(jī)組做儲(chǔ)熱改造那么delta就是1×24的向量索引方式對應(yīng)調(diào)整?;痣姍C(jī)組的熱電耦合可行域約束也是一組不等式Constraints [Constraints, Pgen P_min 0.5 * Hgen]; Constraints [Constraints, Pgen P_max - 0.1 * Hgen];如果機(jī)組類型不一致這些系數(shù)需要分別配置。我在數(shù)據(jù)輸入時(shí)用一個(gè)2×n的矩陣存每臺(tái)機(jī)組的熱電比上下限而不是寫死在公式里方便后續(xù)換算例改參數(shù)。3.4 求解器配置與結(jié)果提取Yalmip調(diào)用Cplex的核心代碼非常簡潔ops sdpsettings(solver, cplex, verbose, 2, showprogress, 1); ops.cplex.mip.tolerances.mipgap 0.0001; ops.cplex.mip.tolerances.integrality 1e-06; optimize(Constraints, Objective, ops);幾個(gè)參數(shù)值得展開說。mipgap是MILP的停機(jī)判據(jù)默認(rèn)0.0001已經(jīng)夠用追求快速得到工程可行解可以放寬到0.001求解時(shí)間會(huì)明顯下降。integrality是0-1變量整數(shù)容差默認(rèn)1e-06即可調(diào)大了可能導(dǎo)致結(jié)果中出現(xiàn)明顯的偽0-1數(shù)值。求解完成之后不要急著畫圖先檢查optimize的返回值和Yalmip的求解狀態(tài)if optimize(Constraints, Objective, ops) 0 disp(求解成功); Pgen_value value(Pgen); SOC_value value(SOC); else disp(求解失敗); disp(optimize(Constraints, Objective, ops)); end初學(xué)者最容易犯的錯(cuò)就是不管求解狀態(tài)直接畫圖。如果問題是不可行的value(Pgen)返回的是NaN圖倒是畫出來了全圖都是洞根本沒法用。而且這種情況下最怕的是你以為是模型正確但實(shí)際上約束已經(jīng)被Yalmip悄悄修改或者松弛掉了。4. 實(shí)際調(diào)試過程中的常見問題與排查心得4.1 求解器報(bào)Infeasible problem怎么辦這是做MILP調(diào)度模型最常見的噩夢幾乎每個(gè)入門的同學(xué)都會(huì)碰到。維度、約束、參數(shù)有一處不對模型就可能直接變成不可行。我自己的排查順序是從松到緊、從內(nèi)到外。第一步先做無約束測試。把目標(biāo)函數(shù)設(shè)成常數(shù)去掉儲(chǔ)熱罐SOC的動(dòng)態(tài)約束只保留所有變量的上下限約束。如果這樣還不可行一定是變量的邊界條件沖突。最常見的原因是SOC初值設(shè)置和容量邊界有沖突或者某臺(tái)機(jī)組的出力范圍下限高于系統(tǒng)負(fù)荷任何一個(gè)時(shí)段功率平衡都無法滿足。第二步加上功率平衡逐步恢復(fù)約束。每次只加一組約束求解一次直到問題變成不可行就在最近一次加入的約束里找沖突。這個(gè)方法雖然繁瑣但定位問題非常精準(zhǔn)。不要一次把所有約束都灌進(jìn)去然后把報(bào)錯(cuò)信息發(fā)給別人看那排查起來太痛苦了。第三步檢查儲(chǔ)熱約束的時(shí)序耦合。儲(chǔ)熱SOC方程天然帶有從初始時(shí)段到末尾的累計(jì)效應(yīng)任何一端的能量不平衡都會(huì)在末端集中爆發(fā)。比如初始SOC設(shè)了80%24小時(shí)內(nèi)儲(chǔ)熱罐用掉的熱量超過總?cè)萘孔詈髸r(shí)段SOC會(huì)突破下限。這種情況下要檢查初值選擇或者確認(rèn)始末SOC約束是否合理。第四步檢查配額的歸屬和符號(hào)。碳配額如果設(shè)置不當(dāng)會(huì)導(dǎo)致目標(biāo)函數(shù)為負(fù)但約束不可行。雖然不常見但我在測試不同碳價(jià)時(shí)確實(shí)遇到過因?yàn)榻貓D問題導(dǎo)致約束范圍被排擠的情況。4.2 求解時(shí)間太長怎么優(yōu)化MILP求解時(shí)間跟二進(jìn)制變量的數(shù)量以及約束的稠密度高度正相關(guān)。24時(shí)段、每時(shí)段多臺(tái)機(jī)組、每臺(tái)機(jī)組又有啟停和儲(chǔ)熱狀態(tài)兩個(gè)0-1變量這種配置的模型規(guī)模非常可觀。我實(shí)測的經(jīng)驗(yàn)是先跑一個(gè)小規(guī)模算例驗(yàn)證模型邏輯正確再從6節(jié)點(diǎn)系統(tǒng)逐步擴(kuò)大到幾十臺(tái)機(jī)組。不要一上來就跑全規(guī)模算例等模型邏輯完全通了再放開規(guī)模。如果大規(guī)模算例確實(shí)求解太慢有幾個(gè)實(shí)用技巧問題本質(zhì)上是凸MILP可以通過設(shè)置MIP gap閾值提前終止比如設(shè)置mipgap0.005得到的次優(yōu)解和最優(yōu)解的偏差在0.5%以內(nèi)對調(diào)度研究完全夠用把一些布爾狀態(tài)轉(zhuǎn)化為連續(xù)區(qū)間約束比如儲(chǔ)熱充放互斥如果不影響方案質(zhì)量可以嘗試去掉0-1變量只靠目標(biāo)函數(shù)的經(jīng)濟(jì)性引導(dǎo)熱負(fù)荷曲線和電負(fù)荷曲線的相關(guān)性如果比較強(qiáng)可以適當(dāng)合并時(shí)段從24時(shí)段合并為12時(shí)段進(jìn)行預(yù)測試靈敏度分析階段再細(xì)分。4.3 常見問題速查表現(xiàn)象可能原因排查方法求解狀態(tài)InfeasibleSOC初值和末值沖突去掉始末SOC約束測試模型是否可解求解狀態(tài)Infeasible功率平衡約束和負(fù)荷曲線不匹配檢查P_load維度、單位是否轉(zhuǎn)化正確結(jié)果中充放熱同時(shí)非零未添加0-1互斥約束引入binvar并添加互補(bǔ)約束風(fēng)電出力曲線幾乎為0棄風(fēng)懲罰系數(shù)設(shè)置過低增大棄風(fēng)懲罰系數(shù)到煤耗成本的10倍以上儲(chǔ)熱罐SOC長期保持上限或下限儲(chǔ)熱罐容量過小或熱負(fù)荷缺乏波動(dòng)性調(diào)整儲(chǔ)熱罐容量檢查熱負(fù)荷曲線碳交易成本對結(jié)果無影響碳價(jià)設(shè)置過低或配額過寬松提高碳價(jià)做靈敏度分析結(jié)果嚴(yán)重不連續(xù)機(jī)組啟停0-1變量數(shù)量過少增加時(shí)段數(shù)或給啟停變量添加過渡約束求解時(shí)間過長0-1變量過多、約束矩陣過密設(shè)置mipgap、削減時(shí)段數(shù)、變量降維4.4 結(jié)果合理性校驗(yàn)的三個(gè)技巧模型能跑通只是第一步結(jié)果合不合理才是真正見功底的地方。分享三個(gè)我在實(shí)踐中反復(fù)使用的校驗(yàn)技巧。技巧一觀察儲(chǔ)熱罐SOC曲線的形態(tài)。正常的SOC曲線應(yīng)該是平滑變化的類似于電池的充放電曲線不會(huì)出現(xiàn)鋸齒狀劇烈波動(dòng)。如果SOC曲線在相鄰時(shí)段劇烈波動(dòng)說明充放熱功率上下限設(shè)置不當(dāng)或者互斥約束未生效。這個(gè)檢查能在30秒內(nèi)發(fā)現(xiàn)大量代碼Bug。技巧二對比改造前后的風(fēng)電消納量。同一個(gè)風(fēng)電出力場景下有儲(chǔ)熱改造的系統(tǒng)應(yīng)該比無儲(chǔ)熱的系統(tǒng)消納更多風(fēng)電。如果兩個(gè)方案的棄風(fēng)量完全一樣大概率是儲(chǔ)熱約束沒生效或者熱負(fù)荷太低導(dǎo)致儲(chǔ)熱罐沒有用武之地。我常用的檢查方法是分別跑有儲(chǔ)熱和無儲(chǔ)熱兩版模型對比棄風(fēng)電量和碳排總量。技巧三檢查碳排放配額和實(shí)際排放的相對關(guān)系。合理情況下系統(tǒng)會(huì)傾向于讓部分機(jī)組處于配額基準(zhǔn)附近、部分機(jī)組超排購買配額、部分機(jī)組減排出售配額。如果所有機(jī)組都遠(yuǎn)低于配額說明碳價(jià)太低減排沒有激勵(lì)如果都遠(yuǎn)高于配額說明碳價(jià)設(shè)置過高導(dǎo)致系統(tǒng)過度反應(yīng)。5. 參數(shù)調(diào)試與場景擴(kuò)展的做法5.1 碳價(jià)的靈敏度測試碳價(jià)是整個(gè)低碳調(diào)度模型中最值得做的靈敏度參數(shù)。我通常的做法是設(shè)定一組梯度比如0、30、50、80、120元/噸分別求解并記錄風(fēng)電消納率、系統(tǒng)總煤耗量、碳排放總量、儲(chǔ)熱罐利用率這幾個(gè)關(guān)鍵指標(biāo)。從實(shí)測趨勢來看碳價(jià)從0升到30元/噸時(shí)系統(tǒng)碳排放總量下降最明顯因?yàn)橄鄬Φ统杀镜臏p排手段儲(chǔ)熱利用、負(fù)荷轉(zhuǎn)移、機(jī)組間出力重新分配在這個(gè)區(qū)間內(nèi)被激活。碳價(jià)繼續(xù)升高到80元/噸以上后減排效果增速放緩說明剩余減排空間需要靠更大規(guī)模的改造比如機(jī)組靈活性改造、新增儲(chǔ)能才能實(shí)現(xiàn)。這種S型曲線是符合預(yù)期的如果測試結(jié)果沒有這個(gè)趨勢就要回頭檢查模型是否真的把碳成本傳達(dá)到了調(diào)度決策。5.2 兩個(gè)可以擴(kuò)展的方向如果你的課題想做深一點(diǎn)以下幾個(gè)方向在現(xiàn)有框架上擴(kuò)展非常順滑。一是多場景魯棒性分析。當(dāng)前模型用的是確定性風(fēng)電出力和負(fù)荷曲線。實(shí)際中風(fēng)電出力預(yù)測必然有誤差可以引入場景生成和縮減技術(shù)把多個(gè)風(fēng)光出力場景加權(quán)后放入目標(biāo)函數(shù)或者采用魯棒優(yōu)化的思路讓調(diào)度方案在最壞風(fēng)電場景下依然可行。Yalmip對這類擴(kuò)展有很好的支持只需要把變量維度從單場景擴(kuò)展到多場景再求和平均即可。二是系統(tǒng)級儲(chǔ)熱容量規(guī)劃。當(dāng)前模型中儲(chǔ)熱罐參數(shù)是給定的能不能反過來把儲(chǔ)熱罐容量也作為決策變量目標(biāo)函數(shù)里加上儲(chǔ)熱改造的投資成本模型就變成了儲(chǔ)熱容量優(yōu)化配置調(diào)度運(yùn)行兩層決策問題。雖然問題規(guī)模變大但本質(zhì)上還是一個(gè)MILPCplex照樣能解。這是很多期刊論文慣用的擴(kuò)展思路適合在課題中后期往這個(gè)方向深入。6. 一些補(bǔ)充經(jīng)驗(yàn)和最終建議最后聊幾個(gè)我在這類項(xiàng)目上積累的實(shí)操細(xì)節(jié)都是踩過坑之后總結(jié)出來的。第一個(gè)是關(guān)于熱負(fù)荷曲線數(shù)據(jù)的處理。很多公開數(shù)據(jù)集里熱負(fù)荷的數(shù)據(jù)精度不高甚至有缺失值。做調(diào)度之前一定要先把熱負(fù)荷曲線可視化一遍看看是否有明顯的不合理跳變。如果熱負(fù)荷出現(xiàn)尖峰但儲(chǔ)熱罐放熱上限不夠模型的調(diào)度結(jié)果無論怎么調(diào)都會(huì)在對應(yīng)時(shí)段出現(xiàn)功率不平衡最后表現(xiàn)為不可行。處理辦法是適當(dāng)平滑數(shù)據(jù)或者調(diào)大儲(chǔ)熱罐功率上限而不是強(qiáng)行更改約束。第二個(gè)是關(guān)于Matlab內(nèi)存和計(jì)算環(huán)境的建議。大規(guī)模MILP求解時(shí)Cplex占用內(nèi)存非常大。我遇到過求解過程中Matlab直接卡死的情況后來排查發(fā)現(xiàn)是循環(huán)里不停地往約束集里添加約束導(dǎo)致Yalmip內(nèi)部數(shù)據(jù)結(jié)構(gòu)反復(fù)重建。解決辦法是在建模前預(yù)先分配Constraints變量或者每加完一段約束就調(diào)用optimize驗(yàn)證而不是把所有約束堆到最后一次性求解。第三個(gè)是關(guān)于結(jié)果可視化的細(xì)節(jié)。對應(yīng)的調(diào)度結(jié)果除了畫常規(guī)的電源出力堆疊圖之外強(qiáng)烈建議再畫一張熱力系統(tǒng)平衡圖把每個(gè)時(shí)段的直供熱量、儲(chǔ)熱充熱量、儲(chǔ)熱放熱量、熱負(fù)荷量四條曲線畫在一起一眼就能看到儲(chǔ)熱罐在哪些時(shí)段充熱、哪些時(shí)段放熱、什么時(shí)候在搬移熱量。這張圖對于論文寫作和答辯展示的說服力非常強(qiáng)效果遠(yuǎn)超一張密密麻麻的出力表格。如果你正在做這個(gè)方向我的建議是不要急著追求大算例、復(fù)雜模型先把一個(gè)簡單的場景跑通、把結(jié)果校驗(yàn)清楚理解清楚儲(chǔ)熱改造到底給調(diào)度模型帶來了什么樣的自由度變化再逐步往里加細(xì)節(jié)。跟儲(chǔ)熱相關(guān)的課題不管最后是寫畢業(yè)論文還是發(fā)期刊核心賣點(diǎn)都在于熱-電-碳三者之間的耦合關(guān)系。把這個(gè)關(guān)系表達(dá)清楚模型的框架就立住了剩下的都是工程實(shí)現(xiàn)層面的問題。