☰
基于模型预测算法的含储能微网双层能量管理
2026/10/3 10:05:46 网站建设 项目流程

之前给一个园区微网搭建能量管理系统时,最让我头疼的不是通信协议,也不是界面开发,而是“计划跟不上变化”。日前按气象预报做的调度计划,到了第二天中午,光伏出力可能因为一片云掉下去一半;负荷预测也总有偏差。如果只靠一个开环的日前优化结果去执行,储能要么提前放空没电可用,要么在低谷时段没充满,全天电量电费比预期高出一截。后来我把模型预测算法(MPC)放进日内层,和上层日前调度组成一套双层能量管理框架,问题才真正解决。这套思路,就是标题里说的“基于模型预测算法的含储能微网双层能量管理”:上层规划全局经济性,下层用MPC滚动修正预测误差。如果你是做微网EMS、储能控制策略,或者正在写相关选题的研究生,这篇文章会把建模思路、MPC实现细节和调参踩坑都讲清楚,可以直接拿去搭算例,也可以改造成工程方案。

1. 为什么微网能量管理必须走上“双层”这条路

1.1 单层日前调度在真实微网里的失灵现场

先看传统单层日前调度是怎么工作的:基于未来24小时的预测曲线(光伏、风电、负荷),一次性求解出未来一天的机组出力和储能充放电计划,然后照单执行。从数学上看,这完全没问题,就是一个典型的开环最优问题。但放在真实微网里,开环这两个字就是最大的问题。

信息流是单向的:预测 -> 优化 -> 执行,没有反馈回路。而预测恰恰是电网里最不可靠的环节。光伏出力受云层影响,几分钟内从100%掉到30%并不稀奇;负荷侧更复杂,一场临时活动、一台大设备启停,都会让负荷预测失真。举个例子,我遇到过一次比较极端的情况:某个园区微网光伏装机200kW,日前预测中午时段出力180kW,实际因为云层遮挡只有120kW,差额60kW。如果日前调度计划里已经把储能安排在晚间放电、清晨放到较低SOC,中午这60kW缺口就只能靠网购电或柴油机顶上。购电正好落在峰时电价,柴油机效率又低,一次偏差就把全天调度策略的收益吃掉大半。

储能的存在让这个问题变得更微妙。储能不是电源,它像一个“能量蓄水池”,今天充的电要留到明天某个时刻放。日前调度把所有充放电时段都安排好了,但实际运行时任何一个时段的偏差都会影响SOC轨迹。偏差是累计的:上午光伏少发,储能多放了一点,下午负荷高峰时储能可能就放不出那么多。单层调度没有能力修正这种累计偏差,只能眼睁睁看着末段SOC偏离计划,甚至出现SOC触底的情况。

1.2 上下层分工的本质:计划负责经济,MPC负责执行与修正

那有人会问:为什么不能直接用一个MPC做全天调度,非要分两层?

关键在于“全局经济性”和“局部可执行性”两个目标在时间尺度上是冲突的。储能想赚钱,靠的是“低谷充、高峰放”的跨时段套利,这个策略需要看全天的分时电价和负荷峰谷,属于小时级甚至日级决策。如果用MPC直接做全天调度,预测时域要拉到24小时甚至更长,滚动窗口每一时刻都要重新求解,计算量先不说,单是24小时内的预测误差累积就足以让优化结果失真。更麻烦的是,23小时后的预测对当前决策几乎没参考价值。

但如果完全依赖日前开环调度,前面已经说了,它管不住实时偏差。所以自然的解法就是把决策拆成两层:

  • 上层(日前/计划层):基于精度较低但覆盖全天的基础预测,做全局经济优化。求解频率低,时间尺度1小时左右,输出结果不针对某一刻的花哨操作,只求大方向正确。
  • 下层(日内/修正层):基于实时量测和超短期预测,以MPC为核心,在短时域内滚动优化,实时修正预测误差引起的一系列偏差。时间尺度可以压缩到15分钟甚至5分钟。

我用一个不太严谨但足够直观的类比:上层是导航软件,出发前根据整体路况规划出一条最优路线;下层是驾驶员,开着车盯着前方的路况,随时微调方向盘和油门。导航告诉你“两小时后上高速”,但不会要求你精确到每一秒的油门开度。真正的手感,是驾驶员在路上根据眼前的情况实时调整出来的。双层能量管理就是这个道理。

2. 上层调度模型怎么搭:从目标函数到SOC参考轨迹

2.1 上层模型的目标函数与约束体系

上层调度的任务,是在“信息不完全”的情况下求一个全局经济的最优计划。它的核心输出一般有三个:储能SOC参考轨迹、柴油发电机/可控机组的计划出力、联络线计划交换功率。其中SOC参考轨迹是上下层衔接最关键的信息,后面单独展开。

目标函数我习惯这么写,包含购售电成本、燃料成本、储能损耗成本:

min Σ_{t=1}^{T} [ C_grid(t)·P_grid(t) + (a·P_dg(t)^2 + b·P_dg(t) + c) + C_bat·|P_bat(t)| ]·Δt

变量含义:

  • P_grid:联络线交换功率,购电为正,售电为负
  • C_grid:分时电价
  • P_dg:柴油发电机出力,成本用二次函数拟合
  • P_bat:储能充放电功率
  • C_bat:储能单位功率损耗折算系数,用来在目标函数里“惩罚”不必要的充放电

约束方面,第一优先级是功率平衡方程:

P_pv(t) + P_wind(t) + P_dg(t) + P_bat(t) + P_grid(t) = P_load(t)

这是一个等式约束,任何时候都必须满足。然后是可再生能源出力上限、DG出力上下限和爬坡率约束、联络线交换功率上限、储能SOC上下限、充放电功率上限、充放电互斥约束,以及一个容易被忽略的SOC初末值约束:SOC(0) = SOC(T) 或 SOC(T) 落在一个允许区间内。不限制SOC末值的话,上层优化会倾向于把储能里的电在最后一个高价时段全部放空,第二天直接从低SOC开始跑,跨日耦合问题就会冒出来。

求解这个模型,如果做研究,可以直接上混合整数线性规划(MILP)或二次规划,二次项做分段线性化。工程落地时我更推荐简化处理:把DG成本按分段线性或直接按优先级排序,储能参与削峰填谷的逻辑用峰谷时段生成约束条件。2015年前后的很多实际工程EMS就是这么干的,用线性规划就能解决问题。

2.2 SOC参考轨迹:连接两层调度的“契约”

上下层之间不是简单地“上层算完,下层跟跑”,而是通过SOC参考轨迹这个接口形成配合。上层优化结束后,最优解的储能功率序列通过状态方程累加,就能得到一天的SOC参考轨迹SOC_ref(1..T)。

很多第一次搭双层模型的人会问:下层MPC是不是应该把SOC_ref当硬约束,严格跟踪?我的回答是:千万别。MPC的预测时域一般只有未来1到2小时,它根本没有全局视野。如果在某段时间内上层给出的SOC_ref和实际偏差太大,比如光伏出力比预测低,实际SOC已经跌到参考值以下,硬约束就会让MPC为了“追轨迹”而不顾当前功率平衡,甚至导致可行域为空,直接求不出解。

正确做法是把SOC_ref作为软跟踪目标,也就是让SOC偏离参考值“付出代价”,但不设死。更进一步,可以给SOC_ref加一个允许偏差走廊:SOC_ref - δ ≤ SOC ≤ SOC_ref + δ,δ取2%到5%。这样MPC在跟踪的同时还有自由度去平滑联络线功率、减少DG调节次数。这个走廊宽度,说白了就是计划层给执行层留的“操作空间”。走廊太窄,MPC又变成一个死板跟踪器;走廊太宽,双层结构就名存实亡。

我在工程里通常还会让上层同时输出一个联络线计划功率P_grid_ref,一并交给下层。注意这里有个优先级排序问题:SOC跟踪权重最高,联络线平滑次之,DG动作量再次之。参考量给得太多,目标函数各项权重会打架,反而调不出好效果。

3. MPC日内层:预测模型、滚动优化与反馈校正

3.1 储能SOC预测模型:MPC的“眼睛”

MPC和普通PID最大的区别在于:它是基于模型的预测控制。意味着控制器脑子里有一个“仿真器”,能根据当前状态和未来输入,推算出未来一段时间的响应。在这个系统里,最核心的预测模型就是储能SOC的状态方程。

我用的形式是:

SOC(k+1) = SOC(k) - [ η_c·P_ch(k) - (1/η_d)·P_dis(k) ]·Δt / E_bat

写成状态空间表达式就是:

x(k+1) = A·x(k) + B·u(k)

其中状态x就是SOC,控制量u包含储能充电功率P_ch、放电功率P_dis、联络线功率P_grid、DG出力P_dg。A在这里等于1,B矩阵由储能参数和采样周期决定。

注意P_ch和P_dis要分开建模,不能合并成一个变量。原因很简单:储能系统的充放电效率不对称,充电时能量从电网到电池有损耗,放电时从电池到负荷又有损耗。如果只用一个P_bat变量再加一个平均效率,MPC在最优解里可能会出现“又充又放”的荒唐结果——同时给P_bat一个正值和一个负值,功率互相抵消,但目标函数里看起来没有损耗,SOC也没有变化。这个问题我在第四章会详细展开,这里先记住结论:充放电分开建模,是储能MPC里的基础习惯。

预测模型还包括未来Np步的光伏、负荷预测值。这里的预测和日前预测不一样:超短期预测只预测未来1到2小时,可以结合实时气象短临预报和最近一段实测数据的趋势外推,精度比日前预测高一个量级。这也是MPC比开环日前调度“看得准”的根本原因。它不是神仙,不能预知未来,但它预测“近处”的能力很强,而近处的预测恰好对当前决策影响最大。

3.2 滚动优化:目标函数设计、权重分配与求解

在k时刻,MPC基于当前实测SOC,对未来Np步做有限时域优化。我常用的目标函数长这样:

min Σ_{i=1}^{Np} [ w1·(SOC(k+i) - SOC_ref(k+i))^2 + w2·P_grid(k+i)^2 + w3·(ΔP_dg(k+i))^2 + w4·ε(k+i)^2 ]

约束包括:

  • 功率平衡:P_pv(k+i) + P_wind(k+i) + P_dg(k+i) + P_bat(k+i) + P_grid(k+i) = P_load(k+i)
  • SOC上下限:S_min ≤ SOC(k+i) ≤ S_max
  • 充放电功率上下限:0 ≤ P_ch(k+i) ≤ P_ch_max,0 ≤ P_dis(k+i) ≤ P_dis_max
  • 充放电互斥:P_ch(k+i) × P_dis(k+i) = 0
  • 联络线功率限幅:|P_grid(k+i)| ≤ P_grid_limit
  • DG爬坡率:|P_dg(k+i) - P_dg(k+i-1)| ≤ ΔP_dg_max

四项权重的物理含义要理解透:

  • w1项是SOC跟踪偏差。这个权重决定了MPC对上层计划的“忠诚度”。w1设小了,MPC会为了平滑联络线而长期偏离SOC轨迹,末端偏差越滚越大;w1设大了,MPC变成纯跟踪器,对联络线波动的压制力就弱。我调参的经验是先固定w1=1,让SOC跑稳,再加w2去压联络线波动。
  • w2项是联络线功率惩罚。用平方项而不是绝对值,是因为平方项同时惩罚功率的大小和波动。如果电网调度要求微网按计划曲线用电,就把这项改成(P_grid - P_grid_ref)^2,变成对计划曲线的跟踪。
  • w3项是DG出力变化率惩罚。柴油机频繁加减载既费油又伤机械。这一项加进去之后,DG的动作次数能肉眼可见地减少,代价是联络线功率会多承担一部分波动,算是一个权衡。
  • w4项是松弛变量惩罚。给SOC越限、联络线越限设一个非负松弛变量,能保证MPC在极端预测误差下一定有解,不至于因为硬约束冲突而求解失败。这个在工程上太重要了,后面第五章还会提到。

求解方面,如果目标函数是二次型、约束是线性的,这是典型的二次规划(QP),用OSQP、CVXGEN这类求解器在嵌入式环境里都能跑。如果充放电互斥约束用了整数变量,问题变成混合整数二次规划(MIQP),计算量会上一个台阶。科研论文里用MIQP没问题,工程上我更建议用惩罚法处理互斥,保持QP形式,实时性更有保障。

3.3 反馈校正:掌控系统当前状态的“手感”

MPC框架里还有个容易被忽视但极其重要的环节:反馈校正。简单说,就是每个采样时刻求解之前,必须用当前实测的SOC作为状态初值重新预测,而不能用上一轮计算出来的预测SOC序列里的值。

为什么要这么做?因为预测模型一定有误差。效率参数η不是精确的,电池容量E_bat会随温度和老化发生变化,SOC估计本身也有误差。如果不做反馈校正,这些误差会在滚动计算中不断累积,MPC会“越算越偏”,最后变成一种开环优化的变体。而反馈校正等价于在每个采样周期的起点重新“对表”,把模型推到和真实系统一致的位置上。这是MPC天然鲁棒性的唯一来源。

我的经验是SOC反馈值的质量决定了MPC效果的天花板。BMS上报的荷电状态百分比如果你完全信它,可能出问题。实际工程中最好做融合估计:安时积分法负责短期动态,开路电压法(OCV-SOC曲线)负责长期校准,或者再加一个卡尔曼滤波。我自己调试时经常干一件事:把BMS上报的SOC和用功率积分算出来的SOC画在同一张图上,如果两条线漂移超过2%,先查SOC估计的问题,再去调MPC参数。反馈是闭环控制的生命线,这一环节马虎不得。

4. 储能建模与约束处理:看似简单实则影响全局的细节

4.1 充放电效率不对称:一个会让求解器“打假球”的模型坑

这一节专门聊储能建模里那些“看着简单,实际全是坑”的细节。第一个坑就是充放电效率。

有些初版模型为了省事,把充电效率η_c和放电效率η_d都设成同一个值,比如0.95。这看似没什么问题,实际运行起来会发现MPC算出来的最优解经常出现“边充边放”:同时满足P_ch > 0和P_dis > 0,两边功率抵消,净功率为零。在效率对称的模型里,这种操作不会产生能量损失,SOC也不变,于是MPC认为这是合理的。但物理上,这简直是在拿储能设备做无用功,白白增加电池循环次数。

解决思路主要有两个。第一是加互斥约束,用一个0-1变量y表示充放电状态:

P_ch(k) ≤ P_ch_max·y(k) P_dis(k) ≤ P_dis_max·(1-y(k))

这样一来,MPC在每一时刻最多只能有一个方向的功率非零。代价是把问题变成MIQP。第二个思路是保持QP形式,在目标函数里加一个很小的惩罚项,比如w5·(P_ch(k) + P_dis(k)),虽然不能严格保证每一时步都不互斥,但实际算出来的解基本满足工程需求。我在工程里常用第二种,跑起来快,解也干净。

还有一个细节是储能功率的方向定义。建议约定:储能放电为正,充电为负,P_bat = P_dis - P_ch。写代码时所有公式符号统一,否则功率平衡方程里很容易出现正负号错误,排查起来非常痛苦。我见过不止一次,双层模型仿真结果异常,最后发现是储能功率方向定义不一致导致上层下层对不上。

4.2 SOC边界不是10%~90%那么简单

大多数模型把SOC约束写成S_min ≤ SOC ≤ S_max,S_min取10%、S_max取90%,完事。这个约束本身没错,但真正调试时你会发现只有这个远远不够。

第一,MPC的预测时域只有未来一段,它看不到时域之外的“明天”。假设上层给的SOC参考轨迹在后半天有个深谷,比如傍晚要把SOC放到20%去应对晚高峰,而MPC当前窗口的末端是下午15点,它只看到下午15点之前SOC还在高位,于是可能为了平滑联络线而在这段时间“少充电、多放电”,等到了下午16点,实际SOC已经提前跌到20%以下,晚高峰再用的时候已经没电了。怎么解决?给SOC参考轨迹末端加一个惩罚项,或者设置一个比硬边界更小的内部边界,比如控制目标设为20%~85%,物理边界是10%~90%。这样即使MPC短暂越了内部边界,也不会直接触底。

第二,大倍率充放电对储能寿命的影响。磷酸铁锂在0.5C和1C条件下循环寿命差异很大。如果研究方向涉及储能寿命,建议把寿命成本折算进目标函数。最简单的做法是用吞吐量模型:L = λ·Σ|P_bat(k)|·Δt,λ表示每单位kWh吞吐量对应的寿命损耗成本,比如0.02元/kWh。把这个加进目标函数后,MPC会自动倾向于减少不必要的充放电次数、抑制大倍率冲击。吞吐量模型比雨流计数法简单一个量级,做研究可以先从它起步,性价比非常高。

第三,容量老化。E_bat不是一个常量,它会随SOH下降而衰减。工程上至少每个季度或每次大检修后更新一次E_bat参数。仿真里做全年场景时,也建议按月度衰减曲线更新,否则到了年末,模型里的“虚拟电池”容量比实际大5%~8%,但MPC浑然不知,SOC跟踪的误差会越来越大。

5. 算例参数设计与调参踩坑记录

5.1 一套可以直接复现的仿真骨架

为了让你心里有个具体轮廓,我给出一个典型算例的配置。这个模型参数参考了我做过的类似园区微网项目,做研究或写论文时可以直接作为基准算例:

设备/参数数值备注
光伏额定容量200kW出力曲线用典型晴天/多云数据
风电额定容量100kW可用可不用,按实际场景取舍
储能容量200kWh磷酸铁锂
储能额定功率100kW即0.5C
柴油发电机150kW爬坡率限制30kW/15min
负荷峰值250kW典型园区负荷曲线
配电网容量300kVA联络线功率上限约240kW
上层调度周期1h24个时段
下层MPC采样周期15min一天96个时步
MPC预测时域Np8步即2小时
求解器QP/MIQP可用OSQP、Gurobi、Cplex

这个骨架的妙处在于上层和下层的时间基准可以统一到15分钟网格:上层按1小时粒度求解,但SOC参考轨迹插值到15分钟粒度,下层MPC在这个细网格上滚动。上下层时间粒度不一致,是实际系统里很常见的情况,衔接好它本身就是工程能力。

5.2 预测时域Np、采样周期和控制权重的搭配经验

Np的选择我一直建议“看负荷和光照变化的特征时间尺度”。光伏主导的微网,特征时间尺度是云层移动引起的出力变化,大约十几分钟到几十分钟;负荷主导的微网,特征时间尺度是峰谷切换,大约1到2小时。所以Np取4到8步(对应1到2小时)一般够用。我见过有人把Np拉到32步,计算时间翻了几倍,控制效果几乎没有提升——因为超短期预测在第16步之后已经明显失真,你拿一堆不准的“未来”在做决策,只会引入新的误差。

权重调节方面,我建议用一套“从里到外”的顺序:先把w1(SOC跟踪)设为1,w2设为0,跑通系统,确认SOC能贴着参考轨迹走。然后逐步加大w2,每次加大后看三个指标:SOC最大偏离值、联络线功率波动标准差、DG动作次数。直到SOC偏离快要越过阈值(比如5%)时,停止增大w2。w3的作用类似,重点看DG出力的阶跃次数。

直接上效果经验:之前给一个算例调参,w1=1时,w2从0加到10,联络线波动标准差下降约40%,SOC最大偏离从0.8%涨到3.2%;再往上w2加到50,联络线波动变化不大,SOC偏离却飙到9%。这时候就说明权重“失衡”了,要回到w2=10附近。这种“先快后慢”的边际收益递减规律,在几乎所有系统里都成立。

5.3 求解失败、数值病态处理与上下层衔接的三个有效习惯

最后分享三个坑和应对习惯。第一个坑是“可行域为空”。MPC报infeasible时,我从不去翻公式找灵感,而是按优先级逐个检查约束:先看联络线功率限幅是否被上下层不一致的数据撑破,再看SOC走廊是否收太紧,最后查DG爬坡约束。修的时候优先把硬约束改成软约束——把P_grid_limit从P_grid(k) ≤ 200kW改成P_grid(k) ≤ 200kW + ε,ε有代价但可以越限。联络线限值本身很多时候不是物理硬约束,而是调度约定,完全有条件做成软的。

第二个坑是量纲和数量级差异。w1如果等于1,w2设成10000,QP的KKT条件数值条件数会非常差,求解器可能报“矩阵接近奇异”。对策是把所有目标项归一化:功率除以100kW基准值,SOC本身在0~1之间,这样各项天然在同一个数量级,权重调节才顺滑。这是我自己踩过的最多次的坑之一,后来养成了习惯:新建模型的第一件事,先把量纲基准写在文件头。

第三个坑是上下层的数据衔接。上层算完给出SOC_ref序列,下层MPC跑一段时间后会拥有“真实”的SOC轨迹。下一次做上层优化时,一定要把当前实际SOC作为初值传给上层,而不是用上一次的SOC_ref当前值。否则上层永远基于一个虚的起点做第二天的计划,误差一天天滚下去,双层结构等于白搭。这个衔接细节我在几份开源代码里都见过漏掉的,值得特别注意。

另外,验证阶段务必跑多场景。晴天、多云、阴天各来一组,再加一组“光伏骤降30%”的瞬态工况。为什么?因为MPC的价值恰恰在多云和骤降这类“预测失准”的工况下最明显。晴天场景下日前调度本身就足够好,MPC发挥不出来,如果你只用晴天数据做对比实验,结论会严重低估滚动优化的价值。做研究的朋友在这点上尤其要注意:算例设计决定了你结论的说服力。

做这个方向研究下来,我最大的体会是MPC的真正价值不在“算法高级”,而在把储能约束、预测不确定性和经济目标掰扯清楚。模型预测算法不是万能的,它只是把“知道得越准,控制得越好”这一点发挥到极致。如果只能带走一个建议,我希望是——把储能建模做扎实,再谈优化算法创新;SOC模型和效率参数错了,优化做得再漂亮都是纸上谈兵。最后再分享一个实操小技巧:调参时把每个时刻的SOC参考轨迹、实际轨迹、联络线功率和DG出力画在同一张图上,一眼就能看出权重分配是否合理。这套检查方法我用了很多年,至今没有失效过。

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

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

立即咨询