☰
共享储能加冷热电多微网双层优化:MATLAB容量配置与运行调度全解析
2026/10/9 4:21:02 网站建设 项目流程

共享储能加冷热电多微网,这两年几乎成了综合能源系统方向最热的一个组合,尤其是做优化配置的研究,十篇里得有五六篇绕不开这个题目。我自己也是从独立储能、单微网一直做到多微网共享储能,中间踩了不少坑,也沉淀了一套用 MATLAB 完整实现“上层容量配置、下层运行优化”双层框架的方法。这篇就把整个项目的设计思路、建模细节、求解技巧和排错经验一次性说透,适合正在做相关课题的研究生,也适合刚入行想搞懂双层优化到底怎么落地的工程师。

1. 项目思路拆解:为什么是非做不可的“双层优化”

1.1 多微网系统的现实困境

先聊一个最基础的问题:既然单个微网就能搞定冷热电联供,为什么非得搞多微网?我早年做过单微网优化,那时候系统内设备都是自己家的,燃气轮机发电、余热制冷制热、电制冷机补充,孤岛运行也能闭环。但实际跑下来会发现三个痛点:一是负荷峰值和谷值差距大,设备要么满负荷要么空转,效率极差;二是每个微网都配一套储能和备用机组,投资成本直线上升,小园区根本扛不住;三是不同微网之间的负荷特性差异非常大,有的白天冷负荷大,有的夜间热负荷大,如果不互联,资源就白白浪费了。

多微网系统解决的就是这个“资源错配”问题。各个微网通过公共母线互联,多余的电、热、冷可以跨网互济,储能电站也可以作为公共基础设施统一服务。但这里面有个天然矛盾:储能电站的容量配置属于规划层决策,而多微网内部的机组出力和储能充放电调度属于运行层决策,两层决策的时间尺度、目标函数和约束条件完全不同。如果用单层模型硬拟合,要么把容量配置做得过粗,要么把运行细节过度简化,结果都不靠谱。

1.2 双层优化的本质:先规划,再运行,再反馈

双层优化(Bilevel Optimization)的本质是处理这种“上层决策影响下层环境,下层决策反馈回上层目标”的层级关系。放到这个项目里,上层问题是储能电站的容量配置:建多大的功率、多大的容量,目标通常是年化投资成本加年运行成本最小;下层问题是在已知储能规模的前提下,每个微网如何调度燃气轮机、余热机组、储能和电网交互,使系统的日运行成本最小。

我常跟学生打一个比方:上层像是小区物业决定装多少台电梯,下层像是每个住户根据电梯数量规划自己的出行时间和路线。电梯装少了,高峰期挤爆,住户时间成本上升;电梯装多了,维护成本高,物业亏本。只有把两层放到一起迭代求解,才能找到那个平衡点。这也是为什么单纯做设备选型或单纯做经济调度都不够,必须用双层框架把“规划-运行”闭环起来。

1.3 为什么选 MATLAB 而不是 GAMS 或 Python

做这个项目的人最纠结的就是工具选型。GAMS 建模方便但可视化弱,Python 生态好但写约束条件时不如 MATLAB 直观。我的实际体验是:MATLAB 加 YALMIP 工具箱配合 CPLEX 或 Gurobi 求解器,是综合能源优化目前最顺手的组合。YALMIP 的语法接近数学表达,定义决策变量、写约束、设置目标函数几乎和论文公式一一对应,排错时能直接看模型结构,再加上 MATLAB 自带的绘图功能,做灵敏度分析和结果可视化非常省事。

当然,MATLAB 的缺点也明显:循环效率低,大规模场景跑起来慢。我的解决方案是能用矩阵运算绝不用循环,把约束批量生成,配合稀疏矩阵存储,典型的三微网二十四小时算例求解时间能控制在一分钟内。

2. 核心建模细节:从储能电站到冷热电联产的全套公式

2.1 共享储能电站的抽象与决策变量

共享储能电站是整个系统的核心设施,它向多个微网提供充放电服务。在建模时,我先把它定义成“黑箱”:只关心它的额定功率、额定容量、充放电效率和 SOC 状态。上层决策变量就是额定功率和额定容量,这两个变量的单位分别是 kW 和 kWh。

储能电站的时序模型我用的是经典的状态递推公式。设第 t 个时段末的荷电状态为 SOC(t),充放电功率分别为 P_ch(t) 和 P_dis(t),充电效率 η_ch 取 0.95,放电效率 η_dis 取 0.95,时间间隔 Δt 取 1 小时,那么 SOC 递推关系为:

SOC(t) = SOC(t-1) + (η_ch * P_ch(t) - P_dis(t) / η_dis) * Δt / E_cap

其中 E_cap 是储能额定容量。这里有个关键细节:充放电功率要么是上层决策得到的额定功率 P_rated 作为上限,要么是下层运行调度中的中间变量,两层模型里对它的处理方式完全不同,后面我会详细展开。

储能电站还有一个容易被忽略的约束:不能同时充放电。这个用引入 0-1 变量 u(t) 的方式处理,当 u(t)=1 时允许充电,u(t)=0 时允许放电,再加一个充电功率上限约束 P_ch(t) ≤ u(t) * P_rated,以及放电功率上限 P_dis(t) ≤ (1-u(t)) * P_rated。这种建模方式虽然增加了变量数量,但能避免出现“一边充一边放”的荒谬解,实测中非常必要。

2.2 冷热电联供机组建模

冷热电联供(CCHP)是多微网里的核心供能设备,由燃气轮机、余热回收装置、吸收式制冷机和换热装置组成。建模时我把它拆成“发电-产热-制冷”三个子模块分别描述,这样逻辑更清晰。

燃气轮机的发电输出 P_gt(t) 和燃料消耗量 F_gt(t) 之间用效率 η_e 关联:F_gt(t) = P_gt(t) / η_e。我采用固定效率模型,η_e 取 0.4,简化处理。如果要做得更精细,可以再加一个部分负荷效率修正系数,但双层优化的计算复杂度已经很高,个人建议第一版先把固定效率跑通,后续再扩展。

余热回收部分的建模重点是把“热电比”这个概念用好。燃气轮机发电时产生的高温烟气经过余热锅炉回收,得到的热功率 Q_recovery(t) = P_gt(t) * η_rec / η_e,其中 η_rec 是余热回收效率,通常取 0.45。回收的热量有两个去向:一部分进入吸收式制冷机产生冷量,一部分通过换热器供应热负荷。这里需要定义一个热分配系数 α(t),表示进入吸收式制冷机的热量比例,那么:

吸收式制冷机产冷量 C_abs(t) = α(t) * Q_recovery(t) * COP_abs

换热器供热量 Q_heat(t) = (1 - α(t)) * Q_recovery(t)

COP_abs 是吸收式制冷机的能效比,我取 1.2。热分配系数 α(t) 是连续决策变量,取值范围 [0,1],它也是下层优化中反映“以热定电”或“以电定热”运行策略的关键调整手段。

电制冷机是补充冷负荷的另一条路径,建模简单得多:C_ec(t) = P_ec(t) * COP_ec,COP_ec 取 3.0。燃气锅炉则负责补充热负荷缺口:Q_boiler(t) = F_boiler(t) * η_b,η_b 取 0.95。

2.3 能量平衡与网络约束

多微网之间的互联和储能电站的接入,最终都要落实到每个微网内部的能量平衡方程上。以第 i 个微网为例,电力平衡约束为:

P_gt,i(t) + P_dis,i(t) + P_buy,i(t) + P_net_in,i(t) = P_load_i(t) + P_ch,i(t) + P_ec,i(t) + P_net_out,i(t)

其中 P_buy 是从上级电网购电功率,P_net_in 和 P_net_out 是微网之间交互功率,这个等式左右两边分别是电源侧和负荷侧。这条约束是硬约束,任何时刻都不能违反,也是下层优化判断可行性的关键。

热平衡和冷平衡同理。热平衡式是:Q_heat,i(t) + Q_boiler,i(t) = Q_load_i(t),即换热器供热量加锅炉补热量等于热负荷。冷平衡式是:C_abs,i(t) + C_ec,i(t) = C_load_i(t),即吸收式制冷量加电制冷量等于冷负荷。

微网互联功率还有一个重要约束:交互功率不能超过联络线的传输极限,通常取 500 kW。这个约束看似简单,但实际运行中如果忽略它,往往会让优化结果出现“不切实际的跨网大功率传输”,上层配置的储能容量也会因此被严重低估。

3. 双层优化框架设计与求解策略

3.1 上层模型:储能电站容量配置

上层模型的目标函数是储能电站的全寿命周期年化成本最小,再加上多微网系统的年运行成本。这里需要考虑投资成本的等年值转换,公式是:

C_inv = (c_p * P_rated + c_e * E_cap) * CRF

其中 c_p 是单位功率投资成本,取 800 元/kW;c_e 是单位容量投资成本,取 1200 元/kWh;CRF 是资金回收系数,等于 r * (1+r)^n / ((1+r)^n - 1),r 取 0.06,n 取 10 年。算下来 CRF 大约是 0.1359,也就是每年要回收大约 13.6% 的初始投资。

上层目标函数写成:

min F_upper = C_inv + Σ_i Σ_d N_d * C_oper,i,d

其中 N_d 是第 d 类典型日的天数,C_oper,i,d 是第 i 个微网在第 d 类典型日的日运行成本,这个值来自下层优化的结果。上层决策变量只有两个:P_rated 和 E_cap,但它需要反复调用下层优化,所以整体计算量巨大。

上层还需要约束储能电站的功率和容量比例关系。通常锂电池储能电站的功率容量比在 0.5~2 之间,也就是 P_rated / E_cap 不能过大或过小,否则要么“大功率小容量”导致充放电一小时就满了,要么“大容量小功率”导致永远充不满。我一般加一个约束 0.5 ≤ P_rated / E_cap ≤ 2。

3.2 下层模型:多微网日运行调度

下层模型是在给定 P_rated 和 E_cap 的前提下,最小化每个微网典型日的运行成本。运行成本包括购电成本、燃气成本、储能充放电的折旧成本,以及微网间交互购电成本。以单微网为例,目标函数为:

min F_lower = Σ_t [ c_buy(t) * P_buy,i(t) - c_sell(t) * P_sell,i(t) ] + Σ_t c_gas * F_total(t) + Σ_t c_ess * (P_ch,i(t) + P_dis,i(t))

其中 c_buy(t) 是分时购电价,c_sell 是售电价,c_gas 是天然气折算单价,c_ess 是储能单位充放电量的折旧成本。这里需要特别注意的是,如果微网有售电行为,目标函数里要写成购电成本减去售电收益,否则模型会钻进“低价买高价卖”的套利漏洞。

下层优化包含的约束很多,包括每个设备的出力上下限约束、爬坡约束、储能 SOC 约束、能量平衡约束,以及储能电站容量和功率的服务上限约束。设备出力上下限直接取铭牌参数,爬坡约束我取每时段最大变负荷率为 20% 额定功率,储能 SOC 的上下限取 0.1 和 0.9。

3.3 求解方法:KKT 条件转化和智能算法迭代的取舍

双层优化求解是项目里最核心也最折磨人的部分。我实践过两条路线:

第一条是把下层优化问题用 KKT 条件替换,把双层问题转化为单层混合整数规划问题,再用 YALMIP 加 CPLEX 直接求解。这个方法的优点是理论上能求出全局最优解,缺点是对下层模型要求必须是凸优化,而且互补松弛条件需要用大 M 法线性化,M 值选不好就会导致求解器数值不稳定。我在第一版代码里把下层简化成线性规划,然后用这个方法一次性求解,效果不错。

第二条是用智能算法做迭代,上层用粒子群或遗传算法生成候选储能容量方案,下层用 CPLEX 精确求解每个方案的运行成本,再把结果反馈给上层更新种群。这个方法适用于下层模型是非凸的复杂情况,但耗时成倍增加,而且粒子群容易陷入局部最优。我后期在对比多场景多点位寻优时用的是这条路线。

个人建议:如果你的系统是冷热电联供加上储能,下层机组的启停没有离散变量,那首选 KKT 转化方法,计算效率高,结果稳定;如果引入了机组的启停状态 0-1 变量、阶梯式购电或者非线性效率曲线,那就老实走智能算法迭代路线,不要强行单层化。

4. 算例搭建与结果分析:从代码到数据的验证闭环

4.1 算例参数设计

为了让代码具有可复现性,我用了一个典型的三微网加一个共享储能电站的测试系统。三个微网分别为商业区、工业区和居民区,用电负荷曲线差异明显:商业区白天冷负荷高,工业区全天电负荷平稳,居民区早晚高峰明显。冷、热、电负荷曲线我用实测数据归一化后叠加典型日系数生成,取四季典型日各代表一定天数。

分时电价采用峰平谷三段式:峰时 10:00-15:00 和 18:00-21:00,电价 1.1 元/kWh;平时 07:00-10:00 和 15:00-18:00,电价 0.7 元/kWh;谷时 23:00-次日 07:00,电价 0.4 元/kWh。天然气折算单价为 0.35 元/kWh,这里要注意的是天然气热值折算成电当量的单位换算,别在单位上栽跟头。储能参数如前面所述,CCHP 机组额定容量取 500 kW,电制冷机取 200 kW,吸收式制冷机容量配到和余热回收最大出力匹配。

互联母线传输功率上限取 300 kW,共享储能电站的功率和容量初始搜索范围分别是 100~800 kW 和 500~2000 kWh。这个范围是根据三个微网的总负荷峰值和典型日最大净负荷差推算的。如果范围太窄,可能截断最优解;范围太宽,求解时间又拖得长。实测下来这个范围比较合适。

4.2 典型日优化结果解读

跑完双层优化,首先看上层输出的最优储能配置结果。在我的算例中,最优配置落在了额定功率 450 kW、额定容量 1200 kWh 附近。这个结果很有意思:如果按“每个微网各自配置一套储能”的思路,三套独立储能总容量大概要 1500 kWh 甚至更多,而共享储能只要 1200 kWh,容量节约了 20% 以上。原因就是三个微网的净负荷曲线之间有时序互补特性,共享储能可以通过“错峰共享”大幅提升利用效率。

再看下层典型日的调度结果。商业区微网白天电负荷高、冷负荷高,燃气轮机满发,余热优先分配给吸收式制冷机,不足的冷负荷用电制冷机补;傍晚电负荷下降后燃气轮机降出力,热负荷缺口由燃气锅炉补充。储能电站在谷时充电,峰时放电,日内呈现出典型的“两充两放”模式,这个结果验证了下层优化的经济性逻辑是对的。

还有一个值得注意的现象:共享储能电站的实际利用率并不是每天都满额。遇到负荷平缓的过渡季典型日,储能可能只充到七八成就停止了,这是优化结果主动让位给运行成本更低的电网购电方案,属于正常现象。分析结果时不要只盯着储能利用率这一项指标,要结合购电成本、燃气成本、碳排放量等多项指标综合评判。

4.3 灵敏度分析:参数扰动对配置结果的影响

做完基本算例,我习惯再做三组灵敏度分析:电价峰谷差变化、储能单位投资成本变化、微网负荷峰值变化。这三组分析的价值在于验证配置结果的稳健性,也能让论文或报告里的结论更扎实。

电价峰谷差从 0.7 元/kWh 逐步加大到 1.2 元/kWh,储能电站的最优额定容量会单调上升,但上升速率逐渐放缓,说明存在“套利饱和”效应。储能单位投资成本从 1800 元/kWh 降到 800 元/kWh,最优容量几乎线性上升,这说明当前配置结果对电池成本非常敏感,也侧面反映了锂电成本下降对共享储能推广的强驱动作用。微网负荷峰值上升 20% 时,最优储能容量上升约 15%,功率上升约 10%,配套比例基本稳定,说明模型的规模效应表现合理。

灵敏度分析还有个实操价值:如果你需要给决策者出报告,这些曲线图可以直接体现“什么变量最影响投资决策”,比单说一个最优解有说服力得多。

5. 代码实现细节与排错实录

5.1 YALMIP+CPLEX 的调用要点

先给出建立决策变量和约束的核心代码片段,这段代码是底层内核,直接复制到 MATLAB R2020b 及以上版本就能跑。

% 决策变量定义 P_ch = sdpvar(T, 1); % 充电功率 P_dis = sdpvar(T, 1); % 放电功率 SOC = sdpvar(T, 1); % 荷电状态 u_ch = binvar(T, 1); % 充电状态二进制变量 % 约束条件 Constraints = []; Constraints = [Constraints, 0 <= P_ch <= P_rated]; % 充电功率上限 Constraints = [Constraints, 0 <= P_dis <= P_rated]; % 放电功率上限 Constraints = [Constraints, P_ch <= u_ch * P_rated]; % 防止同时充放 Constraints = [Constraints, P_dis <= (1 - u_ch) * P_rated]; Constraints = [Constraints, SOC(1) == SOC_initial]; % 初始SOC for t = 2:T Constraints = [Constraints, SOC(t) == SOC(t-1) + ... (eta_ch * P_ch(t) - P_dis(t) / eta_dis) / E_cap]; end Constraints = [Constraints, 0.1 <= SOC <= 0.9]; % SOC上下限

用 YALMIP 时最需要注意的一点是,定义变量时尽量用向量化写法,不要用 for 循环逐个定义 sdpvar,否则模型规模一大,符号运算极其缓慢。我实测用向量化写法处理三微网二十四时段模型的时间开销,比逐个定义降低了近一个数量级。

调用 CPLEX 求解时,有一个容易被忽略的设置:如果检测到模型是非凸的,要主动关闭 CPLEX 的凸性检查选项,并设置允许非凸混合整数二次规划求解。但更建议的做法是把二次项尽量线性化,避免后患。我在做 KKT 转化遗留的互补松弛部分时,就吃过这个亏。

5.2 常见 Bug 与解决方案

第一个高频坑:互补松弛条件的大 M 法线性化数值不稳定。用大 M 法把互补松弛条件 a * b = 0 线性化为 a ≤ M * z 和 b ≤ M * (1-z),M 值默认取 1e6,结果求解器经常报数值警告甚至无解。我的经验是 M 值不要固定取太大,要根据模型里变量量级动态设定,比如功率变量的量级是 1e2,那 M 取 1e4 到 1e5 就够了。这个调整看着小,实际能解决绝大多数数值不稳定问题。

第二个高频坑:SOC 初始值导致出现“初始充放电异常”。很多人在设置初始 SOC 时直接取 0,结果模型为了让储能达到合理运行区间,会在一开始疯狂充电或放电,导致前几个时段的调度结果严重失真。正确做法是设置初始 SOC 为 0.2 到 0.5,并且加上调度周期末 SOC 恢复约束,比如最后一个时段 SOC(T) ≥ 0.4,这样能保证储能电站长期可持续运行。

第三个高频坑:忘了加设备的爬坡约束。很多人建冷热电联供模型时只写出力上下限,不写爬坡约束,结果优化结果出现燃气轮机出力从 50 kW 直接跳到 500 kW 的“激进调度”,物理上根本不可行。加上每时段 20% 额定功率的爬坡约束后,结果立即变得符合工程实际。

第四个高频坑:多微网交互功率的正负号定义混乱。我在建模初期把交互功率写成无约束的连续变量,结果模型把两条微网之间的交互功率同时算成“买入”和“卖出”,导致能量凭空多出来,运行成本虚低。解决办法是把交互功率拆成正向和反向两个非负变量,并加入互斥约束和联络线容量约束,才能堵住这个漏洞。

5.3 实操心得与加速技巧

优化的求解速度永远是做大系统的瓶颈。我总结了三层加速技巧:

第一层是模型层面的简化。下层运行优化尽量用线性模型,避免引入非线性效率曲线和整数启停变量。如果一定要考虑机组启停,把启停成本和运行成本合并成线性分段约束,比引入 0-1 变量快得多。第二层是代码层面的向量化。所有约束能写成矩阵形式就写成矩阵形式,避免在 sdpvar 定义上浪费时间。第三层是求解器参数调优。CPLEX 设置 MIP 相对间隙为 0.01,或者设置时间上限,虽然理论上牺牲了一点精度,但实际工程中足够用。

我在做双层迭代求解时,还有一个特别有用的技巧:给上层算法加一个“记忆库”。每次迭代产生的储能容量方案和对应的下层运行成本都存下来,下次迭代遇到相同或相近的容量方案时直接调用历史成本,不重新求解下层。这个技巧能节省约 30% 的计算时间,尤其是在粒子群算法后期,种群收敛到一起的时候效果非常明显。

6. 项目扩展方向与最终建议

共享储能加冷热电多微网这个模型做熟之后,扩展空间非常大。我手头正在准备的是加进碳排放约束和绿电交易机制,把碳价纳入目标函数,这样就能完成“经济-低碳”双目标优化,再配合 NSGA-II 这类多目标算法输出 Pareto 前沿。另一个方向是把目前确定性的负荷和新能源出力曲线升级成场景集,用两阶段随机规划处理不确定性,这会让模型更贴近真实运行环境,但计算复杂度也会上一个台阶。

如果读者是从零开始复现这个项目,我给的建议是先跑通“单微网加独立储能”的基础版,确认下层运行优化没问题,然后加第二个微网、第三个微网,最后再上共享储能和双层框架。这样既能逐步加深理解,也能避免一步到位调试黑洞。按照这个路径,熟悉 MATLAB 和 YALMIP 基础的人,周末加几个晚上基本能把基础版跑出来,再花一两周时间把双层迭代和结果分析做扎实。

最后分享一个我在实际项目里特别受益的习惯:每次跑完优化,不要把结果扔进废纸堆,而是把配置结果和对应的调度策略画成统一格式的报表。这套报表不仅方便自己复盘,还能直接拿来跟不熟悉算法的同事或甲方沟通。毕竟算法再漂亮,最终要落地的还是清晰可信的数据。

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

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

立即咨询