
分時電價和需求響應這兩個詞放到一起外行聽起來像政策文件里的概念真正做過負荷仿真的人知道這背后是一套很有嚼頭的建模邏輯。這兩年我做電網(wǎng)側負荷分析時被問得最多的就是給定一條24小時基線負荷曲線再給一套峰平谷分時電價用戶到底會挪多少負荷到谷時削峰填谷能到什么程度用戶電費和負荷率會怎么變這些問題不建模跑數(shù)據(jù)靠拍腦袋完全答不準。我當時用MATLAB搭了一套完整的負荷需求響應仿真腳本用來對比不同分時電價方案的差異。這篇文章把這套仿真的建模思路、代碼實現(xiàn)、結果分析和坑點完整展開適合電氣、能源相關專業(yè)的學生也適合準備用MATLAB做電力市場或需求響應課程設計的讀者??赐暌院竽憧梢灾苯幽眠@套思路改成自己的仿真項目。1. 分時電價下的需求響應為什么要靠仿真說話1.1 分時電價到底在解決什么問題電網(wǎng)運行最頭疼的問題之一是負荷曲線的峰谷差。白天工廠開工、空調制冷傍晚照明和家電疊加負荷快速爬升到了后半夜大部分用電設備休息負荷又掉到低谷。如果全天的負荷都像一條平線發(fā)電機組可以安穩(wěn)地滿發(fā)輸電通道利用率也高。但現(xiàn)實是峰谷差可能達到最大負荷的40%以上電網(wǎng)必須在高峰時段投入成本更高的調峰機組低谷時段又面臨機組低負荷運行甚至停機。分時電價的核心思路就是把一天切成峰、平、谷三種時段峰時段電價高谷時段電價低讓用戶在價格信號的引導下自發(fā)調整用電行為。能轉移到谷時的負荷轉移出去高峰時段的負荷壓力就降下來。這個機制聽起來不復雜但效果很難靠經驗估算因為用戶對電價的響應不是線性的也不是簡單平移一段負荷就能模擬的。1.2 仿真在這個環(huán)節(jié)里承擔什么角色需求響應效果評估有三個層面單個用戶的用電行為變化、聚合后的負荷曲線變化、系統(tǒng)層面的削峰填谷指標變化。這三個層面串起來需要一個可重復計算的模型MATLAB正好合適。我選擇MATLAB的原因很直接矩陣運算方便數(shù)據(jù)可視化順手而且彈性矩陣這類公式表達起來非常接近教科書寫法。對于需要對比多種電價方案的場景寫一套參數(shù)化腳本后續(xù)只改時段劃分、電價數(shù)值和彈性系數(shù)就能批量跑出結果。這一點在課程設計和實際項目預研里都特別實用。2. 建模核心彈性矩陣是如何把價格信號翻譯成負荷變化的2.1 自彈性、交叉彈性與24小時聯(lián)動響應機制需求響應建模最經典的方法是基于價格彈性系數(shù)。用戶對電價的響應體現(xiàn)在兩個維度一個是自身時段的電價變化帶來的需求變化叫自彈性另一個是其他時段電價變化對本時段需求的影響叫交叉彈性。自彈性一般是負數(shù)電價升高本時段用電量下降交叉彈性一般是正數(shù)表示某個時段電價升高后用戶把一部分用電轉移到了當前時段。以小時為單位建模時第 ( i ) 個時段響應后的負荷 ( Q_i ) 可以這樣表述$$ Q_i Q_i^0 Q_i^0 \sum_{j1}^{24} e_{ij} \cdot \frac{P_j - P_j^0}{P_j^0} $$其中 ( Q_i^0 ) 是基線負荷( P_j^0 ) 是基線電價( P_j ) 是新的分時電價( e_{ij} ) 是彈性系數(shù)矩陣里的元素。這個公式的意思是說每個小時的新負荷等于原來的負荷加上所有24個小時價格變化帶來的影響之和。自彈性系數(shù)放在對角線位置交叉彈性放在非對角線位置。實際寫代碼時很少直接用24乘24的完整矩陣因為那需要大量交叉彈性數(shù)據(jù)。我的做法是先按峰、平、谷三個時段聚合時段內各小時共享相同的自彈性峰谷之間設定交叉彈性平時段作為緩沖。這樣既保住了價格聯(lián)動的邏輯數(shù)據(jù)需求又可控。2.2 彈性系數(shù)的取值邊界與調參經驗彈性系數(shù)的取值是這套模型最敏感的地方。查閱許多文獻和實際項目的反饋自彈性通常在 -0.5 到 -0.05 之間峰谷交叉彈性在 0.01 到 0.1 之間。數(shù)值調得越大需求響應效果越顯著但越容易偏離實際。我的建議是課程設計或預研階段不要追求極端彈性值取保守的中位數(shù)比較穩(wěn)。比如自彈性 -0.2、交叉彈性 0.05這樣跑出來的結果既有可見的削峰效果又不會出現(xiàn)高峰負荷暴跌一半這種不合理現(xiàn)象。仿真報告里最好補一段敏感性分析把彈性系數(shù)從低到高掃描一遍說明結果隨參數(shù)變化的趨勢這樣即使有人質疑參數(shù)選取你也拿得出數(shù)據(jù)說話。另一個容易忽略的是彈性系數(shù)矩陣的對稱性約束。理論上交叉彈性要滿足某種一致性條件才符合經濟學直覺比如總用電量變化不大時轉移效應應該近似守恒。雖然在簡化模型里不必嚴格要求但跑批時要注意結果是否出現(xiàn)用電總量大幅偏離基線。2.3 峰平谷時段劃分與電價差的設定邏輯時段劃分直接決定了響應的分布。我這次仿真采用了一個典型的工商業(yè)用戶時段劃分峰時段9:00-11:0018:00-21:00谷時段1:00-7:0023:00-24:00平時段其余時間電價方面我設定平時段價格 0.55 元/千瓦時峰時段 0.90 元/千瓦時谷時段 0.30 元/千瓦時峰谷價差比 3 倍。這個比例接近國內許多地區(qū)分時電價的價差水平既足以刺激用戶響應又不至于偏離現(xiàn)實。設計場景時我額外設置了一個更激進的方案峰價上調到 1.10 元谷價下調到 0.25 元用來觀察價差擴大對響應幅度的邊際影響。這里有一個經驗價差擴大后需求響應幅度不會線性增長因為用戶能靈活轉移的負荷是有限的比如生產工序不能隨意中斷、生活作息不能全盤打亂。(\Delta 響應) 的增幅一定小于 (\Delta 價差) 的增幅。仿真里如果看到線性甚至超線性增長大概率是模型少了約束條件。3. MATLAB仿真落地從基礎參數(shù)到多場景跑批3.1 基線負荷和電價向量的初始化仿真的第一步是構造輸入數(shù)據(jù)。我習慣把所有參數(shù)集中放在腳本開頭用結構體或者命名變量管理后續(xù)改動一處不用翻遍全文件。% 仿真步長1小時 hours 24; % 典型夏季工作日基線負荷單位MW Q0 [2800 2700 2600 2550 2500 2600 2900 3200 3500 3800 3900 ... 3700 3500 3400 3450 3500 3700 4000 4300 4100 3900 ... 3500 3100 2900]; % 基線統(tǒng)一電價單位元/kWh price_base 0.55 * ones(1, 24); % 分時電價方案A峰0.90平0.55谷0.30 price_TOU 0.55 * ones(1, 24); price_TOU(9:11) 0.90; price_TOU(18:21) 0.90; price_TOU(1:7) 0.30; price_TOU(23:24) 0.30;這里有個容易踩的坑MATLAB數(shù)組索引從1開始所以 9:11 表示9點、10點、11點三個小時對應實際一天的9:00-11:59。寫成 9:11 不是頭尾都包含的意思而是生成一個整數(shù)向量。如果你習慣用C語言風格第一時間容易寫成 half-open 區(qū)間然后發(fā)現(xiàn)峰時段覆蓋錯了范圍。跑完第一條曲線先輸出一下各時段的電價標簽確認無誤再往下走。3.2 彈性矩陣構建與響應計算主程序我用峰平谷聚合的方式來建彈性矩陣。把24小時映射到三個類別然后構造類別之間的交叉彈性再擴展回小時級矩陣。這樣做既避免24乘24的大矩陣稀疏難調又能保證峰谷時段的負荷可以相互轉移。% 彈性參數(shù) e_self -0.20; % 自彈性 e_peak_flat 0.05; % 峰對平的交叉彈性 e_peak_valley 0.08; % 峰對谷的交叉彈性 e_valley_peak 0.06; % 谷對峰的交叉彈性 e_valley_flat 0.04; % 時段類別標簽1谷2平3峰 period_type zeros(1, 24); period_type(1:7) 1; period_type(23:24) 1; period_type(9:11) 3; period_type(18:21) 3; period_type(period_type 0) 2; % 構建24x24彈性矩陣簡化版 E_matrix zeros(24, 24); for i 1:24 type_i period_type(i); for j 1:24 if i j E_matrix(i, j) e_self; else type_j period_type(j); if type_i 3 type_j 2 E_matrix(i, j) e_peak_flat; elseif type_i 3 type_j 1 E_matrix(i, j) e_peak_valley; elseif type_i 1 type_j 3 E_matrix(i, j) e_valley_peak; elseif type_i 1 type_j 2 E_matrix(i, j) e_valley_flat; elseif type_i 2 type_j 3 E_matrix(i, j) e_peak_valley; elseif type_i 2 type_j 1 E_matrix(i, j) e_valley_flat; end end end end類別交叉放進矩陣后還要按小時求和的詳細公式體現(xiàn)在計算步驟里。響應后的負荷每一小時都等于基線負荷乘以“1加所有時段價格變化加權求和”。% 價格變化比例 delta_price_ratio (price_TOU - price_base) ./ price_base; % 需求響應后負荷初始化為基線 Q_new zeros(1, 24); for i 1:24 gain 1 sum(E_matrix(i, :) .* delta_price_ratio); Q_new(i) max(Q0(i) * gain, 0); end為什么用 ( 1 ) 而不是 ( 1 - )因為 ( delta_price_ratio ) 在峰時段是正數(shù)自彈性又是負數(shù)兩個乘完自然變成負貢獻負荷下降谷時段價格變化比例是負數(shù)乘上負的彈性后變成正貢獻負荷上升。這個正負號處理非常關鍵初學者常在這里把交叉彈性的符號寫反導致峰時負荷不減反增。3.3 三套仿真場景的設計與對比思路單跑一套方案沒有說服力我做的是多場景對比。場景設計邏輯如下基線場景全天空一價0.55元作為對照。方案A常規(guī)分時電價峰0.90元谷0.30元。方案B激進分時電價峰1.10元谷0.25元。方案C在方案A基礎上設置谷時最低負荷保護約束負荷不低于某下限。方案C是為了模擬現(xiàn)實中“谷時負荷不能無限制堆高”的場景。峰谷價差拉大后谷時負荷確實會上升但配電網(wǎng)設備和用戶自身用電能力都可能設了上限。仿真中加入約束結果才更貼近實際。% 方案C谷時段負荷約束 Q_new_c Q_new; valley_idx find(period_type 1); lower_limit 2800; % MW Q_new_c(valley_idx) max(Q_new_c(valley_idx), lower_limit);這只是最簡單的事后約束修正。如果需要更嚴謹應該在優(yōu)化模型里做成不等式約束而不是跑完后直接截斷。截斷的目的是給你快速看趨勢真要寫論文建議用線性規(guī)劃或者fmincon處理約束這會引出另一套代碼。3.4 敏感性分析在仿真流程里怎么加敏感性分析說白了就是對某個參數(shù)做 grid scan看結果怎么變。我在程序里額外包了一層循環(huán)針對自彈性系數(shù)從 -0.05 到 -0.35 取7個值記錄每組參數(shù)下的峰值負荷和峰谷差畫成曲線。e_self_scan -0.05: -0.05: -0.35; peak_load_record zeros(size(e_self_scan)); peak_valley_diff zeros(size(e_self_scan)); for k 1:length(e_self_scan) % 更新彈性矩陣對角元素后重新計算Q_new E_matrix_scan E_matrix diag((e_self_scan(k) - e_self) * ones(24, 1)); gain_scan 1 sum(E_matrix_scan .* repmat(delta_price_ratio, 1, 24), 2); Q_new_scan max(Q0 .* gain_scan, 0); peak_load_record(k) max(Q_new_scan); peak_valley_diff(k) max(Q_new_scan) - min(Q_new_scan); end這種方式寫起來簡潔但如果你追求高效可以先把彈性矩陣參數(shù)化成一個函數(shù)句柄然后放進 arrayfun 里跑。我實測發(fā)現(xiàn)24小時規(guī)模的數(shù)據(jù)量很小循環(huán)就夠用了真正需要優(yōu)化的反而是程序外的輸入數(shù)據(jù)清洗。4. 結果分析從負荷曲線到經濟效益的量化解讀4.1 削峰填谷效果如何用指標量化仿真跑完后第一步是畫出基線負荷和響應后負荷的對比曲線。我在每個場景里都保存了24小時負荷序列然后計算四個核心指標最大負荷、最小負荷、峰谷差、負荷率。以我采用的假設數(shù)據(jù)為例場景最大負荷(MW)最小負荷(MW)峰谷差(MW)負荷率基線4300250018000.78方案A3880276011200.87方案B369029507400.91方案C3900265012500.86方案A的最大負荷從4300兆瓦降到3880兆瓦削峰約9.8%峰谷差從1800兆瓦縮到1120兆瓦降幅接近38%。負荷率從0.78提高到0.87說明全天負荷曲線的平整度明顯提升這就是調度喜歡看到的效果。方案B繼續(xù)拉大峰谷價差后響應更加劇烈但是你會發(fā)現(xiàn)谷時負荷從2760兆瓦漲到2950兆瓦進一步抬升同時日總用電量也顯著低于基線這就是彈性模型里“節(jié)能效應”混入的結果。這里必須提醒一句如果模型只設自彈性且沒有交叉平衡價格一漲總用電量就跟著掉。這到底屬于真正的需求削減還是用戶把負荷轉移走了在結果分析里一定要分清楚。否則削峰效果可能被高估。4.2 用戶側電費支出變化算清楚才叫完整需求響應不能只談系統(tǒng)側削峰用戶之所以參與是因為想省錢。我在仿真里同時統(tǒng)計了響應前后用戶側的電費支出按分時電價計算。場景日用電量(MWh)日電費(萬元)單位電費(元/kWh)基線78800433400.55方案A78200398100.51方案B77400381200.53注意一個反直覺的結果方案B的日電費總額比方案B的單價反而高我這張表里的方案B單位電費是0.53比方案A高這是因為雖然谷時段電價更低了但峰時段電價漲得太猛而用戶剩余在峰時的負荷仍然支付高價整體平均電價被峰價拉高。也就是說大幅拉大峰谷價差并不一定給用戶帶來更多實惠這可能降低用戶的參與意愿。表格數(shù)據(jù)僅用于說明趨勢實際仿真的數(shù)值取決于負荷構成和彈性參數(shù)但分析邏輯是通用的。真正給用戶算賬時最好把響應的機會成本也考慮進去比如某些工業(yè)負荷挪到夜間需要增加人工成本那用戶能接受的最大價差空間又會變化。4.3 拉大峰谷價差的邊際效果遞減從方案A到方案B峰價從0.90漲到1.10谷價從0.30降到0.25價差擴大近50%但最大負荷只多下降了約5%峰谷差多縮減了約34%。這說明需求響應在這個彈性水平下已經接近飽和。為什么會出現(xiàn)邊際遞減因為可轉移負荷并不是無限的。照明、醫(yī)療設備、數(shù)據(jù)中心這類負荷對電價幾乎沒有彈性生產流程中真正能靈活調節(jié)的負荷占比有限。仿真做到這一步應該有意識地在結論里說明單純靠加價差的邊際收益有限下一步應該考慮需求響應與儲能、新能源消納的聯(lián)合優(yōu)化。5. 仿真過程中的常見坑與可復現(xiàn)建議5.1 總用電量莫名變化先檢查彈性矩陣是否對稱我跑第一批結果的時候發(fā)現(xiàn)方案A的日用電量比基線少了600兆瓦時。問題是我起初只想模擬用戶把負荷從峰時挪到谷時并不想模擬節(jié)能。那這個用電量下降來自哪里查處后發(fā)現(xiàn)自彈性讓所有時段都有獨立的價格響應峰時段負荷確實大幅下降但谷時段負荷上升的幅度沒完全抵消總量就掉了。解決辦法有兩個一是把自彈性設得小一些讓價格水平對總量的影響弱于時分遷移影響二是使用對稱矩陣保證交叉彈性在轉移關系上近似守恒。如果目標是純粹模擬削峰填谷建議把交叉彈性設為主因素自彈性只作為次要因素。5.2 負荷曲線在時段邊界出現(xiàn)尖刺峰平谷時段切換的邊界點比如11點和12點之間價格從0.90跳回0.55模型計算后負荷可能出現(xiàn)一個明顯的回落尖刺。這在實際用戶行為里通常不會發(fā)生因為用戶的負荷調整不可能在一瞬間完成。解決方式可以是在邊界時段做平滑處理或者把時段邊界設置成漸變價格帶。我最初沒有處理這個問題畫出來的曲線難看領導一眼就覺得數(shù)據(jù)不合理。后來我做了簡單的三點滑動平均只作用于時段切換鄰近的兩個點效果就好多了。但這樣做會略微改變峰谷指標報告里要向讀者說明平滑處理方式。5.3 MATLAB腳本組織與數(shù)據(jù)單位統(tǒng)一工程實踐里最大的隱性問題是單位。負荷數(shù)據(jù)可能來自SCADA系統(tǒng)單位是兆瓦電價數(shù)據(jù)來自營銷系統(tǒng)單位是元每千瓦時電量數(shù)據(jù)又可能是萬千瓦時。仿真里只要單位不統(tǒng)一結果就會對不上。我在腳本開頭統(tǒng)一轉成“兆瓦小時”組合電量全部用兆瓦時電價用元每千瓦時算電費時直接乘起來再除以10000得到萬元。腳本組織方面推薦按“參數(shù)區(qū)-數(shù)據(jù)區(qū)-計算區(qū)-結果區(qū)”劃分用注釋塊分隔。后續(xù)換數(shù)據(jù)時只需要修改參數(shù)區(qū)和數(shù)據(jù)區(qū)計算區(qū)完全不用動。這樣做的好處是可以快速退化到其他用戶或者時段復用性提高很多。5.4 繪圖與報告輸出的幾個細節(jié)我習慣在結果區(qū)直接生成三張圖負荷曲線對比圖、電費分時段柱狀圖、敏感性分析曲線圖。負荷曲線對比圖用線性圖最直觀基線用灰色虛線方案用實線峰谷時段背景用不同透明度色塊標出。繪圖顏色盡量用色盲友好的配色避免全用紅綠對比。柱狀圖用來展示各時段電費支出結構能直觀看出峰時支出占比下降了多少。敏感性分析曲線圖橫坐標放自彈性絕對值縱坐標放峰值和峰谷差兩條曲線分別用不同marker方便在報告里解釋參數(shù)邊界。寫在最后這套仿真模型真正跑通之后最讓我意外的不是削峰效果有多好而是模型對彈性系數(shù)和時段劃分的敏感程度。參數(shù)稍微改一點結論就可能從“方案最優(yōu)”變成“方案不可行”。所以做這類分析一定要把模型假設寫清楚把敏感性分析附上結論才有說服力。如果你想繼續(xù)擴展可以考慮三個方向第一把剛性負荷、柔性負荷、可平移負荷分開建模替代現(xiàn)在的統(tǒng)一彈性矩陣結果會精細得多第二加入儲能系統(tǒng)模型看分時電價和儲能聯(lián)合起來對用戶經濟性有什么影響第三把這種確定性仿真升級成功率場景下的蒙特卡洛模擬給每條曲線加上置信區(qū)間。每個方向都能單獨拉出一篇完整的項目但核心的彈性矩陣需求響應邏輯是通用的先把這一步做扎實就行。