☰
用户侧储能如何靠辅助服务提升收益?优化配置与Matlab测算全解析
2026/10/24 2:53:20 网站建设 项目流程

用户侧储能的收益测算,我见过太多人栽在“只算峰谷套利”这一条路上。真拿实际电价曲线和负荷曲线去跑,单靠峰谷价差收回投资通常要七八年,这还是在理想循环次数下。我这两年经手的用户侧储能项目里,真正能通过投资评审的,几乎都靠需求响应、调峰补偿这类辅助服务收益撑起回报率。这篇文章把完整方法写出来:如何把“参与辅助服务”量化到用户侧储能的优化配置模型里,如何在Matlab中实现求解,以及经济指标到底怎么算才不虚高。

适合正在做储能可研、园区配储规划,或者想复现优化配置算法的朋友。我会从模型设计讲到代码骨架,再给一个典型场景的完整测算案例,最后把实操中容易被忽略的坑都列一遍。

1. 用户侧储能只做峰谷套利的账,为什么越算越难受

1.1 峰谷套利的收益上限,算完就知道差距

先算一笔最简单的账。假设配置一套2MWh、1MW的用户侧储能,每天完整循环一次,平均峰谷价差0.65元/kWh,充放电综合效率0.9,年运行天数按280天算:

年套利收益 = 2000 kWh × 0.65 元/kWh × 0.9 × 280天 ≈ 32.8万元

再看成本。按近两年用户侧储能系统综合单价1.2元/Wh算,2MWh系统投资约240万元;运维、保险、电池衰减补偿等每年按5万元估算。那么年净收益约27.8万元,静态回收期240 ÷ 27.8 ≈ 8.6年。

这个数字对大多数工商业用户来说太长了。一般企业投资储能的要求是回收期不超过6年、全投资IRR不低于8%,而纯套利场景下这些指标都很难达标。更要命的是,上面已经按“每天满充满放”计算,实际运行中负荷曲线不一定能让你天天吃满价差——这是很多可研报告虚高的第一来源。

1.2 用户侧能参与的辅助服务,收益结构比想象中丰富

所谓辅助服务,通俗讲就是储能除了给自己省钱之外,还能帮电网“搭把手”,并拿到相应补偿。用户侧储能能参与的方向主要有以下几类:

收益类型计费模式用户侧储能参与方式特点
需求响应按响应电量补贴(元/kWh)或容量补贴(元/kW·月)电网或聚合商发出邀约,储能按约定时段放电削减负荷每年次数有限,但单价较高
调峰辅助服务按中标容量或放电电量补偿在电网调峰压力大的时段主动放电,申报容量通过审核后获得补偿适合2小时以上持续放电的储能
调频辅助服务容量补偿+里程补偿储能预留部分功率用于快速响应频率调节信号,需要具备AGC接口对响应速度要求高,用户侧多以聚合形式参与
备用/应急电源容量费或调用费在局部电网故障或保电时段提供支撑偏保障型收益,不确定性较大

这些收益的特点是“按规则给钱”,不同地区差异很大,有的地区用户侧储能要通过负荷聚合商才能进入辅助服务市场。我在实际项目中通常会把辅助服务收益分成“确定性较强”和“不确定性较强”两类:需求响应签约补贴相对确定,调频里程收益则波动大,测算时最好做保守估计。

1.3 配置与运行策略强耦合,这是整个问题的核心难点

很多人做配置时习惯先拍脑袋定容量,再去做运行策略,这是不对的。储能的额定功率、额定容量一旦定下来,每天的充放电曲线决定年收益;反过来,充放电曲线又受功率和容量上下限约束。也就是说,配置方案和运行策略是一枚硬币的两面,必须放在同一个优化模型里同时求解。

这带来的直接后果是:你不能用简单的“容量×循环次数×价差”公式估算收益,因为实际调度策略决定了储能到底能不能在最高价时段放电、能不能避开负荷尖峰、能不能留出备用容量去拿辅助服务补偿。所以正确做法是把“日运行策略”作为优化变量嵌入到“配置优化”中,逐个候选配置下最优运行收益,再扣除年化投资成本,最终选出经济性最优的方案。

2. 参与辅助服务的优化配置模型:变量、目标与约束怎么拧在一起

2.1 决策变量怎么设

优化模型选择的决策变量包括两类:一类是全局配置变量,一类是逐时运行变量。

配置变量就是额定功率 (P_{rated})(kW)和额定容量 (E_{rated})(kWh)。这两个变量决定了储能系统的规模,也直接决定投资成本。运行变量则是每个时段t的充电功率 (p_{ch}(t))、放电功率 (p_{dis}(t)),以及对应的充放电状态二进制变量 (u_{ch}(t))、(u_{dis}(t))。二进制变量的作用下面会详细说,它解决的是“同一时刻不能边充边放”这一物理约束。

为了处理储能能量状态,我习惯不直接用SOC作为变量,而是用储能内部存储电量 (E_{st}(t)),这样能避开“SOC乘额定容量”带来的非线性项。SOC只是在后处理时用 (E_{st}(t)/E_{rated}) 换算回来。

2.2 目标函数:年净收益最大化的建模方式

目标函数是年净收益最大化,分成“运行收益”和“投资成本”两部分。运行收益用典型日线性折算,假设一年有 (N_d) 个等效运行日,则:

[ max \quad N_d \times \sum_{t=1}^{T} price(t) \times (p_{dis}(t) - p_{ch}(t)) \times \Delta t ;+; 辅助服务年收益 ;-; 年化投资成本 - 年运维成本 ]

这里面有两个关键的建模选择:

第一,用户侧储能的收益本质是“减少电费支出”,所以充电成本按充电功率乘以对应时段的购电价计算,放电收益按放电功率乘以对应时段的购电价计算——因为放电替代了从电网买电。注意充放电效率不是乘在价格上,而是体现到能量状态递推方程里,这一点后面会展开。

第二,辅助服务收益不能简单加一个常数。它往往和配置变量耦合,比如调频容量补偿是“预留功率 × 补偿单价 × 时长”,预留的功率不能超过额定功率,还要在充放电过程中保留余量。所以辅助服务收益必须写成配置变量和运行变量的函数,放进同一个目标函数里优化。

2.3 约束条件的六个维度与线性化处理

约束条件可以归纳为六个维度,全部要写成线性约束,保证问题可以用混合整数线性规划求解。

第一个是功率上限约束:(p_{ch}(t) \le u_{ch}(t) P_{rated}),(p_{dis}(t) \le u_{dis}(t) P_{rated})。当二进制变量为0时,对应功率强制为0。

第二个是充放电互斥约束:(u_{ch}(t) + u_{dis}(t) \le 1)。没有这条约束,模型可能跑出同一时段既充电又放电的物理不可行结果。

第三个是能量状态递推方程:

[ E_{st}(t+1) = E_{st}(t) + \left( \eta_{ch} p_{ch}(t) - \frac{p_{dis}(t)}{\eta_{dis}} \right) \Delta t ]

这里 (\eta_{ch})、(\eta_{dis}) 分别是充电和放电效率。这个方程是线性的,因为它不涉及SOC和额定容量相乘。

第四个是SOC运行范围约束:(SOC_{min} E_{rated} \le E_{st}(t) \le SOC_{max} E_{rated}),其中 (SOC_{min}) 和 (SOC_{max}) 是常数,所以仍然是线性约束。还要加上日始末能量平衡约束 (E_{st}(1) = E_{st}(T+1)),否则优化器会利用“白拿”的初始能量把结果做得很虚。

第五个是额定配置约束:(P_{rated} \le P_{max}),(E_{rated} \le E_{max}),以及可选的能量时长比约束 (E_{rated} = k \cdot P_{rated}),这个 k 通常取2,即两小时储能,太长会拉低利用效率。

第六个是辅助服务备用约束。比如要预留 (R_{fr}) 的调频备用,则充电或放电时都要留出这个功率空间:(p_{ch}(t) + R_{fr} \le P_{rated}),(p_{dis}(t) + R_{fr} \le P_{rated})。如果辅助服务还要求最低申报功率,则 (R_{fr}) 需要满足 (R_{fr} \ge R_{min}),这也和其它收益存在竞争关系——备用预留越多,套利可用的功率就越少,这个权衡正是优化模型要解决的。

2.4 为什么选混合整数线性规划,而不是智能算法或非线性规划

这个问题的自然数学形式就是混合整数线性规划。充放电互斥、备用申报状态天然是二进制变量,价格和功率的关系是线性的,能量递推是线性的。用MILP的好处有三个:全局最优有保证、求解速度快、对参数扰动稳定。

我曾经用遗传算法做过对比,种群规模不够大时,结果每次跑都不一样,而且收敛到的往往不是全局最优。也用过fmincon把二进制变量松弛成连续变量再加惩罚项,调惩罚系数调到头大,最后解出来的“边充边放”比例还是很高。

在Matlab里用内置的intlinprog就能解。典型日T=24小时,二进制变量只有48个,加上连续变量,求解时间通常不到1秒。就算用15分钟分辨率,T=96,二进制变量192个,intlinprog配合默认分支定界也扛得住。如果你要求更高的求解精度,可以调整MIPGap和节点上限选项,后面代码部分会给出具体设置。

3. 经济性评估口径:收益怎么算、成本怎么摊、指标怎么定

3.1 三类收益的测算口径

优化模型算出来的是日运行策略和日收益,经济分析要把这些放在年度、全生命周期的尺度上重新核算。我习惯把所有收益归成三类:

峰谷套利收益是最基础的。以一年为周期,把每个典型日的套利收益乘上对应天数再累加:

[ I_{arb} = \sum_d N_d \sum_t price_d(t) \times (p_{dis,d}(t) - p_{ch,d}(t)) \times \Delta t ]

需量电费管理收益是很多项目容易漏算的大头。用户侧储能在负荷尖峰时段放电,可以直接压低最大需量。收益等于“原最大需量减去优化后最大需量,再乘以需量电价和月份数”:

[ I_{demand} = (D_{base} - D_{new}) \times \rho_{demand} \times 12 ]

这里的关键是 (D_{new}) 必须从优化后的负荷曲线里取月最大值,不能凭经验拍一个。有些可研报告直接假设“降低20%需量”,那很不严谨,因为需量削减和储能放电策略强相关,一旦储能容量不足以覆盖最尖峰的那个小时,削减量就达不到预期。

辅助服务收益按参与方式分别计算。需求响应按次数和单次响应电量估算;调频容量补偿按预留功率、月度补偿单价和参与月数估算;调峰补偿按实际放电电量乘以补贴单价估算。注意辅助服务各项之间存在耦合,同一个储能系统不可能同时把所有补偿吃满,后面我会专门讲这个坑。

3.2 投资成本和运维成本的摊法

投资成本方面,完整的用户侧储能系统费用由几部分构成:

成本项说明典型占比
电池本体电芯、模组、电池包约50%-60%
PCS变流器双向变流器,交直流转换约15%-20%
BMS/EMS电池管理系统、能量管理约10%-15%
施工与并网安装、电缆、并网改造、验收约10%-15%

近两年综合单价大致在0.8-1.4元/Wh之间。做经济分析时建议取区间偏高值,并且一定要包含并网改造费用——有些园区变压器余量不足,要做增容或新增出线,这部分往往超出预算。

成本摊到年度有两种口径要区分。一种是把CAPEX用年化因子等额摊到每年,用于和年收益比较;另一种是现金流口径,用于算回收期和IRR,这时CAPEX作为零时刻的一次性流出,年度只计运维成本。很多新手把这两个口径混在一起,结果回收期算出来奇短无比。

年化因子用标准的资本回收系数:

[ CRF = \frac{i(1+i)^n}{(1+i)^n - 1} ]

我常用的假设是寿命n=10年、折现率i=8%,此时CRF≈0.149。240万元投资对应年化成本约35.8万元,再加年运维5万元,年度总成本约40.8万元。这个数要和年收益直接对标。

3.3 四个核心指标的计算和判断标准

全生命周期经济分析用四个指标就够,分别是净现值NPV、内部收益率IRR、静态回收期、平准化储能成本LCOS。

NPV是把全生命周期每年的净现金流折现后加总,大于0说明项目按目标折现率能赚钱。这里的“净现金流”一定是现金流口径:年收益减去年运维,不含年化分摊。IRR是让NPV等于0的折现率,一般工商业项目要求不低于8%,有些企业要求10%以上。静态回收期用初始投资除以年均净现金流,不折现,是一个快速参考值,一般要求6年以内。

LCOS是更精细的指标,把全生命周期所有成本折现后除以累计放电电量折现:

[ LCOS = \frac{CAPEX + \sum \frac{O&M_t}{(1+i)^t}}{\sum \frac{E_{dis,t}}{(1+i)^t}} ]

LCOS适合用来横向比较不同储能技术路线的度电成本。我之前做过对比,磷酸铁锂用户侧储能LCOS通常在0.5元/kWh到0.8元/kWh之间,如果算出来超过1元,那说明配置规模偏大或者循环次数偏低,方案大概率不成立。

3.4 敏感性分析为什么必须做

用户侧储能经济性对几个外部参数特别敏感:储能系统单价、峰谷价差、年循环次数、辅助服务补贴标准。这四者任何一个波动20%,都可能让IRR从10%掉到6%。

我的做法是固定其它参数,对每个自变量取0.8倍、1.0倍、1.2倍三个水平,输出一张“IRR变化表”。备参数的时候,给投资方汇报时优先展示偏保守组合,也就是“单价高、价差小、循环少、补贴低”那个角上的结果。这既是职业习惯,也是项目评审的实际要求——银行和投资方不会信乐观预估。

4. Matlab代码实现:从时序数据到求解器的完整链路

4.1 数据准备:负荷、电价与辅助服务信号的时序处理

优化模型质量的上限由数据决定。负荷曲线最好拿到一整年的用户关口表计数据,按15分钟间隔整理。一年数据太多,直接塞进日优化模型效率低,我的做法是聚类成典型日:把一年分成夏季、冬季、过渡季三个季节,每个季节再分工作日和周末,共6类典型日,每类赋一个权重天数。

电价曲线按实际执行的峰谷平目录电价生成,每个典型日单独保存。注意很多地区还有尖峰电价,尖峰时段和负荷尖峰不一定重合,这事必须用数据说话。

辅助服务数据则包括:需求响应年邀约次数和单次补偿单价、调频容量月补偿单价、调峰电量补偿单价。这些参数的来源是当地辅助服务规则和市场历史结算数据,如果没有历史数据,宁可先按中低值估,也不要按高值估。

数据都整理成Matlab的列向量或结构体,负荷是 (T \times 6) 的矩阵,价格同理,每列代表一类典型日。

4.2 优化模型的核心代码框架

下面这段代码我用的是Matlab优化工具箱的problem-based接口,求解器选intlinprog。先是变量声明:

% 参数区 T = 24; % 24小时,可改成96(15分钟) dt = 1; Pmax = 1000; % 额定功率上限 kW Emax = 2000; % 额定容量上限 kWh eta_ch = 0.95; eta_dis = 0.95; SOCmin = 0.1; SOCmax = 0.9; Ndays = 330; % 年等效运行天数 c_sys = 1.2; % 系统单价 元/Wh CRF = 0.1490; % 折算年化因子 OM_cost = 50000; % 年运维成本 % 典型日数据:第d类的负荷和电价 load_profile = [...]; % T x 6 price_profile = [...]; % T x 6 % 概率优化问题 prob = optimproblem('ObjectiveSense','maximize'); % 配置变量 P_rated = optimvar('P_rated',1,'LowerBound',0,'UpperBound',Pmax); E_rated = optimvar('E_rated',1,'LowerBound',0,'UpperBound',Emax); % 逐时运行变量(对某一典型日,这里先写单日版本) p_ch = optimvar('p_ch',T,'LowerBound',0); p_dis = optimvar('p_dis',T,'LowerBound',0); u_ch = optimvar('u_ch',T,'Type','integer','LowerBound',0,'UpperBound',1); u_dis = optimvar('u_dis',T,'Type','integer','LowerBound',0,'UpperBound',1); E_st = optimvar('E_st',T+1,'LowerBound',0); % 存储电量

注意E_st的下限不直接取0,还要满足SOC下限,这个放到约束里用E_rated乘SOCmin表达。

然后是约束构建:

% 能量状态递推 soc_cons = optimconstr(T,1); for t = 1:T soc_cons(t) = E_st(t+1) == E_st(t) + (eta_ch*p_ch(t) - p_dis(t)/eta_dis)*dt; end prob.Constraints.soc = soc_cons; % SOC范围约束 prob.Constraints.soc_low = E_st(1:T) >= SOCmin*E_rated; prob.Constraints.soc_up = E_st(1:T) <= SOCmax*E_rated; % 日始末能量平衡,防止“白拿”初始电量 prob.Constraints.soc_bal = E_st(T+1) == E_st(1); % 功率上限和互斥 power_cons = optimconstr(T,1); excl_cons = optimconstr(T,1); for t = 1:T power_cons(t) = p_ch(t) <= u_ch(t)*P_rated; power_cons(t) = power_cons(t) + (p_dis(t) <= u_dis(t)*P_rated); excl_cons(t) = u_ch(t) + u_dis(t) <= 1; end prob.Constraints.power = power_cons; prob.Constraints.excl = excl_cons; % 辅助服务备用约束:预留10%额定功率做调频备用 R_fr = 0.1*P_rated; reserve_cons = optimconstr(T,1); for t = 1:T reserve_cons(t) = p_ch(t) + R_fr <= P_rated; reserve_cons(t) = reserve_cons(t) + (p_dis(t) + R_fr <= P_rated); end prob.Constraints.reserve = reserve_cons;

目标函数里把每日套利收益折算到年,再扣掉年化投资和运维:

% 日套利收益 daily_arb = price_profile(:,1)' * (p_dis - p_ch) * dt; % 年套利收益 annual_arb = Ndays * daily_arb; % 年化投资成本 annual_capex = c_sys * E_rated * 1000 * CRF; % E_rated单位kWh, c_sys单位元/Wh prob.Objective = annual_arb - annual_capex - OM_cost; % 求解 options = optimoptions('intlinprog','Display','iter','MIPGap',0.001,... 'MaxTime',300); [sol,fval,exitflag] = solve(prob,'Options',options);

这段代码是单典型日的骨架。多典型日版本要把运行变量、约束结构体和目标函数按典型日维度展开,加起来即可。实际跑下来你会发现,最优配置往往出现在P_rated或E_rated的上限边界附近,这说明“能配多大就配多大”在这个模型里未必成立,真正起作用的是边界上的边际收益和边际成本对比。

4.3 结果整理与绘图

求解完成后,我一般先把结果整理成结构化数据:

P_opt = sol.P_rated; E_opt = sol.E_rated; Pch = sol.p_ch; Pdis = sol.p_dis; SOC = sol.E_st / E_opt; % 年收益拆解 rev_arb = Ndays * sum(price_profile(:,1).*(Pdis - Pch))*dt; rev_demand = demand_reduction_estimate(Pdis, Pch, load_profile, rho_demand); rev_aux = calc_auxiliary_revenue(P_opt, E_opt, Pdis); fprintf('额定功率: %.1f kW\n', P_opt); fprintf('额定容量: %.1f kWh\n', E_opt); fprintf('年套利收益: %.2f 万元\n', rev_arb/1e4); fprintf('年需量收益: %.2f 万元\n', rev_demand/1e4); fprintf('年辅助服务收益: %.2f 万元\n', rev_aux/1e4);

绘图方面我习惯画三张图:第一张是典型日的充放电功率曲线和负荷曲线叠在一起,直接看放电是否落在负荷尖峰和电价尖峰时段;第二张是SOC曲线,检查SOC是否在10%-90%之间且首尾相接;第三张是全年收益结构柱状图,把套利、需量、辅助服务三类收益分开显示。

这三张图也是给投资方汇报的三件套。尤其是第一张图,能直观说明“储能到底在什么时候干活”,比任何文字都有说服力。

4.4 灵敏度分析的批处理思路

经济分析阶段要把优化配置固定下来,只变外部参数,观察IRR和NPV的变化。用一个循环批量处理:

price_range = [0.9, 1.0, 1.1, 1.2, 1.3, 1.4]; % 系统单价 元/Wh irr_results = zeros(size(price_range)); for k = 1:length(price_range) c_sys = price_range(k); % 重新跑优化或者直接按固定配置算现金流 [~, irr_results(k)] = evaluate_project(c_sys); end plot(price_range, irr_results*100, '-o'); xlabel('系统单价(元/Wh)'); ylabel('全投资IRR(%)'); grid on;

如果配置结果对单价敏感,每一轮都需要重新求解优化模型,否则配置和参数不匹配。我在批处理时会把4.2节的求解函数封装成一个optimize_storage(load, price, aux_param, cost_param)函数,参数通过结构体传入,这样循环里调用起来很干净。

求解速度不是瓶颈。真正花时间的是数据清洗和结果解读,代码本身即使加上多典型日,跑完一轮也只要几十秒。

5. 一个典型用户场景的仿真结果与收益拆解

5.1 案例参数设定

用某工业园区做仿真案例。园区变压器容量2500kVA,年最大需量约1800kW,日负荷曲线呈典型的双峰形状,上午和下午各有一个高峰,夜间负荷降到400kW左右。峰谷电价按“尖峰0.95元/kWh、平时0.65元/kWh、低谷0.35元/kWh”设置,平均有效价差0.6元/kWh。储能候选范围:额定功率上限1000kW,额定容量上限2000kWh,能量时长比2。

系统单价按1.2元/Wh取120万每MWh,全系统总投资240万元;年运维5万元;寿命10年;折现率8%。辅助服务按保守情况估:需求响应每年12次、每次按1000kWh参与、补贴3元/kWh,年收益约3.6万元;调频容量按150kW参与、月补偿30元/kW、全年12个月参与,约5.4万元;调峰电量补贴年均约2万元。合计辅助服务年收益约11万元。

5.2 最优配置结果:辅助服务改变了什么

我用上一节的Matlab代码分别跑了两个场景:不参与辅助服务,以及参与辅助服务。

不参与辅助服务时,最优配置落在额定功率约700kW、额定容量约1200kWh附近。原因很直接:当储能只有套利和需量管理两件事可做时,再往上增加容量,边际收益开始低于边际投资成本,配置就停在中间区域。

参与辅助服务后,最优配置变为额定功率约900kW、额定容量约1800kWh,明显向边界靠拢。原因是辅助服务的容量补偿和需求响应次数收益,让增大规模带来的边际收益提高了,也就是“大一点更划算”。这说明辅助服务不只改善经济性,还会改变最优配置——这就回应了标题里的“优化配置”和“参与辅助服务”之间的关系。

当然,这个结果依赖于辅助服务参数假设。如果调频容量补偿降低到每kW每月10元以下,最优配置会明显回缩,这也是我坚持做敏感性分析的原因。

5.3 收益拆解与经济指标对比

按参与辅助服务场景,年运行收益拆解如下:

收益项年收益(万元)说明
峰谷套利约302000kWh系统日循环一次,考虑效率和280天有效循环
需量管理约9尖峰时段放电削减需量约300kW
需求响应约3.612次×1000kWh×3元/kWh
调频容量补偿约5.4150kW×30元/kW·月×12个月
调峰电量补贴约2年10次左右,按电量结算
合计约50—

再看两个场景的经济指标:

指标不参与辅助服务参与辅助服务
年运行收益约39万元约50万元
年运维5万元5万元
年净现金流34万元45万元
静态回收期约7.1年约5.3年
IRR约7%约13%
NPV(8%)约-12万元约62万元

这个对比很能说明问题:不参与辅助服务时IRR不到8%,项目在投资评审这一关就过不了;加入辅助服务收益后,IRR抬到13%左右,NPV转正,项目从“不可投”变成“可投”。辅助服务的11万元年收益看似只占总收益的22%,却恰好是压垮或撑起项目的那根杠杆。

5.4 单价变化对IRR的敏感性结果

继续在参与辅助服务场景下做系统单价敏感性。系统单价从0.9元/Wh逐步升高到1.5元/Wh,IRR变化趋势大约是:0.9元/Wh时IRR约16%以上,1.2元/Wh时约13%,1.4元/Wh时约9%左右,超过1.5元/Wh后跌破8%的基准线。

峰谷价差的敏感性同样显著。有效价差从0.6元/kWh降到0.45元/kWh,IRR会掉3到5个百分点,这个区间的项目就处在“看天吃饭”状态。所以我会额外建议投资方在商务谈判中锁定辅助服务入市规则或签订长期聚合服务协议,把这部分收益的确定性做高,项目才真正稳。

6. 反复踩过的坑和对应的处理办法

6.1 SOC初值与调度周期衔接问题

第一次跑日优化时,我在SOC初值这里栽过跟头。如果允许每天从SOC=0.2开始而不约束终值,优化器会把最后几个时段全部放完,让SOC一路降到下限,相当于把“赊来的能量”在第一天就变现了。结果年收益虚高10%以上。

处理办法就是加日始末能量平衡约束 (E_{st}(T+1) = E_{st}(1))。对于连续运行的多日调度,更强的方法是把整个月的时序一次性放进模型,只用SOC的运行范围约束头尾,这样更接近真实连续运行。代价是变量规模变大,但15分钟分辨率的月调度在intlinprog里仍然可以接受。

6.2 充放电互斥约束缺失的假结果

理论上说,同一时段的充放电功率都是正变量,如果同价,同时充放只会因效率损失而降低目标函数,好像不会出现。但加入需量管理约束后情况就变了,求解器可能在约束的缝隙里构造出“同一时刻既充电又放电”的不可行运行方式,通过同时动作既满足峰值约束又套取收益。这种结果物理上完全不存在,却让收益虚增。

所以二进制变量和互斥约束不能省。题外话:如果你用遗传算法或粒子群这类启发式算法,这个问题更难发现,因为算法压根不会主动保证可行性。

6.3 需量管理与辅助服务的时序耦合被忽略

最容易犯的错是重复计算收益。比如需求响应要求某时段放电,同时你又用同一个时段的放电去削减最大需量,这就把同样一度电卖了两遍。真正严肃的算法要按时间序列把两类收益的权责边界分开:一般规则是需求响应时的放电电量不计入需量削减,或者提前约定二者的优先级。

我的处理方式是在约束里显式建模:定义需求响应事件集合,事件时段内的放电功率单独隔离计算收益,不再进入需量削减的核算窗口。这样虽然保守一点,但每个项目的账都是干净可复核的。

6.4 衰减模型过于简单导致指标虚高

很多早期报告假设电池寿命10年、容量衰减均匀10%,结果IRR算得漂亮,但实际跑到第5年,可用容量已经掉了20%,月收益跟着掉,项目现金流和后段完全对不上。

我的经验是把电池衰减分成日历衰减和循环衰减两类。日历衰减按年度折减可用容量比例,循环衰减按累计吞吐电量折减,简化处理可以用“年均衰减1.5%-2%”做保守假设,也可以接经验公式。重点不是模型多精细,而是别让经济指标建立在“容量永远不变”的假设上。

6.5 Matlab实现的几个常见报错

代码层面有三个高频问题。一是能量状态约束里忘记把初始时段 (E_{st}(1)) 纳入SOC范围约束,导致初始SOC可以低于下限。二是optimvar的维度搞错,比如把T写成T+1后索引对不齐,求解时报“Index exceeds array bounds”。三是求解器返回“infeasible”,十有八九是互斥约束和辅助服务备用约束组合出矛盾——比如额定功率上限设得比备用功率还小,模型当然无解。

遇到infeasible先别急着改约束,用prob.showConstraints逐个检查可行域,或者先松一个约束做排除法。我习惯第一步把Pmax设大一点看有没有解;如果有,再用二分法收紧,找临界点。

最后再分享一个项目收尾的小技巧:经济分析不要只出一版结果。我每次都会给三层“收益包”——不参与辅助服务、参与需求响应、参与需求响应加调频——分别出一套配置和指标。投资人拿这三个版本自己判断风险偏好,比逼我硬给一个乐观数字要舒服得多。辅助服务市场规则还会调整,这个三层结构也让后续修改参数不至于重做整个模型。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询