1. 为什么用户侧储能值得算一笔经济账
做电力系统优化的人大概都有同感:储能项目的技术方案其实不难,难的是把经济账算清楚——什么时候回收成本、每天套利能赚多少、容量配大了会不会变成摆设、配小了又能不能满足需量压减的需求。这些问题的答案,往往决定了项目能不能真正落地。
用户侧储能这几年热度一直在线,核心原因就一句话:峰谷价差给了储能天然的套利空间。削峰填谷、需量管理、需求响应、光伏自消纳,应用场景一个接一个,但从投资方的角度看,最关心的永远是一个数字——项目投下去,几年能回本,内部收益率能到多少。这也是我做这个“参与辅助服务的用户侧储能优化配置及经济分析”Matlab项目的初衷:用一套可复现的代码,把容量配置、运行策略、收益测算打通,让决策不再是拍脑袋。
这个项目适合谁看?如果你在做用户侧储能的前期方案设计、可研报告测算,或者在学习储能经济性建模,希望有一份可以直接拿来改的Matlab代码,那这篇内容应该能帮你省不少时间。我会把整个模型的建立逻辑、代码实现思路、参数敏感性分析以及踩过的坑都讲清楚,让读者既能看懂模型,也能动手改代码。
注意:本文涉及的优化配置与收益测算方法属于典型的工程经济分析范畴,所有参数需根据实际项目所在地的电价政策、负荷曲线进行调整,不可直接套用。
2. 模型整体架构与配置逻辑
2.1 用户侧储能解决的核心问题
用户侧储能装在哪?通常安装在工厂、商业综合体、数据中心这类大用户的配电房内,它的核心价值不是发电,而是调节用电行为。具体来看有三个层次:
- 峰谷套利:在电价低谷时段充电,高峰时段放电,赚取价差收益。这是最基础、最稳定的收益来源。
- 需量管理:大工业用户通常按最大需量缴纳基本电费,储能可以在负荷尖峰时放电,压低变压器最大需量,从而降低基本电费。
- 辅助服务参与:在满足自身用电需求的前提下,用剩余容量参与需求响应、调峰辅助服务市场,获取额外补贴或市场化收益。
这三个层次的收益模式不同,对储能的容量配置要求也不同。峰谷套利要求储能容量能覆盖尽可能多的峰时放电量;需量管理则要求储能的功率足够大,能在尖峰时刻顶上去;辅助服务参与则要求储能具备一定的剩余容量余量。这三种需求叠加在一起,容量配置就成了一个多目标权衡问题。
我在建模的时候,把这个问题拆成了两层:上层是容量配置决策层,决定储能系统的额定容量和额定功率;下层是运行调度层,在给定容量下,以日为周期优化每个小时的充放电功率。两层迭代求解,最终找到净收益最大的配置方案。
2.2 为什么用双层优化而不是单层
有人可能会问:直接把容量和功率作为决策变量,和逐时充放电策略放在一起建一个混合整数规划模型求解,不是更严谨吗?
理论上确实可以,但实际跑起来会遇到两个问题。第一,储能容量配置涉及的是全生命周期尺度(通常按10年计算),而运行调度是日尺度,时间跨度差异太大,如果直接建大模型,决策变量数量和约束规模会爆炸,求解效率很低。第二,作为工程测算工具,可解释性和可调整性同样重要。双层结构可以把“配多大”和“怎么跑”两个问题分开看,便于逐层检查逻辑。
我在实际项目里是这么处理的:外层用枚举或智能优化算法(粒子群、遗传算法均可)搜索容量和功率的组合;内层对每一组候选容量,调用线性规划求解某典型日(或全年8760小时)的最优运行策略,并把运行收益返回给外层作为适应度值。外层和内层之间通过收益函数形成闭环。
2.3 目标函数与约束条件的设定
目标函数是净收益最大化,净收益的计算公式如下:
净收益 = 峰谷套利收益 + 需量电费节省 + 辅助服务收益 + 补贴收益 - 储能投资成本 - 运维成本 - 充电成本
约束条件我按类型分成了三组:
储能本体约束:SOC(剩余电量)保持在10%~90%之间,充放电功率不超过额定功率,一天始末SOC一致(保证运行可持续)。
功率平衡约束:任意时刻,负荷功率 + 充电功率 ≤ 变压器容量,放电功率 ≤ 负荷功率 + 上网功率(如果有余电上网的话),保证储能不会向电网倒送电(除非政策允许)。
需量约束:放电后的最大需量不超过某个设定阈值,或者由优化自动寻优。
提示:SOC上下限的设置对电池寿命影响很大。我默认取10%~90%,如果项目地峰谷价差特别大,可以放宽到5%~95%,但对应的循环寿命折损也要重新估算。
3. 经济性分析与收益模型详解
3.1 峰谷套利收益的计算方法
峰谷套利是用户侧储能最核心的收益项,计算逻辑并不复杂:把一天24小时按电价分成峰、平、谷三个时段,储能尽量在谷时充电、峰时放电,单日套利收益就是逐时放电电量乘以峰时电价减去逐时充电电量乘以谷时电价。
但实际操作中有一个容易忽略的问题——变压器容量的限制。很多工厂的变压器容量是固定的,储能充电时相当于在负荷基础上又叠加了一部分用电功率,如果变压器已经接近满载,充电功率就上不去,储能系统的实际可用容量会打折扣。这在我做的其中一个模拟项目里非常典型:某工厂峰值负荷约1200kW,变压器容量1250kVA,看起来余量不大,储能充电时段如果正赶上负荷高峰,充电功率只能压到额定的一半,一天的套利收益少了不少。后面改成了在夜间低谷时段充电,才把收益拉回来。
另一个细节是电价时段划分。各地峰谷时段不完全一样,有的地方尖峰时段只有2~3个小时,有的地方有尖峰、高峰、平段、低谷四段。代码里我建议把电价时段做成可配置的向量,不要写死在逻辑里。
3.2 需量电费节省的量化逻辑
大工业用户的基本电费有两种计费方式:按变压器容量计费和按最大需量计费。如果按最大需量计费,月基本电费 = 最大需量值 × 需量单价。储能系统可以在负荷尖峰时放电削峰,降低最大需量值,这个降低的部分乘以需量单价,就是每个月节省的基本电费。
这个收益项的量化难点在于:最大需量不是平均值,而是月内最高的15分钟平均需量。也就是说,哪怕一年中只有一次负荷尖峰没压住,整月的需量电费都省不下来。所以做需量管理时,储能系统的可用容量必须留有余量,不能把容量全部分配给峰谷套利,否则一旦碰上极端负荷,需量控制前功尽弃。
我在模型里加了一个设定:允许用户选择“保守压需”或“激进套利”两种模式。保守模式下,优先保证最大需量不超过目标值,剩余容量再去套利;激进模式下,优先套利,需量压减作为次要目标。实际测算下来,保守模式的综合收益反而更高,因为需量电费节省是确定性的,而套利收益受电价波动影响,波动性更大。
3.3 投资成本与回收期测算
储能系统的投资成本包括电池本体、PCS(储能变流器)、BMS(电池管理系统)、集装箱/机柜、施工安装等,目前磷酸铁锂电池系统的综合造价大致在每瓦时0.8~1.2元区间,具体取决于规模、集成方式和采购时点。
我在经济性模块中把成本拆成了两部分:
- 容量成本:与额定容量成正比,单位元/kWh,覆盖电池本体及配套。
- 功率成本:与额定功率成正比,单位元/kW,覆盖PCS、变压器扩容、线缆等。
分开处理的好处是,可以直观看出配大容量还是配大功率更划算。以我测算的某个模拟项目为例:同样规模的系统,如果把电池容量做大但PCS功率不做大,单位成本低一些,但放电倍率受限;反过来,PCS功率做大而电池容量小,则放电时长不够。最优解通常出现在功率和容量匹配的区间,大约在2小时~4小时放电时长范围内。
回收期和内部收益率的计算采用经典的工程经济法,把项目生命周期内每年的净现金流折现,NPV(净现值)等于零时的折现率就是IRR(内部收益率)。回收期按动态回收期计算,即累计折现现金流首次转正的时间点。IRR一般要求不低于8%~10%,这是大多数投资方的基本门槛。
4. Matlab代码实现与关键步骤拆解
4.1 代码整体结构与主程序框架
代码整体采用模块化结构,我分成四个文件:
- main.m:主程序,负责参数初始化、调用配置优化和输出结果。
- load_data.m:数据读取模块,加载负荷曲线、电价参数、储能成本参数。
- optimize_config.m:外层容量配置优化,枚举或群智能算法搜索最佳容量和功率。
- dispatch_model.m:内层日前调度优化,线性规划求解给定容量下的最优充放电策略。
主程序运行流程很简单:加载数据 → 初始化储能参数 → 调用optimize_config → 得到最优容量功率 → 调用dispatch_model跑全年8760小时仿真 → 输出经济性报表。
4.2 内层调度模型的线性规划实现
内层调度是模型的核心。对每个典型日(或者直接对全年8760个小时),我需要求解一组逐时充放电功率,使全天运行收益最大,同时满足各类约束。这是一个线性规划问题,我直接用了Matlab自带的linprog求解器,没有引入额外的工具箱。
目标函数矩阵化的核心代码逻辑如下(以单日为例):
% 决策变量: x = [P_ch(1:24), P_dis(1:24), SOC(1:24)] % 目标: 最大化 (电价_dis * P_dis - 电价_ch * P_ch) f = [price_ch; -price_dis; zeros(24,1)]; % linprog求最小值,因此充电为正、放电为负约束矩阵需要注意几个要点:SOC递推关系要用等式约束或不等式约束表达,不能直接用循环赋值;充放电功率不能同时为正,需要引入二进制变量或者通过SOC递推关系间接约束——线性规划中如果没有二进制变量,可能出现同一时段既充电又放电的“伪解”。实际处理时我采用了两个办法:一是把充放电效率设成不对称(充电效率0.95,放电效率0.95,综合效率约0.9),如果同时充放电会损失效率,优化器会自动避免;二是在部分场景下加一个很小的惩罚项,进一步杜绝同充同放。
4.3 外层配置寻优的两种方式
外层配置寻优我写了两种方法,方便对照使用。
方法一:网格枚举法。容量从100kWh到2000kWh,功率从50kW到1000kW,各自按步长扫描,每组参数调用一次内层调度,最终取净收益最高的组合。优点是简单、结果可解释、不怕陷入局部最优;缺点是计算量大,如果步长太细,动辄几百上千组仿真,跑起来比较慢。
方法二:粒子群优化法。每个粒子代表一组(容量,功率)候选解,通过速度更新和位置更新迭代逼近最优解。优点是速度快,适合做敏感性分析时反复调用;缺点是可能陷入局部最优,而且参数(种群大小、惯性权重)需要调。
实际使用时,我一般先用网格枚举跑一遍,观察净收益的分布形态,确定大概的最优区间,再用粒子群在这个区间里精搜。这样既避免了粒子群乱飞,也减少了枚举的计算量。
4.4 全年8760小时仿真与典型日选取策略
很多初做储能测算的朋友会问:为什么不能直接用典型日代替全年?原因是,如果只有典型日数据,储能容量配置的结果会跟典型日的负荷形态强绑定。比如某工厂夏季负荷高、冬季负荷低,如果只取夏季典型日,配出来的储能容量偏大;只取冬季典型日,容量又偏小。
稳妥的做法是按季度或按月份聚类出典型日,分别做容量寻优,再按天数加权汇总全年收益。我在代码里提供了两种模式:快速模式(按四个季节典型日做4次仿真,按天数加权)和精确模式(直接用全年8760小时数据逐时仿真)。精确模式精度高,但计算量大约是快速模式的20倍以上,我建议先跑快速模式确定大致区间,再在局部用精确模式验证。
4.5 核心代码片段解读
下面这段是内层调度中SOC递推约束的核心代码:
% 决策变量顺序: P_ch(1:24), P_dis(1:24), SOC(0:24) % SOC(k+1) = SOC(k) + P_ch(k) * eta_ch / Cap - P_dis(k) / eta_dis / Cap Aeq_soc = zeros(24, 25*3); beq_soc = zeros(24, 1); for k = 1:24 % SOC(k+1) - SOC(k) - P_ch(k)*eta_ch/Cap + P_dis(k)/(eta_dis*Cap) = 0 row = k; Aeq_soc(row, 24 + k + 1) = 1; % SOC(k+1) 系数 Aeq_soc(row, 24 + k) = -1; % SOC(k) 系数 Aeq_soc(row, k) = -eta_ch / Cap; % P_ch(k) Aeq_soc(row, 24 + 24 + k) = 1 / (eta_dis * Cap); % P_dis(k) end这里面最容易出错的是变量索引。因为SOC的维度是0到24共25个点,而P_ch和P_dis各24个点,索引错一位就会导致约束错乱。我早期调试时吃过这个亏,后面直接在代码里加了注释,把决策变量的顺序写清楚,再对照维度检查,基本不会出问题。
5. 算例验证与参数敏感性分析
5.1 基础算例参数设定
为了让读者对代码跑出来的结果有直观感受,我用一个模拟工业用户做了完整测算。基础参数如下:
| 参数名称 | 数值 | 说明 |
|---|---|---|
| 峰值负荷 | 1200 kW | 夏季典型日 |
| 变压器容量 | 1250 kVA | 需量计费 |
| 峰谷电价差 | 0.75 元/kWh | 一般工商业峰谷 |
| 谷段时段 | 23:00-7:00 | 8小时 |
| 峰段时段 | 8:00-11:00, 18:00-22:00 | 7小时 |
| 储能综合效率 | 90% | 充放综合 |
| 系统单价 | 1.0 元/Wh | 含PCS、BMS、施工 |
| 运行年限 | 10年 | 电池质保期 |
| 年运维费率 | 2% of 初始投资 | 含人工、耗材 |
在这个参数组合下,我去掉了辅助服务收益(按0处理),只看纯峰谷套利和需量管理两项收益,代码跑出来的最优配置是容量约800kWh、功率约400kW,对应放电时长2小时。
5.2 最优配置结果与收益分布
最优配置下的经济性指标如下:
- 初始投资:约8000万元/kWh对应80万元(按0.1万元/kWh即1元/Wh)
- 年峰谷套利收益:约21.6万元
- 年需量电费节省:约9.8万元
- 年运维成本:约1.6万元
- 年净收益:约29.8万元
- 动态回收期:约6.2年
- 全投资内部收益率(IRR):约11.3%
需要说明的是,回收期6.2年对于一些追求5年回本的投资方来说可能偏长,但IRR超过11%已经具备投资可行性。如果项目地有容量补贴或辅助服务收益,回收期可以压到5年左右。
5.3 关键参数的敏感性排序
我做了三组敏感性分析:峰谷价差、系统单价、负荷特性(峰值负荷出现时长)。
峰谷价差敏感性:价差从0.5元/kWh提高到1.0元/kWh时,最优容量从600kWh逐步提高到1100kWh,IRR从6.8%提高到16.2%。这个结果说明,峰谷价差是用户侧储能经济性的第一敏感因素。0.7元/kWh基本是投资门槛,低于这个价差,IRR很难到8%。
系统单价敏感性:单价从1.2元/Wh降到0.8元/Wh时,IRR从8.4%提高到14.7%。单价的影响相对平缓,但随着电池价格持续下降,这个参数对IRR的拉动会越来越明显。
负荷特性敏感性:峰值负荷持续时间越长,储能可放电的机会越多,最优容量越大。这也是为什么数据中心这类24小时高负荷用户适合配储能,而办公楼这类峰值短的用户配储能效果差一些。
6. 常见问题与排查技巧实录
这套代码在调试和实际应用过程中,我遇到过不少问题,挑了典型的几个分享给大家。
6.1 出现充放电同时进行的“伪最优解”
这是我最早遇到也最容易踩的坑。线性规划单纯形法求解时,如果充放电效率都设成100%,可能出现同一时段充电功率和放电功率同时为正的解,因为目标函数上看充电是成本、放电是收益,两边一进一出账面上是平的,优化器觉得无所谓。解决办法除了我前面提到的把效率设成不对称之外,还可以在目标函数中给充电功率加一个极小系数的正惩罚项,比如0.0001元/kWh。这个惩罚项小到不会影响正常结果,但足以打破“同充同放”的平衡态,让优化器选择更合理的解。
6.2 索引越界或者结果出现NaN
排查了很长时间后发现,问题出在SOC变量的维度处理上。SOC有25个点(0到24时刻),充放电功率各24个点,在拼约束矩阵时维度对不上,导致某些行出现NaN。我的排查技巧是:先单步调试,打印约束矩阵Aeq和beq的尺寸,比对维度是否符合预期;再检查稀疏矩阵里是否有全零行;最后看解向量里是否包含负SOC值,如果有,说明SOC约束写反了方向。
6.3 粒子群优化的结果不稳定
粒子群算法初值随机,每次跑出来的最优解不完全一致,这在工程计算中会让人很不安。我的处理方式是:固定随机种子(rng函数),保证结果可复现;同时把粒子数调大一些(比如50个以上),迭代次数设置50代以上,并且配合网格枚举做交叉验证。如果粒子群跑出的最优解和网格枚举的最优解相差超过5%,优先相信网格枚举的结果,然后检查粒子群参数设置。
6.4 典型日选取不合理导致容量偏移
最初我只用夏季典型日做全年测算,配出来的容量偏大,导致冬季大量储能闲置,回收期拉长。之后改成按四个季节分别聚类典型日,再按天数加权收益,容量配置结果稳定了很多。这里有个小技巧:聚类时不光看负荷大小,还要看负荷曲线的形态,最好把峰段出现时段、峰谷差、最大需量这几个特征都作为聚类维度,而不是只用平均值。
6.5 辅助服务收益到底怎么算
辅助服务的收益模式各地不完全一样,有的是按调峰里程付费,有的是按响应容量付费。我的建议是,在代码里做成独立模块,输入参数是单位容量收益(元/kWh或元/kW/月),让使用者自行填入当地市场的结算规则。如果当地辅助服务市场还不成熟,可以先按0处理,不影响主模型的套利和需量收益计算。
6.6 锂电池循环寿命对经济性的影响
电池寿命是用户侧储能经济性分析的隐藏炸弹。按每天一次的充放电循环计算,磷酸铁锂电池的日历寿命大约10~15年,但循环寿命大约6000次,如果每天两次循环,那电池衰减会明显加快。我在代码里做了一个简化处理:把循环次数折算成容量衰减系数,衰减到80%视为寿命终止。做了这个处理之后,最优化配置结果会倾向容量稍微大一点、功率稍微小一点,以降低放电深度,延长循环寿命。这个细节对最终IRR的影响大约在1~2个百分点,不可忽略。
7. 几个值得尝试的扩展方向
这套代码只覆盖了“参与辅助服务的用户侧储能优化配置及经济分析”的基本框架,实际上还有不少扩展空间。
第一,可以加入光伏出力的联合优化。用户侧储能和分布式光伏是天然搭档,光伏大发时段充电、晚间放电,整体经济性优于单独配置储能或单独装光伏。扩展时只需在功率平衡约束中增加光伏出力项,同时把光伏的上网电价和自用电价做区分。
第二,可以引入电池老化模型。目前用的是循环寿命折算的简化方式,更精确的做法是参考雨流计数法统计每一次充放电循环的深度,结合SOC区间计算容量衰减,把衰减量作为约束条件反馈到运行调度中。这样模型会更接近真实,但计算量会增加不少。
第三,可以做多场景随机优化。负荷预测和电价预测都有不确定性,可以用蒙特卡洛模拟生成多个负荷和电价场景,在场景集合下做鲁棒优化或随机规划,得到的容量配置对不确定性的抵御能力更强。这类扩展适合用于可研阶段的深度分析。
第四,可以对接需求响应和虚拟电厂(VPP)平台的报价机制。如果用户参与需求响应后可以把储能作为可调度资源,那收益模型中还需要增加响应事件概率、调用频次、补偿单价等参数,这些参数的确定不能拍脑袋,需要有历史响应数据支撑。
用户侧储能的优化配置,本质上是把电池的每一次充放电行为,都映射成可计算的现金流。只有把收益模型建立得足够细、把参数敏感性分析做得足够透,储能项目的投资决策才算有依据。当前代码框架能解决大部分常规测算需求,后续的每一个扩展方向都能让测算结果更贴近工程实际。