做微网调度的人应该都有这个体会:白天光伏预测曲线稍微偏一点,下午联络线功率就跟着跑飞,储能SOC要么提前见底,要么到晚上还剩一大截没用完。加上共享储能这种场景,一组电池要同时服务多个主体、多个时段,协调难度直接翻倍。这两年我一直在折腾“基于MPC的日前日内微网共享储能优化调度”这类项目,把“日前优化”和“日内滚动MPC跟踪”两段拼成一个完整的协同框架。今天就把这套东西从头到尾捋一遍,包括建模思路、滚动时域怎么设、日前计划怎么变成日内参考轨迹、以及我踩过的各种坑。项目关键词是MPC(模型预测控制)、微网、共享储能、优化调度,内容偏实战,涉及数学建模和求解器细节,但我会尽量讲得直白,让刚入手的朋友也能照着搭起来。
先说结论:这种“日前定计划、日内做跟踪”的分层架构,核心价值不是把预测误差消除,而是用反馈把误差的影响控制在一个可接受的范围内。日前优化负责“算得清”,日内MPC负责“跟得住”,两者协同的核心是衔接变量的设计与惩罚系数的整定。下面从设计思路开始,逐层拆解。
1. 项目整体设计与选型思路
1.1 难点在哪:为什么传统单层调度不够用
微网的优化调度,本质上是一个“在满足功率平衡和运行约束的前提下,最小化运行成本”的优化问题。如果光伏、负荷、电价这些数据全部精确已知,直接建一个全局优化模型,一次性算出未来24小时每一刻的储能充放电功率,问题就结束了。但现实不允许:光伏功率受云层影响可以几分钟内下降一半,负荷预测误差在极端天气下能达到百分之二三十,现货电价也会波动。单层日前调度拿这些不准的数据当准数据用,算出来的计划到实际执行时大概率失配。
这就是为什么需要分层。日前优化在预测信息下提前一天算出一个“基准计划”,解决的是“未来大致怎么运行最经济”的问题;日内阶段再用更短周期、更高频率的MPC,根据实际量测和滚动更新的预测,在不严重偏离日前计划的前提下修正控制指令。说白了就是粗细结合:日前负责大方向,日内负责微调。用一句话概括:日前优化给你一个“锚”,日内MPC保证船不飘太远。
1.2 共享储能的建模思路
共享储能和传统“自建自用”储能最大的区别在于:储能资产的所有权和使用权分离,多类用户(或者微网内的多个子单元)共用一组电池。在建模层面,需要把储能的能量状态、充放电功率、寿命损耗这些内部变量显式表达出来,同时把“共享”的语义落到约束里。
我比较推荐的做法是:把共享储能看成微网内的一个“公共功率节点”。所有用户/子微网的功率差额(发用不匹配的部分)汇总到这一点,由储能统一充放平衡。目标函数里加上储能运行成本/租赁费用项。对于不同用户的用能需求,可以用比例分配或者按申报功率配额的方式建模。注意,这里的“共享”不是简单的容量切分,而是强调SOC(剩余电量)随时间动态变化,谁在某个时段用得多,谁的等效占用就多,因此SOC轨迹的优化在日前计划里特别重要——它决定了储能一天内“立场的分配”。
1.3 MPC协同方案的框架
MPC在这套系统里的角色不是替代日前优化,而是作为日内层的核心控制器。它做的事是:在当前时刻k,读取系统实际状态(尤其是储能SOC、实际光伏/负荷功率),获取未来一段时间(预测时域N)的预测数据(修正后的光伏/负荷/电价),然后在线求解一个有限时域开环优化问题,得到从k到k+N-1的控制序列,但只执行当前时刻的控制量。到k+1时刻,状态更新、预测滚动、重新求解,如此反复。
之所以选MPC而不是简单的规则控制或PID,是因为MPC能天然处理多变量耦合、约束和预测信息。储能充放电、联络线功率、用户购售电是强耦合的,用规则很难兼顾。而MPC把问题形式化成了“有限时域优化”,约束直接嵌在模型里,非常契合这个场景。这里我采用的标准做法是:日内MPC以日前计划的联络线功率和储能出力为参考输入,通过目标函数中的二次惩罚项将其“拉向”参考轨迹,同时结合更新的预测做局部优化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日前优化部分:在预测精度有限时先把骨架搭好
2.1 日前优化的输入与目标
日前优化的输入主要包括三类:一是预测数据,包括24小时(或96点)的光伏出力、负荷功率、分时电价;二是设备参数,包括储能额定容量、最大充放电功率、充放电效率、SOC上下限;三是网络/市场约束,比如联络线功率上限、购售电价格的对称或不对称性。这些数据在理想情况下来自天气预报和负荷预测系统,但实战中我有一个体会:宁可预测偏保守,也不要让日前计划“贴着边界走”。比如联络线功率上限是500kW,日前计划最好只用450kW,给日内MPC留一点调节余地。
目标函数我一般建两个版本。版本A是纯经济目标:最小化购电成本减去售电收益,加上储能的运行维护成本(按充放电电量计)和寿命损耗成本(按吞吐量折算)。版本B在A的基础上加入对储能充放电次数或吞吐量的惩罚,用来避免储能频繁切换充放状态。对于含共享储能的多主体场景,还需要把储能租赁费用的分配逻辑写进去,比如按各主体申报的容量比例或实际SOC占用时间比例分摊。目标函数写出来长的样子是:
min Σ [ C_buy(t)·P_buy(t) - C_sell(t)·P_sell(t) + C_om·(P_ch(t)+P_dis(t)) + C_deg·(P_ch(t)+P_dis(t)) ]
这里的P_buy、P_sell是购售电功率,P_ch、P_dis是储能充电和放电功率。C_deg是寿命损耗系数,我一般按储能全寿命周期内可吞吐总电量折算,比如电池容量1MWh,循环寿命6000次,总吞吐量6000MWh,电池组投资100万元,那每充放1kWh的损耗成本大概是0.167元/kWh,这个折算值可以作为C_deg的量级参考。
2.2 决策变量与约束怎么建模
决策变量分成两类:连续变量(储能充放电功率、购售电功率、SOC)和0-1整数变量(储能充电状态、放电状态、购电状态/售电状态)。因为充放电不能同时进行,所以需要引入0-1变量来互斥约束:P_ch(t) ≤ P_ch_max·u_ch(t),P_dis(t) ≤ P_dis_max·u_dis(t),u_ch(t) + u_dis(t) ≤ 1。同理,同一时刻一般也不会同时购电和售电,可以加u_buy(t) + u_sell(t) ≤ 1。这样一来,日前优化就是一个混合整数线性规划(MILP)。
约束部分最核心的是这几条。一是功率平衡约束:P_pv(t) + P_wt(t) + P_dis(t) + P_buy(t) = P_load(t) + P_ch(t) + P_sell(t),左边是电源侧,右边是负荷侧。二是储能SOC递推约束:SOC(t+1) = SOC(t) + η_ch·P_ch(t)·Δt/E_rated - P_dis(t)·Δt/(η_dis·E_rated)。三是SOC上下限约束,比如0.1 ≤ SOC(t) ≤ 0.9,这是保护电池寿命的关键。四是联络线功率约束,0 ≤ P_buy(t) ≤ P_line_max,售电同理。
还有一个经常被忽略的约束是SOC的日始日终一致性。如果不加这个约束,日前优化会倾向于把储能电量在电价高时放光、日终SOC降得很低,然后第二天又重新充满。这在单日调度里没问题,但多日连续运行就不行。我一般加一个SOC(0)=SOC(T),或者SOC(24)落在某个区间(如0.45-0.55),视项目需求而定。
2.3 求解与实践要点
日前优化是离线的,对求解时间不那么敏感,所以可以直接用商业求解器(Gurobi、CPLEX都是好选择)把MILP解到最优或非常小的MIP gap(比如0.1%)。模型规模:96个时段、一个储能、一个联络线,变量大概有三四百个,其中整数变量两百多个,求解时间通常在几秒到几十秒,完全可接受。
实操中我想提醒一点:日前优化算出来的计划不要让储能SOC轨迹“太完美”。什么意思?就是SOC曲线往往会在电价谷段快速充满、峰段快速放净,斜率很陡。这种计划给日内MPC当参考时,MPC会拼命跟踪,导致储能频繁功率爬坡。我的对策是:在日前优化目标里加一个SOC变化量的惩罚项,让SOC轨迹更平滑,这样日内跟踪的难度会小很多。具体做法是加二次项或L1范数:λ·|SOC(t+1)-SOC(t)|,虽然只是很小的改动,但效果非常明显。
3. 日内滚动MPC跟踪部分:用反馈把误差收回来
3.1 MPC的三个核心环节
MPC不是某个特定算法,而是一种控制方法论,三个环节缺一不可。第一是预测模型,也就是用来预测系统未来行为的模型,在这里是储能SOC的递推方程和功率平衡关系。第二是滚动优化,在每个控制周期内求解一个有限时域的最优控制问题,得到未来N步的控制序列。第三是反馈校正,只执行序列中的第一步控制量,下一个周期重新量测温度、修正模型预测偏差,再重新求解。反馈校正是MPC区别于开环优化的灵魂,也是它能在预测误差较大时依然稳住系统的原因。
在共享储能微网场景,这三者分别对应:预测模型是储能SOC更新方程和功率平衡等式;滚动优化是每15分钟(或5分钟)求解一次包含16个时段的二次规划/线性规划;反馈校正则是用实际SOC量测去修正模型的初值,同时把预测误差(实际光伏-预测光伏)隐式地注入优化,因为最新的预测数据参与了当前时刻的优化计算。
3.2 滚动时域怎么设计
滚动时域的设计直接决定系统性能和求解负担。我常用的配置是:控制周期Ts=15分钟,预测时域N=4小时(16步),控制时域M=1步(即只优化当前时刻的控制量,未来只作为可行的演算)。为什么预测时域取4小时?因为光伏和负荷预测在4小时尺度上还有一定可信度,而更长时段的预测误差明显上升,取16步能让MPC提前看到电价变化趋势和储能SOC的可调节范围,又不会因为预测不准导致过度约束。
还有两个参数要一起定。一是控制周期,如果微网内的负荷变化快、储能功率上限大,建议用5分钟;如果变化平缓,15分钟就够了。二是约束的处理方式,MPC里我把SOC上下限、功率极限都作为硬约束,但功率平衡等式加松弛变量。为什么?因为硬约束一旦冲突,MPC会无解,在线运行最怕这个。松弛变量会把等式从P=0变为P=ε,ε在目标函数里被重罚,这样数学上永远有解,而且只在万不得已时才“违约”。
3.3 跟踪目标怎么设
日内MPC目标函数我把“跟踪”落成三项之和。第一项是联络线功率与日前计划的偏差惩罚,这是最关键的,因为微网与主网之间的功率协议往往是硬指标——偏差大了可能被考核甚至罚款。第二项是储能充放电指令与日前计划储能出力的偏差惩罚,目的是让储能的实际运行尽量贴合日前经济计划,避免储能“乱出力”。第三项是经济性项,即购售电成本,这可以理解为在跟踪计划的同时,允许MPC利用更新的预测小幅优化运行成本,而完全不需要为预测误差买单。
比例系数怎么定?我采用“分层惩罚”原则:联络线偏差系数最大,储能偏差系数次之,经济性项系数最小。打个比方,联络线偏差系数是100,储能偏差系数是10,购电成本系数是1。这样MPC会优先保联络线,其次保储能节奏,最后才抠经济性。要是你把经济性系数调得比联络线偏差还大,MPC会为了省电费把联络线拉到天边去,日前计划就形同虚设了。
这里还有一个容易被忽略的细节:MPC的参考轨迹不应该只是日前计划中“同一时刻的值”,而应该加上一个前瞻修正。因为MPC是有限时域优化,它看到的未来窗口只有4小时,而日前计划是24小时全局最优。如果不加修正,MPC很可能在窗口的末尾把储能SOC推到一个对后续不利的位置。我的常用做法是:在MPC的目标函数里放一个“SOC末端落点”惩罚项,引导窗口末端的SOC靠近日前计划的SOC参考值,这样既保留了MPC的滚动修正能力,又不会破坏全天节奏。
4. 日前与日内的协同运行机制
4.1 协同的三层含义
很多人把日前+日内理解成“先算一遍,再算一遍”,其实协同远不止如此。我拆成三层:第一层是“计划协同”,日内MPC以日前计划的联络线功率和储能出力作为参考轨迹,这是最表面的协同;第二层是“状态协同”,日前优化算出的SOC轨迹作为日内MPC的末端约束或软约束参考,确保储能全天的能量状态能闭环。第三层是“信息协同”,日前优化和日内MPC共享同一套物理模型和参数,只是在预测信息和优化时域上不同,这样两个层的解天然兼容。
如果只做了第一层,大概率会出现这种情况:日前计划里储能上午充电、下午放电,但日内MPC因为上午光伏实际出力比预测大,就少买了电甚至不充电,到了下午负荷上来时储能没电放,联络线超额,计划崩盘。所以状态协同特别重要,我强烈建议在日内MPC目标里加SOC跟踪项。
4.2 衔接的逻辑:日前计划如何注入日内MPC
具体到数据流,整个运行流程是这样的。前一天T日,用预测数据求解日前优化,得到全天96点计划:P_DA_buy(t)、P_DA_sell(t)、P_DA_ch(t)、P_DA_dis(t)、SOC_DA(t)。到T+1日运行阶段,每个控制周期k,MPC获取当前量测值(实际光伏出力、实际负荷、储能SOC、联络线实际功率),更新未来4小时的光伏/负荷预测,然后求解自己窗口内的优化问题。
关于参考轨迹的时区对齐,我要多说一句:假如MPC在t时刻求解,它的窗口是[t, t+N-1],那么参考轨迹应该取日前计划中对应时段的值,而不是固定从一天的某个点开始。这个细节看似简单,但如果代码里不小心偏移了一个时段,MPC就永远在“追一个错位的影子”,偏差永远消不掉。我在实际项目里因为这个bug排查了一个下午,最终打印逐点的参考和实际值才定位到问题。
4.3 协同效果的评估指标
做完这个系统,怎么判断协同得好不好?我只用三个指标。一是联络线功率偏差的均方根误差(RMSE),这个越小说明跟踪越准。二是储能SOC轨迹偏差,即日内MPC实际SOC与日前计划SOC的平均偏差,如果这个值在5%以内,说明状态协同是到位的。三是全天运行经济性与日前计划预期成本的偏差率,这个允许有正偏差,因为预测误差终究要花钱弥补,但如果偏差太大,说明日前计划本身就不合理。
我有一次测试,在光伏预测误差约15%的情况下,只做日前优化(不跟踪)联络线RMSE高达80kW,加上日内MPC跟踪后降到约25kW。代价是运行成本比日前计划预期高了约6%,这是因为MPC为了跟踪计划而放弃了一些刚刚出现的临时套利机会。这个交换是值得的——对微网调度来说,稳定性和可预测性往往比那百分之几的“理论最优”更值钱。那6%的差额也并非纯损失,因为日前计划本身基于不确定预测,它算出来的“最优”本身就含水份。
5. 实操中的坑与排查经验
5.1 算例设计的坑
很多初学者在验证这类协同调度方案时,喜欢用一整天的真实历史数据跑一次,然后看结果。这个本身没错,但容易忽略两个陷阱。第一个是“用同一段预测去测另一段预测”——比如你用真实数据做日前优化,又用真实数据做日内MPC,相当于预测误差为零,那协同方案的优势自然看不出来。正确做法:日前优化用的预测数据要人为加噪声,日内MPC的滚动预测也应该用带误差的更新预测,才能模拟真实场景。
第二个陷阱是“数据分辨率不一致”。日前计划是15分钟一个点,日内MPC如果也是15分钟一个点,问题不大;但如果你把日内控制周期设为5分钟,就要把日前计划插值到5分钟尺度,不能直接采样。我遇到过直接用固定值填充一小时内的4个15分钟点,结果联络线功率出现阶梯状跳变,MPC为了跟踪这种阶梯反而导致高频抖动。最后我用线性插值平滑了参考轨迹,抖动才消失。
5.2 求解速度与求解精度的平衡
日前层是MILP,求解慢点无所谓;日内层是在线运行,必须在控制周期内出结果。我试过把日内MPC直接建模成MILP,包含充放电互斥的0-1变量,每15分钟求解一次,在通用求解器上大概要2-5秒,勉强能跑。但如果控制周期缩到5分钟,MILP求解时间就可能超时。我的处理方案是“递进松弛”:先用带0-1变量的MPC完整模型求解,如果超时,就把充放电互斥约束改为软约束,从MILP退化为LP,速度提升一个数量级,代价是理论上可能出现“同时充放电”的假象,但因为目标函数里充放电都有成本,实际上几乎不会触发。
另外可以通过减少整数变量数量来提速。比如把充放电互斥状态从“每步两个0-1变量”改为“每步一个0-1变量”(用1表示充电、0表示放电),变量数减半。再比如预测时域16步里,只有前半段需要精确整数规划,后半段可以用较宽松的MIP gap,或者把后半段的0-1变量固定为日前计划建议的状态,这样整数变量数量大幅下降。这个方法在工程里叫“时域分层整数松弛”,牺牲的全局最优性很小,但速度提升非常明显。
5.3 常见问题速查表
最后整理一个我项目里反复遇到的问题清单,列成表格,方便对照排查。
| 现象 | 可能原因 | 排查方向与解决建议 |
|---|---|---|
| MPC优化模型无解 | 约束冲突,SOC上下限与充放电功率约束不兼容 | 给功率平衡加松弛变量;检查SOC初值是否在上下限内;检查N步内SOC能否从初始值转移到目标值 |
| 联络线功率跟踪偏差一直很大 | 参考轨迹时区错位或预测更新未生效 | 打印逐时参考值与实际值对照;确认MPC窗口与参考轨迹时段对齐;确认每步重算的预测数据传入了求解器 |
| 储能SOC偏离日前计划越来越大 | 缺少SOC末端跟踪项,MPC只跟了功率没跟状态 | 在目标函数里加SOC轨迹偏差惩罚或末端SOC落点约束 |
| MPC控制指令高频抖动 | 参考轨迹不平滑、预测噪声过大、惩罚系数过强 | 用低通滤波或线性插值平滑参考轨迹;降低联络线偏差惩罚系数;适当增大控制周期 |
| 求解超时 | 整数变量太多、预测时域太长 | 缩短预测时域;MILP问题降级为LP;固定窗口后部时段的整数变量;设置求解时间上限 |
| 经济性比日前预期差很多 | 日前计划太激进(贴着边界跑),MPC没有调节余地 | 日前优化时加储耗惩罚让SOC轨迹平滑;联络线功率留5%-10%裕度;检查储能容量配置是否过小 |
这些坑我基本都踩过一遍,每一个背后都有实际调试时的故事。比如“SOC偏离越来越大”这个问题,当初真是费了很大劲才想明白——MPC只盯着功率偏差,它不会主动去纠正SOC累积误差,除非你把SOC轨迹也放进目标函数。想明白这个道理之后,协同方案的性能才真正稳定下来。
根据我个人的经验,做这类项目最重要的不是把数学公式搞得多么高深,而是要把两层优化之间的“物理语义”想清楚。日前优化和日内MPC不是两个独立的模块,而是一个闭环系统的两个时间尺度。日前计划不是教条,它是日内MPC的坐标系;日内MPC也不是推翻日前计划,而是在保持大局的前提下吸收新信息。如果领悟到这一层,模型改起来、参数调起来都会更有方向感。
最后再分享一个实用技巧:在部署这套系统之前,先用历史数据做离线回测,把日前优化和日内MPC串起来跑一遍,然后逐次画三张曲线对比图——日前计划值、日内MPC实际输出值、真实量测值,放在同一张图里。只要这三条曲线在关键时段基本重叠,系统离上线就不远了。如果某些曲线分叉严重,不要急着调参数,先回头检查衔接逻辑和数据流有没有bug,往往比调参更管用。这个技巧我每次做新项目都会用,省下的调试时间非常可观。
