1. 储能参与调峰的核心逻辑:收益从哪来,成本怎么算
看到“参与调峰的储能系统配置方案及经济性分析”这个题目,我的第一反应是:这其实是一类非常典型的电力系统规划-运行联合优化问题。它在EI论文里出现的频率极高,不只是因为储能本身是热点,而是因为这个问题的结构足够完整:既有设备投资层面的整数决策(配多大功率、配多少容量),又有运行层面的连续决策(每个时刻充多少、放多少),最后还要落到财务指标上判断到底划不划算。
先说清楚“调峰”到底是个什么事。电网的负荷是波动的,一天之内有明显的峰谷差,尤其是在以风电、光伏为主的高比例新能源系统中,净负荷曲线(负荷减新能源出力)的波动会更剧烈。传统火电机组可以爬坡调节,但调节速率有限,而且深度调峰时煤耗高、磨损大。储能的作用就是“时间搬移”——负荷低谷时充电,负荷高峰时放电,把能量从时间轴上搬一块,缓解系统调峰压力。
那储能的收益到底从哪来?这个必须分清楚,否则经济性分析就是一笔糊涂账。常见的有四类:
- 峰谷价差套利:在分时电价机制下,低谷充电、高峰放电,赚取价差。这是市场化程度较高地区最直观的收益来源。
- 容量补偿/容量租赁:储能给新能源场站或电网提供调峰容量,按容量获得补偿,类似“订阅费”。
- 辅助服务市场的调峰补偿:储能参与调峰辅助服务市场,按调峰深度和调峰量获得补偿,这是东北、西北等地区实际运行中收益占比较大的部分。
- 减少弃电的增量收益:配在新能源场站侧时,储能把弃电时段的风光出力存下来,在限电解除后再上网,减少弃电量的损失。
成本侧就相对明确了:初始投资(储能本体、PCS、变压器、土建、安装)、运维成本、充电购电成本、替换成本(电池寿命到期后更换),以及资金成本(贷款利息、贴现率)。
经济性分析的最终目标就是回答三个问题:配多大储能(功率)、配多长时间(容量/时长)、在什么电价和政策环境下能实现净收益为正。这三个问题不是独立求解的——功率和时长决定了投资成本,也决定了调峰能力和套利空间,而电价政策直接决定单位调峰量的收益。
我在复现这类论文时最大的体会是:论文里的模型往往不是难点,真正的难点在于弄明白作者对“调峰收益”的定义。同样是“参与调峰”,有的论文按调峰深度付费,有的按实际调峰电量付费,有的是综合峰谷价差和容量补偿的叠加。如果第一步就没对齐,后面所有的求解结果都没有可比性。
2. 复现EI论文的关键三步:模型还原、参数对齐、结果验证
“EI复现”这四个字听起来很唬人,实际做起来其实有一套固定的方法论。我复现过不少电力优化类的论文,总结下来就是三步:读透模型、抠清参数、跑通流程再验证。
2.1 模型还原:从论文公式到数学表达
第一步是把论文里的目标函数和约束条件“翻译”成标准的数学优化模型。参与调峰的储能配置问题,标准形式通常是一层或两层的:
- 单层模型:目标函数是年净收益最大化(或年综合成本最小化),决策变量既包含储能配置容量/功率,也包含逐时的充放电功率。好处是结构简单,直接一个混合整数线性规划/混合整数二次规划就能求解。
- 双层模型:上层做投资决策,下层模拟系统运行(比如机组组合或经济调度),两层之间通过KKT条件或者强对偶理论合并为单层,或者用迭代方法求解。这类模型更贴近电网实际运行,但求解难度和复现难度都明显上升。
实际复现时,我通常先按单层模型走通,再根据论文具体内容考虑是否升级到双层。单层模型的核心可以概括为:
目标函数(以净收益最大为例):
[ \max ; \sum_{t=1}^{T} \left( p_t^{peak} \cdot P_{dis}(t) \cdot \Delta t \cdot \eta_{dis} - p_t^{valley} \cdot P_{ch}(t) \cdot \Delta t / \eta_{ch} \right) - C_{inv} - C_{om} ]
其中 ( P_{dis}(t) )、( P_{ch}(t) ) 是放电/充电功率,( \eta_{dis} )、( \eta_{ch} ) 是充放电效率,( p_t^{peak} )、( p_t^{valley} ) 是峰谷电价,( C_{inv} ) 是折算到每年的投资成本,( C_{om} ) 是年运维成本。
投资成本的折算看着简单,但有几个细节容易踩坑:储能系统寿命通常按循环次数或者运行年限取较小者,贷款利息要不要计入、折旧年限怎么取,不同论文的处理方式五花八门。我复现时的默认做法是采用等年值法,把一次性投资按折现率折算成等额年值,公式为:
[ C_{inv}^{annual} = C_{inv}^{total} \cdot \frac{r(1+r)^n}{(1+r)^n - 1} ]
其中 ( r ) 是折现率,( n ) 是储能寿命年限。这套方法在工程经济学里叫年值法,吐出来的结果可以直接和年收益对比,判断项目是否可行。
2.2 参数对齐:一个都不能少
参数是复现过程中最容易被忽视、却是最影响结果的部分。论文的正文、表格、甚至附录里的一个小数都可能决定最终结果的走向。
我整理了一套“参数清单”,每次复现都对一遍:
| 参数类别 | 具体参数 | 典型取值(参考) |
|---|---|---|
| 储成本 | 单位功率成本(元/kW) | 锂电池PCS+集成:600~1500元/kW |
| 储成本 | 单位容量成本(元/kWh) | 锂电池系统:1000~1800元/kWh |
| 储能运行 | 充放电效率 | 0.88~0.95 |
| 储能运行 | 最大放电深度(DOD) | 0.8~0.9 |
| 储能运行 | 自放电率 | 0.01~0.05/月 |
| 电价 | 峰时电价(元/kWh) | 0.8~1.2 |
| 电价 | 谷时电价(元/kWh) | 0.2~0.4 |
| 系统 | 折现率 | 0.06~0.08 |
| 系统 | 储能寿命 | 10~15年 |
| 调峰补偿 | 调峰深度补偿价格 | 0.3~0.8元/kWh |
这些参数不是随便拍的,实际论文里都会给出取值范围。复现时我的经验是:先用论文里的原始参数跑出一版结果,再自己调整关键参数做敏感性分析。如果论文给的是“某地区实际数据”,那就尽量还原该地区的峰谷时段划分——有的地方峰谷时段是固定的,有的地方是分季节浮动的,这个细节直接影响充放电策略。
2.3 结果验证:对不上才是正常的
很多新手复现时最焦虑的环节是“为什么我的结果和论文不一样”。先说结论:完全一样才不正常,因为论文里很多隐式假设没有写出来——比如是否考虑了容量衰减、是否计及了功率限制下的效率变化、是否忽略了某些运行约束。
我的做法很简单,三步验证:
- 有量纲检查:收益是元/年,成本是元/年,容量是MWh,功率是MW。如果某个中间量的单位对不上,说明公式推导出了问题。
- 边界验证:把储能的配置容量设为0,目标函数值应该等于不配储能的基准值;把充放电效率设为1,投资成本设为0,收益应该逼近理论最大值。这几个边界条件一测,模型错误基本能暴露。
- 趋势验证:电价峰谷差拉大时,最优配置容量应该变大;储能单位成本上升时,最优配置容量应该变小。如果趋势反了,那一定是约束或目标函数写反了。
3. 优化模型搭建:目标函数、约束条件与线性化处理
这部分是复现工作的重头戏。很多论文的模型看起来复杂,但拆开了无非就是目标函数加几组约束。我把参与调峰的储能配置模型按功能拆成四块,一块一块说透。
3.1 决策变量与目标函数
决策变量分两类:
- 配置变量:储能额定功率 ( P_{rated} )(MW)、储能额定容量 ( E_{rated} )(MWh),这俩决定了投资规模。
- 运行变量:每个时刻的充电功率 ( P_{ch}(t) )、放电功率 ( P_{dis}(t) )、荷电状态变量 ( SOC(t) )。
目标函数如果要考虑调峰贡献,可以写成“综合收益最大化”,其中调峰收益部分按调峰深度或调峰电量计费。比如调峰电量的收益可以写成:
[ R_{peak} = \sum_{t=1}^{T} C_{peak_shaving} \cdot P_{dis}(t) \cdot \Delta t ]
其中 ( C_{peak_shaving} ) 是单位调峰电量的补偿价格。加上峰谷套利收益、减去投资和运维成本,就是完整的净收益目标函数。
3.2 约束条件:看得见和看不见的
约束条件是区分论文深度的关键。参与调峰的储能配置模型,核心约束至少包括这六类:
- 功率平衡约束:储能放电功率加上其他电源出力,要等于负荷需求。在配置模型里这条约束可以简化,但如果论文做的是并网运行模拟,这条不能省。
- 充放电功率上限: [ 0 \le P_{ch}(t) \le P_{rated}, \quad 0 \le P_{dis}(t) \le P_{rated} ]
- 同一时刻不能同时充放电:用二进制变量 ( u(t) \in {0,1} ) 控制: [ P_{ch}(t) \le M \cdot u(t), \quad P_{dis}(t) \le M \cdot (1-u(t)) ] 其中 ( M ) 是一个足够大的常数(Big-M法)。这条约束很多复现者会漏,漏掉之后求解器会把“边充边放”当成最优解——毕竟充进去再放出来,虽然效率有损耗,但如果效率大于50%,在纯套利模式下 solver 确实有可能钻这个空子。
- SOC递推约束: [ SOC(t+1) = SOC(t) + P_{ch}(t) \cdot \Delta t \cdot \eta_{ch} / E_{rated} - P_{dis}(t) \cdot \Delta t / (E_{rated} \cdot \eta_{dis}) ] 注意效率放在分母还是分子,别搞反了。
- SOC上下限:( SOC_{min} \le SOC(t) \le SOC_{max} ),通常取 0.1~0.9,对应DOD 0.8。
- 始末SOC相等约束:( SOC(T) = SOC(0) ),保证储能在一个完整调度周期后回到初始状态,避免“透支”下一周期的能量。
3.3 非线性项的线性化处理
复现时最大的坑往往出在非线性项。最常见的是这个:储能参与调峰的收益,如果按“调峰深度”付费,那么调峰深度本身是 ( P_{rated} ) 和 ( P_{dis}(t) ) 的组合,可能形成双线性项。还有配置变量 ( P_{rated} )、( E_{rated} ) 和运行变量之间如果存在互相乘除的关系,模型就变成非凸了。
我建议大家优先把模型建成MILP(混合整数线性规划),避免直接上MINLP(混合整数非线性规划)。实际做法是把非线性项做线性化处理:
- Big-M法处理“条件约束”,比如“只有放电时才能获得调峰收益”。
- 分段线性化处理充放电效率随功率变化的曲线。简单起见,很多论文直接用固定效率,复现时可以先从固定效率入手。
- 二进制变量+线性约束处理“要么充要么放”的逻辑关系。
举个实际的线性化例子。假设调峰收益按放电功率计,单位补偿 ( C_{peak} ),那收益项 ( C_{peak} \cdot P_{dis}(t) ) 本身就是线性的,问题不大。但如果论文里写的是“按调峰深度比例补偿”,补偿比例 ( \alpha(t) ) 和储能的额定功率关联,那 ( \alpha(t) \cdot P_{dis}(t) ) 就是个双线性项。
处理方法是引入辅助变量 ( z(t) = \alpha(t) \cdot P_{dis}(t) ),然后用McCormick不等式进行松弛。不过说实话,大部分EI论文不会搞得这么复杂——只要看到目标函数是“收益-成本”形式,成本是线性函数,基本都可以建为MILP。
我踩过的最大一个坑是:在SOC递推公式里忽略了时间步长 (\Delta t) 的量纲。如果 (\Delta t) 以小时为单位,而充放电功率以MW为单位,那么一个小时内充进去的电量是 MW × 1h = MWh。如果把 (\Delta t) 写成分钟数,容量数字会大10倍以上,整个配置结果全部作废。这个错误在初稿阶段非常隐蔽。
4. Matlab求解实现:从YALMIP建模到结果可视化
标题里带了“附Matlab代码”,这说明论文复现的最终呈现载体是Matlab。Matlab做这类优化问题,我的首选组合是YALMIP + CPLEX或YALMIP + Gurobi,前者做建模语言,后者做底层求解器。如果机器上没装商业求解器,也可以用内置的intlinprog或fmincon顶一下,但求解速度和稳定性差不少。
4.1 建模前需要准备的输入数据
在写代码之前,先把数据准备好。参与调峰的储能配置问题至少需要以下几类数据:
- 负荷曲线或净负荷曲线(8760小时或典型日96点数据)
- 分时电价序列(至少要有峰、平、谷三段,最好按季节区分)
- 新能源出力曲线(如果储能配置在新能源场站侧)
- 储能成本和效率参数
这些数据在论文里一般以曲线图或参数表形式给出。复现时一个常见问题:论文的曲线图无法直接提取数据。我的做法是用getdat之类的工具从图中提取数值点,或者直接根据论文描述的典型日场景人工构造数据。注意在博文或代码注释里说明数据来源,否则后续回顾时会忘。
4.2 代码结构设计
我惯用的代码结构分四块,按顺序执行:
% 1. 参数初始化 % 2. 构建优化模型(YALMIP) % 3. 调用求解器求解 % 4. 结果后处理与可视化参数初始化的关键代码大致是这样的:
%% 基础参数 T = 24; % 调度周期(小时) dt = 1; % 时间步长(小时) load_profile = [...]; % 负荷曲线,24维向量 price = [...]; % 分时电价,24维向量 eta_ch = 0.92; % 充电效率 eta_dis = 0.92; % 放电效率 SOC_min = 0.1; SOC_max = 0.9; SOC_init = 0.5;模型构建部分最核心的代码是决策变量定义和约束方程:
%% 决策变量 P_rated = sdpvar(1, 1); % 额定功率 (MW) E_rated = sdpvar(1, 1); % 额定容量 (MWh) P_ch = sdpvar(1, T); % 充电功率 P_dis = sdpvar(1, T); % 放电功率 u = binvar(1, T); % 充放电状态二进制变量 SOC = sdpvar(1, T+1); % 荷电状态 %% 目标函数 Income_peak = sum(C_peak * P_dis * dt); % 调峰补偿收益 Income_arb = sum(price .* (P_dis * eta_dis - P_ch / eta_ch) * dt); % 峰谷套利净收益 Cost_inv = alpha * P_rated + beta * E_rated; % 投资年化折算 Objective = Income_peak + Income_arb - Cost_inv - Cost_om; %% 约束条件 Constraints = []; Constraints = [Constraints, P_ch <= P_rated]; Constraints = [Constraints, P_dis <= P_rated]; Constraints = [Constraints, P_ch <= u * P_rated]; Constraints = [Constraints, P_dis <= (1 - u) * P_rated]; Constraints = [Constraints, SOC(2:T+1) == SOC(1:T) + (P_ch * eta_ch - P_dis / eta_dis) * dt / E_rated]; Constraints = [Constraints, SOC_min <= SOC <= SOC_max]; Constraints = [Constraints, SOC(1) == SOC_init, SOC(T+1) == SOC_init]; %% 求解 ops = sdpsettings('solver', 'cplex', 'verbose', 2); result = optimize(Constraints, -Objective, ops);这里有几个细节值得展开:
- 为什么用
-Objective而不是Objective?因为 YALMIP 默认最小化,取负号之后最大值问题变成最小值问题。 - 二进制变量在同一个时刻把充放电隔开,但要不要同时限制 SOC 变化率的上下限?严格来说需要,因为 SOC 变化率受功率限制。但我这里通过功率约束已经间接限制住了,所以可以不额外加。
- 投资成本 ( \alpha \cdot P_{rated} + \beta \cdot E_{rated} ) 是线性的,意味着什么?意味着在同一个线性规划框架内,求解器可以同时决策功率和容量,不需要两层循环。这是很多论文采用线性化成本的原因。
4.3 求解完成后的结果处理
求解之后,最容易被忽视的一步是结果合理性检查。我习惯先查看几个关键输出:
P_rated_opt = value(P_rated); E_rated_opt = value(E_rated); P_ch_opt = value(P_ch); P_dis_opt = value(P_dis); SOC_opt = value(SOC);然后做三件事:
- 打印最优配置:
fprintf('最优配置:%.2f MW / %.2f MWh,储能时长 %.2f h\n', P_rated_opt, E_rated_opt, E_rated_opt/P_rated_opt); - 看SOC曲线是否“平滑”。如果SOC剧烈震荡,大概率是约束写错了(比如效率方向搞反)。
- 看总收益的各组成部分占比——调峰收益多少、峰谷套利多少。如果某部分收益占比异常高,需要回头检查是不是收益公式里少乘了效率或系数。
可视化部分我习惯用两个图:第一个是功率曲线图(充电为正、放电为负,叠加负荷曲线),第二个是收益柱状图(按收益来源拆分开)。这两个图基本是论文标准的“结果图”配置。
5. 算例配置与敏感性分析:如何让结果可复现又有说服力
模型和代码都跑通之后,最考验“复现者水平”的部分来了——算例设计。这部分直接决定了你的分析结果能不能支撑结论,也决定了审稿人(或导师)会不会认可你的工作。
5.1 基础算例参数设计
以国内某省的典型日为例,我设计过这样一套基准算例参数:
- 系统基础负荷:峰值120 MW,谷值60 MW,日峰谷差60 MW
- 风电装机容量:100 MW,出力曲线按典型日风速波动
- 电价机制:峰时(10:00-14:00,18:00-22:00)0.9元/kWh,平时0.6元/kWh,谷时(23:00-6:00)0.3元/kWh
- 调峰补偿:0.5元/kWh(按放电电量计)
- 储能成本:单位功率成本800元/kW,单位容量成本1200元/kWh,折现率6%,寿命10年
这套参数的好处是“干净”——成本和电价都在常见范围内,结果不会出现极端配置。用这套参数跑出来后,最优配置通常落在10~20 MW/20~40 MWh的区间,储能时长2小时左右,年净收益在数百万元量级。如果结果差得太远,优先检查模型,而不是怀疑参数。
5.2 敏感性分析的三个维度
复现一篇EI论文,不能只看一个基准结果,至少要跑三组敏感性分析,结论才有支撑力:
- 峰谷价差敏感性:价差从0.4元/kWh到1.0元/kWh,观察最优配置和净收益的变化。预期结果是:价差越大,最优配置和收益率都上升。如果上升幅度太缓,说明目标函数里套利收益的权重设置有问题。
- 储能成本敏感性:单位容量成本从800元/kWh到2000元/kWh,观察最优容量的变化。这个趋势几乎是线性的,因为成本直接进目标函数。
- 调峰补偿价格敏感性:补偿价格从0.3元/kWh到0.8元/kWh,观察储能运行策略的改变——补偿高了之后,储能更倾向于在负荷高峰深度放电,而不是只做“浅充浅放”的套利。
敏感性分析做完之后,还要做一个盈亏平衡分析,找到净现值为零的临界条件。比如在基准参数下,如果峰谷价差低于0.35元/kWh,或者单位容量成本高于1800元/kWh,项目就会亏。这个临界点数据放在论文里,比单纯说“具备经济可行性”有说服力得多。
5.3 复现过程中的“隐藏关卡”
复现最后我提几个PubMed级别的“坑”,全是实际踩过的:
- 论文里的“典型日”和“全年8760小时”的换算关系要分清。有的论文用典型日数据乘以365近似全年,这在RSOC递推中没问题,但在涉及电池循环寿命折旧时会有系统性偏差。如果论文没写清楚,我建议直接按全年时序仿真,牺牲一点求解速度换结果准确性。
- 效率参数的方向。充电效率 ( \eta_{ch} ) 和放电效率 ( \eta_{dis} ) 在SOC递推和收益计算中,位置完全不同。SOC递推里充电效率在分子,表示充进去的电量打了个折;收益计算里放电效率在乘法位置,表示放出来的电量需要按效率折算。弄反一个,SOC曲线就会整体偏移。
- “弃电”场景下的储能收益计算。如果储能配在新能源场站侧,充电的电价怎么取?有的论文按“弃电零成本”处理,有的按“上网电价”处理,这个假设对收益影响极大。复现时一定要看清楚原文假设,并在代码注释里显著标注。
- 求解器的数值问题。Big-M法里的M取值如果太大,求解器的数值稳定性会下降,出现“实际上满足约束但被判定为不可行”的假象。我习惯把M设置为P_rated的上界(比如100 MW),而不是随便拍一个10000。
6. 代码可复现性的最后一公里
Matlab代码能不能被别人复现,往往取决于你写代码时有没有考虑“使用场景”。很多复现者的代码只有自己能看懂,换个数据源就跑不动。我分享几个提升可复现性的习惯:
第一,参数集中管理。不要在代码里散落多个区段的魔法数字,而是把参数集中到一个params.m脚本或者struct结构体里。换个数据源,只改这一处。
第二,输入数据文件化。负荷曲线、电价序列、新能源出力,都放成CSV文件,用readmatrix读取。这样读者拿到代码后可以直接替换自己的数据,不需要去代码里找赋值语句。
第三,分阶段调试。我先用一个小规模的测试数据(比如3个时刻的简化模型)跑通,再上完整数据。小规模时可以直接打印每一行的约束条件,肉眼检查是不是符合物理规律。
第四,输出中间结果。在代码里加上关键结果保存,比如save('result.mat', 'P_rated_opt', 'E_rated_opt', 'SOC_opt')。后面做敏感性分析或对比实验时,不需要重跑整个时间序列,直接加载结果就行。
第五,版本控制与注释。我强烈建议给每个主要函数开头写一段注释,说明输入输出、调用的求解器、依赖的Matlab工具箱。哪怕只是三五行,也会在半年后帮到大忙。
回到标题本身——“EI复现”其实不是一个很困难的事情,难点在于把论文的隐含信息补齐、把参数对齐、把代码写清楚。储能参与调峰这个选题本身也不算特别前沿,但它胜在结构完整、逻辑清晰、结论有实际参考价值,不管是做课程设计、毕业论文,还是发小论文,都是一个很扎实的起点。
如果你正准备入坑这个方向,我给的建议是:先别急着追求“完全复现论文的每个数字”,而是先把模型结构跑明白——为什么要在低谷充电、为什么要在高峰放电、为什么储能时长不是越长越好。把这三个为什么用自己的话解释清楚,比跑通十篇论文都有用。
最后再分享一点我在实际操作中的体会:储能配置方案这类问题的“经济性分析”,表面上是在算账,本质上是在给不确定的未来定价。不同价格机制下,储能的价值差别极大。所以做敏感性分析时,不要只盯着一组参数的结果,多看看趋势和临界条件——那才是你论文里最耐看的部分。