☰
联合储能参与配电网优化调度:建模、评估与Matlab实现
2026/10/16 4:41:28 网站建设 项目流程

最近整理联合储能参与配电网优化调度的这套仿真框架时,我最大的感触是:储能接入配电网这件事,难点从来不在“把储能模型写进潮流计算”,而在“怎么让储能和新能源、网络约束一起被塞进同一个优化问题里,还能稳定求到解”。很多人一开始只把储能当成一个大号充电宝,削峰填谷完了就结束,结果跑出来的弃风弃光率根本压不下去。真正起作用的,是把储能当作一个“可调度的灵活性资源”,放在配电网的潮流、电压、倒送功率这些约束里一起考虑。

这篇文章我把整套思路从头到尾捋一遍,从为什么需要联合储能、怎么把储能和网络写成优化模型,到目标函数怎么定、新能源消纳能力怎么评估,最后给出一份可复现的Matlab实现框架。适合刚接触配电网调度研究、想用代码把论文里的模型落地,或者在做新能源消纳评估时卡在建模环节的同行参考。

1. 为什么“联合储能”才是配电网调度的关键变量

1.1 新能源渗透率上去之后,最先撞到的不是电量缺口,而是“消纳墙”

配电网和输电网的调度逻辑有本质差别。输电网讲究断面稳定,配电网的痛点是容量和电压。过去配电网是被动网络,负荷多大就供多大,电源基本来自上级电网。光伏和风电大规模接进来之后,情况变成:某条馈线的用户中午用电少但光伏大发,潮流从用户侧顺着馈线往上送,馈线末端电压被顶起来,甚至越过上限;到了傍晚光伏骤降、负荷上升,又需要上级电网快速响应。这就是典型的“鸭子曲线”在配电网层面的重演。

我在某标准33节点辐射状配电网测试系统上做了个小实验:没有储能时,光伏渗透率到30%,馈线末端电压已经接近1.07pu,再往上就得限制光伏出力;渗透率到50%,弃光率直接超过20%。也就是说,配电网真正缺的不是发电量,而是消纳能力——在安全运行边界内,能接住多少新能源的波动。

这种场景下,储能是少数几个能同时对“有功功率平移”和“电压支撑”起作用的手段。但问题也随之而来:用什么储能?

1.2 单类储能的局限性和“联合”的本质逻辑

锂离子电池现在最常用,能量密度高,能扛住几个小时的削峰填谷,但它的短板是瞬时功率响应和循环寿命。光伏云层遮挡、风机阵风造成的分钟级波动,如果全部由电池去平抑,电池的充放电循环次数会消耗得非常快,经济性账就算不过来。超级电容恰好相反,功率密度高、响应速度快、循环寿命长,但能量密度低,往往只能支撑几十秒到几分钟的功率冲击,扛不了长时间的峰谷转移。

在仿真里我最初只建了电池储能模型,调度周期一小时一个点,效果还行;但把时间尺度细化到分钟级之后,电池的充放电功率曲线出现了大量尖峰,SOC波动剧烈,退化成本飙升。后来把超级电容纳入联合储能,让电池承担低频分量、超级电容承担高频分量,整体曲线平滑了很多——这就是联合储能最核心的互补逻辑:能量型储能负责“量”的搬运,功率型储能负责“率”的缓冲。

类比一下:电池像一个大水箱,能存很多水但灌水放水都比较慢;超级电容像一个水泵,能瞬间提供大流量但蓄水量有限。两者搭配使用,进水管接水泵、出水口接水箱,整个系统的调节能力才是完整的。

1.3 调度员视角下的储能:它不只是“移峰填谷”的工具

我在做这套框架之前一直觉得储能的最大价值是套利——低谷充电、高峰放电,赚峰谷价差。但放在配电网里看,这种思路太窄了。储能参与调度时,同一个充放电动作可以同时实现几个目标:削峰填谷、抑制新能源倒送、抬升低谷期电压、降低网损。问题在于这些目标并不总是同方向的,比如为了降低网损,储能可能需要在某个节点保持一定的充电功率,但这个充电需求和“高峰放电压负荷”的目标就矛盾了。

所以调度模型的本质是多目标折中,而不是单目标最大化。这时候用优化模型把所有的目标、约束写清楚,交给求解器去权衡,比人为定规则可靠得多。这也是为什么我在后文里要强调目标函数怎么写——它决定了储能到底在帮系统做什么。

2. 把储能和配电网写成数学模型:状态变量与约束方程

2.1 储能设备的建模取舍:SOC动态、充放电效率与寿命损耗

储能模型的起点是SOC(荷电状态)的递推关系。调度时段设为T个,步长为Δt,那么第k+1个时段末的SOC等于:

SOC(k+1) = SOC(k) - [η_c·P_c(k) - P_d(k)/η_d]·Δt / E_rated

其中P_c是充电功率,P_d是放电功率,η_c和η_d分别是充放电效率,E_rated是额定容量。这个式子看起来简单,但在Matlab里写优化约束时有两个容易出错的地方。第一,很多调度模型允许储能“同时充电和放电”,这在物理上无意义而且浪费,所以需要加一个约束:P_c × P_d = 0,但这会引入非线性;实际处理时要么引入0-1变量,要么用互补约束的松弛形式。第二,SOC的初始值不是随便给的,比如设为0.5,然后要求调度周期结束时SOC回到初始值附近,否则储能相当于白赚了电量,结果没有可持续性。

寿命损耗的建模我建议不要搞太复杂。文献里有用等效循环寿命的,有按DoD(放电深度)折算的,但对配电网优化调度来说,一个实用的做法是把储能退化成本折算成“单位充放电电量的惩罚系数”,加在目标函数里。这样既反映了“频繁充放电不划算”,又不会把模型弄成大规模混合整数问题。

2.2 网络约束:DistFlow潮流方程与二阶锥松弛

配电网是辐射状结构,用DistFlow潮流比用牛拉法更合适。支路ij的潮流方程可以写成:

P_ij - r_ij·I²_ij = Σ P_jk + P_Lj - P_Gj Q_ij - x_ij·I²_ij = Σ Q_jk + Q_Lj - Q_Gj V²_j = V²_i - 2(r_ij·P_ij + x_ij·Q_ij) + (r_ij² + x_ij²)·I²_ij

这套方程是非凸的,直接给求解器是求不到全局最优的。工程上通用做法是做二阶锥松弛:把V²和I²替换成辅助变量,然后把等式关系松弛成锥约束。在Matlab里用YALMIP写锥约束很直接,但要知道松弛之后解出来的下限是否紧,需要检查松弛间隙——通常支路功率不为零时松弛是紧的,个别轻载支路可能出现较大间隙,这种情况需要做修正。

2.3 新能源机组的约束:有功可调与无功支撑

光伏和风电在模型里有两种对待方式:一种是按“最大出力曲线”给定,调度只允许削减;另一种是当作决策变量,与实际预测值挂钩。我推荐后者加一个“弃电变量”——实际出力等于预测出力减弃电量,弃电量非负、不大于预测值。这样目标函数里就能放一个弃电惩罚系数,让求解器在“牺牲一点经济性和弃一点电”之间做权衡。

新能源的无功能力也值得建模。光伏逆变器可以发无功,但受视在功率约束。把无功功率留在模型里,对评估“储能抬升电压”的效果很重要——因为储能可以择机发无功抬升电压,但电池的容量是有限的,发无功多就会挤占有功空间,这个耦合关系必须在约束里体现出来。

3. 优化调度目标怎么定:成本、弃电和网损的权衡

3.1 目标函数的典型构成和量纲处理

我用的目标函数是这样的形式:

min Σ_t ( C_grid·P_grid(t) + C_ls·P_loss(t) + C_curtail·P_curtail(t) + C_bess·|P_bess(t)| )

四项分别是购电成本、网损成本、弃电惩罚、储能退化成本。购电成本可以按分时电价设定,网损成本按当地电价折算,弃电惩罚要设置得比上网电价略高,才能让求解器“尽量不弃电”。

一个常见坑是量纲不统一。购电成本单位是元/kWh,网损是有功功率,单位是kW,乘以时段小时数才是能量。如果调度步长是15分钟,换算系数不对,成本项和惩罚项的数值级就会错乱,优化出来的方案偏向某一项。我习惯的做法是先把所有功率都换算成标幺值或统一到MW,能量用MWh,成本统一到万元,这样目标函数各项的系数才能反映真实的偏好结构。

3.2 用惩罚系数还是硬约束来限制弃电

限制弃电有两种建模思路。硬约束是直接要求P_curtail = 0,只允许新能源满发,这在新能源渗透率低时可行,渗透率高了之后很容易导致无解——因为在某些时段,所有可调度资源都用上也无法把功率压低到倒送极限以内。软惩罚是给弃电量一个高价系数,让求解器在极端情况下允许少量弃电,换取整个系统在可行域内有解。实际项目中我建议用软惩罚,并且给惩罚系数一个范围,做敏感性分析。系数取得太低会大量弃电,取太高又和硬约束没区别。

3.3 求解方案选型:为什么优先凸优化,什么时候才能用启发式

模型里如果只有连续变量,且二阶锥松弛后是凸的,用YALMIP加求解器(比如CPLEX或Gurobi)几分钟内就能拿到全局最优解。这是首选方案,因为可复现、可解释,论文里审稿人也认。我以前做过一个更大规模的模型,加了储能位置选择的0-1变量,混合整数二阶锥规划(MISOCP)的求解时间从几分钟涨到几小时,这时才需要考虑启发式算法。

但启发式算法有一个致命的弱点:对同一套参数,两次跑的结果可能不一致,而且很难证明解的质量。我现在的原则是:能建凸模型就不碰启发式。如果必须加整数变量,优先考虑是否能把整数变量通过“大M法”或“置罚”转化成连续约束,实在不行再用粒子群或遗传算法,但只用于求解初始可行解,再用凸优化去微调。

4. 新能源消纳能力评估:指标定义、评估方法和边界条件

4.1 “消纳能力”到底指什么

消纳能力这个词在文献里有两种口径。一种是功率口径:某典型运行方式下,系统不越限能消纳的最大新能源出力。另一种是电量口径:一个调度周期内系统能消纳的新能源电量占理论发电量的比例。评估消纳能力时,我更看重电量口径,因为它更能反映储能在长时间尺度上的作用。具体指标用弃电率最直观:弃电率 = 弃电量 / 理论可发电量。消纳率 = 1 - 弃电率。

4.2 时序仿真评估法的完整步骤

我用的评估流程分四步。第一步,构造典型日的新能源出力曲线和负荷曲线,光伏用单峰曲线加随机波动,风电用分段平稳的时序数据。第二步,在Matlab里搭建带储能的配电网优化调度模型,把储能容量设为零,先算出基准弃电率。第三步,逐步增大储能容量,比如从0.5MWh加到3MWh,记录每一档的弃电率、网损和电压偏移。第四步,画出储能容量与弃电率的曲线,找到边际收益递减的拐点——那个拐点就是经济上比较合理的储能配比。

还要注意一个边界条件:消纳能力评估不是只看最大渗透率,也要考虑倒送功率约束。新能源出力最大的时段往往也是负荷最小的时段,馈线根部的功率可能倒送上级电网。评估时必须把这个倒送功率极限作为硬约束,否则算出来的“消纳能力”在工程上是没法落地的。

4.3 消纳能力对储能配置的敏感性分析

我这里用虚构的一组测试数据说明(某33节点系统,光伏装机3MW,风电装机2MW,日负荷峰值4.5MW):

储能容量(MWh)弃电率(%)网损(MWh/日)末端电压极值(pu)
018.60.421.071
0.512.10.351.054
1.07.40.291.043
1.54.80.251.038
2.03.90.241.036
3.03.50.231.036

可以看到,储能从0加到1.5MWh时,消纳率提升非常明显;从1.5加到3MWh,边际收益急剧下降。这说明该场景下1.5MWh附近就是一个合理的配置区间。当然这个拐点会随线路容量、负荷水平、新能源装机比例变化,不同系统要重新跑这一步,但方法流程是通用的。

5. Matlab仿真框架拆解与核心代码骨架

5.1 测试系统与数据准备

我用的测试系统是某33节点辐射状配电网,基准电压12.66kV,基准功率10MVA。这套系统的好处是节点多、馈线长、电压问题典型,网上很容易找到支路参数和负荷数据。新能源接入点我设置了两个:光伏接在节点18和22,储能接在节点25,风电场接在节点30——位置选得不同,效果差异很大,储能接在长馈线末端比接在靠近根节点处对电压支撑的帮助大得多。

数据准备阶段最耗时间的是典型日曲线的构造。如果手头没有实测数据,可以用正态分布加随机扰动生成:光伏出力峰值系数取0.8,风电出力用了一天24点的低速起伏曲线。负荷曲线按“早晚双峰”构造。调度步长我设成1小时,一天24个时段。

5.2 用YALMIP搭建优化模型的代码结构

代码分四块:数据输入、变量声明、约束拼接、求解与后处理。下面是核心骨架,只截取储能和潮流相关的关键部分:

%% 决策变量 P_grid = sdpvar(1, T); % 根节点购电功率 P_bess = sdpvar(1, T); % 储能充放电功率,正为放电 S_bess = sdpvar(1, T+1); % SOC P_pv = sdpvar(1, T); % 光伏实际出力 P_wt = sdpvar(1, T); % 风电实际出力 P_cur = sdpvar(1, T); % 总弃电功率 %% 约束 Constraints = []; % 节点功率平衡(简化写法,实际需按DistFlow逐支路展开) for k = 1:T Constraints = [Constraints, P_grid(k) + P_pv(k) + P_wt(k) ... + P_bess(k) - P_load(k) == sum_load_loss(k)]; end % 储能SOC动态 Constraints = [Constraints, S_bess(1) == 0.5]; for k = 1:T Constraints = [Constraints, S_bess(k+1) == S_bess(k) - (P_bess(k) * dt) / E_bess]; Constraints = [Constraints, -P_bess_max <= P_bess(k) <= P_bess_max]; Constraints = [Constraints, 0.1 <= S_bess(k+1) <= 0.9]; end % 弃电约束 for k = 1:T Constraints = [Constraints, 0 <= P_pv(k) <= P_pv_forecast(k)]; Constraints = [Constraints, 0 <= P_wt(k) <= P_wt_forecast(k)]; Constraints = [Constraints, P_cur(k) == P_pv_forecast(k) + P_wt_forecast(k) ... - P_pv(k) - P_wt(k)]; end %% 目标函数 Objective = sum(C_grid .* P_grid * dt) ... + sum(C_curtail .* P_cur) ... + sum(C_loss .* P_loss) ... + sum(C_bess .* abs(P_bess)); %% 求解 ops = sdpsettings('solver', 'gurobi', 'verbose', 2, 'solverTolerance', 1e-6); optimize(Constraints, Objective, ops);

由于篇幅没法展开所有支路的DistFlow约束,实际工程里需要把每个节点的有功、无功平衡和支路电流约束写清楚。用YALMIP的好处是,你只需要把变量之间的关系写出来,求解器会自动处理。

注意代码里SOC初始值我选了0.5,同时在目标函数里要加一个“SOC终值回到0.5”的约束或惩罚,否则对最后几个时段而言,储能在系统里剩余的能量相当于额外收益,结果会失真。

5.3 后处理:结果曲线和指标计算

求解完成之后,我一般输出三张图。第一张是24小时有功平衡堆叠图,横轴时间,纵轴功率,堆叠项包括光伏、风电、购电、储能充放电和负荷,能一眼看出调度策略的形态。第二张是储能SOC曲线,检查SOC有没有到边界,如果经常顶到0.9,说明储能容量定小了。第三张是节点电压分布,画所有节点24小时的电压热力图,或者挑末端最恶劣的几个节点画曲线。

指标计算用一个简单函数汇总:弃电率、网损率、电压偏移指标(所有节点电压偏离1.0pu的平均绝对值)、储能利用率(实际充放电量/额定容量)。这几个指标值保存到结构体里,做敏感性分析时循环调用。

6. 算例复盘:三组关键结果和背后的物理含义

6.1 有功调度曲线:储能改变了配电网的“呼吸节奏”

基准场景(无储能)下,光伏大发时段的购电功率趋近于零,甚至可以忽略,但倒送功率接近上限;傍晚负荷尖峰时段,购电功率被顶得很高。加入联合储能后,光伏大发时段储能充电,把本该倒送的电量“截留”下来;傍晚负荷尖峰时储能放电,加上超级电容的快速出力,购电功率曲线明显被削平。从网损的日累计曲线看,储能加入前后,高峰期网损下降了约25%。

我特别留意了联合储能里超级电容的出力曲线,它基本只在云层快速遮挡光伏的时段出现短时放电尖峰,其余时段安静待命。电池的SOC曲线则呈现“V”字型——早上充电、傍晚放电,循环次数少、幅度深,正好符合电池的经济运行区间。

6.2 电压改善:储能末端接入的“托举”效应

电压问题在高渗透率场景下主要体现为两个极端:光伏大发时末端电压过高,傍晚重载时末端电压过低。储能接在馈线末端时,中午充电相当于就地增加负荷,把电压往回拉;傍晚放电相当于就地增加电源,把电压往上抬。我测试的结果是:末端节点(节点18)的电压极值从1.07pu降到1.043pu,傍晚低谷电压从0.95pu抬升到0.975pu左右。这个改善效果在储能接入点附近最明显,距离越远越弱——所以储能位置选在哪,本质上是个电压支撑问题。

6.3 消纳率提升的一个量化结论

回到消纳能力评估的主线。测试场景中,无储能时的弃电率是18.6%,配上1.5MWh联合储能后降到4.8%,消纳率从81.4%提升到95.2%。继续加储能到3MWh,弃电率只降到3.5%,边际收益已经很薄。此外我还试过把光伏接入点附近的线径加粗,同样可以降低弃电率,但改线路的成本远高于储能——这也是联合储能方案在经济性上的核心底气。

7. 调试过程中踩过的坑和我最终的处理办法

7.1 二阶锥松弛的数值病态问题

第一次跑通模型时,求解器提示“numerical issues”,结果曲线里电压出现异常毛刺。排查后发现是支路电流平方的辅助变量初始化不当,导致松弛锥被压得过紧。处理办法:给电压平方变量加一个合理的上下限初值,比如1.0pu附近的软约束;同时把所有的功率值先归一到MW级别,不要让r_ij和x_ij这种小数与上千千瓦的功率直接乘以产生极端量纲。调标幺化之后,问题基本消失。

7.2 SOC的单位陷阱

我在一个测试场景里给储能容量设了2MWh,充放电功率上限却是2MW,然后发现SOC曲线反复横跳。一查代码,dt用的是小时(1),E_bess用的是MWh,但P_bess在某段代码里被当成了MW,其他约束里又被当成kW,换算关系乱了。这种问题最坑的地方在于模型不会报错,解出来的结果看起来也“合理”,但物理上是错的。我现在所有储能相关参数统一用“MW、MWh、小时”三件套,并在代码顶部写一段单位确认的断言检查。

7.3 求解器选型和收敛性判断

同样一套模型,用不同求解器解出来的时间差别很大。我的经验是:纯连续二阶锥问题,Gurobi和CPLEX差距不大;一旦加了0-1变量,Gurobi在MISOCP上的内置分支策略通常更快。求解器要设置一个可行的相对间隙(比如0.1%),否则个别规模较大的算例会跑很久不收敛。另外,YALMIP的调试模式下可以输出约束冲突诊断,遇到无解时先查某几个时段的不等式冲突,比翻看全部约束高效得多。

还有一个小建议:首次让模型跑通时,先用单时段(T=1)做验证,确认潮流、储能的单个时段约束没有写错,再扩展到24时段。整套代码跑一次24时段的MISOCP,从秒级到分钟级都有,先在T=1的场景把SOCP下标问题全部暴露出来,再进入完整周期,能省下大量调试时间。

储能参与配电网调度这块,模型和代码只是手段,真正有价值的是理解“储能到底在帮系统解决什么约束”。每个系统的瓶颈不同——有的卡在电压上限,有的卡在倒送功率,有的就是网损太难看——把瓶颈定位清楚了,再有的放矢地写约束、配参数,仿真结果才有参考价值。希望这份从建模到评估再到Matlab落地的完整流程,能帮你少走几步弯路。

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

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

立即咨询