如果你打开一套微网能量管理系统的设计文档,大概率会看到两类方案:一类把“谷充峰放”写成固定规则,另一类直接做离线日前优化。前者在天气稳定的晴天能跑出不错的经济性,但一旦遇到连续阴天或午后突发云层,储能常常在错误的时间充满或放空;后者虽然全局眼光很好,却对预测精度极其敏感,预测一偏,计划就成了“纸上谈兵”。我前年做微网储能优化时,被这两个问题轮番折磨,最后转向模型预测控制(MPC)才真正把问题理顺。这篇博文就把我的完整思路、建模过程、仿真结果和踩坑记录分享出来,适合准备数学建模竞赛的同学、做微网能量管理的研究生,以及想给储能系统加上智能决策的工程师参考。全文不绕弯子,直接讲能落地的做法。
1. 微网储能优化为什么难:不确定性才是真正的对手
一个典型的光伏+储能微网,运行人员每天要回答的无非是四个问题:储能充不充、放不放、从电网买不买电、多余的电卖不卖。如果光伏出力恒定、负荷曲线固定、电价不变,这四个决策用穷举都能算出来。但现实是,光伏出力每分钟都在变,负荷有高峰低谷,电价还有峰谷分时结构,买电价和卖电价又不一致。整个问题本质上是一个在不确定环境下的序列决策问题,难度不在“算”,而在“怎么应对变化”。
1.1 为什么“谷充峰放”这种死规则不够用
“谷充峰放”是很多人最先想到的策略:电价低谷时段给储能充满,电价高峰时段放出来供给负荷,省下高价购电费。听上去很合理,但实际跑起来问题不少。
第一个问题是储能容量有限,低谷时段可能根本不需要充满。比如在光伏出力较大的中午,如果光伏发电量已经足够覆盖负荷,储能就不该在低谷时段提前充满,因为到了中午会出现“想充没地方充、光伏只能白白弃掉”的情况。第二个问题是晚高峰和次日低谷之间的衔接。固定规则很难考虑“今天多放一点,明天低谷再补回来”这类跨日协调,导致储能在次日清晨就处于低电量状态,白白错过早高峰的套利机会。
更麻烦的是,固定规则完全无视了功率平衡和设备约束。储能充放电功率不能超过额定值,SOC不能越界,电网交互功率也有限制。规则策略在正常情况下也许够用,一旦负荷或光伏偏离预期,就可能导致过充、过放或功率越限,轻则影响经济性,重则触发保护动作。
1.2 离线日前调度的问题:计划赶不上变化
既然固定规则不行,很多人自然会想到离线优化:提前一天用预测数据,求解一个全天24小时的最优调度计划,把每个时刻的储能充放电功率和购售电功率都定下来。这个方法本身没错,但它有一个致命前提——预测要准。
我做测试时遇到过很典型的情况:日前预测第二天是多云转晴,于是优化出来的计划是在上午用低价电给储能充电,准备中午光伏大发时吸纳多余电量。结果第二天实际是阴天,光伏出力比预测低了40%,原计划里“光伏充满储能”的时段压根没有多余出力,储能只能从电网买高价电来执行充电计划,整个优化目标被完全破坏。
这揭示了一个核心矛盾:优化本身是开环的,它决策时假设未来的输入和预测一致,但实际运行时输入一直在变。开环计划一旦执行,就没有机制修正偏差。真正要解决的,不是把某一次优化做得更精细,而是让决策本身具备“根据最新情况持续更新”的能力。
2. 模型预测控制的核心逻辑:滚动刷新比一次算清更靠谱
模型预测控制能解决上述问题的思路很朴素:我不再试图一次算出未来24小时的全部计划,而是只算未来一小段时域内的最优决策,执行第一步,然后等时间往前走,获取新的测量值和更新后的预测,再重新优化。整个过程不断滚动,每走一步都修正一次方向。
2.1 预测控制三件套是什么
严格来说,MPC不是一个算法,而是一个控制框架,由三部分组成:预测模型、滚动优化、反馈校正。
预测模型的作用是“往前看”。我们需要一套描述系统行为的模型,给定当前状态和未来的输入序列,就能推算出未来一段时域内系统的状态和输出。在微网场景里,这个模型就是光伏出力预测、负荷预测、储能SOC递推方程等。
滚动优化是MPC的核心动作。在每个采样时刻,MPC根据最新的状态测量值和预测信息,求解一个有限时域的最优控制问题,得到未来Np步的控制序列,但只把第一步下发到执行机构。等到下一个采样时刻,系统状态更新,预测信息刷新,再重新求解。这样每次决策用的都是最新信息,天然具备对不确定性的适应能力。
反馈校正是MPC区别于纯开环优化的关键。因为预测模型不可能完全准确,MPC需要在每个周期用实测状态值和模型预测值做对比,把误差带进下一轮优化。实际工程中,我们通常直接使用实时测量到的SOC和功率作为下一轮优化的初始状态,这就隐式完成了模型误差的修正。
2.2 为什么储能场景天然适合MPC
用导航来类比:离线日前优化相当于出发前看一次全程路线,然后完全不看路况,闭着眼开到终点;规则控制相当于只看眼前的红绿灯,不管前面五公里有没有堵车;MPC则像开导航之后,每五分钟根据实时路况重新规划路线,既看得到前方几公里的情况,又不断根据当前位置修正。
储能优化问题的几个特征恰好和MPC的长处完全匹配。第一,储能系统有明确的约束条件:SOC上下限、充放电功率限制、互斥约束,MPC通过约束优化可以全部纳入。第二,光伏和负荷预测是时变的,MPC每个周期更新预测信息,能够适应这种时变性。第三,储能设备的实际状态和模型预测总有偏差,反馈校正保证了不会越偏越远。
还有一点容易被忽略:MPC的求解结果天然是一段控制序列,这对储能这种执行机构来说非常合适。储能充放电功率不需要频繁剧烈变化,MPC给出的序列可以让决策更平滑,减少对电池寿命的损害。
3. 设备建模:光伏、储能、电网交互各自怎么写进优化器
要跑MPC,第一步就是把系统的各个组成部分写成可计算的模型。模型不需要每个细节都精确,但必须抓住影响决策的关键因素。
3.1 光伏出力的预测输入
光伏建模在能量管理这个层面不需要太复杂,最简单实用的做法是直接使用预测功率曲线作为模型输入。光伏预测数据可以来自数值天气预报、历史数据统计,或者简单的机器学习模型。在MPC框架里,光伏预测值代表“对未来出力分布的中心估计”,实际出力则通过反馈校正进入下一轮优化。
做仿真时,我会设定一个预测场景和一个实际场景,两者之间的差值用来模拟预测误差。比如预测曲线是典型晴天的钟形曲线,实际曲线在某个时段叠加一个云层遮挡导致的出力下降,这样就能测试MPC在预测失配时的表现。
需要提醒的是,光伏模型虽然简单,但单位一定要统一。我见过不少人把kW和kWh混用,导致优化结果完全失真。功率用kW,能量用kWh,时间步长用h,计算SOC变化量时别忘乘上时间步长。
3.2 储能电池的状态与约束
储能模型的核心是SOC递推方程:
SOC_{t+1} = SOC_t + (η_c * P_c_t - P_d_t / η_d) * Δt / E
其中P_c是充电功率,P_d是放电功率,η_c和η_d分别是充放电效率,E是电池额定容量,Δt是时间步长。注意充放电效率通常不对称,铅酸电池和锂电池的差别都不小,建模时一定要分开设置。
储能约束包括几类:充放电功率不超额定值,SOC不越界,充放电不能同时进行。前两类是线性约束,第三类需要引入整数变量或逻辑约束。如果使用的是锂电池,推荐把SOC运行范围设得保守一点,比如20%到90%,这对延长寿命有明显的帮助。
还有一个容易被忽略的部分:储能寿命成本。每次充放电都会产生电池衰减,从经济优化角度看,这部分成本应该计入目标函数。最简单的处理方式是设定一个“每kWh吞吐量的折旧成本”,在目标函数里加一个和充放电量成正比的惩罚项。这样优化器会自动在“赚峰谷价差”和“减少电池损耗”之间找平衡。
3.3 电网交互与分时电价
微网和外部电网之间通过一个公共连接点交互,模型里需要区分购电和售电两种状态。购电价是微网从电网买电的价格,售电价是微网把多余的电卖给电网的价格,通常卖电价明显低于买电价。
分时电价一般分为峰、平、谷三个时段。我常用的参数设置如下表:
| 时段 | 时间范围 | 购电价(元/kWh) |
|---|---|---|
| 峰时 | 10:00-15:00, 18:00-21:00 | 1.1 |
| 平时 | 07:00-10:00, 15:00-18:00, 21:00-23:00 | 0.7 |
| 谷时 | 23:00-07:00 | 0.4 |
| 售电 | 全天 | 0.4 |
电网交互约束方面,购电功率和售电功率都有限值,而且不能同时大于零。此外,如果所在地区执行需量电价,还需要把最大购电功率作为决策变量纳入目标,这部分在进阶优化里再展开。
4. 目标函数与约束:把“尽量省钱”变成可求解的数学问题
模型建好以后,接下来这一步是关键中的关键:把“尽量省钱”这个模糊目标,翻译成一个数学上可求解的优化问题。
4.1 目标函数怎么拆
在一个调度周期内,微网的运行经济成本主要由四部分组成:
- 购电费用:从电网买电花的钱,等于每个时段购电功率乘对应时段的购电价。
- 售电收益:向电网卖电赚的钱,等于每个时段售电功率乘售电价。
- 储能折旧成本:充放电导致电池衰减带来的隐性成本,按吞吐量乘以单位折旧系数。
- 弃光惩罚和失负荷惩罚:如果允许弃光或切负荷,需要在目标函数里加入足够大的惩罚项,防止优化器走极端。
把这些加总起来,目标就是最小化总成本。注意目标函数是线性的,这为后续使用高效求解器提供了基础。
一个完整的PC表达式可以写成:
min Σ (buy_price_t * P_buy_t - sell_price_t * P_sell_t + dep_cost * (P_c_t + P_d_t) * Δt)
如果还想进一步减少储能充放电切换次数,可以再增加一个与充放电状态变化幅度相关的惩罚项,相当于给频繁启停的电池“加税”。
4.2 约束条件怎么列
约束条件按物理逻辑梳理成几组:
第一组是功率平衡约束,保证任意时刻微网内的发电和用电平衡:
P_pv_t + P_d_t + P_buy_t = P_load_t + P_c_t + P_sell_t
这个式子含义是:光伏出力、储能放电、购电之和,等于负荷、储能充电、售电之和。
第二组是SOC递推约束,描述储能能量状态随时间的变化。第三组是各类边界约束:储能充放电功率上下限、SOC上下限、购售电功率上下限。第四组是互斥约束,包括储能不能同时充放电、不能同时购售电。
因为有互斥约束在,整个优化问题是一个混合整数线性规划(MILP)。求解MILP需要用到分支定界等方法,计算量比普通线性规划大不少,但当前主流的求解器处理这种规模的问题非常轻松。
4.3 求解工具与MILP规模控制
我习惯用MATLAB的YALMIP工具箱建模,调用Gurobi求解;Python环境则用PuLP或Pyomo。商用求解器Gurobi和CPLEX性能最好,学生可以用学术许可证。开源方案里,CBC和SCIP也是完全够用的选择。
对规模控制,我在实际使用中有几条经验:日前调度用1小时步长、24个时段,决策变量很少,求解时间在秒级;日内滚动用15分钟步长、预测时域4小时,就是16个时段,规模也不大。真正让规模失控的是把每个时段都引入一组整数变量并且拉长预测时域,所以建议在使用整数变量前先想清楚能不能用松弛约束替代。
5. 三层时间尺度怎么配合:日前计划、日内滚动、实时校正
工程实践中,单靠一层MPC是不够的。原因在于时间尺度太宽时,预测精度差;时间尺度太窄时,又看不全电价周期和负荷趋势。所以我把调度策略分成三层,各司其职。
5.1 三层架构各管什么
- 日前层:提前24小时做一次全局优化,时间步长1小时。它的任务不是精确执行,而是确定大方向,比如储能应该在哪些时段充电、哪些时段放电、是否需要从电网购电满足峰时负荷。日前层主要解决“跨时段的全局协调”。
- 日内层:每15分钟滚动一次,时间步长15分钟,预测时域取未来4小时。它根据最新的光伏和负荷预测修正计划,主要应对几小时内的预测偏差。
- 实时层:秒级到分钟级的本地控制,用简单的比例控制或下垂控制跟踪日内层的功率指令,应付几秒到几十秒的快速波动。
这三层的关系可以理解成:日前层定战略,日内层调战术,实时层做战斗。战略方向错了,战术再灵活也救不回来;战术不调整,战略也会被现实打乱。
5.2 日内滚动是怎么“滚”起来的
日内滚动是整套系统的核心。它的执行过程是这样的:在t时刻,读取当前的SOC实测值,获取未来4小时的光伏预测、负荷预测和电价信息。然后求解一个未来16个时间步的优化问题,得到一个控制序列,比如[t, t+15min]时刻储能充电20kW、[t+15min, t+30min]放电10kW等等。优化器只执行第一段指令,也就是只执行未来15分钟的动作。
等到t+15min时刻,重新读取SOC实测值,更新光伏和负荷预测,再次求解未来16步的最优控制序列。如此不断滚动。
关键点在于,每个周期都重新测量、重新预测、重新优化。就算初始预测很差,随着时间推进,误差会不断被修正,系统始终不会偏离目标太远。这也是MPC鲁棒性的根本来源。
5.3 层与层之间的接口
层与层之间不能各自为政,接口设计很重要。日前层的输出不是硬性的功率指令,而是一个参考轨迹,比如储能SOC的目标走廊。日内层优化时会让SOC尽量落在走廊中间,而不是严格跟踪某一条线,这样既有全局方向,又保留了局部灵活性。
日内层给实时层的则是具体的功率指令。实时控制根据实际电压频率对这些指令做微调,保证设备不越限。实践中我会把日内层的时间步长和实时层的执行周期错开,避免两个闭环抢同一个执行器。
6. 仿真验证:MPC比规则控制省多少,误差影响有多大
模型和算法都搭好之后,必须用一个贴近实际的场景去验证。我做的仿真参数如下:
| 参数 | 数值 |
|---|---|
| 光伏装机容量 | 100 kW |
| 负荷峰值 | 80 kW |
| 储能额定容量 | 200 kWh |
| 储能额定功率 | 50 kW |
| 储能SOC范围 | 20%-90% |
| 充放电效率 | 0.95 / 0.95 |
| 购电价 | 峰1.1元, 平0.7元, 谷0.4元 |
| 售电价 | 0.4元/kWh |
| 储能折旧成本 | 0.05元/kWh(吞吐量) |
负荷曲线按典型居民园区的双峰形状设置,早高峰在8点左右,晚高峰在19点左右。光伏曲线用两种场景:晴天和阴天,分别对应高光伏出力和低光伏出力。
6.1 规则控制做对比基准
为了公平验证MPC的价值,我首先实现了一个常见规则控制策略:
- 光伏优先供给负荷,多余功率首先给储能充电。
- 储能充满后,如果还有多余光伏才向电网卖电。
- 电价平段不主动充放电。
- 电价峰段且负荷较高时,储能放电。
- 电价谷段,储能从电网购电充满。
这套策略符合大部分人的直观认知,在工程里也确实是常见兜底方案。但它的问题在于,充放电的时机完全依赖状态触发的死规则,不具备跨时段优化能力。
6.2 结果对比和预测误差的敏感性
晴天场景下,规则控制全天运行成本约为812元,MPC优化后的成本约为695元,节省了约14.4%。阴天场景下光伏出力只有晴天的50%,规则控制成本约为1025元,MPC约为907元,节省约11.5%。优势主要来自两块:一是提前在低价时段给储能充电,而不是等光伏剩余了才被动充电;二是精确控制放电时机,避免在电价刚进入峰段时过早放完。
预测误差的敏感性测试我做了三组,把光伏实际出力在预测基础上分别偏差5%、15%、30%。结果和不少人预想的不同:MPC在30%预测误差下,成本只比理想预测增加了约6%。原因在于滚动修正把大部分误差消化掉了。真正的开环优化在同样条件下,成本增加了超过20%。这也说明,MPC的价值重点不是算得准,而是修正得快。
6.3 一个容易被忽略的观察点
仿真时我还观察到一个现象:MPC优化出来的储能充放电次数明显少于规则控制。规则控制在晴天时储能一天充放了三轮,MPC只充放了两轮。这是因为目标函数里加入了折旧成本项,优化器会自动权衡“多充放一轮省下的电费”和“多产生一次折旧成本”哪个更划算。对电池寿命而言,这种自动抑制频繁充放电的特性非常宝贵。
7. 参数整定与工程坑:预测时域、求解速度、SOC初值
算法跑通不难,跑出稳定可靠的效果则要处理不少工程细节。下面这几个坑是我实际踩过的,写出来供参考。
7.1 预测时域和控制时域怎么定
MPC最核心的两个参数是预测时域Np和控制时域Nc。Np太短,优化器看不到电价从低谷切换到高峰的时机,储能决策就会“短视”;Np太长,预测误差累积,且求解耗时增加。我的经验是Np至少要覆盖一个完整的峰谷周期,这样才能让优化器看到完整的电价切换逻辑。
在日前层,Np取24个时间步比较合理;在日内滚动层,Np取16个时间步(4小时)已经足够,因为超过4小时的光伏预测可靠性显著下降,再长的时域反而是负担。Nc一般取1到3,储能这类惯性较大的对象不需要每步都重新决策。
7.2 MILP求解太慢怎么办
当我首次把日前计划扩展到包含整数互斥约束的MILP时,求解耗时在几秒左右,Gurobi表现很好。但换成开源求解器CBC后,当预测时域拉长到48步且整数变量增多时,偶尔会需要几十秒甚至更久。
如果遇到求解太慢,我建议从三个方向入手:第一,把步长从5分钟改成15分钟,减少时段数是最直接的;第二,去掉整数变量,用线性约束近似充放电互斥,比如给SOC变化量加上限;第三,给求解器设置合适的MIP gap,比如1%,牺牲一点点最优性换取速度。工程上没必要追求数学上的精确最优,接近最优完全够用。
7.3 SOC初值和预测误差的补偿
SOC初值对优化结果的影响远比我想象中更大。如果初值设错10%,整套计划都会明显偏移。所以日内滚动层每周期必须从BMS实时读取SOC,不能拿上一轮的计算值凑合。
预测误差的补偿方面,我采用的是一种简单的遗忘因子修正:在每轮滚动时,把上一时段光伏预测误差的一定比例叠加到本时段的光伏预测值上。虽然这个办法很土,但实测对短期预测误差有不错的抑制效果。如果有条件,用LSTM或Transformer做光伏预测自然更好,但如果数据量不够,修正项和MPC的滚动机制已经能兜住大部分误差。
7.4 几个容易被忽视的坑
- 单位一致性:kW和kWh、分钟和小时之间要统一,用代码实现时建议强制规定全文件只用一套单位。
- 电价时段边界:分时电价在边界时刻切换,优化器容易在这类时刻产生充电/放电的跳变指令,需要加平滑约束。
- 分时电价时段切换瞬间,购电价从1.1跳到0.7,如果优化器只知道当前时段的电价而预测时域又没跨过边界,就会产生错误决策。
- 储能最小运行时间:频繁启停不仅伤电池,还可能在切换瞬间造成功率波动。可以增加最小充放电持续时间约束,或者用折旧成本间接抑制。
8. 更进一步:把微网与外部电网的电力调控放进同一套框架
做完整套MPC之后,我最大的收获不是代码跑通了,而是理解了微网能量管理的本质:它不是某个单一算法的问题,而是一套“预测-优化-执行-校正”的闭环体系。框架搭建好之后,往里加新的目标和约束只是工作量问题。
8.1 为什么要把外部电网交互放进框架
很多微网并网运行时,不只是被动地从电网买电或把多余电量卖回电网,还可以参与外部电网的辅助服务,比如需求响应、调峰调频等。这类内容就是近期数学建模和电工杯赛题里反复出现的“微网与外部电网电力调控策略”的考察核心。
把这个放进MPC框架非常自然:只需要在目标函数里增加与电网交互的收益项,比如削峰奖励、需量电价惩罚,在约束条件里增加功率限值和时间段约束,优化器就会自动在“自身用电省钱”和“配合电网换奖励”之间寻找最优平衡。我建议比赛或项目中遇到这类题,优先考虑在MPC框架里扩展,而不要另起炉灶。
8.2 面向比赛和实际项目的扩展方向
如果后续想深入,可以考虑三个方向。第一,多微网之间的协同调度:多个微网共享储能和功率交互,模型会变成分布式优化,可以用交替方向乘子法或一致性算法求解。第二,把需求响应负荷纳入优化:部分负荷是可平移、可削减的,目标函数里加入负荷调整的用户满意度惩罚,让系统在极端电价时段主动削减负荷。第三,引入电压无功优化:不只做有功调度,把无功功率、电压约束也加进来,这就把能量管理问题从“时间维度”拓展到“时间+空间维度”。
8.3 我的几点实际体会
最后分享几条做了这个项目之后沉淀下来的经验。模型能简单就不要复杂,光伏用一条曲线加误差修正足矣,储能用一个递推方程足矣,把精力花在框架闭环上,而不是模型本身的炫技上。预测系统是整个MPC的天花板,算法再强,预测偏到离谱也一样白搭,值得花时间和精力做好数据清洗与预测调参。调试时一定要做好仿真环境的最小复现,单独构造场景验证某一类约束是否正确,不要等整套系统跑起来再找问题,那会让人崩溃。MPC最迷人的地方不是它算得有多准,而是它承认世界充满不确定性,然后用滚动的方式和不确定性共存,这是工程思维和数学思维一个很不一样的交汇点。