微网储能优化:基于模型预测控制(MPC)的滚动调度策略

发布时间:2026/9/18 21:11:41
微网储能优化:基于模型预测控制(MPC)的滚动调度策略 如果你打开一套微网能量管理系统的设计文档大概率会看到两类方案一类把“谷充峰放”写成固定规则另一类直接做离线日前优化。前者在天气稳定的晴天能跑出不错的经济性但一旦遇到连续阴天或午后突发云层储能常常在错误的时间充满或放空后者虽然全局眼光很好却对预测精度极其敏感预测一偏计划就成了“纸上谈兵”。我前年做微网储能优化时被这两个问题轮番折磨最后转向模型预测控制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_{t1} 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:001.1平时07:00-10:00, 15:00-18:00, 21:00-23:000.7谷时23:00-07:000.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, t15min]时刻储能充电20kW、[t15min, t30min]放电10kW等等。优化器只执行第一段指令也就是只执行未来15分钟的动作。等到t15min时刻重新读取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最迷人的地方不是它算得有多准而是它承认世界充满不确定性然后用滚动的方式和不确定性共存这是工程思维和数学思维一个很不一样的交汇点。