ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

储能参与调峰配置方案与经济性分析的Matlab复现指南

储能参与调峰配置方案与经济性分析的Matlab复现指南 刚收到“参与调峰的储能系统配置方案及经济性分析”这个题目时我原以为就是把储能容量、功率套进一个优化函数在Matlab里调出结果就完事。真做下来才发现调峰场景牵扯到目标函数怎么建、约束条件怎么表达、充放电时机怎么建模每个环节都有一堆细节。这篇文章就把我复现EI论文时踩过的坑、摸过的路完整整理出来适合正在做论文复现、毕业设计或者储能项目前期方案论证的同行参考。我会把建模逻辑、经济性核算、Matlab实现路径、结果敏感性分析和常见报错一并讲清楚尽量做到看完就能动手。1. 调峰场景下储能配置的建模逻辑从负荷曲线到决策变量1.1 调峰需求从哪来储能又扮演什么角色电力系统的负荷一天之内波动很大夜间低谷、白天高峰。新能源大规模接入之后情况变得更复杂光伏在午间大发把净负荷负荷减去新能源出力压得很低到了傍晚光伏出力归零净负荷又快速爬升形成所谓的“鸭子曲线”。这样一来系统对调峰资源的需求不再只是简单的峰谷差而是要求机组具备快速爬坡、深度下调的能力。传统火电机组调峰深度有限频繁启停和深调不仅增加煤耗还带来机组寿命损耗。储能系统的优势正好体现在这里充电时相当于增加负荷放电时相当于减少负荷配合PCS的快速响应能力可以在几分钟内完成充放电状态切换。在配置层面储能参与调峰主要回答三个问题装多大功率、装多大容量、充放电策略怎么安排。功率决定了单位时间能“挪”多少电量容量决定了能持续“挪”多久两者互相耦合。1.2 为什么配置方案要当成优化问题来解很多人一上来就套“两小时储能”的固定比例比如负荷峰值的10%、持续2小时这是工程估算思路不能用于论文复现或精细方案论证。原因是功率和容量之间存在最优配比关系功率大了容量不足高峰时段放一会儿就没电容量大了功率不足高峰时段派不上用场。同时储能参与调峰还面临“在哪里充电、在哪里放电”的时序决策这是一个典型的规划-运行联合优化问题。EI论文里常见做法是把问题写成一个混合整数规划MILP上层决策储能的额定功率和额定容量运行层决策每个时段的充放电功率和0-1状态变量。两层可以解耦迭代也可以用KKT条件合并成单层更多人直接用单层MILP表达。判别标准很简单如果目标函数里同时出现投资成本项和运行收益项且运行收益依赖逐时段的充放电变量就需要放在同一个模型里联立求解而不是先定规模再算运行收益那样会漏掉规模与运行策略之间的耦合关系。1.3 典型日与全时间尺度的取舍复现这类论文时最先要决定的事情就是时间尺度。直接用全年8760小时建模变量维度大求解时间长而且很多论文数据只给典型日。实用做法是选取典型日来代表不同季节的运行特性比如夏季典型日、冬季典型日、过渡季典型日每个典型日按24时段或96时段离散。目标函数中把典型日天数作为权重乘进去折算全年收益。典型日的选取不是随手挑一天平均曲线我建议从全年负荷数据里按峰谷差、总电量、早晚高峰形态做聚类或者直接选取峰谷差最大的保守日。保守日算出来的储能规模偏大适合可研阶段聚类典型日算出来的规模更贴近实际运营适合方案比选。如果原文没写清楚典型日怎么来的可以在复现说明里注明“采用聚类得到的三个典型日各代表一个季节”这样审稿人或导师不会质疑数据来源。2. 经济性目标函数与约束条件净年值法下的成本-收益核算2.1 成本项投资成本怎么折算成每年的费用储能系统配置的经济性核心是净年值NAV或等年值而不是静态投资回收。不同方案寿命不同、规模不同只有折算成年值才能放到同一个尺度上比较。总投资成本通常分成两部分C_inv c_p × P_ess c_e × E_essc_p是单位功率成本包含PCS、变压器、场地等常用单位是元/kWc_e是单位容量成本包含电池本体、BMS、温控等常用单位是元/kWh。投资发生在建设期运行收益发生在运营期所以要把投资换算成等年值换算系数是资金回收系数CRF r(1r)^n / ((1r)^n - 1)r是折现率n是储能系统寿命。年化投资成本 C_inv × CRF。运行维护成本一般按投资额的一定比例估算常见取值是每年2%到3%也可以用单位电量运维成本乘年充放电量。最后成本项表达式为C_total C_inv × CRF C_om我复现时习惯把折现率设为8%、寿命15年这两个参数对结果影响很大后面敏感性分析会专门讲。2.2 收益项峰谷套利和调峰价值的量化口径收益项是经济性分析里最容易出问题的地方。参与调峰场景下储能收益主要有两笔口径必须分清楚。第一笔是峰谷套利收益。储能低价时段充电、高价时段放电每时段收益等于放电量乘放电电价减去充电量乘充电电价。表达式为R_arb Σ [ p_dis(t) × P_dis(t) - p_ch(t) × P_ch(t) ] × Δt第二笔是调峰价值。储能削峰填谷后系统原本需要调用深度调峰火电机组现在这部分电量由储能承担替代的深调成本就是储能的调峰价值。如果按调峰补偿机制算可以写成R_reg c_reg × E_total_disc_reg是单位调峰电量补偿价格。这里要特别提醒峰谷套利和调峰补偿不能对同一度电重复计算。如果储能在高峰时段放电已经赚了峰谷价差又把同一段放电量拿一份调峰补偿收益就虚高了。我的处理原则是把储能放电量分成两类——价差套利部分按分时电价结算额外深度调峰支持部分按调峰补偿结算两者通过时段划分和系统调峰缺口来界定。2.3 约束条件从SOC递推到充放电互斥约束条件直接决定模型是否物理可行。复现时至少要有以下五组约束。储能SOC荷电状态递推约束是核心SOC(t1) SOC(t) η_ch × P_ch(t) × Δt / E_ess - P_dis(t) × Δt / (η_dis × E_ess)η_ch是充电效率η_dis是放电效率。注意放电时效率要放在分母意思是电池释放出的电能要大于送入电网的电能这个位置放反了会直接把储能效率算到120%经济性结果完全失真。功率上下限约束0 ≤ P_ch(t) ≤ P_ess 0 ≤ P_dis(t) ≤ P_essSOC上下限约束SOC_min ≤ SOC(t) ≤ SOC_max充放电互斥约束用0-1变量u(t)表示P_ch(t) ≤ M × u(t) P_dis(t) ≤ M × (1-u(t))M是足够大的常数但不能太大否则数值计算会病态。最后还要加一个周期约束让典型日结束时的SOC回到初始值否则储能会“免费”消耗初始电量收益被高估SOC(T1) SOC_0如果是调峰场景还可能需要加入系统净负荷峰谷差约束或火电最小出力约束具体形式取决于原文采用的机制模型。3. Matlab实现路径从参数初始化到优化求解的完整流程3.1 数据准备负荷曲线归一化与时段划分我复现时第一步不是写代码而是先把负荷数据整理成标准格式。假设一个典型日24时段负荷单位为MW需要转换成与储能功率统一量纲。如果原文给的是标幺值要乘以基准负荷。分时电价按时段填入向量峰平谷时段要跟负荷曲线对应上。一个容易被忽略的问题是时段步长。如果按24点离散Δt 1小时能量单位就是MWh如果按96点离散Δt 0.25小时公式里的Δt就不能省略。很多报错都源于步长没乘导致SOC递推错得离谱。我习惯把数据组织成结构体data.T 24; % 时段数 data.dt 1; % 步长小时 data.P_load [..]; % 典型日负荷MW data.price_ch [..]; % 充电电价元/MWh data.price_dis [..]; % 放电电价元/MWh data.eta_ch 0.95; data.eta_dis 0.95; data.SOC_min 0.1; data.SOC_max 0.9; data.SOC_0 0.5;3.2 变量定义与约束建模YALMIP还是intlinprogMatlab里处理MILP有两条路一是直接用内置的intlinprog二是装YALMIP工具箱让YALMIP把模型翻译成求解器能识别的形式。我强烈建议用YALMIP因为论文复现要频繁修改约束条件YALMIP维护变量的维度关系更方便不容易出现索引错位。变量声明如下P_ch sdpvar(data.T, 1); P_dis sdpvar(data.T, 1); u binvar(data.T, 1); E_ess sdpvar(1, 1); P_ess sdpvar(1, 1);SOC变量可以显式声明也可以直接用递推公式约束表达SOC sdpvar(data.T1, 1); SOC(1) data.SOC_0;约束写成数组形式YALMIP会自动处理每个时段的约束Constraints []; for t 1:data.T Constraints [Constraints, SOC(t1) SOC(t) ... data.eta_ch*P_ch(t)*data.dt/E_ess - ... P_dis(t)*data.dt/(data.eta_dis*E_ess)]; Constraints [Constraints, P_ch(t) data.P_max_scale * u(t)]; Constraints [Constraints, P_dis(t) data.P_max_scale * (1-u(t))]; end注意互斥约束里M的取值我用的是P_ess的上界比如取负荷峰值的2倍这个上界在所有可行解范围内都成立又不会大到引起数值问题。目标函数按净年值定义C_inv c_p * P_ess c_e * E_ess; C_annual C_inv * CRF c_om * C_inv; R_arb sum(price_dis .* P_dis - price_ch .* P_ch) * year_days * data.dt; R_reg c_reg * sum(P_dis) * year_days * data.dt; Objective C_annual - R_arb - R_reg; optimize(Constraints, Objective);这里的year_days是典型日在全年出现的天数三个典型日各算各的再累加。3.3 求解器选型与参数设置如果只装Matlab可以用内置的intlinprog。YALMIP底层默认调用的求解器如果不是专门针对MILP优化过的大模型会跑得很慢。我复现时用Gurobi或者Cplex速度和稳定性都明显好于内置求解器。如果没有外部求解器许可证先用intlinprog也能跑通小算例但迭代次数要调大。几个关键求解参数供参考options sdpsettings(solver, gurobi, ... gurobi.MIPGap, 0.01, ... gurobi.TimeLimit, 300, ... verbose, 2);MIPGap设到1%就足够论文精度再往下压会显著增加求解时间。如果模型规模大建议先把某个典型日的时段数从96降到24做调试跑通再加密。3.4 结果验证与输出一套模型跑完不能只看目标函数值就收工还要做三层验证。第一层检查可行性SOC序列是否在上下限内充放电功率是否同时为正。第二层检查能量平衡充电电量乘以效率减去放电电量应等于24小时前后SOC差折合的能量。第三层检查经济性指标单位容量年收益、静态回收期、内部收益率这些指标应处于行业合理区间。我最常用的验证手段是画图观察SOC曲线。如果SOC曲线出现锯齿状频繁震荡大概率是电价时段划分和储能响应逻辑不匹配如果SOC长期顶在上限说明容量配置过大储能大部分时间用不上。这些直觉判断比单纯看报表有效得多。4. 典型算例演算配置结果随边界条件的变化规律4.1 算例参数与基础电价环境为了把方法落地我构造一个典型算例参数取当前工程常见量级。负荷峰值100MW峰谷差率40%分时电价峰、平、谷分别为1.0、0.6、0.3元/kWh。储能单位功率成本1500元/kW单位容量成本800元/kWh运维费率2%效率95%SOC范围0.1到0.9寿命15年折现率8%。这里要说明参数不是从某一篇特定论文抄来的而是综合多个文献和行业可研报告取的中间值。不同论文原文参数差别很大复现时第一步就是把原文参数表完整落到代码里再按我这里的流程跑。4.2 最优配置结果与运行特性按上述参数求解典型的优化结果会是20MW/80MWh左右对应4小时持续放电。年放电量约2600万kWh峰谷套利收益和调峰补偿合计年收益约900万元年化成本约500万元净年收益约400万元。这个量级下静态回收期约7到8年符合当前储能项目可研常用判断区间。运行曲线有几个特征值得注意。储能会在谷段满充在峰段满放平段基本不出力。SOC曲线在谷段从0.1爬到0.9峰段从0.9掉回0.1整个循环干干净净。如果优化结果里出现SOC只用了0.3到0.7的情况说明电价差还没有大到值得用满储能容量配置规模相对电价环境偏大了。4.3 敏感性分析单位成本、价差与调峰补偿的影响经济性分析不能只给一个方案结果必须有敏感性分析。我通常扫三个变量储能单位容量成本、峰谷价差、调峰补偿价格。单位容量成本从1000元/kWh降到600元/kWh时最优配置容量大约增加30%到50%。这是因为成本下降直接拉低边际成本原本不经济的多配置部分变得可接受。峰谷价差从0.5元/kWh扩大到0.9元/kWh时储能运行收益提升最优功率和容量都会上升且储能更倾向于“满充满放”。调峰补偿价格从0.1元/kWh提高到0.3元/kWh时储能收益曲线变得更陡配置结果也会变大。有一个所有算例都成立的经济规律最优配置落点一定在边际收益等于边际成本的位置。储能容量每增加1MWh带来额外的年收益递减因为峰谷电量空间有限、充放电次数有上限。一旦边际收益小于年化边际成本继续加容量就是负优化。论文里的“经济拐点”指的就是这个位置画成曲线就是净年值随容量先升后降的倒U型。5. 复现中的常见坑位与实战排查思路5.1 SOC递推与维度对不齐这是我在复现时踩过的第一个坑。Matlab索引从1开始t1对应第一个时段SOC变量如果长度是T1第一行是初始值循环里SOC(t1)和SOC(t)的对应关系一旦写错整个SOC曲线就会发生平移或跳变。最直接的排查方法打印t1、t2时段的SOC与前一步计算人工手算验证。还有一个隐蔽问题SOC递推式子里E_ess做分母如果E_ess是决策变量且初始值为0求解器在计算约束时会出现除以0的问题。解决方法是给E_ess加一个极小下界比如0.001或者在约束里做等价变形SOC(t1) × E_ess SOC(t) × E_ess ...这在实际求解时更稳。5.2 充放电互斥条件遗漏导致“既充又放”这是一个特别典型的模型错误。如果不加0-1变量约束只写功率上下限优化器会利用“低价充电的同时高价放电”这种虚假的套利空间把收益计算到极高结果完全失真。检查办法是看结果里max(min(P_ch, P_dis))是否接近0只要大于求解容差就说明约束没起作用。我遇到过一次YALMIP模型里M取值过大导致求解器在数值上绕过了互斥约束。M取P_ess上界的1.1倍就够不要顺手写10000。另外如果用了商业化求解器的高精度模式数值容差变小也会缓解这个问题。5.3 收益重复计算与口径混淆复现论文时收益项口径不一致是审稿人最爱挑的问题。有些原文同时写了削峰填谷收益和调峰辅助服务收益表面上两类实际却存在放电量的重叠部分。同一个放电时段不能既算峰谷价差收益又算调峰补偿收益。我的处理方式是在代码注释里明确每个时段的收益来源先按放电量拆分分类汇总后跟原文收益表逐项核对。具体拆分逻辑我这样写峰段放电量属于套利电量按当地峰谷价差计收益在系统调峰缺口时段比如火电最小出力已经压到下限仍然无法平衡的时段放电的部分才计入调峰补偿。代码实现上就是增加一个调峰缺口标记向量gap(t)收益函数改为R_arb sum(price_dis .* P_dis .* (1-gap) - price_ch .* P_ch) * year_days; R_reg c_reg * sum(P_dis .* gap) * year_days;这个gap向量来自系统的调峰需求计算虽然增加了建模复杂度但能让经济性分析站得住脚。5.4 从论文复现走向实际项目时的三个方向扩展如果做的是真实项目而不是单纯复现我建议在基础模型之上做三方面扩展。第一把单典型日改成多季节加权场景每个场景按不同天数权重计入目标函数这能反映储能全年的真实利用率。第二计及储能寿命衰减每充放一个循环容量轻微退坡长期运行成本会更贴近实际。第三如果是新能源配储把弃电率约束或新能源消纳收益纳入目标函数否则模型会倾向于“只做套利不做消纳”与实际政策目标不一致。这三个扩展在YALMIP框架下实现成本并不高无非是给SDP变量加下标约束批量生成。我后来做工程项目时就是在复现模型基础上加了多场景聚类和寿命衰减模块整个代码结构没有推倒重来。复现这类EI论文最大的体会是先把经济机制想清楚再写代码。目标函数每一项对应什么物理过程、约束每一条对应什么运行边界全部落到纸上Matlab代码只是一个翻译过程。先用小规模算例手算验证再逐步加复杂度中间结果每步都要打印出来看合理性。按照这个流程即便原文没有公开代码也能通过复现理解每一处细节的来龙去脉拿到一份可信的储能配置方案与经济性评估结论。
返回列表