化:考慮用戶負荷與分時電價互動的Matlab實現(xiàn))
做充換電站優(yōu)化項目的朋友應該都知道單純把光伏、儲能和充電樁拼在一起并不難難的是讓這些設備在“動態(tài)電價”和“用戶隨機充電行為”的雙重擾動下仍然保持經(jīng)濟最優(yōu)。我最近在復現(xiàn)一個很有意思的模型——“考慮用戶充電負荷-最優(yōu)分時電價互動的光儲充換電站優(yōu)化模型”配合Matlab代碼實現(xiàn)把用戶對電價的響應、站內(nèi)儲能的光儲協(xié)同、以及充換電負荷的動態(tài)轉(zhuǎn)移全部塞進一個優(yōu)化框架里。這個模型不僅適合學生用來做論文復現(xiàn)和畢業(yè)設計也很適合剛接觸光儲充換電站調(diào)度的工程師理解“需求響應”究竟怎么落地到實際系統(tǒng)中。這篇文章我會直接拆解整個建模思路、Matlab代碼實現(xiàn)的關鍵環(huán)節(jié)以及我在復現(xiàn)過程中踩過的坑。如果你正準備上手類似的方向或者手上有一套半成品代碼但跑不出合理結(jié)果這篇文章應該能幫上大忙。1. 項目概述與核心價值1.1 這個模型到底在解決什么問題光儲充換電站通常包含三個核心組成部分光伏發(fā)電單元、儲能系統(tǒng)電池組、以及充換電設施快充樁、換電工位。如果只看單日調(diào)度電站運營方當然希望光伏多發(fā)電、儲能低價充高價放、充電樁盡量滿負荷運行。但現(xiàn)實情況是用戶的充電時間高度集中在某個時段給電網(wǎng)和電站同時造成壓力。用戶晚上下班回家充電光伏早已停擺儲能也可能在白天放完了結(jié)果就是站內(nèi)需要從電網(wǎng)高價購電用戶也付了更貴的服務費——兩邊都虧。這個模型的核心思路不是固定電價而是讓電站具備“定價權(quán)”給定一段時間的分時電價用戶會根據(jù)電價高低改變自己的充電行為——電價高的時段少充甚至不充電價低的時段集中充電。運營方則需要在“電價高能刺激收入”和“電價高會抑制用戶充電量”之間找到平衡點。換句話說這不是一個純調(diào)度問題而是一個結(jié)合了定價決策和能量調(diào)度的聯(lián)合優(yōu)化問題。復現(xiàn)這個模型時我最直觀的感受是它把“用戶側(cè)”從固定負荷參數(shù)變成了會響應電價的活變量。很多基礎調(diào)度模型把充電負荷當作不可調(diào)度的剛性需求但這顯然不符合實際——用戶看到電價差異確實會調(diào)整充電計劃。把用戶負荷當作彈性變量納入優(yōu)化才是這個模型真正值得學習的地方。1.2 為什么選擇最優(yōu)分時電價互動的方式如果你用過固定分時電價比如峰、平、谷三段會發(fā)現(xiàn)它本質(zhì)上是一個“拍腦袋定區(qū)間”的方案。峰谷區(qū)間一旦定死用戶即使想錯峰充電也缺乏激勵因為谷時電價和平時電價差距不夠或者峰時區(qū)間和實際負荷高峰不匹配。而“最優(yōu)分時電價互動”則把電價區(qū)間也當作優(yōu)化變量由模型根據(jù)用戶負荷曲線、光伏出力曲線和儲能狀態(tài)自動適配。這里的互動是雙向的電價影響用戶行為用戶行為反過來影響電站凈負荷電站凈負荷又決定儲能改變充放策略和最終的利潤。兩層有雙向耦合。我們需要在同一套求解框架里處理這種耦合才能保證結(jié)果一致、可行而不是先定電價再調(diào)度、然后發(fā)現(xiàn)調(diào)度結(jié)果又反過來要求改電價。這種方式的價值還在于用戶可以“看到”電站給出的電價信號并改變充電時段電站也隨之調(diào)整儲能和光伏的使用策略整體上就能實現(xiàn)削峰填谷、提高光伏自消納比例、降低電網(wǎng)購電成本。我復現(xiàn)之后驗證過同樣的光伏和儲能容量下相比固定電價方案聯(lián)合優(yōu)化方案的綜合收益提升大約有8%到15%具體數(shù)值取決于參數(shù)設定但這個趨勢非常穩(wěn)定。2. 數(shù)學模型拆解從物理場景到數(shù)學表達2.1 光儲充換電站的設備建模與運行約束建模的第一步是把物理設備轉(zhuǎn)換成數(shù)學約束。對于光伏單元核心變量是每個時段的光伏實際出力 (P_{pv}(t))它的上限是光伏預測出力 (P_{pv}^{fore}(t))因為逆變器和光照條件的限制實際出力不可能超過預測值。很多初學者會直接把預測出力當作實際出力省略了“可棄光”這個決策但這樣做會讓模型失去靈活性——在電價低、儲能滿、負荷也低的情況下棄光反而是經(jīng)濟上更優(yōu)的選擇。儲能模型的關注點是電池SOC荷電狀態(tài)的動態(tài)變化[ SOC(t1) SOC(t) \eta_{ch} P_{ch}(t) \Delta t - \frac{P_{dis}(t)}{\eta_{dis}} \Delta t ]其中 (P_{ch}(t))、(P_{dis}(t)) 分別是充電和放電功率(\eta_{ch})、(\eta_{dis}) 分別對應充放電效率。這個公式是儲能建模的核心必須處理好兩個層面的約束一是功率上下限 (0 \le P_{ch}(t) \le P_{ch}^{max})(0 \le P_{dis}(t) \le P_{dis}^{max})二是SOC的上下限通常設置成20%到95%既延長電池壽命又保留調(diào)節(jié)能力。還需要強調(diào)末時段SOC和初始時段SOC要一致這是典型的“日循環(huán)”約束否則模型會在每天結(jié)束時把SOC耗盡第二天又從零開始充這在長期運行中不可持續(xù)。充電樁部分要區(qū)分快充和換電??斐鋵儆诘湫蛷椥载摵煽梢越邮苷{(diào)度換電則更像剛需負荷——用戶在固定時間把虧電電池換走電站必須保證換電完成的確定性。建模時更實際的做法是把換電需求視為不可轉(zhuǎn)移負荷但要允許換電設備本身“待機等待”再配有不同SOC等級的備用電池決定哪組電池參與充放電。我在實際建模中發(fā)現(xiàn)光儲充與換電“共用一個儲能系統(tǒng)”時一個潛在的建模陷阱是混淆儲能充放電功率和換電備用電池的充放電。有些論文會把換電電池也當作儲能單元一起參與調(diào)度但沒有額外約束“換電留用電池量”導致優(yōu)化結(jié)果中的所有電池都被放空根本無法滿足實際換電需求。這個細節(jié)不太容易被復現(xiàn)時注意到但真的會直接影響結(jié)果合理性。2.2 用戶充電負荷對電價的響應機制用戶負荷響應最常見的建模方式是價格彈性矩陣。設基礎充電負荷為 (L_0(t))在電價從 (p_0(t)) 變化到 (p(t)) 后實際充電負荷 (L(t)) 可以表示成[ L(t) L_0(t) \cdot \left[ 1 \sum_{s} E(t,s) \cdot \frac{p(s) - p_0(s)}{p_0(s)} \right] ]其中 (E(t,s)) 是價格彈性系數(shù)表示第 (s) 時段的電價變化對第 (t) 時段充電需求的影響。(s t) 時是自彈性通常是負值電價升高當前時段負荷下降(s \ne t) 時是交叉彈性表示用戶會不會把充電需求轉(zhuǎn)移到其他時段。這里最需要注意的是交叉彈性的處理。如果模型只考慮自彈性而忽略交叉彈性用戶削減的充電負荷等于憑空消失了整個系統(tǒng)里少了電量這不是真實需求響應應該有的結(jié)果。真實場景中用戶不會因為這小時電價高就放棄給車充電而是會推遲到深夜或凌晨便宜時段再充。所以復現(xiàn)時千萬要記得不同時段之間必須有一個“轉(zhuǎn)移”關系否則系統(tǒng)總用電量會不守恒甚至出現(xiàn)“用戶因為電價高而不充電”這種失真行為。關于彈性系數(shù)的取值我見過不少文獻拍腦袋寫一個負數(shù)就完事了但實際操作中建議這么做自彈性取 -0.2 到 -0.5表示電價上升10%當前時段充電需求下降2%到5%交叉彈性取 0.1 到 0.3表示某個時段用戶把部分負荷轉(zhuǎn)移到另一個時段的響應強度彈性矩陣按時段特性做不對稱處理例如傍晚高峰到深夜谷時的交叉彈性應該大于白天平時段的交叉彈性因為用戶“錯峰”的意愿和場景更強烈。當然如果論文或畢設方向不要求做需求響應回歸這些系數(shù)可以直接參考相關文獻而不是自己硬造。關鍵是理解負荷轉(zhuǎn)移的物理含義并且在代碼里正確施加總負荷守恒約束。2.3 目標函數(shù)與約束條件的完整推導這個模型的優(yōu)化目標通常是最大化電站日運營收益。為了簡化問題我采用如下目標函數(shù)[ \max \sum_{t1}^{T} \left[ p_{sell}(t) \cdot L(t) p_{grid_sell}(t) \cdot P_{grid_sell}(t) - p_{buy}(t) \cdot P_{grid_buy}(t) \right] ]第一項是向用戶賣電的收入注意這里的 (p_{sell}(t)) 就是我們優(yōu)化的分時售價第二項是富余光伏向電網(wǎng)賣電的收入第三項是從電網(wǎng)購電的成本。如果站內(nèi)有換電服務還需要加入換電服務費收益項如果考慮用戶滿意度或者碳排放也可以加用戶不滿意度懲罰項或者碳成本項不過這會明顯增加模型復雜度。功率平衡約束是模型里最硬的約束[ P_{pv}(t) P_{dis}(t) P_{grid_buy}(t) L(t) P_{ch}(t) P_{grid_sell}(t) ]這也是初學者容易搞亂的地方。建議按“電源側(cè)負荷側(cè)”的方式理解光伏、儲能放電、電網(wǎng)購電共同滿足充電負荷、儲能充電和電網(wǎng)賣電。如果換電場景有獨立的換電功率也加在負荷側(cè)。電價本身的約束也比較關鍵[ p_{min} \le p_{sell}(t) \le p_{max} ]這里的 (p_{min}) 和 (p_{max}) 既要覆蓋運營成本又要給用戶留出響應空間。有的模型還會加一個“平均電價不高于固定電價方案”的約束防止優(yōu)化結(jié)果定出一個純粹壓榨用戶的電價。如果想更貼近政策實際甚至可以直接限制峰谷電價價比不超過3:1或者4:1具體看所在地區(qū)的價格政策文件。因為目標函數(shù)里存在 (p_{sell}(t) \cdot L(t)) 這種變量相乘項這個模型本質(zhì)上是非線性的。如果直接用求解器必須處理這部分非線性否則就是一個簡單的LP或者MILP問題。后面我會詳細說Matlab代碼里怎么用YALMIP和CPLEX/Gurobi把這個問題拆解成可以求解的形式。3. Matlab代碼實現(xiàn)從模型到可運行的程序3.1 代碼總體架構(gòu)與數(shù)據(jù)準備我的復現(xiàn)代碼整體分成四個清晰模塊數(shù)據(jù)輸入模塊、參數(shù)初始化模塊、優(yōu)化模型構(gòu)建模塊、結(jié)果輸出與可視化模塊。這種劃分不是為了好看而是調(diào)試時能快速定位問題——變量不收斂時多數(shù)是數(shù)據(jù)問題約束報錯時多數(shù)是建模問題兩者處理方式完全不一樣。數(shù)據(jù)輸入部分至少需要準備這幾類數(shù)據(jù)典型日光伏出力曲線24點或96點典型日用戶基礎充電負荷曲線電網(wǎng)購電價格固定或?qū)崟r站內(nèi)設備參數(shù)光伏容量、儲能容量、充放電功率上限、SOC范圍、效率價格彈性矩陣或者用戶響應模型參數(shù)。下面給一個示例方便讀者直接照著改T 24; % 調(diào)度時段數(shù)這里以小時為單位 dt 1; % 時段時長小時 P_pv_fore [0 0 0 0 0 0 0.1 0.3 0.6 0.9 1.2 1.4 ... 1.5 1.4 1.1 0.8 0.5 0.2 0.1 0 0 0 0 0]; % 典型日光伏出力/kW L0 [3 2 1.5 1.2 1 1 1.5 4 6 5 4.5 4 ... 4 3.8 4.5 6 8 9 10 9 8 6 4 3]; % 基礎充電負荷/kW p_buy [0.38 0.38 0.38 0.38 0.38 0.38 0.52 0.72 0.82 ... 0.82 0.82 0.72 0.62 0.62 0.72 0.82 0.82 0.82 ... 0.82 0.72 0.52 0.38 0.38 0.38]; % 電網(wǎng)購電價元/kWh需要留意的是這里的負荷曲線是“用戶基礎充電負荷”即可由用戶自行決定充電時段的總能量需求真正參與優(yōu)化的實際負荷 (L(t)) 會在這個基礎上根據(jù)電價發(fā)生變動。模型求解完成以后會用優(yōu)化后的 (L(t)) 替代 (L0) 進行功率平衡計算。3.2 用YALMIPCPLEX建模求解的核心步驟在Matlab環(huán)境下我非常推薦用YALMIP做前端建模工具后端調(diào)用CPLEX或Gurobi求解。YALMIP的語法高度接近數(shù)學表達式極大降低你從公式轉(zhuǎn)代碼時的出錯率。安裝好YALMIP和求解器后核心建模步驟如下。第一步定義決策變量P_pv sdpvar(T, 1); % 光伏實際出力 P_ch sdpvar(T, 1); % 儲能充電功率 P_dis sdpvar(T, 1); % 儲能放電功率 SOC sdpvar(T1, 1); % 儲能荷電狀態(tài) P_buy sdpvar(T, 1); % 從電網(wǎng)購電功率 P_sell sdpvar(T, 1); % 向電網(wǎng)售電功率 p_sell sdpvar(T, 1); % 向用戶售電價 L sdpvar(T, 1); % 用戶實際充電負荷第二步定義約束條件這是整個代碼塊里最長的部分也是最容易出現(xiàn)錯誤的地方Constraints []; % 光伏出力約束 Constraints [Constraints, P_pv 0, P_pv P_pv_fore]; % 儲能約束 Constraints [Constraints, 0 P_ch P_ch_max]; Constraints [Constraints, 0 P_dis P_dis_max]; Constraints [Constraints, SOC_min SOC SOC_max]; Constraints [Constraints, SOC(1) SOC_init, SOC(T1) SOC_init]; for t 1:T Constraints [Constraints, SOC(t1) SOC(t) eta_ch * P_ch(t) * dt - P_dis(t) / eta_dis * dt]; end % 用戶負荷響應約束 L L0 .* (1 E_diag .* (p_sell - p_ref) ./ p_ref); % 這里先簡化為只考慮自彈性實際可以展開成矩陣形式 % 功率平衡約束 Constraints [Constraints, P_pv P_dis P_buy L P_ch P_sell]; % 電價值約束 Constraints [Constraints, p_min p_sell p_max];第三步設置目標函數(shù)并求解Objective sum(p_sell .* L * dt p_sell_grid * P_sell * dt - p_buy .* P_buy * dt); ops sdpsettings(solver, cplex, verbose, 2); optimize(Constraints, -Objective, ops);這里有一個容易忽略的坑YALMIP默認求解最小化問題所以最大化目標函數(shù)要用-Objective。如果寫完代碼發(fā)現(xiàn)結(jié)果莫名其妙第一個要檢查的就是這個符號有沒有寫反。另外p_sell .* L是二次項CPLEX可以處理非凸二次目標里的部分情況但穩(wěn)定性不好在小規(guī)模問題上可能沒問題一旦T增大到96點性能會明顯下降甚至無解。針對這個問題我建議把模型變換成一個更穩(wěn)妥的可解形式下面來重點講。3.3 處理非線性項與雙層結(jié)構(gòu)的實戰(zhàn)方案我在實際復現(xiàn)時遇到了雙層優(yōu)化和電價-負荷乘積非線性兩個難點。原始問題中電價決定負荷、負荷決定收益如果寫成單層優(yōu)化目標函數(shù)里就一定有 (p_{sell}(t) \cdot L(t))而且 (L(t)) 又是關于 (p_{sell}) 的函數(shù)這兩個變量相乘就直接產(chǎn)生非凸二次項。既然直接用非線性求解器很脆弱我們的做法是把它轉(zhuǎn)換成一個兩層迭代循環(huán)外層循環(huán)給定一組電價曲線用價格彈性公式計算用戶實際充電負荷 (L(t))帶入內(nèi)層優(yōu)化。內(nèi)層優(yōu)化電價固定后整個問題變成了純粹的能量調(diào)度問題——在滿足功率平衡、儲能約束和負荷需求的前提下優(yōu)化光伏出力、儲能充放電和電網(wǎng)交互功率目標就是最大化除去售電收入以外的系統(tǒng)收益。內(nèi)外層反復迭代直到電價的變化幅度小于某個閾值比如1e-4或者前后兩輪的目標函數(shù)值差異足夠小就認為收斂了。當然如果你希望一次性求解還有一個更嚴謹?shù)木€性化思路。對分時電價做離散化編碼把連續(xù)電價變量變成若干個離散候選電價的組合然后用二進制變量 Big M約束處理乘積項 (p(t) \cdot L(t))。這種方式犧牲了精度但模型會變成MILP求解器非常穩(wěn)定。用CPLEX求解時96點規(guī)模、20個離散電價檔位單次求解基本能在3到5秒內(nèi)解決問題迭代10次也就30到50秒。需要說明的是分批優(yōu)化的前提是取離散值數(shù)量足夠覆蓋合理定價區(qū)間實際運行中還要不斷檢查負荷分布情況否則離散化會導致電價跳變。3.4 代碼調(diào)試與結(jié)果可視化的個人經(jīng)驗我調(diào)試這個模型時最常用也最有效的技巧是單獨抽出“純儲能調(diào)度”子問題來驗證模型對不對。先去掉電價優(yōu)化讓負荷固定為L0然后檢查只含光伏和儲能的單目標優(yōu)化結(jié)果光伏利用率是否合理、儲能是否在低價時段充電高價時段放電、SOC曲線是否滿足日循環(huán)。如果這些小目標都正常再疊加電價反饋問題定位就會清晰很多不會所有環(huán)節(jié)一起卡住。結(jié)果可視化方面我一定會輸出以下幾個圖電價曲線與實際充電負荷曲線對比、SOC運行曲線、光伏消納率、電網(wǎng)交互功率分布。其中最有價值的是負荷曲線對比通過對比固定電價下的負荷曲線和優(yōu)化后的負荷曲線能非常直觀地看到削峰填谷效果。如果優(yōu)化后峰值負荷反而更高那基本是響應系數(shù)或者約束方向出錯了。我之前復現(xiàn)時曾遇到一個特別隱蔽的問題SOC的單位用了kWh而功率用了kW計算SOC變化的式子里乘了dt但dt的單位用了小時導致一天下來SOC出入好幾倍。好運的是數(shù)值檢查一遍就會發(fā)現(xiàn)但在此之前已經(jīng)浪費不少時間。這段經(jīng)驗提醒我仿真前一定要自查所有變量的單位是否一致。4. 復現(xiàn)過程中踩過的坑與關鍵經(jīng)驗4.1 迭代不收斂或結(jié)果振蕩的原因分析我迭代求解雙層問題時最常出現(xiàn)的情況是電價和負荷在相鄰迭代之間跳變幅度太大導致目標函數(shù)不收斂。比如第一輪算出來的夜晚電價很低第二輪用戶負荷一下涌到半夜第三輪模型看半夜負荷太高又把電價抬回來于是用戶負荷又跑回傍晚——來回震蕩始終達不到穩(wěn)定。這個問題的本質(zhì)是迭代策略太“硬”沒有阻尼設計。我的解決方法是引入松弛因子每次迭代得到的電價不直接作為下一次輸入而是按一定比例和上一輪電價混合例如[ p^{(k1)}_{new} \alpha p^{*(k)} (1 - \alpha) p^{(k)} ]其中 (\alpha) 是松弛系數(shù)通常取0.5到0.8之間。松弛系數(shù)太小收斂慢太大容易振蕩。實測下來0.6左右對大多數(shù)場景都是穩(wěn)妥的選擇。4.2 用戶負荷轉(zhuǎn)移約束的細節(jié)處理很多復現(xiàn)代碼里只做了以下線性模型L L0 .* (1 E .* (p_sell - p_ref) ./ p_ref);但沒有約束“總充電能量不因為電價調(diào)整而變化”這會導致一個問題電價上升時L整體變小系統(tǒng)里憑空少了一部分電量相當于用戶不充電了。而真實場景是用戶整體充電量基本守恒時間調(diào)整不等于總量減少。想讓結(jié)果更可信需要在模型里加入轉(zhuǎn)移電量約束。最簡單的辦法是讓不同時段的負荷變化量之和為零Constraints [Constraints, sum(L - L0) 0];更精細的做法是給不同時段設定轉(zhuǎn)移比例上限比如每個時段最多向外轉(zhuǎn)移30%的充電量可以用正負偏差變量建模[ L(t) L_0(t) \sum_{s \ne t}\Delta_{s\to t} - \sum_{s \ne t} \Delta_{t\to s} ]其中 (\Delta_{s\to t}) 表示從 (s) 時段轉(zhuǎn)移到 (t) 時段的電量同時還要保證每個轉(zhuǎn)移變量都不能超過上限。這個建模方式能直觀阻止不合理的電量“憑空消失”。4.3 參數(shù)敏感性分析需要關注的核心變量復現(xiàn)完成后一定要做幾個關鍵參數(shù)的敏感性分析不然你對這個模型的理解只能停留在“代碼能跑”的層面。我最推薦的三個分析方向價格彈性系數(shù)對結(jié)果的影響。依次把自彈性從 -0.2 調(diào)到 -0.5看負荷曲線平滑度、總收益和用戶電費的變化趨勢。如果彈性系數(shù)增大后收益反而下降說明“高電價刺激收益”的效應被“用戶減少充電”的效應壓過了這個拐點關系很重要。儲能容量對光儲協(xié)同收益的影響。從0開始逐步加大儲能容量觀察收益邊際遞減規(guī)律。多數(shù)場景下儲能容量增加到一定值后再增加容量的經(jīng)濟效益會非常有限說明設備利用率已經(jīng)飽和。分時電價上限 (p_{max}) 的調(diào)控效果。由于上限決定了峰時電價能拉多高它雖然直接影響用戶側(cè)費用也間接影響用戶時段轉(zhuǎn)移幅度。氣派的價格上限可能帶來高收入但也可能因為用戶流失導致站內(nèi)負荷率過低。4.4 數(shù)據(jù)單位與時間粒度的常見錯誤時間粒度也值得專門說一句。如果你的模型是用96點數(shù)據(jù)每15分鐘一個點那么 (dt 0.25)所有儲能能量計算必須乘0.25。但很多人把dt直接設成1或者忘記在功率平衡里乘dt最后得到的結(jié)果會出現(xiàn)數(shù)量級錯誤。建議在代碼開頭寫一個明確的參數(shù)注釋dt 0.25; % 時間粒度注意不是1小時任何單位不匹配在模型里都極其隱蔽因為優(yōu)化器不會報錯只會給出一個數(shù)值詭異但“可行”的結(jié)果。我自己的習慣是拿到結(jié)果后先驗算一遍能量守恒關系光伏總電量購電總電量-售電總電量-負荷總電量-儲能損耗看看是否和SOC變化量吻合。不吻合就說明代碼里某個系數(shù)乘錯了這種檢查比什么都快。5. 結(jié)果分析與擴展應用5.1 典型仿真結(jié)果與經(jīng)濟效益解讀以一套典型參數(shù)為例光伏裝機200 kW儲能容量300 kWh充電樁總功率100 kW基礎負荷曲線取傍晚高峰、夜間低谷。優(yōu)化之后我得到的主要結(jié)論如下優(yōu)化后的售電價格曲線自動呈現(xiàn)“晚高峰上浮、深夜低谷下浮”的趨勢谷時電價大概比固定電價方案低0.1元/kWh左右峰時電價則有一定上浮用戶充電負荷明顯向深夜轉(zhuǎn)移假設基礎負荷峰值出現(xiàn)在18點優(yōu)化后的負荷峰值會轉(zhuǎn)移到23點或24點附近最大負荷數(shù)值明顯下降儲能系統(tǒng)會在午后光伏大發(fā)時充電在晚高峰時段放電減少光伏上網(wǎng)的損失整體運營收益相對于“固定電價固定負荷”的基準方案提高了10%左右其中售電收入增加主要來自峰時電價提升和儲能套利。這里有一點需要補充收益提升并不意味著所有用戶總電費同步上升。由于用戶把充電移到低價時段平均購電價格反而有可能下降峰時電價高只影響那些“不差錢、非高峰時間充電不可”的用戶。這一部分需要對用戶做分層分析如果你拿到的數(shù)據(jù)里用戶多樣性比較強這個模型的解釋力會更強。5.2 模型擴展從單站到多站協(xié)同這個模型本身是單站優(yōu)化但它的主體框架可以擴展為多站協(xié)同版本。最直觀的擴展方向有三個把“向電網(wǎng)購/售電”擴展成“從上級電網(wǎng)購電、在多個電站間共享儲能”的交換邏輯多站之間可以通過中低壓配電網(wǎng)聯(lián)絡線互相支援模型中會出現(xiàn)“站間交互功率”這個新決策變量在用戶響應模型中引入充電需求分類比如快充、慢充、換電三種需求分別對應不同的彈性矩陣這樣更能體現(xiàn)真實的用戶集群行為引入日前市場和實時市場的雙重價格讓電價優(yōu)化同時考慮日前預測誤差和實時平衡偏差模型就不只是靜態(tài)的典型日調(diào)度而更接近實際電力市場的滾動優(yōu)化邏輯。很多團隊做擴展時都會遇到一個共同問題多站協(xié)同模型會把決策變量規(guī)模放大好幾倍再用雙層迭代思路去跑速度會很慢。這種情況下我建議改用MILP單層表達并借助相鄰時段相似性對分時電價檔位做歸并減少離散變量數(shù)量。如果變量數(shù)太多導致CPLEX內(nèi)存吃緊可以嘗試Gurobi或者用Benders分解把多站問題拆成主子問題協(xié)調(diào)迭代但這是后話了。5.3 換電模式與快充模式共存時的電價設計如果你的站內(nèi)同時有換電和快充電價設計會比單純快充復雜得多。換電用戶對電價不那么敏感因為換電服務本身的確定性價值很高用戶更看重時間而不是差價??斐溆脩魟t不同價格彈性相對更大很容易被電價引導到深夜。復現(xiàn)項目中如果引入換電變量我建議單獨設置換電服務費不直接參與分時電價聯(lián)動否則優(yōu)化模型會因為換電剛性需求的存在把分時電價整體抬高到不合理的水平。比較穩(wěn)妥的做法是快充部分采用動態(tài)分時電價換電部分保持一口價服務二者在功率平衡約束里共享儲能和光伏功率但在收入項里分賬核算。這個設計在程序上非常簡單就是把目標函數(shù)里的價格變量改成兩個獨立變量 Group并不會額外增加求解難度。5.4 從論文復現(xiàn)到工程落地的實用建議如果你只是在做課程設計或論文復現(xiàn)把上面的模型跑通、畫出漂亮的曲線就夠了。但如果目標是工程落地我還想多分享幾點經(jīng)驗。第一實際系統(tǒng)的分時電價并不是能夠在連續(xù)區(qū)間內(nèi)隨便定的。執(zhí)行電價要提前上報、需要得到監(jiān)管方認可、并且要避免頻繁變動對用戶體驗造成困擾所以優(yōu)化出來的電價往往還需要做“圓整和簡化”。我通常會在優(yōu)化結(jié)束后加一個后處理腳本把相鄰時段接近的電價合并成三段或四段然后再按時段重新計算一次負荷分布。這次重算的結(jié)果才是最終可執(zhí)行的調(diào)度方案。第二真實光伏出力預測存在誤差儲能的實際可充放電量也受溫度和老化的影響所以模型最好至少保留10%到15%的SOC安全邊界。很多論文圖表里SOC貼著5%跑看著效率很高但現(xiàn)場工程師不會愿意這么操作因為一旦預測偏差電池過放會縮短壽命。第三如果你想在答辯或匯報里更能展示模型價值建議把“基準場景-優(yōu)化場景”的收益分解畫一張堆疊柱狀圖把光伏自發(fā)自用的收益、儲能套利收益、售電結(jié)構(gòu)調(diào)整帶來的收益分別顯示出來。這個圖比單獨一個收益數(shù)字有說服力得多也方便評審老師理解模型各部件的貢獻。6. 一些個人的復盤與實操建議復現(xiàn)這個模型的過程中我最大的體會是不要一次性試圖把雙層、需求響應、儲能調(diào)度全部在一個復雜求解器里搞定而應該先用固定負荷驗證單層調(diào)度再引入用戶負荷響應最后才考慮電價優(yōu)化。這種漸進式復現(xiàn)方式能把錯誤定位在局部也不會因為一開始就遇到不收斂的問題而勸退。第二點是數(shù)據(jù)質(zhì)量優(yōu)先于算法復雜度。我試過拿隨機生成的負荷曲線和數(shù)據(jù)去跑結(jié)果模型怎么調(diào)都很難看核心問題不是求解器不夠強而是負荷曲線本身不合理。建議在復現(xiàn)之前先花時間把典型日光伏和負荷曲線畫出來觀察光伏最大出力時刻和負荷高峰時刻是否錯開因為很多光儲場景的關鍵收益來源就是這個“錯峰套利”窗口。如果曲線本身不明顯后面怎么優(yōu)化都是形式主義。第三點就是保持一個樸素的投資視角。不要沉迷于把目標函數(shù)寫得越來越復雜而要在論文和代碼里反復驗證優(yōu)化出來的電價、負荷轉(zhuǎn)移率和儲能充放電策略是不是真的能提升電站收益是不是真的讓用戶省了錢模型里的每一個公式都應該能對應到一個實際的商業(yè)或物理邏輯。如果你的模型中某個約束或者懲罰項并說不清它的實際意義那大概率只是為了“讓結(jié)果好看”而塞進去的到真實項目里早晚會出問題。我本人復現(xiàn)這套代碼花了大約兩個周末第一個周末搭架子、跑通固定電價版本第二個周末處理雙層耦合和調(diào)試收斂最終的Matlab代碼一共只有300多行核心優(yōu)化語句集中在一個函數(shù)里。項目代碼里的注釋不夠充分但在實際復現(xiàn)時把YALMIP的約束定義、目標函數(shù)、以及求解器設置整理清楚整個模型邏輯就守住了一半。后續(xù)如果想繼續(xù)深入建議嘗試把時間粒度從小時級別改成15分鐘級別再引入實時電價預測模型對比預測不確定性和電價決策之間的相互作用這是當前研究的價值洼地。如果你也在復現(xiàn)類似模型走通了書里沒有寫清楚的那幾步這篇內(nèi)容的經(jīng)驗應該能幫你少走不少彎路。祝你在光儲充換電站優(yōu)化這條路上跑出滿意的結(jié)果。