ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于Matlab的分时电价需求响应建模与削峰填谷仿真分析

基于Matlab的分时电价需求响应建模与削峰填谷仿真分析 分时电价到底能削多少峰、填多少谷这个问题我被人问过很多次。直到我用负荷需求响应模型在matlab里跑通一遍完整的仿真流程之后才知道这种拍脑袋没法回答的问题其实可以量化得很清楚把用户对电价的敏感程度拆成弹性系数把一天24小时拆成峰、平、谷三个时段再用矩阵运算算出每条负荷曲线的变化量削峰填谷的效果一目了然。这篇文章我会完整复盘这套仿真思路包括分时电价策略下的负荷响应变化分析逻辑、价格弹性矩阵的构造方式、matlab实现的核心代码以及最后如何用峰谷差、负荷率这些指标来评估削峰填谷效果。适合电力专业的研究生、做负荷预测和需求侧管理的工程师以及想用matlab快速验证电价方案效果的同学参考。1. 价格信号如何撬动负荷迁移需求响应的建模逻辑1.1 为什么电价能改变用电行为很多人第一次接触需求响应时都有一个疑惑用户又不是机器凭什么电价一变用电曲线就跟着变答案藏在负荷的构成里。一个区域的全天负荷大致可以分为三类一类是刚性负荷比如医院、夜间照明的路灯、必须连续运行的工业生产线这些负荷对电价不敏感你就算把电价翻一倍该用多少还是多少。第二类是弹性负荷比如空调、电热水器、蓄冷蓄热设备它们的运行时段有一定的调整余地电价贵的时候用户可以少开一会儿或者提前在电价便宜的时候把能量存起来。第三类是可转移负荷比如电动汽车充电、洗衣机、洗碗机、部分工业间歇性工序这类负荷的特点是事情要做但时间可以挪完全可以从晚高峰挪到凌晨低谷。分时电价之所以有效就是因为它同时对后两类负荷起作用。弹性负荷感受到高价后会主动收缩可转移负荷感受到高价后会把用电需求搬走。这两股力量叠加反映在电力系统的总负荷曲线上就是高峰被压低、低谷被抬高。这个原理和打车平台的动态调价有点像高峰期车费上浮一部分人选择等一等或者改乘公共交通平台的订单峰值就平缓下来了。1.2 自弹性与交叉弹性把用户行为翻译成数学语言要把上面这个行为逻辑写成模型最经典的框架是价格弹性矩阵。经济学里弹性描述的是一个变量的变化引起另一个变量多大比例的变化。需求响应领域把它拆成两个维度自弹性系数当前时段的电价变化对当前时段负荷的影响。电价上涨当前时段负荷下降所以自弹性通常是负值。交叉弹性系数其他时段的电价变化对当前时段负荷的影响。比如晚高峰电价上涨用户会把一部分本应在晚高峰使用的电量挪到午间平段或者凌晨谷段所以其他时段电价上涨反而可能让当前时段的负荷增加交叉弹性通常是正值。用公式表达对于一个24小时模型第t个时段的负荷响应率为ΔL(t) / L0(t) Σ E(t, s) × ΔP(s) / P0(s)其中L0(t)是响应前的基准负荷ΔP(s)是第s个时段的电价变化量P0(s)是参考电价E(t, s)就是价格弹性矩阵中第t行第s列的元素。这个式子的物理含义很直观本时段的负荷变化一部分来自本时段电价变化的直接影响另一部分来自其他所有时段电价变化带来的转移效应。1.3 建模仿真要回答的三个核心问题明确了弹性系数和响应公式之后整个仿真要回答的核心问题就浮出水面了。我在实际做项目时通常会把这三个问题作为建模的验收标准第一在给定的分时电价方案下高峰时段的负荷到底能压下去多少。这直接决定电网能不能靠价格手段替代一部分调峰电源。第二低谷时段的负荷能被填充多少。如果谷段电价压得足够低填谷效果不明显说明价格信号没传达到位。第三峰谷差缩小之后会不会出现新的问题比如原本的平段变成新的高峰或者峰时段内部出现反峰谷。这三个问题想清楚之后后面所有参数设置、代码实现和结果分析都有了明确的目标不会跑完仿真之后不知道自己在看什么。2. 数据准备与弹性矩阵matlab模型的关键前置工作2.1 典型日负荷曲线从哪来仿真输入的第一份数据是24小时典型日负荷。这条曲线可以来自三处一是实际电网的SCADA系统历史数据取典型日比如夏季最大负荷日或冬季典型工作日的96点负荷再聚合到小时级二是电力用户侧的智能电表数据做聚合后得到区域净负荷三是项目前期没有实测数据时参考同类型区域的公开典型负荷曲线自己构造一份。我这次演示用的是一份有明显双峰特征的典型日负荷数据单位是MW覆盖0点到23点的24个时段。数据的特点很典型凌晨负荷低早上8点以后快速爬升午间出现一个平台下午小幅回落后在19点左右达到全天最高峰580MW随后逐步下降。这种双峰型曲线是典型的城市电网夏季负荷形态用来验证分时电价的削峰填谷效果非常有代表性。% 基础数据24小时典型日负荷单位MW load_base [280 260 240 230 225 235 250 300 380 420 ... 450 480 470 460 450 440 430 460 520 580 ... 560 500 420 340];2.2 分时电价时段划分与参考电价基准分时电价方案本身也是模型输入。我采用的是最常见的三段式谷段0.30元/kWh、平段0.70元/kWh、峰段1.20元/kWh。时段划分上0点到8点为谷段10到12点和18到22点为峰段其余时间为平段。关于参考电价的选取这里有个容易忽略的细节。公式里ΔP/P0的P0不能随意取它代表用户心里的基准电价。实际工程中常用平段电价作为参考基准因为它是大多数用户感知最强烈的常态价格峰段和谷段都是相对它浮动的。如果拿全天平均电价当基准算出来的价格变化率会整体偏移导致谷时段的价格变化率看起来没那么低峰时段也没那么高响应结果会被扭曲。在matlab里把时段类型固化成一个数组后续计算会非常方便。我用1、2、3分别代表谷、平、峰三个时段类型% 分时电价设置单位元/kWh price zeros(1, 24); price(1:8) 0.30; % 谷段 00:00-08:00 price(9:10) 0.70; % 平段 08:00-10:00 price(11:12) 1.20; % 峰段 10:00-12:00 price(13:18) 0.70; % 平段 12:00-18:00 price(19:22) 1.20; % 峰段 18:00-22:00 price(23:24) 0.70; % 平段 22:00-24:00 % 时段类型标记1谷 2平 3峰 price_type [1 1 1 1 1 1 1 1 2 2 3 3 2 2 2 2 2 2 3 3 3 3 2 2];2.3 弹性矩阵怎么构造才合理接下来是最核心的弹性矩阵。我不建议一上来就构造24×24的大矩阵那样看起来专业实际上很难标定因为24×24矩阵里有足足576个参数绝大多数都没有物理意义支撑。更务实的做法是先构造一个3×3的时段类型转移矩阵再按每个小时所属的时段类型映射到24小时上。3×3矩阵的行代表当前负荷所在时段类型列代表价格变化来源的时段类型。以我这次用的矩阵为例E [-0.12 0.08 0.04; 0.06 -0.12 0.06; 0.10 0.08 -0.18];对角线是自弹性系数全部为负值符合价格上涨、当前时段负荷下降的规律。非对角线是交叉弹性系数全部为正值符合其他时段价格上涨、负荷向本时段转移的规律。我再逐行解释一下物理含义。第一行是谷时段负荷的响应逻辑谷时段自身电价上涨1%谷时段负荷下降0.12%平段电价上涨1%谷时段负荷增加0.08%因为用户会从平段往谷段挪电峰段电价上涨1%谷时段负荷增加0.04%因为峰段的电被挪到了谷段。第三行是峰时段负荷的响应逻辑峰段自身电价上涨1%峰段负荷下降0.18%这个数值最大因为峰时段的可调负荷最集中谷段电价上涨1%峰段负荷增加0.10%这意味着本来想在谷段用电的行为会被价格推回峰段平段电价上涨1%峰段负荷增加0.08%同理。这里有个需要提醒的点这个矩阵的行和并不为0也就是说模型运行后全天的总用电量会略微下降。这其实符合实际情况——高电价环境下一部分用户会主动削减非必要用电而不仅仅是把用电时间挪走所以总电量下降一点是合理的。但如果你的项目要求电量守恒比如目标场景是刚性总电量固定的工业园区就需要在矩阵构造时增加约束让每一行的系数和严格等于0。3. 核心仿真代码从24小时负荷曲线到响应结果计算3.1 价格变化率与时段平均聚合数据准备完成之后进入最核心的计算环节。第一步是计算每个时段的相对价格变化率然后按谷、平、峰三个时段类型做平均聚合得到三个标量值。这样做的原因是我们构造的弹性矩阵是3×3的它描述的是时段类型之间的响应关系所以价格信号也要先聚合到时段类型维度。以平段电价0.70元作为参考基准谷段0.30元对应的相对变化率是-0.5714峰段1.20元对应的相对变化率是0.7143。这两个数字意味着谷段电价相比基准打了约57%的折扣峰段电价相比基准上涨了约71%。% 参考电价取平时段电价 price_ref 0.70; delta_p (price - price_ref) / price_ref; % 三类时段的平均价格变化率 delta_p_type(1) mean(delta_p(price_type 1)); % 谷段 delta_p_type(2) mean(delta_p(price_type 2)); % 平段 delta_p_type(3) mean(delta_p(price_type 3)); % 峰段3.2 逐小时负荷响应计算有了时段类型标记、平均价格变化率和弹性矩阵之后就可以逐小时计算响应后的负荷了。对每一个小时t找到它所属的时段类型k然后对这个k行的三个弹性系数分别乘以谷、平、峰三个时段的价格变化率累加得到该小时的负荷响应率再乘以基准负荷就是响应后的负荷值。% 弹性转移矩阵行当前负荷时段类型列价格变化来源时段类型 E [-0.12 0.08 0.04; 0.06 -0.12 0.06; 0.10 0.08 -0.18]; % 逐小时计算响应后负荷 load_res zeros(1, 24); for t 1:24 k price_type(t); rate 0; for j 1:3 rate rate E(k, j) * delta_p_type(j); end load_res(t) load_base(t) * (1 rate); end这个双层循环写得非常直观但如果你追求代码效率也可以直接向量化先用非零元素索引生成24×3的稀疏映射矩阵再做一次矩阵乘法。我特意用循环写法是为了让逻辑更透明——每一行的计算过程都对应着当前时段负荷变化率三个弹性系数×三个价格变化率的物理含义。跑完这段代码你会得到一个有意思的结果。谷时段负荷因为电价低而整体上升上升幅度大约9.7%平时段几乎不变略增约0.86%峰时段负荷明显下降下降幅度约18.6%。这个结果方向完全符合分时电价的预期作用。3.3 指标计算与可视化仿真做完之后需要把结果转化成可以汇报的数字。我一般会计算五个核心指标最大负荷、最小负荷、峰谷差、峰谷差率、负荷率。前三个衡量削峰填谷的绝对效果后两个衡量曲线的相对平缓程度。% 计算指标最大值、最小值、峰谷差、峰谷差率、负荷率 calc_metrics (L) [max(L), min(L), max(L)-min(L), ... (max(L)-min(L))/max(L)*100, ... mean(L)/max(L)*100]; metrics_base calc_metrics(load_base); metrics_res calc_metrics(load_res);可视化方面我推荐用双纵轴图来展示。左侧Y轴画负荷曲线右侧Y轴画分时电价阶梯线。这样可以把电价高低和负荷升降放在同一张图里对照一眼就能看出高电价时段负荷被压下、低电价时段负荷被抬升的对应关系。figure(Color, w, Position, [100 100 900 450]); yyaxis left plot(1:24, load_base, -o, LineWidth, 1.6); hold on; plot(1:24, load_res, -s, LineWidth, 1.6); ylabel(负荷 / MW); yyaxis right stairs(0:24, [price(1:24) price(24)], k--, LineWidth, 1.2); ylabel(电价 / 元/kWh); xlabel(时刻 / h); legend(响应前负荷, 响应后负荷, 分时电价, Location, best); grid on;这段代码在近几年的matlab版本里都能直接运行不需要额外安装任何工具箱纯基础函数就能搞定。需要注意的一点是stairs函数画阶梯线时X轴长度要取25对应0到24的边界点最后一位重复一次电价值这样闭合阶梯线在图上才不会缺一段。4. 削峰填谷效果量化峰谷差、负荷率与转移电量解读4.1 核心指标对比响应前后发生了什么模型跑通之后最能说明问题的就是数字。我本地运行一次记录的响应前后指标对比如下指标响应前响应后变化最大负荷 / MW580.0474.0下降106.0最小负荷 / MW225.0246.9上升21.9峰谷差 / MW355.0227.1缩小127.9峰谷差率 / %61.247.9下降13.3个百分点平均负荷 / MW390.8377.0下降13.8负荷率 / %67.479.5提升12.1个百分点这几个数字放在一起削峰填谷的效果可以说非常直观。最大负荷从580MW降到474MW降幅约18.3%这意味着电网在晚高峰时段对调峰电源的需求大幅降低。最小负荷从225MW升到246.9MW低谷爬升约9.7%说明谷时段的负荷利用率提高了。最核心的峰谷差从355MW缩小到227.1MW降幅达到36%。负荷率这个指标尤其值得关注。它等于平均负荷除以最大负荷反映的是全天负荷曲线的饱满程度。响应前只有67.4%意味着全天有一大段容量是被浪费的响应后升到79.5%对于电网运行来说这个提升意味着发输配电设备在全天各时段的利用率更均衡了。4.2 峰时段电量转移了多少削峰填谷的效果除了看瞬时值还要看电量维度。把6个峰时段的负荷加总响应前峰时段总电量是4504805805605205003090MWh。响应后这6个小时的负荷分别是366.4、390.9、472.3、456.0、423.4、407.1合计约2516MWh。也就是说峰时段的用电量减少了约574MWh占原峰时段电量的18.6%。这部分电量去了哪里一部分是真正的负荷削减用户少用了电另一部分转移到了谷时段和平时段体现为谷时段负荷的抬升。电力系统调度人员会特别关注这个转移比例因为纯削减的部分意味着电费收入减少而转移的部分意味着把高价电量变成了低价电量对电网公司来说有收益侧的影响。在做电价方案经济性评估的时候这两个分量必须拆开算账。4.3 响应后曲线形态的新问题仿真结果不能只看指标变好就收工还要仔细看响应后的负荷曲线形态有没有出现新的隐患。我注意到一个细节响应之后原来的午间峰时段11点、12点负荷降到了366.4MW和390.9MW这个数值已经明显低于同一天的谷底负荷回升值。换句话说午间时段出现了一个新低谷。这就是所谓的高电价时段内部的反峰谷现象——用户响应过于积极把原本的午间高峰削成了新的低谷。在真实的电价方案设计里这种反峰谷是需要警惕的。它虽然不影响峰谷差指标的改善但实际上会造成新的容量浪费午间时段电网本来可以输送更多电力现在因为电价过高反而空转了。遇到这种情况说明峰时段的电价水平或者弹性系数设置需要回调或者峰时段划分需要细化比如把午间峰和晚高峰拆开分别设置不同的电价水平。4.4 分时段响应差异的解读把响应前后的负荷变化按类型拆开看谷时段整体上涨9.7%平时段几乎不变峰时段下降18.6%。这组数字说明弹性系数设置的主效应落在了峰时段上峰时段用户对电价的反应最敏感。这其实是符合预期的——用户的弹性负荷在高峰时段最容易被感知到因为那时候电价最高、电费支出压力最大用户调整用电行为的意愿最强。平时段的负荷几乎没有变化也是一个合理的信号。平段电价与参考电价相同用户没有改变用电行为的激励所以负荷基本原地不动。很多第一次做仿真的人会误以为平段负荷也应该被填高看到平段曲线基本不动就怀疑模型出错实际上这是正确的行为。5. 参数标定、模型边界与下一步升级方向5.1 弹性系数标定没有历史数据怎么办弹性矩阵是整个模型的灵魂也是最难标定的部分。如果在项目里有了实际的智能电表数据标定的标准做法是收集连续几个月的历史负荷和对应时段电价数据对每个时段做回归分析把负荷变化率对价格变化率做最小二乘拟合得到的回归系数就是弹性系数的估计值。样本量至少要覆盖一个完整的年度四季因为不同季节的用户用电弹性差异很大夏季空调负荷弹性高过渡季节弹性低。如果项目比较早期、没有历史数据可以参考行业文献里的经验值范围。自弹性系数一般在-0.05到-0.30之间交叉弹性系数一般在0.01到0.15之间。我这次演示用的-0.12到-0.18的自弹性和0.04到0.10的交叉弹性就落在这个常见区间内。但要注意弹性系数不是一成不变的。居民用户、商业用户和工业用户的弹性差异非常大工业用户里电解铝、水泥这类高耗能行业对电价的敏感程度远高于一般制造业商业用户的空调负荷可调性很强居民用户的弹性则高度依赖收入水平和电价占生活支出的比例。做精细评估的时候需要分用户类型各自标定弹性系数再做加权聚合。5.2 模型边界哪些事情它算不准这个模型本质上是静态的、聚合性的它假设用户会对电价做出瞬时、确定性的响应。但在真实电力系统里以下因素会让实际效果打折扣。第一负荷变化有爬坡约束。晚高峰负荷不是瞬间降下来的用户调整空调温度、启动蓄冷设备都需要时间聚合到系统层面会体现为一段过渡过程。第二用户舒适度约束没有建模。空调负荷的削减超过一定限度用户会感觉不舒服然后手动把温度调回来这部分反弹效应会抵消模型预测的削峰效果。第三分布式光伏和储能没有纳入。光伏出力旺盛的午间时段净负荷本来就低如果分时电价还把午间设为高峰就会造成光伏消纳和削峰目标之间的冲突。我在实际项目中的处理方式是把这个模型当作理想响应上限来用。先用它算出理论上的最佳削峰量再乘一个用户实际响应率系数一般取0.6到0.8得到更保守的工程估算值。这样既保留了模型的结构又不至于把方案效果吹得过大。5.3 从固定分时电价到动态电价寻优这套模型的另一个扩展方向是把分时电价本身从输入变成输出用优化算法去搜索最优的电价时段划分和电价水平。传统做法是做敏感性分析比如把峰段电价从1.2元逐档调到1.5元观察峰值负荷和负荷率的变化选择综合效果最好的方案。更进阶一点的做法是引入智能寻优算法。固定分时电价本质上是一个静态策略而负荷是动态变化的如果想让电价实时跟随系统供需状态变化可以尝试强化学习这条路用DQN或者PPO这些算法训练一个定价智能体让它根据当前负荷水平决定下一时段的电价调整幅度目标函数就设为峰谷差最小化和用户满意度最大化。matlab里做这个方向的好处是生态完整从负荷数据生成、仿真环境搭建到强化学习算法都有配套的模块不需要在多个软件之间来回倒数据。我建议的思路是先从现有模型跑出详细的负荷响应数据集再用这些数据作为强化学习环境的仿真底座这样可以避免直接用真实电网数据训练带来的安全风险。5.4 更精细的时空维度和不确定性处理最后说两个可以直接落地的升级方向适合已经跑通基础模型的读者继续往下做。一个是时间维度细化。24小时模型粒度还是太粗实际的峰时段往往只有2到3个小时细分到15分钟或者5分钟能更精确地刻画电价突变时刻的负荷响应行为。时间粒度细化之后弹性矩阵的标定数据量要求也上去了需要从小时级数据换成96点或288点负荷数据。另一个是不确定性处理。分时电价方案在实际执行中会遇到用户响应不确定、气温波动、节假日负荷模式变化等随机因素。可以在现有确定性模型外面加一层蒙特卡洛仿真对弹性系数取分布形式而不是固定值比如假设自弹性系数服从正态分布跑几百次仿真看削峰填谷指标的置信区间。这样给决策者的不是一个单点数字而是一个大概率落在哪个范围内的结论比单一仿真结果有说服力得多。我个人在实际操作中的体会是弹性系数宁可取小一点也别取大。很多人为了让削峰效果好看把自弹性系数调到-0.4以上结果仿真曲线漂亮得惊人但实际落地根本达不到。先跑通固定分时电价这条主线观察响应前后曲线的形态是否合理再逐渐调整弹性系数和电价水平这会让你少走很多弯路。
返回列表