资讯详情

用户侧储能参与辅助服务的优化配置与经济分析Matlab实现

📅 2026/10/13 18:01:08 | 华诺云谱 👁 阅读
用户侧储能参与辅助服务的优化配置与经济分析Matlab实现
做储能项目的同行应该都有这个体会聊到用户侧储能第一反应是“削峰填谷”聊到辅助服务第一反应是“火电、独立储能的事”。但当用户侧储能真正想参与调频、备用这些辅助服务时问题马上就来了——储能容量配多大合适功率和电量怎么权衡参与辅助服务的收益到底能不能覆盖电池的额外损耗这些问题如果靠经验拍脑袋很容易把项目算亏。我最近用Matlab做了一套用户侧储能参与辅助服务的优化配置与经济分析代码把容量配置、运行调度、收益测算全部放进同一个模型里求解算是把账算明白了。这篇博文把完整的建模思路、代码框架和我在实际调试中踩过的坑整理出来给准备做类似评估的同行一个可直接参考的底稿。1. 为什么要把“辅助服务”放进储能配置模型1.1 单一峰谷套利已经算不过账用户侧储能最早的应用场景就是峰谷套利低谷充电、高峰放电赚电价差。在早期峰谷价差超过0.7元/kWh的地区两三套电池的回本周期还能控制在五六年内。但从这两年实际项目的测算结果看很多地区峰谷价差在缩窄加上变压器容量限制、电池衰减等因素单纯靠峰谷套利已经很难撑起一个合理的投资回报模型。以一组典型工商业数据为例两部制电价下中等规模用户年用电量约2000万kWh峰谷价差0.6元/kWh如果只做套利一个500kW/1000kWh的储能系统年套利收益大概只有30-40万元而系统初始投资在150-200万元静态回收期接近5年。如果把电池衰减、运维成本、资金利息都算进去整个项目的内部收益率会相当难看。这个背景下辅助服务就成了一个必须考虑的收益补充来源。用户侧储能参与辅助服务的模式包括调频、备用容量、需求响应等收益模式与峰谷套利完全不同往往是“按容量付费”或“按里程付费”这就引入了全新的优化维度。1.2 辅助服务是收益结构的调节阀辅助服务对用户侧储能来说不是简单的“多赚一笔钱”而是改变了储能的运行模式。峰谷套利是典型的能量型应用要求储能“低谷充满、高峰放完”日均循环次数有限放电深度大。而调频辅助服务是典型的功率型应用要求储能快速响应、频繁小幅充放单次充放电的深度浅但动作次数大幅增加。这个区别直接决定了容量配置的方向。如果你只是做峰谷套利容量的核心是“电量”——kWh越大越好功率只要在4-6小时内能充满放完就行。但如果要参与调频核心就变成了“功率”——kW决定了你能竞标多少调频容量而kWh只是保证持续动作的底仓。同一个电池两种应用场景下的最优功率配比可能差出3-4倍。所以优化配置不能把“辅助服务收益”当成一个固定输入而是要把辅助服务的参与深度和容量配置同时作为决策变量让模型去算究竟拿出多少功率和电量去做调频、留多少去做套利整体经济性最优。1.3 配置、调度、经济性必须放在同一个框里算我在最初做这个项目的时候犯过一个典型错误先把容量配置算好再单独做运行策略优化最后算经济账。这种串行流程有两个问题。第一容量配置阶段没有调度信息支撑你只能按经验假定年循环次数、放电深度这些参数恰恰是决定电池寿命和经济性的核心变量。第二运行策略优化阶段已经固定了容量如果跑出来发现调频收益很高、想多投调频功率不够就得重新回到上一步来回迭代非常低效。正确的做法是把配置问题和调度问题耦合在一起外层是容量决策kW、kWh内层是逐时段的运行决策充电、放电、调频备用容量目标函数是项目全生命周期的净现值最大化或者年化利润最大化。这样求解出来的配置结果本身就包含了最优运行策略的影子经济分析也不需要额外假设一个“运行模式”因为所有收益项和成本项都是模型内生计算出来的。这就是我这套Matlab代码的核心设计原则一体化建模。2. 数学模型目标函数与约束条件怎么设2.1 目标函数从“最大收益”到“NPV最大”很多初学者做优化配置时习惯把目标函数设成一个调度周期内的收益最大化比如24小时的总收益最大。这在单一调度周期内没有问题但如果整个项目的目标是在全生命周期内盈利这个目标函数就少了维度——它没有考虑初始投资、电池更换成本、资金的时间价值。我这套模型采用的目标函数是全生命周期净现值最大化。计算方式是把储能系统的整个寿命周期按年划分每一年的收益和成本都折现到当前时刻减去初始投资后求最大值。表达式上可以写成max NPV -C_cap * E_rated - C_pow * P_rated - C_fix sum_{y1}^{N} (R_y - O_y - D_y) / (1 r)^y其中C_cap是单位容量成本元/kWhC_pow是单位功率成本元/kWC_fix是固定安装成本R_y是第y年的总收益包括峰谷套利收益、调频收益、备用容量收益O_y是第y年的运维费用D_y是第y年的电池衰减折算成本r是折现率N是项目寿命期为什么不用“年利润最大”而用NPV因为用户侧储能项目的初始投资在总成本中的占比极高而收益分布在整个寿命周期内如果不折现算出来的结果会偏向“短期多赚”的方案低估了电池衰减对后期收益的影响。用NPV做目标函数模型会自动在“多配容量赚更多”和“少配容量降低投资风险”之间找到平衡点。2.2 电池运行约束和寿命损耗建模模型的核心约束是电池的物理约束和运行逻辑约束。最基础的一组是SOC(t1) SOC(t) (P_ch(t) * eta_ch - P_dis(t) / eta_dis) * dt / E_rated 0 SOC(t) 1 0 P_ch(t) P_rated * u_ch(t) 0 P_dis(t) P_rated * u_dis(t) u_ch(t) u_dis(t) 1这组约束让电池在任何时刻都只能处于充电、放电、待机三种状态之一不能同时充放电避免模型利用“边充边放”来虚增收益。SOC的上下限一般取0.1和0.9既保护电池也给调频动作留出调节余量。比较关键的是电池寿命损耗约束。如果模型认为电池寿命恒定不变它就会想方设法把电池用得很猛因为长期衰减成本没有体现在优化中。实际中电池循环深度越深寿命衰减越快参与调频时频繁的小幅度充放也会加速老化。我的处理方式是建立一个线性化损耗模型每次充放电的损耗成本按照当前时刻的放电深度和动作次数折算成经济量直接放进目标函数的运行成本项里。简化处理时可以按总吞吐量计算等效循环次数N_cycle(t) (eta_dis * P_dis(t) * dt P_ch(t) * dt / eta_ch) / (2 * E_rated) 总等效循环数 sum(N_cycle) 年寿命损耗 总等效循环数 / 设计循环寿命 * 初始投资 / 寿命年数这个模型虽然做了线性化但在工程测算的精度范围内是够用的而且保持了优化问题的可解性。2.3 辅助服务收益项与机会成本辅助服务收益建模是这套代码里最需要细致的部分。以调频为例用户在日前市场中提交调频容量投标中标后在任何时刻都需要预留相应的功率区间来执行AGC指令。这个预留功率会影响正常的峰谷套利计划所以模型需要显式考虑这种耦合关系。调频收益可以分成两部分容量补偿和里程补偿。R_AGC price_capacity * R_cap * T price_mileage * mileage_rate * R_cap * T其中R_cap是调频备用容量mileage_rate是调频里程与容量的比值一般取1到3之间。约束上调频容量不能超过额定功率的一定比例而且和充放电功率存在冲突关系P_ch(t) R_cap(t) P_rated P_dis(t) R_cap(t) P_rated这两条约束的道理很简单电池功率容量是有限的如果预留了R_cap做调频剩余功率才能用于充放电。有些初学者会漏掉这个约束算出来的收益结构过于乐观实际执行时根本做不到。备用容量收益同样类似按可用容量乘以小时数和补偿单价计算。但备用容量一般要求储能保持一定的SOC水平这会限制套利时段的电量可用性模型里要加上对应的SOC约束。3. Matlab实现从参数设置到求解器调用3.1 代码总框架与模块划分整套Matlab代码我分成了五个模块数据输入模块、参数设置模块、优化模型构建模块、求解与后处理模块、经济分析模块。模块化的原因很直接——储能项目的边界条件差异很大换一个项目就得换一套数据如果代码全部耦合在一起改参数的时候容易出错。数据输入模块读取电价曲线、辅助服务补偿价格、负荷曲线等外部数据。参数设置模块定义电池参数、项目经济参数、优化时长。优化模型构建模块是核心负责把第一节和第二节的数学模型写成Matlab可求解的形式。求解与后处理模块调用求解器把结果整理成容量配置、逐时出力计划。经济分析模块根据求解结果计算NPV、内部收益率、回收期等指标。我用的求解框架是Yalmip加外部求解器。Yalmip是一个建模层不自己求解而是把优化问题翻译成标准形式交给底层的求解器。我实测下来Gurobi在这个模型上表现最稳定CPLEX也可以但配置起来稍麻烦。如果只有Matlab自带的优化工具箱可以用intlinprog但问题是辅助服务收益模型中如果涉及分段线性化表达起来很绕Yalmip的符号建模方式会清晰很多。3.2 决策变量与约束条件怎么写以24小时优化、单位时间1小时为例核心决策变量包括P_ch(t)充电功率连续变量P_dis(t)放电功率连续变量u_ch(t)、u_dis(t)充放电状态标志0-1变量R_cap(t)调频备用容量连续变量SOC(t)荷电状态连续变量用Yalmip写的时候参数设置部分长这样%% 基本参数 E_rated 1000; % 额定容量 kWh P_rated 500; % 额定功率 kW eta_ch 0.95; % 充电效率 eta_dis 0.95; % 放电效率 SOC_min 0.1; SOC_max 0.9; SOC_init 0.5; dt 1; % 时间步长 1小时 T 24; % 优化时长 24小时 %% 决策变量定义 P_ch sdpvar(T, 1); P_dis sdpvar(T, 1); u_ch binvar(T, 1); u_dis binvar(T, 1); R_cap sdpvar(T, 1); SOC sdpvar(T, 1);约束条件写起来也很直观。注意SOC递推约束要逐时段写成循环式定义Yalmip对向量化表达支持得不错但涉及首时段固定值的时候要单独处理%% 约束条件 Constraints []; % 首时段SOC约束 Constraints [Constraints, SOC(1) SOC_init]; % SOC递推约束 for t 1:T-1 Constraints [Constraints, SOC(t1) SOC(t) ... (eta_ch * P_ch(t) - P_dis(t) / eta_dis) * dt / E_rated]; end % SOC上下限 for t 1:T Constraints [Constraints, SOC_min SOC(t) SOC_max]; end % 功率约束与调频容量耦合 for t 1:T Constraints [Constraints, 0 P_ch(t) P_rated * u_ch(t)]; Constraints [Constraints, 0 P_dis(t) P_rated * u_dis(t)]; Constraints [Constraints, u_ch(t) u_dis(t) 1]; Constraints [Constraints, P_ch(t) R_cap(t) P_rated]; Constraints [Constraints, P_dis(t) R_cap(t) P_rated]; Constraints [Constraints, 0 R_cap(t) P_rated * 0.3]; end这里对R_cap(t)的上限取了额定功率的30%是考虑到大多数调频市场对用户侧储能的性能约束。如果你所在地区有明确的准入标准改成对应数值即可。目标函数里把峰谷套利收益、调频收益简化处理作容量补偿和电池损耗成本整合在一起%% 目标函数 price_buy price_data; % 从外部读取的分时购电价 price_sell price_data; % 从外部读取的分时售电价 revenue_arb sum(-price_buy .* P_ch * dt price_sell .* P_dis * dt); revenue_agc agc_price * sum(R_cap) * dt; loss_cost k_loss * sum(eta_dis * P_dis * dt P_ch * dt / eta_ch); Objective -revenue_arb - revenue_agc loss_cost; optimize(Constraints, Objective, sdpsettings(solver, gurobi));注意这里目标函数前面加负号是因为优化默认是求最小值而我希望最大化收益所以把收益项取负。3.3 经济评价指标的计算优化求解完得到的是运行层面的最优策略和收益流。但要回答“这个储能项目值不值得投”还需要把收益流折算成投资指标。经济分析模块里我实现了NPV、内部收益率IRR和动态回收期三个指标。NPV的计算前面已经给了公式。内部收益率IRR是让NPV等于0的折现率Matlab里可以直接用irr函数或者自己写一个二分法求解。动态回收期是累计折现现金流首次转正的年份逻辑上是NPV曲线过零点的时间。比较容易被忽略的是运维成本的处理。电池的运维成本不是一次性支出而是逐年发生的包括电池更换、巡检维护、保险、通信流量费用等。在NPV计算里这些成本按年折现后减去不能简单地在初始投资里扣。4. 算例结果一组典型工况的经济分析4.1 输入数据与场景设定为了验证代码的正确性我做了一个基准算例。假设某工商业用户变压器容量2000kVA日均负荷曲线有明显的双峰特征综合电价采用分时电价低谷0.25元/kWh、平段0.6元/kWh、高峰1.1元/kWh。储能候选配置范围功率200-800kW容量400-2400kWh单位功率成本800元/kW单位容量成本1200元/kWh固定安装成本10万元寿命10年折现率8%。辅助服务方面当地调频市场容量补偿价格为20元/MWh里程补偿价格为8元/MW调频里程比按2.0取值。备用容量补偿价格为25元/MWh但备用容量会从优化周期开始时持续占用到结束所以模型会在最终一个时段检查可用容量确保满足备用申报。4.2 优化结果与收益结构模型跑出来的最优配置结果是功率600kW、容量1200kWh。对比几个备选方案这个配置点对应的年化收益结构如下表| 收益来源 | 年均收益万元 | 占比 | | 峰谷套利 | 38.2 | 46.3% | | 调频容量补偿 | 17.5 | 21.2% | | 调频里程补偿 | 12.6 | 15.3% | | 备用容量补偿 | 9.8 | 11.9% | | 其他需求响应等 | 4.2 | 5.1% |合计年均收益约82.3万元。扣除年运维费用6.5万元和电池损耗折算成本4.8万元年净收益约71万元。初始投资按600kW×800元/kW 1200kWh×1200元/kWh 10万元计算总共约202万元。静态回收期2.8年动态回收期3.4年NPV折现率8%为186万元IRR约24.7%。这个结果比我最初只做峰谷套利的测算好很多核心原因就是辅助服务把储能在非高峰时段的闲置功率变成了收益来源。注意一个细节最优配置的功率容量比是0.5600kW/1200kWh比纯套利场景下的常见配比0.25-0.3高不少。模型之所以选择更大功率正是为了让储能留出更多余量参与调频这是个很典型的辅助服务驱动容量再优化的例子。4.3 敏感性分析单一场景的优化结果不足以下结论必须做敏感性分析。我重点测了三个变量调频补偿价格、电池循环寿命和折现率。调频补偿价格从20元/MWh降低到10元/MWh时最优配置中调频容量占比明显下降整体容量从1200kWh降到850kWh功率从600kW降到400kW。这说明辅助服务的收益水平会实质性影响配置决策而不是简单地在固定容量下分成比例。电池循环寿命从6000次下降到4000次时最优容量减少约15%因为更短的寿命意味着更保守的利用策略模型宁可少赚一点也不愿意过度消耗电池。折现率从8%调整到12%时最优功率基本不变但NPV大幅降低回收期从3.4年变到4.6年。这些敏感性测试对投资决策特别有用。实际项目沟通中业主问“储能装多大合适”我会把不同场景下的配置结果和对应的NPV包络线一起给出让业主看到即使补偿价格打七折项目仍然具备正的收益空间。5. 实操经验与常见问题5.1 求解器卡住或不可行怎么办我调试这个模型时遇到最多的就是求解不可行问题。最常见原因是SOC递推约束里某一时刻出现了无法满足的状态组合比如在连续多个高峰时段模型既想放电套利又想保持足够的SOC用于调频约束冲突导致无解。排查方法有一个方向把目标函数临时改成最小化“松弛变量”然后在约束里给SOC上下限加一个小的惩罚松弛项比如±0.05的误差范围。这样即使原始问题不可行也能求解出一个接近的解然后从松弛量大的时段反查是哪个约束卡住了。这个技巧在复杂约束模型里非常实用比起一条条删约束快得多。另外求解器参数对性能影响很大。Gurobi默认的MIP Gap是1e-4对这个规模的模型来说太苛刻了。我一般设置到0.01也就是1%的Gap求解速度会有明显改善结果精度也足够工程使用。5.2 收益数据采集的坑辅助服务补偿价格不是单一固定值而是随市场供需波动的。我在做实际项目时发现如果直接用某个时段的平均价格作为全年的输入优化结果会偏乐观。建议的做法是取过去一年辅助服务市场的分月平均值并把最差的三个月作为保守场景单独测算一次。另外调频里程比这个参数特别容易被忽略。很多初次做调频收益测算的人直接把补偿价格乘以中标容量再乘以小时数实际收益远低于这个数因为调频是动态动作不是静止在那里就拿到全款。里程比就是把动态动作量折算进去的关键参数取值偏低可能低估收益取值偏高又会造成收益虚高。我建议按储能实际性能测试曲线测算没有测试数据时至少取1.5-2.0的范围做区间测算。5.3 电池老化到底怎么折算电池损耗成本是经济分析中最有争议的部分。如果完全不考虑NPV会虚高20%以上因为模型会让电池在高峰期疯狂放电快速把容量耗尽。如果考虑过头模型会变得极度保守不敢利用电池赚钱配置结果也失真。我的经验是采用“吞吐量损耗法”作为基础模型同时用日历老化成本做保底。具体做法是每度电的充放电循环按等效循环折算损耗成本这个成本的费率通过“初始投资乘以设计循环寿命对应的能量吞吐量”得到也就是设计寿命内的总能量吞吐量分摊到单位电量的损耗成本。全年循环1000次和全年循环300次的项目损耗成本相差接近三倍这个差异如果不用吞吐量法就无法体现到优化决策中。日历老化则是按电池自放电和环境因素导致的容量衰减估算通常可以按初始投资的1%-2%作为年度固定损耗成本。这样既体现了使用强度对寿命的影响也保留了时间因素的底账整体上比较接近实际。6. 最后再说几句用户侧储能参与辅助服务的优化配置表面上是一个数学规划问题我做完这套代码和测算后的体会是真正的难点反而不在算法而在对实际业务约束的理解。调频和其他服务的耦合、备用容量对SOC的限制、电池损耗的经济化表达每一项都是从实际项目里提炼出来的刚性需求如果只停留在理论模型层面算出来的结果根本落不了地。我建议做类似项目的同行拿到代码后不要直接套用参数而是先把自己所在地区的电价、辅助服务补偿规则、电池厂商提供的寿命曲线这三组数据整理清楚再跑模型。数据质量决定了优化结果的上限优化算法只是把这个上限如实呈现出来。后续如果要扩展可以在当前模型基础上加入需求响应、需量管理这类收益项也可以把年内的季节性电价差异做成多时段聚类后参与优化模型框架不用大改核心的耦合约束逻辑是通用的。有小问题欢迎在评论区交流我有空会回复。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑