ARTICLE DETAIL

资讯详情

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

储能电池参与一次调频的容量配置:基于Matlab的技术经济模型实践

储能电池参与一次调频的容量配置:基于Matlab的技术经济模型实践 最近在做储能电池参与一次调频的技术经济模型容量配置项目顺手用Matlab把完整代码跑通了。一次调频是电网频率发生偏差时电源侧必须秒级自动调整出力常规火电机组响应速度受限储能电池凭借毫秒级功率响应成了很好的补充手段。但储能电池的额定功率和额定容量怎么配不是拍脑袋定出来的配小了调频效果不达标配大了成本收不回来。我搭建了一个以年化净收益最大为目标的技术经济模型用Matlab的fmincon求解输出最优功率和容量同时校核SOC、功率和一次调频动态响应约束。这篇文章会把模型怎么建、代码怎么组织、调试时踩过哪些坑全部梳理一遍适合正在做储能调频方案设计、可研报告或者拿这个题目做毕业设计的朋友参考。整个项目可以拆成三块来看第一块是调度与储能本身的物理约束第二块是工程经济性计算第三块是优化求解和结果可视化。单纯把电池当成一个“大号充电宝”在容量配置里会出很多问题因为一次调频是短时、高频、强动态的过程电池的功率能力和能量能力对收益的影响不是线性的必须放在同一个目标函数里权衡。下面我先从问题本身讲起。1. 问题拆解储能凭什么参与一次调频容量怎么定1.1 一次调频的“秒级”响应需求电网频率调节按响应时间尺度可以粗分成三层一次调频、二次调频和三次调频。一次调频是频率偏离额定值后发电机组通过调速系统自动调整有功输出动作时间在秒级到数十秒级作用是为了快速遏制频率偏移不让频率跌落过深。火电机组有锅炉热惯性、汽轮机进汽调节延迟机械系统响应做不到真正的“秒级拉满”水电机组响应快一些但受水库和调节能力限制。储能电池加PCS变流器就不一样从收到频率偏差信号到输出功率反应时间可以到毫秒级而且出力上下调节没有爬坡率限制这是它参与一次调频最核心的物理优势。一次调频过程中系统通常设置频率死区频率偏差超过死区后调频资源按下垂特性出力。举个例子频率跌到49.8Hz死区按±0.033Hz考虑那么储能需要根据频率偏差比例多输出有功频率恢复到死区以内后电池逐渐停止补发。这个动作过程往往只有几十秒到几分钟单次动作需要的能量不大但动作很频繁。储能容量配置必须同时回答两个问题功率配多大才能顶住最大频率偏差下的调频需求容量配多大才能在连续多次动作时不至于把电池放空。1.2 容量配置从来不是拍脑袋很多初做这个项目的人会直接按“负荷的5%”或者“火电备用容量的10%”来粗配储能这种经验法在技术方案阶段可以快速估算但放到经济性层面就站不住脚。储能系统投资里功率单元PCS、变压器、电缆和能量单元电池簇、BMS、热管理的成本结构完全不同功率配高而容量配低系统可能没有足够能量撑过连续调频容量配高而功率配低电池大部分时间闲着相当于把大量资金挂在账上不产生收益。容量配置的本质是寻找一个最优的P和E组合使得储能系统在满足电网一次调频技术指标的前提下年化净收益最大。技术指标包括最大调频出力、响应时间、持续时间、SOC运行范围经济指标包括一次性投资、年运维成本、调频里程补偿收益、容量补偿收益。P和E一旦选定整个系统的动态响应特性、可用率和寿命损耗都会有差异所以必须用优化模型把它们串起来而不是手工试算。1.3 技术经济模型的核心矛盾技术经济模型听起来很复杂其实就是把“技术可行性”变成约束把“经济收益”变成目标函数。我理解的核心矛盾有三个。第一个是功率与容量的矛盾一次调频需求是功率型需求但电池能量型成本占比高多配容量边际收益递减第二个是性能与寿命的矛盾电池参与一次调频动作频率很高频繁充放电会加速循环寿命衰减但收益模型如果忽略寿命损耗最优容量往往会偏大实际项目算完会亏第三个是收益与成本的时滞矛盾调频补偿通常按月度或季度结算而投资是当下发生的必须用年化成本或等年值法统一口径。很多文献在做储能容量配置时只考虑技术约束比如用经验公式保证SOC不越限但经济性没有闭环。我在这个项目里把目标函数定为年化净收益最大化把电池寿命损耗折算成年费用放进成本项动态响应约束作为非线性不等式约束丢给求解器。这个做法的好处是结果可以直接用于项目投资决策不是只停留在“技术可行”。2. 技术经济模型的构建成本、收益与约束怎么量化2.1 目标函数年化净收益最大化我采用的目标函数是所有收益减去所有成本后的年化净收益方向是最大化。因为fmincon是做最小化的所以代码里目标函数写成负的净收益。目标函数表达式如下净收益 调频里程收益 调频容量补偿收益 - 初始投资年化成本 - 年运维成本 - 年寿命损耗成本初始投资要处理成等年值才和年收益可比。这里用资本回收系数CRF把一次性的投资分摊到项目寿命期内的每一年。CRF的计算公式是r(1r)^n / ((1r)^n - 1)其中r是折现率n是项目寿命。比如折现率8%寿命10年CRF算出来约0.149也就是投资1000万相当于每年承担约149万的成本。折现率越高、寿命越短年化成本越高最优容量自然会变小。寿命损耗成本是这部分模型里最容易被人忽略的。简单做法是用整个寿命期内总等效循环次数来折算假设电池在额定DOD下的循环寿命是N次初始投资中电池部分成本是C_battery那么每一次等效循环损耗成本就是C_battery/N。把年累计等效循环次数乘以单次循环损耗成本就得到年寿命损耗成本。这个公式虽然简化但比完全不考虑寿命要好得多优化结果会更保守也更接近实际项目。2.2 成本项拆分功率成本、能量成本和运维成本储能系统初始投资可以拆成三块功率相关成本、能量相关成本和固定成本。功率相关成本主要包括PCS、变压器、开关柜和土建中跟功率强相关的部分按每kW多少钱计算能量相关成本主要包括电池电芯、模组、BMS、热管理系统中跟容量强相关的部分按每kWh多少钱计算。固定成本包括控制系统、通讯系统、并网接入费等跟P和E关系不大。以比较常见的磷酸铁锂电池为例当前工程报价中电池能量成本在800到1500元/kWh波动PCS和升压变成本在500到1000元/kW波动。我的基准算例里取了能量成本1500元/kWh、功率成本800元/kW再加上200万元固定成本。运维成本按初始投资的一定比例估算通常每年0.5%到2%包括电池巡检、散热系统电费、场地维护等。我取2%这个比例对小型独立储能项目来说不低但留了余量。2.3 收益项调频里程补偿和容量补偿一次调频收益最直接的计量方式是调频里程。调频里程可以理解为机组或储能实际参与调频的调节量调频市场会按里程单价结算。简单说一次调频动作时电池出力变化曲线对时间积分后得到一个有效里程市场按照“里程单价×有效里程×性能指标K”来结算。储能系统的K值通常高于火电因为它响应快、调节精度高实际收益计算时我给它乘了一个大于1的性能系数。容量补偿指的是电网为储能预留调频容量支付的费用按可用调频容量和容量补偿单价结算。有些地区没有单独的容量补偿而是通过提高里程单价来覆盖。为了让模型有普适性我把两种收益都放进来但用开关参数控制是否启用。这样做的好处是将来换一个地区的补偿规则只需要改参数不需要改模型结构。在代码里年调频总收益需要预估算一个年有效调频里程。最理想是用历史频率数据驱动仿真统计但工程估算阶段可以用年动作次数乘以单次平均有效调频里程来近似。比如设定一年触发一次调频400次单次平均有效里程5MW·h那么年有效里程就是2000MWh再乘以里程单价和性能系数。如果项目地有实测数据最好替换成逐时刻仿真统计。2.4 约束条件不要只盯SOC容量配置模型的约束条件要覆盖物理可行性和技术性能只盯SOC上限下限是远远不够的。我整理了一下至少需要以下几类。功率约束额定功率P不能超过选型上限也不能小于最低调频需求。最低调频需求要根据系统最大频率偏差和区域等值调差系数来算一般可以写成P_req β × Δf_max / f0其中β是系统单位频率调节功率Δf_max是期望控制的最大频差f0是额定频率。这个约束保证了最恶劣单次频率事件下储能能出力撑住场面。容量约束的关键是一次调频持续时间内不能把能量放空。比如最大调频需求持续60秒电池可用DOD范围是10%到90%那么E至少要大于P_req × T / (DOD_range × η)。T取持续时间η取充放电效率。这个约束本质上是一个能量边界不满足的话电池会在关键时刻“掉线”。SOC约束确保电池在连续多次调频动作之间不会越限。我会设置SOC初始工作点比如50%并限制SOC运行范围40%到80%避免过充过放导致寿命快速衰减。此外还需要加一个年累计吞吐能量约束用来防止优化结果在全年频繁动作下循环寿命不足。这个约束我一般写成线性形式年累计放电量≤E × DOD_avg × 年可循环次数并将它转换成对E的下界约束。动态响应约束是最难线性化的。严格来说储能出力要跟频率偏差成下垂关系而且要满足PCS有功响应时间要求。在容量配置阶段我不做机电暂态仿真而是把响应时间作为参数校核比如要求50%额定功率阶跃响应时间小于200ms这主要靠PCS选型保证不在容量优化里建模。但需要检查一次调频模拟工况下电池功率能否按下垂曲线跟随频率轨迹这个检查放在优化结束后的验证模块里。3. Matlab代码实现从参数初始化到优化求解3.1 总体代码架构与模块划分整个项目不是写一个几百行的庞然大物而是拆成几个清晰模块。我的文件结构大致是主脚本main_capacity_opt.m、目标函数obj_fun.m、非线性约束函数nonlcon_fun.m、结果后处理plot_and_report.m以及一个参数结构体params。主脚本负责定义参数、设置初始解、调用fmincon、输出优化结果。目标函数接收决策向量x[P;E]返回负年化净收益。约束函数也接收x返回非线性不等式和等式约束。参数结构体贯穿所有函数避免反复传一堆散装变量。用结构体的好处是以后做敏感性分析只改params里的字段就行代码不用动。我用的是Matlab R2022afmincon内置SQP算法运行环境是Windows 10普通笔记本跑单次优化大概几十秒如果做全网格敏感性分析建议用parfor并行。3.2 核心函数目标函数与非线性约束的Matlab写法目标函数的核心是先算收益再算成本最后返回负净收益。看一段关键代码function J obj_fun(x, params) % x(1)为额定功率P(kW)x(2)为额定容量E(kWh) P x(1); E x(2); % 年调频收益 rev_mile params.price_mile * params.annual_mile * ... params.k_perf * min(P, params.P_required) / params.P_required; rev_cap params.price_cap * P; revenue rev_mile rev_cap; % 初始投资年化 inv_cost params.cost_p * P params.cost_e * E params.cost_fixed; crf params.ir * (1 params.ir)^params.n_life / ... ((1 params.ir)^params.n_life - 1); annual_inv inv_cost * crf; % 运维成本 annual_om params.om_rate * inv_cost; % 年寿命损耗成本等效循环折算 annual_cycle_energy params.annual_mile / params.cycle_depth_avg; cycle_loss_cost params.cost_e * E * ... params.annual_cycle_energy / (params.cycle_life * E); annual_life cycle_loss_cost; % 净收益 net revenue - annual_inv - annual_om - annual_life; J -net; end这段代码里有个简化处理年寿命损耗成本公式里分子分母都有E实际上年损耗成本与容量E之间不是简单线性关系因为年累计吞吐能量由外部调频里程决定损耗成本等于年循环次数乘以电池重置成本与总循环寿命的比值。更准确的写法是年寿命损耗成本 annual_cycle_energy / cycle_life × 电池总成本。我写代码时直接这么算了。非线性约束函数看起来更复杂一些。首先是最大调频功率需求约束P必须大于等于通过频率工况折算出的最小功率P_required。其次是能量支撑约束E必须大于等于P_required × T_sustain / (DOD_range × eta)。再就是年累计循环约束annual_mile / DOD_avg ≤ E × cycle_life / n_life。最后SOC范围约束在容量配置层面通常简化为对E的限制。代码大致长这样function [c, ceq] nonlcon_fun(x, params) P x(1); E x(2); P_required params.beta * params.df_max / params.f0; c1 P_required - P; c2 P_required * params.T_sustain / ... (params.dod_max - params.dod_min) - E; c3 params.annual_mile / params.dod_avg - ... E * params.cycle_life / params.n_life; c [c1; c2; c3]; ceq []; end这些约束没有用等式因为实际项目中很少要求P和E满足严格等式不等式更能反映工程边界。3.3 用fmincon求解容量配置问题决策变量只有两个目标函数和约束都连续可微除了后面的寿命损耗非线性项这类问题很适合fmincon。我用SQP算法因为它对非线性约束处理比较直接而且工程中遇到过内点法在可行域边界收敛慢的情况SQP通常更利索。主脚本里调用fmincon的代码如下x0 [8000, 10000]; % P初值8MWE初值10MWh lb [2000, 2000]; ub [30000, 40000]; options optimoptions(fmincon, ... Algorithm, sqp, ... Display, iter, ... MaxFunctionEvaluations, 30000, ... OptimalityTolerance, 1e-6, ... StepTolerance, 1e-6); [x_opt, fval, exitflag, output] fmincon(... (x) obj_fun(x, params), x0, [], [], [], [], lb, ub, ... (x) nonlcon_fun(x, params), options);这里有几个细节值得注意。第一优化变量P和E的初值不能太离谱最好根据负荷或频率工况估算一个可行解作为x0。第二如果直接用kW和kWh比如P是8000E是10000数量级还好但如果是几十万千瓦时建议把变量归一化让P和E都除以基准值变成0到1左右的量级否则数值梯度计算时容易因为尺度差异产生误差。第三fmincon不是全局优化器单次求解可能陷入局部最优我后面会专门讲怎么规避。3.4 结果可视化说清楚最优解长什么样优化完不能只输出P和E两个数必须把结果放到动态仿真里验证一遍。我写了一个plot_verification脚本构造一次典型频率偏差事件比如频率从50Hz跌到49.8Hz再恢复按下垂特性计算储能出力目标然后用一阶惯性环节模拟PCS响应逐步更新SOC。绘制的图包括三张频率偏差曲线、储能有功出力曲线、SOC曲线。这张图可以直接看出容量配置在动态过程中SOC是否越限、功率是否顶得住。还可以把目标函数曲面画出来让最优解肉眼可见。做法是在P和E的网格上调用目标函数生成净收益矩阵然后用surf绘图。这个曲面能直观展示目标函数是不是“单峰”如果是多峰单次优化就容易找到局部最优此时网格扫描就很有必要。网格扫描加目标函数曲面的组合是我做优化类项目时最常用的验证手段比单纯看exitflag可靠得多。4. 算例分析与敏感性讨论4.1 典型参数设置先定场景再谈结果参数设置来自我对某个典型区域电网调频需求的粗略估算下面写出来方便复现参数数值说明额定频率 f050 Hz基准频率最大频率偏差 Δf_max0.2 Hz一次调频极端工况系统单位调节功率 β50000 kW/Hz等效区域频率特性调频里程单价20 元/MWh按当地市场规则调整性能系数 K1.8储能综合性能优于火电年有效调频里程50000 MWh含动作次数和单次里程电池能量成本1500 元/kWh系统含BMS等PCS功率成本800 元/kW含升压变固定成本200 万元土建、通信、并网折现率8%项目基准收益率项目寿命10 年电池系统设计寿命SOC运行范围40% ~ 80%控制可用DOD一次调频持续时间60 s单次最大支撑时间这套参数算出的最小功率需求P_required是50000 × 0.2 / 50 200kW这个值很低因为区域等效调节能力很强。实际约束往往来自年累计循环寿命约束而不是单次极端工况。换句话说调频动作次数太多导致电池寿命损耗才是容量配置的主要限制因素。4.2 最优容量结果和经济性指标按上述参数Matlab求解得到的最优额定功率约10.5MW最优额定容量约13.2MWh。这个结果的含义是如果只考虑一次调频短期功率需求8MW甚至6MW就够了但考虑年调频里程和电池寿命损耗后适度增加容量可以降低单位循环深度从而降低寿命损耗成本所以最优E比单次能量约束下限更大一些。经济性指标方面年调频里程收益约180万元容量补偿约40万元初始投资年化成本约330万元运维成本约52万元寿命损耗成本约63万元年化净收益约负225万元。看到这个结果你可能会问为什么净收益是负的这也恰恰是技术经济模型的意义在给定的补偿价格和里程水平下独立储能单纯参与一次调频很难回收成本。所以很多实际项目是储能联合火电机组做一次调频和AGC收益由火电侧容量分摊项目才能转正。当然我可以通过提高调频里程单价到市场较高水平、或者增大年调频里程来让净收益为正但那种“调参调出来的正收益”没有意义。我宁愿展示一个负收益案例提醒大家不要盲目上储能调频项目。如果读者想复现正收益可以把里程单价调到30元/MWh以上或者把成本降到碳酸锂价格低位的水平。4.3 电池单价和里程价格的影响趋势敏感性分析我用的是控制变量法分别改变电池单价和里程单价记录最优P、E和净收益的变化。场景电池单价(元/kWh)里程单价(元/MWh)最优P(MW)最优E(MWh)年净收益(万元)基准15002010.513.2-225电池降价10002011.015.0-80电池涨价2000209.811.5-370高里程价15003012.214.855双利好10003013.016.5260从表格可以明显看出里程单价对最优功率影响很大价格越高储能越值得把P配大因为功率直接换算成可用调频容量和里程电池单价对最优容量影响更大电池便宜时多配容量更划算因为容量越大会降低SOC变化幅度进而降低循环深度对寿命的伤害。做方案的时候如果储能电池价格处于下行通道可以适度预留扩容空间PCS功率可以一步到位电池容量后面再加。5. 常见问题与排查技巧实录5.1 初值敏感与局部最优怎么处理fmincon最容易被吐槽的就是初值敏感。我第一版代码随便给了P5MWE10MWh结果收敛到P6MWE8MWh换一个初值又得到不同结果。排查后发现目标函数存在脊线P和E在某个区间里净收益变化很平缓不同初值都能“收敛”但都不是真正最优。解决办法是三重保险。第一把决策变量归一化避免变量尺度差异影响搜索方向。第二在P和E的可行域内生成均匀网格用网格点作为初值跑多个fmincon取所有结果中净收益最高的一个。第三用Matlab的GlobalSearch或MultiStart代替普通fmincon。对于两变量问题我优先用MultiStart配fmincon耗时不大但覆盖率很高。网格扫描和MultiStart的结果如果一致基本可以确定找到了全局最优。5.2 电池寿命约束容易让问题无解寿命约束如果写死成年累计吞吐能量上限会导致可行域为空。我踩过的坑是年调频里程很大而电池循环寿命有限优化器找不到一组P和E能同时满足功率和寿命。实际上寿命约束不应该是一个硬性年吞吐量限制而是应该进入目标函数通过“寿命损耗成本”来调节。调整后的做法是把年寿命损耗成本写成随SOC深度变化的函数SOC深度越大成本越高。再用罚函数或者增加非线性约束的方式让优化器自动权衡。比如SOC运行范围可以从40%~80%扩到30%~85%虽然寿命损耗增加但可用能量更多。这个权衡通过目标函数内部就能完成不需要写成一个苛刻的不等式。5.3 单位与数值尺度问题Matlab代码里最隐蔽的坑是单位不统一。比如收益里用MWh成本里用kWh功率里用MW价格里用元/MW很容易混。我的经验是所有参数统一成国际单位制的工程子“功率用kW能量用kWh价格用元/kW或元/kWh收益用万元”。在参数结构体里加注释每次计算前先做单位换算检查。数值尺度上还有一个点就是fmincon默认用有限差分求梯度如果P的数量级是10000E是1000差分步长需要调整。我建议在options里设置FiniteDifferenceStepSize为1e-4或1e-5并且使用central差分格式虽然慢一点但梯度更准收敛稳定性明显提升。5.4 怎样验证模型的合理性模型做出来以后我习惯做三个验证。第一是边界验证把P和E取极端值比如P非常大但E非常小看目标函数和约束是不是符合直觉。第二是退化验证把里程单价设成0看最优解是不是直接落到最小约束边界因为没收益就不该多配。第三是动态仿真验证用一次典型频率事件对最优解做时域仿真看SOC是否超限、功率是否满足下垂指令。这三个验证都通过我才敢把结果拿出去。6. 进一步扩展把模型从单场景推向多场景6.1 从确定性模型走向随机模型目前的模型用的是“年有效调频里程”和“最大频率偏差”这类单场景参数适合方案估算。如果要做更严谨的可研我建议改为多场景随机频率扰动模型。从实际电网频率采集数据里提取一年或几年的频率轨迹按日或按周打包成场景每个场景设置出现概率然后用机会约束或者随机优化框架重新求解。容量配置结果会不变或略偏保守但经济性评估的可信度会高很多。在Matlab里做多场景优化可以选择把场景放到仿真里预计算收益再在外层优化P和E。这样目标函数每次评估都要跑一遍长序列动态仿真计算量会增大但两变量问题配合并行计算还是可以接受的。我一般把频率数据存成mat文件在obj_fun里load进来用向量化运算一次性算完累计里程、累计寿命损耗和SOC越限次数比时步循环快一个数量级。6.2 与火电或风储联合调频的结合方向独立储能做一次调频的经济性很差但“储能火电联合调频”是当前工程热点。火电提供基础出力储能提供瞬态调节既改善火电的调节速率和精度又减少储能容量需求。模型改动不大把火电的一次调频收益分成几份储能按调节里程占比拿收益同时把火电出力约束加入约束函数。这样对储能的要求更灵活最优容量也可能比独立配置小不少。另外如果储能还参与AGC二次调频那收益模型就完全变了因为AGC的里程更大、持续时间更长对容量要求会上一个台阶。一次调频和AGC联合配置时P和E的匹配逻辑会向大容量方向偏但也取决于市场规则里一次调频和AGC能不能同时获得补偿。这块我后面打算专门写一篇这里先留个口子。6.3 实用小工具自动生成报告最后分享一个让效率提升不少的小技巧我写了一个导出函数优化结束后自动把参数、最优解、目标函数曲面、动态验证图打包成Word或PDF报告。用Matlab自带的publish功能或者Report Generator都可以。报告里会把优化结果和手工估算的对比放进去方便给老板交差。代码不复杂核心就是把图存成png然后用report库的add和append写段落。有自动化报告以后做敏感性分析时批量跑几十组场景最后只需要翻报告不用一个一个看Matlab窗口。按我个人经验这类容量配置项目最容易失真的地方不是求解算法而是收益和成本参数的选取。同一个模型换一组市场价格结论可能从“不推荐配置”变成“可以配置”。所以代码跑通只是第一步更重要的调查清楚当地调频补偿机制、储能系统造价趋势和电池循环寿命的实测数据。把这些搞准了用我给的框架去优化结果才有工程参考价值。
返回列表