资讯详情

资讯详情

基于Matlab的储能调峰容量需求分析与仿真实现

干电力系统规划与储能配置这几年储能辅助电力系统调峰的容量需求问题几乎每个项目都要碰一次。电网夜间低谷负荷低于常规机组最小技术出力、白天尖峰时段又顶不上去储能通过充电和放电进行电量平移是解决调峰缺口的重要手段。但“到底该配多少功率、多少能量”很多人会凭经验拍脑袋或者直接把“最大峰谷差乘以某系数”当成结论。这篇文章把一套可复现的容量需求分析思路和Matlab计算代码完整拉出来覆盖典型日净负荷曲线构建、削峰填谷仿真、容量参数扫描和常见坑点适合刚接手储能调峰配置的工程师也适合想用代码验证设计方案的从业者参考。1. 储能调峰容量需求先搞清楚在算什么1.1 调峰与储能的角色电力系统调峰本质上是在应对负荷在一天甚至一周内的剧烈波动。白天工商业用电集中傍晚居民用电叠加负荷曲线向上冲后半夜大部分用户入睡负荷又快速回落。传统火电机组有最小技术出力限制不是想压到多低就能压到多低水电受来水和蓄水能力约束新能源出力又往往与负荷时序不匹配。这种情况下系统就出现了双重压力高峰时段机组容量不够用低谷时段消纳不了多余电力。储能参与调峰的物理过程很简单低谷段当“用电户”充电把电网暂时用不掉的电量存起来高峰时段当“发电厂”放电把储存的能量回送电网。这样一来净负荷最高点被压低最低点被抬升传统机组的调节负担就降下来了。但实际工程中不能只讨论方向要回答一个具体的数量问题需要多大的充放电功率需要多少可容纳的能量才能把调峰缺口补上。1.2 容量需求由哪几个数字组成储能容量需求不是单一变量至少包含三块额定功率单位MW或MWh/h决定了储能系统在一个调度时段内能持续充放的最大速率。额定能量单位MWh决定了系统能容纳或释放多少电量直接关系削峰的持续时间。可用能量窗口和SOC荷电状态范围储能电池不会在0%到100%之间随意使用实际可用区间通常只有80%左右这是容量需求计算必须扣除的冗余。打个比方储能系统像一个蓄水池。功率决定了水管的粗细能量决定了水池有多大。水管再粗水池太小一个高峰时段放完就没电了水池很大但水管太细又来不及在尖峰时段释放出足够多的功率。所以容量需求的本质就是对“功率”和“能量”的联合寻优同时还要考虑充放电效率、SOC保守区间和调度策略。这套思路看起来不复杂真正跑起来后细节问题多得是。2. 整体思路与方案选型2.1 常用计算方法对比目前业内做储能调峰容量需求分析常见的有几种做法。第一种是“最大峰谷差换算法”直接用日最大负荷和最小负荷的差值作为所需削峰量再乘上某个小时数得出容量。这个方法最简单但误差极大。峰谷差只是瞬态差值并没有回答“这个差值要维持多少小时”也没考虑新能源汽车、负荷曲线形状、储能SOC约束最后结果经常离谱。第二种是“典型日时序仿真法”挑一个能代表系统紧张程度的典型日或者冬夏两个典型日把负荷和新能源出力做成时序曲线让储能按削峰填谷策略在每一个时段充放电再通过反复计算寻找满足调峰目标的最小功率和能量组合。这个方法兼顾了曲线形状、效率和SOC约束计算量适中很适合方案前期和可研阶段。第三种是“全年8760小时生产模拟”把全年每个小时的负荷、新能源、机组启停状态全部建模用线性规划或混合整数规划优化储能容量。这种方式最严谨也能把机组组合、备用容量、爬坡约束都纳入进来但数据要求高计算时间长一般放到初步设计或系统级规划再上。我在容量需求估算项目中大部分场景先落典型日时序仿真。原因很直接容量需求的初步结论不需要精确到小数点后几位更重要的是抓住“峰谷缺口持续多长时间、可用能量够不够、效率损耗多大”时序仿真刚好都能体现。如果典型日都扛不住全年结果大概率更紧张反过来典型日结果可以作为全年仿真的初值大幅缩短后续优化时间。2.2 净负荷曲线才是计算的出发点无论采用哪种方法第一步都是把系统负荷曲线和新能源出力曲线合并成“净负荷曲线”。这里的“新能源”以风电、光伏为主逻辑是电网调度必须优先消纳新能源所以在看调峰需求时把新能源出力从总负荷里扣掉剩余的部分才是必须由常规电源和储能共同平衡的净负荷。净负荷曲线比原始负荷曲线更能反映真实的调峰压力。一条原始负荷曲线看起来峰谷差不大但如果叠加一个“白天强、夜间弱”的光伏出力净负荷可能在傍晚出现急剧爬升形成典型的“鸭子曲线”这时调峰需求并不小。如果用总负荷曲线来定储能容量很可能严重低估。所以我在开头一再强调负荷、新能源、净负荷这三组数据尽量都提前处理好再进入储能容量计算。2.3 经济性指标如何参与定容容量需求研究的背后不只是技术可行性还有经济性平衡。储能功率和容量越大调峰效果越好但投资也越高。单靠“头上限设到多少”来选结果工程上往往不可行。所以我们在参数扫描时通常会给每个“功率容量”组合折算一个综合成本再从中挑选满足调峰目标的最小成本方案。综合成本里常见项包括单位功率造价、单位能量造价、运维成本、预期循环寿命等。为了简化我会在扫描代码中加入一个成本函数单位取万元或百万元等级不求绝对精确只求方案之间存在比较关系。这个思路在工程上很有用技术可行是底线经济可承受才是最终选型依据。下面的Matlab代码也把这个成本逻辑体现在参数扫描环节读者可以按自己的造价参数替换。3. 关键参数与计算流程3.1 参数整定表在做容量需求仿真前以下参数必须提前定好。我把常用参数清单整理成一张表方便对照取值。参数含义典型取值/处理方式净负荷序列 P_net负荷减去新能源出力的逐时段功率单位MW步长可为15min、30min或1h峰目标 P_peak_target储能投入后希望达到的最大净负荷一般取系统可接受的开机上限或考核值谷目标 P_valley_target储能投入后希望达到的最小净负荷一般取常规机组最小出力以上某值储能额定功率 P_rated候选储能充放电功率上限扫描范围按峰谷缺口的10%~100%设置储能额定能量 E_rated候选储能容量扫描范围按峰值持续时间估算充电效率 eta_ch交流侧输入到电池侧的转换效率0.90~0.95放电效率 eta_dis电池侧释放到交流侧效率0.90~0.95SOC下限 soc_min电池允许的最低荷电状态0.1左右SOC上限 soc_max电池允许的最高荷电状态0.9左右初始SOC soc_0仿真开始时的荷电状态一般取50%这些参数看起来琐碎但对结果影响非常大。比如效率如果全部设为1储能容量会被低估10%以上SOC上限定得太高会忽略实际电池保护策略最终容量配置偏紧。我建议哪怕只是估描也不要随便省掉这些参数。3.2 容量需求计算五步走在实际项目中我习惯把整个计算过程拆成五步数据准备整理至少一个典型日的负荷曲线和新能源出力曲线合成净负荷做异常值清洗。目标设定从系统实际约束出发明确削峰后的最大净负荷目标和填谷后的最小净负荷目标。目标不是拍脑袋通常来自“不增开机组”“不弃新能源”“保证最小技术出力”等运行条件。候选组合枚举给定一组候选P_rated和E_rated如功率从50MW到300MW、容量从100MWh到1000MWh逐档扫描。时序仿真按每个候选组合以SOC约束和效率修正为条件仿真储能在典型日内的逐时段出力。结果筛选检查仿真后的最大/最小净负荷是否满足目标接着按成本排序输出推荐方案。这个流程最大的价值是把“漫无目的拍容量”变成了“约束条件下的搜索问题”。后面会看到Matlab代码也是按这五步组织的。3.3 效率修正和SOC约束怎么进公式储能仿真最核心的公式是充放电后SOC的变化关系。设当前时段储能出力为P_batt放电为正、充电为负时间步长为dt则放电时SOC(k1) SOC(k) - P_batt * dt / (E_rated * eta_dis)充电时SOC(k1) SOC(k) - P_batt * eta_ch * dt / E_rated 此时P_batt为负值相当于增加SOC注意充放电效率的作用点不一样。一般厂商给的效率是“交流侧到电池侧”或“电池侧到交流侧”的单程效率不能简单地对P_batt统一乘一个效率。这个错误我在早期代码里犯过后果是仿真结果偏高实际系统到了峰时放不出计划电量。SOC上下限在控制环节也必须是“硬约束”如果当前SOC已经低于下限再大的放电指令也得被截断同理SOC接近上限时充电指令得降下来。这就是为什么不能只用“峰谷差除以效率”来求容量必须把SOC随时间的累计变化逐段算出来能量不足的问题会自然暴露。4. Matlab代码实现与运行细节4.1 数据结构与输入组织用Matlab跑这个分析最舒服的数据结构就是列向量一个时间索引列一个净负荷列。时间步长dt需要单独定义比如1小时就是dt115分钟就是dt0.25。所有候选的P_rated和E_rated可以组织成两个矩阵或循环数组。代码里使用的净负荷数据这里做一组虚构演示数据不代表任何实际系统。数据逻辑要体现“早上低谷、上午小高峰、傍晚最大尖峰”的形状这样跑出来的削峰效果更容易理解。实际项目请替换成自己系统的测记录或规划数据。4.2 核心削峰填谷仿真函数我把仿真主体封装成一个函数输入净负荷曲线、储能候选参数和调峰目标输出储能逐时出力、逐时SOC和调峰后的净负荷。写成函数的好处是后面参数扫描可以直接循环调用不需要重复复制一大段主循环代码。function [P_batt, SOC_seq, P_after, max_after, min_after] sim_storage(P_net, P_rated, E_rated, ... P_peak_target, P_valley_target, eta_ch, eta_dis, soc_min, soc_max, soc_0) % 储能辅助调峰时序仿真 % P_net: 净负荷序列MW % P_rated: 储能额定功率MW % E_rated: 储能额定容量MWh % P_peak_target: 调峰后最大净负荷目标MW % P_valley_target: 调峰后最小净负荷目标MW % 返回储能出力P_batt正放电、负充电SOC序列调峰后净负荷 N length(P_net); dt 1; % 假定时间步长为1小时 P_batt zeros(N,1); SOC_seq zeros(N,1); P_after zeros(N,1); SOC soc_0; for t 1:N % 期望出力超越峰值上限则放电低于谷值下限则充电 if P_net(t) P_peak_target P_des min(P_rated, (P_net(t) - P_peak_target) / eta_dis); elseif P_net(t) P_valley_target P_des -min(P_rated, (P_valley_target - P_net(t)) * eta_ch); else P_des 0; end % 根据SOC约束限制实际出力 E_now SOC * E_rated; if P_des 0 % 放电可用放电量受SOC下限限制 P_max_dis (SOC - soc_min) * E_rated * eta_dis / dt; P_batt(t) min(P_des, P_max_dis); E_next E_now - P_batt(t) * dt / eta_dis; else % 充电可充电量受SOC上限限制 P_des_ch -P_des; P_max_ch (soc_max - SOC) * E_rated / (eta_ch * dt); P_actual_ch min(P_des_ch, P_max_ch); P_batt(t) -P_actual_ch; E_next E_now P_actual_ch * eta_ch * dt; end SOC E_next / E_rated; SOC_seq(t) SOC; P_after(t) P_net(t) - P_batt(t); end max_after max(P_after); min_after min(P_after); end这段代码的关键点在于“目标越限”逻辑。只有净负荷实际超过峰值目标时才放电低于谷值目标时才充电中间区域储能不动作。实际调度中可能还需要储能此前瞻性充电或放电但作为容量需求估算这个规则是够用的它能在不依赖复杂优化器的情况下直接告诉你“给定目标下储能是否需要动作、需要多少能量”。4.3 参数扫描找最小可行方案单个组合跑完只得到一个结论容量需求需要在功率、能量的二维平面上看整体关系。下面用双循环扫描候选组合并记录满足调峰目标的方案和简化成本。% 参数扫描寻找最小可行储能容量 P_net [760,700,680,660,650,640,720,820,940,1010,990,960,930,950,980,1010,1060,1120,1090,1020,940,860,800,760]; P_peak_target 950; % 削峰目标上限 MW P_valley_target 700; % 填谷目标下限 MW eta_ch 0.92; eta_dis 0.92; soc_min 0.1; soc_max 0.9; soc_0 0.5; P_range 50:10:200; % 候选功率 MW E_range 100:50:1000; % 候选容量 MWh feasible []; for ip 1:length(P_range) for ie 1:length(E_range) P_rated P_range(ip); E_rated E_range(ie); [~, ~, ~, max_after, min_after] sim_storage(P_net, P_rated, E_rated, ... P_peak_target, P_valley_target, eta_ch, eta_dis, soc_min, soc_max, soc_0); % 检查是否满足调峰目标 if max_after P_peak_target 0.1 min_after P_valley_target - 0.1 % 简化投资成本单位百万元量级只是用于排序 cost 0.35 * P_rated 0.06 * E_rated; feasible [feasible; P_rated, E_rated, max_after, min_after, cost]; end end end % 按成本排序输出最小成本方案 if ~isempty(feasible) feasible_sorted sortrows(feasible, 5); disp(可行方案按成本升序); disp(array2table(feasible_sorted, VariableNames, ... {P_MW,E_MWh,max_MW,min_MW,cost})); else disp(当前参数范围内无可行方案请放宽目标或扩大扫查范围。); end我故意把目标上限设在950MW、下限设在700MW对应图中的虚构净负荷序列。原曲线最大净负荷约1120MW最小约640MW峰谷差约480MW。如果只按“峰谷差”拍容量很容易得出一个“150MW/4h”之类的方案但实际逐时段仿真后会发现峰值时段集中在傍晚几个小时谷值时段在凌晨同样的150MW功率下容量需求其实跟峰值缺口的持续时间密切相关。这套代码还可以直接扩展成“全年逐日扫描”无非是外层再加一个“日序号”循环把每一天的净负荷曲线逐条喂给sim_storage函数再统计全年不满足目标的天数。通常工程上会要求保证率比如“全年98%以上天数满足调峰目标”这时扫描条件就从“典型日可行”变成“全年不满足天数小于阈值”。4.4 运行结果解读用上面虚构数据跑完常见的输出结果会有三组差异明显的特征。当P_rated取80MW、E_rated取400MWh时凌晨充电时段能把低谷抬到700MW附近但傍晚削峰到950MW以下后电池容量可能提前耗尽造成后半段净负荷重新冲高当P_rated取120MW、E_rated取200MWh时功率够大但能量太少放电不到两小时SOC就撞下限同样不合格。真正可行的方案往往出现在功率和能量都比较“均衡”的区间比如120MW/500MWh或者100MW/650MWh。这个现象很有工程意义储能调峰不是“功率越大越好”或“容量越大越好”而是在特定峰形下的能量匹配问题。如果峰值持续时间短但很尖大功率小容量可能就够了如果峰值持续时间长且平缓那就需要更大的能量池子。5. 实操中常见的坑与排查技巧5.1 数据预处理里的“隐形坑”净负荷数据如果是公开或不完整的常见问题是时间步长不统一。有的数据是15分钟分辨率有的则是1小时整点混合使用会导致功率与能量的换算出错。另一个问题是异常值比如某时段新能源出力超过负荷净负荷出现负值。这不是不可能尤其是光伏大发的中午时段而在这种时段储能充电策略是完全不同的。如果代码里不处理负净负荷削峰判断逻辑就会混乱。我的建议是进入仿真前把数据统一到同一时间分辨率并用插值补齐缺失时段对负净负荷单独打标签可以把它视为“需要填谷的最极端场景”或者根据实际消纳条件调整谷值目标。5.2 SOC初始值设定不当导致结果失真仿真第一天如果SOC从0开始那么凌晨充电时可用容量很充足但如果典型日开始于傍晚高峰SOC从0开始会导致第一天削峰完全失效。许多人在跑全年逐日仿真时不注意“日间SOC连续”的问题每天清零SOC或不考虑前一天剩余电量会导致结果严重高估容量需求。正确做法是典型日单日仿真时选择一个合理的初始SOC比如50%如果是全年连续仿真就必须让SOC跨日传递不能每天重置。我遇到过一次情况日仿真结果要求400MWh改成跨日连续仿真后只要300MWh差异大得离谱。原因是前一天傍晚高峰放电后SOC已经很低如果重置为50%相当于每天免费赠送了一多半储能电量。5.3 峰/谷目标设置不合理导致容量虚高容量需求研究里最容易被质疑的就是P_peak_target和P_valley_target的取值。这两个值设置得太极端会导致储能容量需求暴涨设置得太宽松又可能实际上不需要储能。实际操作中这两个值应该来自电力系统的实际约束。比如某区域电网在低谷时段有大量供热机组最小技术出力合计约700MW而夜间负荷只有640MW那么为了不弃电、不压供热机组P_valley_target取700MW就是合理的如果系统允许少量深度调峰目标就可以相应放宽。峰值目标通常跟系统备用容量、输电通道约束有关目标设得越低储能需要承担的任务越重。调试代码前先把这两个目标值写成“推导过程”而不是直接塞一个数字这样后面对外解释时也有底气。5.4 常见问题排查速查表问题现象可能原因排查方向仿真后最大净负荷仍然超过目标储能功率不足或能量提前耗尽查看SOC曲线是否触底提高P_rated或E_rated最小净负荷低于谷值目标充电功率不够或SOC已满查看凌晨时段充电是否受限提高E_rated上限可行方案列表为空P_peak_target或谷目标设置过紧先放宽目标确认原曲线在不加储能时的缺口量级SOC曲线长期处于0.9以上容量过大或充电控制过于保守适当减小E_rated或提高放电触发逻辑参数扫描速度极慢双循环规模过大先粗扫找趋势再在最优附近细扫成本排序结果不符合直觉成本函数中功率/容量系数不合理核对单位造价系数优先反映真实投资趋势这些坑大部分不是算法复杂造成的而是参数和边界条件没对齐。我建议每次改完参数都先把“不加储能”的基准峰谷差打出来再对比储能后指标任何与预期不符的瞬间都能快速定位是逻辑问题还是参数问题。6. 我对这套方法的一点补充思考代码能跑通不代表结论可以直接用到工程上。典型日仿真最大的价值是通过一两条代表性曲线把容量量级算明白但它替代不了一年365天的天气波动、设备检修计划、新能源出力的随机性。工程上我一般把典型日结果作为初选再用全年8760小时数据跑一遍时序生产模拟最后还要留出10%~20%的容量备用系数防止极端寒潮或特殊运行方式下缺口扩大。另外目前代码采用的是启发式“越限即动作”策略没有考虑电价、峰谷套利和辅助服务收益。如果研究方向是经济性最优容量配置建议在仿真基础上接入线性规划把目标函数改成“年化投资成本运行收益最大”约束里加入机组组合和充放电功率平衡。这样得到的容量需求才真正贴近市场环境而不是单一技术约束下的答案。我在实际使用中发现容量需求研究最花时间的往往不是算法本身而是把负荷曲线、新能源出力、机组参数和运行约束整理成仿真输入。这个预处理如果做得扎实Matlab代码其实很快就能给出初步结果后续调整也不需要大改。建议刚开始接触这个方向的朋友先把典型日单点算通再把方案扩展到全年扫描最后再上优化算法。这个路径踩过的人比较少但走起来最稳。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →