做微网优化调度的朋友应该经常被问到一个问题:既然日内层已经上了MPC,日前优化是不是可以省掉?干脆在每个控制周期让MPC把未来24小时全算一遍不就行了?我第一次做带共享储能的项目时,也抱着这个想法交过一版“纯日内MPC”方案,后来被现场实际运行结果教育了一整轮,才老老实实把日前的“剧本”和日内的“临场修正”重新组合起来。
带着共享储能这个新变量去设计日前日内协同调度,和传统单微网储能调度不太一样。它不光是“预测误差大所以要滚动修正”这么简单,还牵扯到共享容量的分配、整条SOC参考轨迹的交接、以及两层优化各自边界怎么划。本文就把这套基于MPC的日前日内微网共享储能优化调度框架拆开讲清楚,重点聊聊我现在认为最值得注意的部分:日前优化和日内滚动MPC到底各管哪一段、交接点在哪、以及协同设计里容易踩的坑。适合正在做微网优化调度的研究者,也适合准备把MPC从仿真往工程落地的工程师参考。
1. 两阶段架构的逻辑:单靠MPC滚动为什么扛不住微网调度
1.1 离散决策和能量大账,是有限滚动窗口看不全的
先聊一个最常见也最反直觉的问题:为什么不能只用MPC,把预测时域直接拉满24小时,一滚到底?
MPC的本质是有限时域的滚动优化。它的正常工作方式是:在每个采样时刻获取最新状态,基于未来一段时间(通常几小时)的预测,解一个约束优化问题,只执行第一步,等下一个时刻再重新来。这种机制特别适合处理“预测会不断更新、系统存在扰动”的连续控制问题,但有几个先天短板。
第一个短板是离散决策。微网调度里的燃气轮机启停、储能充放电模式切换、联络线购售电状态选择,这些往往都需要0-1整数变量。要是把这些变量全都塞进MPC的滚动窗口里,每个周期都得解一个混合整数规划,实时性撑不住。更要命的是,像机组启停这种决策带有强时间耦合性:今天开机是为了满足晚上的高峰负荷,开机时刻必须提前很久确定。日内MPC只看未来两三个小时,根本不知道今晚负荷会冲到多高,它凭什么决定现在要不要启动机组?这种“跨时段大决策”必须在更长时间尺度上预先做好。
第二个短板是全天能量管理。储能SOC就是一个典型的全天耦合状态变量。假设一台共享储能的SOC现在只有30%,未来4小时光伏预测很好,日内MPC如果只看这4小时,很可能判断“没必要充电”,结果傍晚负荷高峰来时储能没电可放。但如果把时间尺度拉到全天,日前优化能看到晚间负荷和电价,就会在午间光伏大发时提前把储能充满。这类跨多个时段的能量搬运,本质上需要一个“全天视角”的优化来安排。
需要说明的是,有人会说“那我让MPC的预测时域等于24小时不就行了?”理论上可以,但一旦把预测时域拉到全天,MPC就退化成开环最优控制,丧失“每步根据实测状态修正”的核心价值。实际系统中,全天尺度的预测精度逐小时快速衰减,算出来的所谓“最优控制序列”到下午早就失真了。而且全天尺度MPC每个控制周期都要重新求解大规模MIP,在15分钟控制周期内很难保证收敛。
把这两个短板合在一起,结论就很清晰:日前优化负责“拍板”离散状态和全天能量分配,日内MPC负责“精调”连续出力和短期偏差修正。两阶段架构本质上是把时间尺度不一的决策问题拆成两层,各算各的,再通过参考轨迹衔接。
1.2 预测误差的累积方式,决定了闭环优化只能在短周期内工作
再来看为什么必须有日内反馈层。微网里的光伏、风电、负荷预测误差巨大,尤其在多云天气,光伏15分钟级预测误差可以达到装机容量的20%-30%。如果只有日前优化,把全天的计划定死,那就只能靠两个东西兜底:上级配电网的交换功率余量,以及燃气轮机的爬坡能力。这两种兜底手段在边界条件比较紧的时候根本不够用。
举一个很实际的数字例子。假设日前预测某天15:00光伏出力是100kW,实际的超短期预测在14:45更新为只有60kW,负荷预测没有变,那么15:00前后系统就少了40kW的供给。这条40kW的缺口怎么补?如果联络线功率日前已经顶到合同上限,燃气轮机爬坡率只有10kW/15min,储能SOC又只剩35%,那这个时段的功率不平衡就没法在15分钟内消掉,只能切负荷或者接受越限罚款。
但日内MPC不会等到15:00真正缺电才被动反应。它在14:45读取最新的光伏预测和实测SOC之后,会重新优化从15:00开始的未来预测时域内的控制序列,提前把燃气轮机出力加上去、安排储能提前放出部分电量,保证功率平衡约束在每个时段都满足。这个“提前量”就是反馈校正相对开环优化的核心优势。
这里也回答了很多初学者一个困惑:MPC是不是把所有预测误差都消掉了?不是。MPC只能消除“可预测到”的偏差,对15分钟内的真实随机波动无能为力,那部分要靠一次调频或下垂控制等更快的控制层处理。但微网调度层面能做的,是把分钟级到小时级的预测误差尽可能吸收掉,而不是把误差累积到越限才处理。这正是两层架构位置感的来源:日前做粗调,日内做细调,实时响应做微调。
1.3 共享储能给两阶段带来的额外必要性
如果储能是单微网自有的,前面说的两阶段必要性已经成立。现在把场景换成共享储能,问题会进一步复杂化,因为共享储能天然带“容量分配”维度。
共享储能的物理形态通常是一座集中式储能电站,服务周边多个台区、多个微网或多个用户。每个用户和储能运行方之间有租赁协议、容量合同、费用结算关系。一个用户的充放电行为会直接影响储能SOC,进而影响另一个用户在后续时段的可用电量。比如凌晨某A用户把储能充到80%,白天B用户想放电就没有多少裕量了。这种“资源占用”问题不可能等日内滚动时再临时博弈,因为它跨越全天,涉及多方利益,必须在日前阶段就做出明确的容量分配计划。
就算在单一微网内部署共享储能,同样存在类似问题。共享储能通常作为“公共资产”运行,不同时段可能服务不同性质的负荷(比如白天供商业负荷、晚间供居民负荷)。日前阶段要把这些不同负荷的储能使用时段和功率上限排好,日内MPC才能知道当前时段能调用储能到什么程度。如果共享储能的日前分配结果不清晰,日内MPC实际上没有明确的边界去优化。
另一个共享储能特有的约束是:电池的等效循环寿命和充放电深度、吞吐量直接相关。频繁深度充放会显著缩短寿命。日前优化可以在全天尺度约束储能的总吞吐量和SOC运行区间,避免日内MPC由于只看短窗口,为了省一点电费,在局部时段反复深度充放。这是一层非常需要“远视”的约束,而远视恰恰是日内短窗口MPC欠缺的。
| 对比维度 | 日前开环优化 | 日内滚动MPC |
|---|---|---|
| 时间尺度 | 全天,典型1h或15min分辨率 | 滚动窗口,典型2-4h预测时域,5-15min控制间隔 |
| 预测输入 | 日前短期预测(精度相对低) | 超短期/实时预测加实测状态(精度更高) |
| 主要决策对象 | 机组启停计划、购售电计划、共享储能容量分配、全天SOC轨迹 | 机组出力调整、储能充放电微调、参与响应的柔性负荷功率 |
| 是否存在反馈校正 | 否 | 是,每个控制周期更新状态 |
| 擅长处理的变量 | 0-1离散变量、全天跨时段能量约束 | 连续控制量、实时功率平衡修正 |
| 对预测误差的鲁棒性 | 弱,误差会直接累积为计划偏差 | 强,可在每步滚动中重新消差 |
这个表基本帮我回答了一个关键设计选择:两层之间不是二选一的关系,而是分工协作的关系。接下来分别把这两层的模型怎么建、目标怎么设讲透。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日前优化:排出共享储能全天能量轨迹和机组启停的剧本
2.1 日前优化在“算”什么
日前优化的输入是未来24小时的负荷预测、新能源出力预测、电价预测、机组参数、储能参数和共享储能租赁合同信息。它的输出是一组可以执行到日内MPC作为参考的调度计划。这里最关键的是要理解:日前优化的结果不是最终控制指令,而是给日内MPC的一组“参考线”和“边界”。
目标函数通常写为全天的总运行成本最小,核心项包括:燃料成本、机组启停成本、从上级电网购电成本(减去售电收益)、共享储能老化损耗成本、柔性负荷调节补偿。
用文本公式表示可以是:
code复制min Σ_t [
f_g(P_g(t)) + c_on·u_g(t)
+ p_buy(t)·P_buy(t)·Δt - p_sell(t)·P_sell(t)·Δt
+ K_ess·(P_ch(t)+P_dis(t))·Δt
]
这里有个细节值得展开:f_g(P_g) 通常是二次成本函数,在求解混合整数规划时一般会做分段线性化,用一组线性约束近似。做工程优化不是写论文,没必要为了“精确二次”牺牲求解速度,分段线性化在工程精度够用。
P_ch和P_dis分别表示储能充电功率和放电功率,K_ess 是储能的单位吞吐量老化成本。这部分在共享储能场景下更值得重视,因为电池是多方共用的,寿命损耗谁用谁承担,必须在目标函数里体现。K_ess的标定方法我在后面工程经验里会单独说。
约束条件包括:
- 功率平衡约束:任意时刻,光伏出力、风电出力、燃气轮机出力、储能放电功率、购电功率之和,等于负荷、储能充电功率、售电功率之和(严格说还要加上网损和柔性负荷调节量,但工程上常先忽略网损或按固定比例折算);
- 燃气轮机出力上下限和爬坡约束;
- 储能SOC递推约束和SOC上下限;
- 储能充放电互斥约束(同一时刻不能边充边放);
- 联络线交换功率上下限;
- 如果储能为多个用户服务,还需要加共享容量分配约束。
储能SOC递推是整个问题里最核心的动态约束:
code复制S(t+1) = S(t) + [η_c·P_ch(t) - P_dis(t)/η_d]·Δt / E_e
这里η_c是充电效率,η_d是放电效率。很多新手容易把放电效率乘在放电功率上,写成P_dis(t)·η_d,方向反了。放电功率的定义如果是储能输出到母线侧的功率,那么电池内部释放的能量是P_dis/η_d,SOC下降得更多。习惯上我把P_ch和P_dis都定义为母线上的功率,所以一个乘、一个除,物理意义才一致。
SOC上下限也不要直接写成0到1。从保护电池寿命角度,典型工程会限制在10%-90%甚至20%-90%。共享储能更要注意不能长时间把SOC压在边界上运行,因为一旦预测误差导致实际值越过边界,就没有任何调节裕量了。
2.2 共享储能的容量分配建模,不是把一台储能拆成几台那么简单的
如果只有一个微网,整台储能的SOC和功率就是全局变量,建模相对直接。但共享储能引入了一个“多用户+单物理设备”的问题。
假设一座储能电站容量为E_e、额定功率为P_rated,同时服务M个独立的负荷聚合体或微网用户。日前优化的自由度就多了一维:不仅要决定储能整体何时充放电,还要决定每个用户在某个时段可以使用多少储能功率、占用多少储能电量。
最简单的一种建模方式是引入“用户级充放电变量”P_ch,i(t)和P_dis,i(t),其中i是用户编号。约束条件如下:
- 用户级功率与储能总功率的耦合关系:
Σ_i P_ch,i(t) = P_ch(t),Σ_i P_dis,i(t) = P_dis(t) - 每用户单独的最大充放电功率(取决于其接入开关/线路容量):
0 ≤ P_ch,i(t) ≤ P_ch,i_max,0 ≤ P_dis,i(t) ≤ P_dis,i_max - 每个用户在调度周期内可用的总电量(租赁电量合同):
Σ_t [η_c·P_ch,i(t) - P_dis,i(t)/η_d]·Δt ≤ E_lease,i + M·(1-...)
这里最需要小心的是:物理储能SOC是全系统唯一的,但用户之间存在电量分配。一个用户把共享储能充满,意味着另一个用户实际占用的SOC空间变小了。如果只在优化模型里写“储能SOC递推”而不写“用户间可用电量分配约束”,结果很可能出现某用户在整个调度期几乎用不到储能的情况——从系统总成本看可能是最优的,但用户侧完全不答应,这种“最优”在共享场景根本不成立。
解决思路一般是引入“用户虚拟SOC”或者“每用户累计净充电量”约束,把共享储能的总能量按合同在用户间做时间上的解耦。比如约束每个用户在整个调度周期内的累计放电量不低于某个最低保障值,或者约束任意时刻每个用户已占用的储能容量不超过其租赁上限。
另一个共享储能典型问题是功率分配与结算。有的系统中储能功率费用和电量费用分开计,用户在高峰时段需要大功率支撑,需要在日前为高峰时段预留足够功率容量。这种“功率预留”同样是一个跨时段约束,会直接影响日前优化结果中的储能功率分配。实际项目中,共享储能运营方往往给出的是“容量包+功率包”两维套餐,日前优化要做的是在总功率和总容量约束下,把套餐切分到各个时段和各用户。这比单纯的“单微网储能充放电计划”复杂不少。
2.3 日前优化要为日内MPC预留执行裕度
很多刚开始做两阶段调度的同学容易在这里犯一个方向性错误:把日前优化当成一个“精确计划”,恨不得让储能SOC轨迹贴着上下边界走、联络线功率贴着上限走,觉得这样才叫“充分利用资源”。但问题是,日前优化用的预测和日内实际运行时的预测差异很大。如果日前把边界全部用死,日内MPC就完全没有调整空间了。
我的经验是,日前优化阶段就必须为日内留裕度,具体做法有三类。
第一类是约束层面的裕度:日前优化时不给储能SOC设10%-90%的宽边界,而是设一个更紧的“运行带”,比如20%-80%,留出两端各10%作为日内应急区。这样日内MPC在遇到突发功率缺额时,至少还有更深一层的SOC可调用空间。
第二类是目标层面的裕度:在日前优化目标里显式加入对“日内可调能力”的度量。最简单的方式是把联络线功率的目标值限制在其物理上限的90%以内,或者把联络线功率的超出部分设为高惩罚项,这样日前不会轻易把联络线申请到满。
第三类是参考值层面的裕度:日前优化输出的联络线
