基于MPC的混合储能微电网双层能量管理及仿真实现
我在做微电网能量管理的时候遇到过这样一个实际问题光伏板被一片云挡住几十秒内出力掉了一半这时候锂电池需要立刻顶上。可锂电池这东西不是水龙头频繁大功率地充放几个月容量衰减会快到让人肉疼。换超级电容来扛高频冲击呢它的容量又撑不起长时间的能量缺额。于是混合储能几乎成了必然选择——锂电池负责能量超级电容负责功率。但两种储能往同一个微电网里一放怎么给它们分工、怎么让两套设备协同出力就变成了一件远比想象中麻烦的事。这篇博文要聊的就是基于模型预测算法也就是常说的 MPCModel Predictive Control的混合储能微电网双层能量管理系统我会把整体架构、MPC 的核心逻辑、Matlab 侧的代码实现思路以及我在调参和仿真过程中踩过的坑全部摊开来写。内容适用于正在做微电网方向课题的研究生、刚入行储能系统设计/仿真工程师以及想在 Matlab 里快速搭一套能量管理原型的人。我不会只丢一堆公式和框图而是尽量讲清楚每一步为什么要这么干。1. 混合储能为什么跑不掉锂电池和超级电容的分工逻辑在正式聊算法之前我先把混合储能存在的必要性说透。因为很多时候代码写不出来不是算法多难而是对系统里为什么要有这两样东西理解不到位导致目标函数都不知道该怎么设。1.1 两种储能从物理特性上就注定要配合锂电池的能量密度高能长时间稳定地充放电适合处理分钟级到小时级的功率波动比如早晚负荷爬坡、光伏日内出力变化。但锂电池对高频次、大幅度充放电特别敏感每一次大功率冲击都在消耗循环寿命。超级电容恰恰相反功率密度高、响应速度快能承受极高的充放电倍率寿命循环次数能达到几十万次。但它储的能量少放个几十秒到几分钟就没电了根本扛不起长时段的功率缺口。这两者放在一起做一个混合储能系统本质是低频分量给电池高频分量给电容。这个分工不是人为拍脑袋定的而是由两种介质本身的物理特性决定的。理解了这一层后面所有控制策略的出发点就清晰了所有算法的目标其实都是在两个电源之间找到最合理的动态分工边界。1.2 单靠一种储能微电网会在实际运行中很难受我做仿真时最初试过只用锂电池扛全部波动的方案结果特别典型平抑效果确实做到了但电池的充放电切换频率非常高一天下来功率曲线像锯齿一样来回跳电池频繁在充放之间转换长期运行必然加速老化。反过来只用超级电容光伏出力波动稍微大一点电容的 SOC 十几分钟就见底之后系统就没有任何余量去应对下一波冲击。现实中的微电网还往往处在并网和离网两种运行状态下并网时靠大电网兜底离网时母线电压和频率全部要靠自己撑。这种情况下一个有能量但脾气急不得的锂电池、配上一个反应快但肚量小的超级电容才能既稳住能量平衡又压住电压瞬变。这里插一句混合储能系统的混合不仅仅是硬件层面的电池加电容更关键的是控制逻辑要能把功率分频做好。我在后面章节会详细讲这个分频动作在双层架构里其实是落在下层控制中的。特性维度锂电池超级电容能量密度高低功率密度低高响应速度秒级毫秒级循环寿命千次至万次级十万至百万次级适合处理的波动低频、长时高频、短时单位容量成本适中较高2. 双层能量管理架构拆解上层定策略下层做协调如果只做一套能量管理系统把光伏预测、负荷预测、储能 SOC、并网功率全部塞进一个优化问题里能不能跑能跑但效果通常很差。原因很朴素不同的控制目标时间尺度完全不同硬塞进同一个问题会让求解器顾此失彼。2.1 为什么非要用双层而不是单层微电网能量管理里有两类核心任务一是该让微电网和大电网交换多少功率、锂电池总体出力该是多少这类任务变化慢决策周期在分钟级以上主要考虑经济性和 SOC 规划的合理性二是超级电容该怎样实时分担波动分量、电压波动怎么被快速压下去这类任务变化极快响应要求到秒级甚至毫秒级。把它们放一起处理优化变量的时间尺度跨越太大。MPC 的预测时域如果拉长到能看清楚经济调度的变化采样周期就慢了响应不了瞬态波动如果缩短采样周期去追求快速响应又看不到足够长的未来趋势整体策略就会变得短视。干脆拆成两层上层做慢时间尺度的决策下层做快时间尺度的跟踪与分配中间通过接口信号串联起来。2.2 上层预测与调度决策上层是策略大脑。它接收光伏出力预测序列、负荷预测序列、当前各类储能 SOC 和电池可出力范围等状态然后在优化窗口内求解一组控制指令确定未来一段时间内微电网与大电网交换功率的参考值以及锂电池组的总出力参考。这一层常见做法是用 MPC 做滚动调度也可以退一步用日前优化加实时修正但 MPC 的优势在于每滚一步就把最新的预测误差和 SOC 状态重新带入天然适合处理光伏和负荷预测不准确的问题。在这一层目标函数通常包含经济性成本比如向大电网购电的电价、锂电池出力波动惩罚为了延寿、以及 SOC 越限惩罚。2.3 下层功率分频与实时跟踪下层就是执行肌肉。它拿到上层给出的总功率参考之后要在极短的控制周期内做两件事第一把总功率按频谱分解低频分量给锂电池高频分量给超级电容第二输出最终 PWM/电流指令给储能变流器让实际出力跟随参考值。最经典的下层分频工具就是一阶低通滤波器超级电容支路分担高通分量锂电池支路分担低频分量。但这个滤波器需要加一个关键修正当超级电容 SOC 接近上限或下限时不能继续让它硬扛高频分量否则电容会过充或过放。这时候要适当把一部分高频分量强行转移给锂电池或者通过反向充电让超级电容回到安全区间——这个逻辑我在第五章会展开讲。为了更直观我这里用一个简单时序说明两层之间的关系上层在k时刻读取预测数据计算出[k, kNp]步的锂电池参考功率序列P_bat_ref下层在每一个采样周期内基于P_bat_ref和实测母线功率偏差计算超级电容的实时补偿指令电池变流器跟踪慢变的功率指令电容变流器处理瞬变偏差。这样拆完以后系统的控制逻辑变得非常清爽上层不用管毫秒级波动下层不用操心电价和 SOC 规划各干各的活。3. 模型预测控制的核心机制从看一步到看 N 步这一章说说 MPC 本身。很多初学者第一次看 MPC 觉得玄乎其实把它拆成模型、滚动、优化、反馈四个词就清楚了。我尽量不用教材语言用我们写代码时的思路来讲。3.1 MPC 到底在算什么MPC 做的事情翻译成大白话就是在每一个控制时刻基于被控对象的数学模型预测未来一小段时间内的系统状态然后在这个预测窗口内求解一个带约束的优化问题得到一串未来的控制指令。但只执行第一个指令到下一个时刻重新预测、重新求解。这个过程很像你开车时不光盯着车头前那一米的路而是提前看前方几百米的路线然后不断微调方向盘。普通的 PID 是现在偏了我纠偏MPC 是未来要偏我现在就开始提前准备。在后者的思路里预测模型的质量决定了控制效果的上限。3.2 预测模型怎么建从储能 SOC 说起预测模型是 MPC 的地基。对储能系统而言最简单的预测模型就是 SOC 的离散状态递推式SOC(k1) SOC(k) - η * Δt * P(k) / E_rated其中η是充放电效率Δt是采样周期P(k)是该时刻的储能功率E_rated是额定容量。正功率表示放电负功率表示充电。这个式子虽然简单却抓住了储能系统最核心的动态特性功率对 SOC 的积分累积关系。在双层系统里上层 MPC 会同时把锂电池和超级电容的 SOC 递推式都放进预测模型配上微电网内部的功率平衡约束P_pv(k) P_bat(k) P_sc(k) P_grid(k) P_load(k)这样MPC 在看未来的时候就不是瞎猜了而是一边推算 SOC 怎么变一边算出哪一组控制指令能让整个系统在未来依然保持平衡。3.3 目标函数与约束MPC 的精髓在于带着镣铐跳舞MPC 最值得吹的点不是能预测未来而是能在预测未来时把约束直接塞进优化问题里。对储能系统来说这些约束相当关键锂电池功率上下限P_bat_min ≤ P_bat(k) ≤ P_bat_max超级电容功率上下限P_sc_min ≤ P_sc(k) ≤ P_sc_maxSOC 运行范围约束SOC_min ≤ SOC(k) ≤ SOC_max与大电网交换功率约束P_grid_min ≤ P_grid(k) ≤ P_grid_max目标函数结构大致是三项加权之和功率跟踪误差的平方项、SOC 偏离期望值的惩罚项、以及出力波动抑制项。写成数学形式大概是min J sum( w1 * (P_total(k) - P_ref(k))^2 w2 * (SOC(k) - SOC_target)^2 w3 * (P_bat(k) - P_bat(k-1))^2 )w1、w2、w3三个权重系数决定系统更偏向哪一头。权重调大某一项系统就会优先满足对应的目标。这直接导致了我在第五章想讲的第一个坑权重调不好MPC 面板上什么都是对的但系统实际运行时该抖还是抖。3.4 和规则控制/PID 的对比为什么研究阶段要选 MPC我在早期也试过用低通滤波加规则判断来做能量分配比如超级电容 SOC 高于 50% 就让它多出力低就切回来给电池实现非常简单在工况不复杂的仿真里也能跑出还不错的结果。可一旦光伏波动变剧烈或者负荷突变规则库会迅速膨胀而且每个规则之间的优先级冲突很难理清。MPC 则把所有控制目标统一到一个优化问题里靠约束和权重的几何关系自动协调。预测不准的时候滚动优化还会不断用新的测量值修正——这是我个人认为 MPC 在微电网能量管理领域最不可替代的价值。代价就是计算量比规则控制大得多实时性要求高的时候需要做大量简化比如短预测时域、线性化模型、甚至用显式 MPC 离线查表。4. Matlab 代码实现一套能复现的双层 MPC 方案下面进入正题怎么在 Matlab 里把前面说的这套东西落成代码。我会给一个主线版的实现思路而不是贴一个几百行的完整工程。因为不同microgrid拓扑的参数差异太大直接抄代码的意义有限但框架和关键函数是通用的。4.1 环境准备与仿真实体的搭建我用的环境是 MATLAB R2023a安装了 Optimization Toolbox 和 Simulink。纯脚本仿真其实用不到 Simulink只需要 Optimization Toolbox 里的quadprog或者fmincon就能把 MPC 的优化问题解出来。如果有 YALMIP 工具箱会更省事LMI 和二次规划都能直接建模但对新手来说 YALMIP 加一层抽象有时候反而分不清自己在解什么所以我下面以quadprog为主线。首先构造一个仿真循环需要的时域数据。光伏出力和负荷曲线我建议不要一开始就用真实数据先用一条带阶跃的光伏曲线和一条平滑的负荷曲线方便观察控制效果Ts 1; % 采样周期 1s N_sim 3600; % 仿真 1 小时 t (0:N_sim-1) * Ts; P_pv 100 50 * sin(2*pi*t/600) 30 * (rand(1,N_sim)-0.5); % 带波动的光伏出力 P_load 150 30 * sin(2*pi*t/300 0.5); % 带波动的负荷这样构造出来的数据能明显看到高低频分量后期验证分频逻辑非常直观。光伏和负荷模型加完再搭两个储能单元% 锂电池 E_bat 50; % kWh P_bat_max 30; % kW SOC_bat_min 0.2; SOC_bat_max 0.9; SOC_bat_0 0.6; % 超级电容 E_sc 2; % kWh P_sc_max 20; % kW SOC_sc_min 0.1; SOC_sc_max 0.95; SOC_sc_0 0.5;注意锂电池和超级电容的容量差了 25 倍这个比例是有意的模拟真实场景里电池管能量、电容管功率的工程配置。4.2 上层 MPC 的滚动优化主循环上层 MPC 的代码核心是一个 for 循环从当前时刻k采样最新的状态与预测数据调用quadprog求解未来Np步的锂电池参考功率。Np 20; % 预测时域 Nc 5; % 控制时域 for k 1:N_sim-Np % 从全局变量取当前状态 SOC_bat_k SOC_bat_history(k); % 构造优化问题变量为未来Nc步的P_bat和P_sc % 目标函数写成标准二次型 0.5 * x*H*x f*x H_blk ... % 由权重w1/w2/w3生成 f_blk ... % 由参考功率、SOC期望生成 % 线性等式约束功率平衡 Aeq ...; beq ...; % 不等式约束功率上下限和SOC上下限 A ...; b ...; % 边界 lb ...; ub ...; options optimoptions(quadprog,Display,off); [u_opt, ~] quadprog(H_blk, f_blk, A, b, Aeq, beq, lb, ub, [], options); % 只取第一步控制量 P_bat_ref(k) u_opt(1); P_sc_ref(k) u_opt(Nc1); % 如果P_sc也参与优化 end这套代码的逻辑就是每次算一遍未来但只往前动一步。这里有一个特别重要的细节上一时刻已经执行的控制量必须作为当前时刻优化问题的初始状态传入否则滚动优化就没有记忆目标函数里的波动抑制项和 SOC 状态约束会失去意义。很多入门代码跑出来控制效果抖得厉害十有八九是这个初始状态没传对。4.3 下层功率分配一阶低通滤波加 SOC 修正下层控制要把上层给出的总功率参考拆成两部分。我常用的做法是先对总功率做一阶低通滤波低频分量给电池残差高通分量给超级电容alpha Ts / (T_f Ts); % 低通滤波系数T_f为滤波时间常数 P_bat_lpf(k) alpha * P_total_ref(k) (1-alpha) * P_bat_lpf(k-1); P_sc_hpf(k) P_total_ref(k) - P_bat_lpf(k);但直接这么滤波有一个致命问题超级电容的 SOC 会在某个方向上持续漂移。比如光伏连续波动电容总是处理正的高频功率它的 SOC 会慢慢偏离初始值。所以必须加一个 SOC 回归修正项if SOC_sc(k) 0.85 P_sc_limit -P_sc_max * 0.3; % 强制电容先放电归位 elseif SOC_sc(k) 0.2 P_sc_limit P_sc_max * 0.3; else P_sc_limit 0; end P_sc_cmd(k) P_sc_hpf(k) P_sc_limit;这个归位的幅度要设得很温和不能一次把电容功率指令顶到限幅值否则又会引起新的突变。我实际调试中的经验是当 SOC 接近边界时用系数缓慢分配功率而不是硬切换母线电压的冲击会小很多。4.4 代码里容易忽略的系统级细节写 Matlab 代码时有一个细节建议你从一开始就规范起来把仿真环境、控制器、执行器分文件写环境脚本只负责生成P_pv、P_load和储能参数控制器文件只负责输入状态、输出指令主脚本跑循环存历史曲线。这样后期换预测模型、换目标函数权重时不需要整个工程推倒重来。另一个容易被忽略的地方是数值单位。我在一个项目里吃过亏SOC 习惯用百分数功率用 kW结果目标函数里SOC和P的数量级差了 100 倍。MPC 的权重如果没做归一化求解器会把数值大的项优先满足SOC 项等于被忽略了。正确做法是先归一化比如把 SOC 变成 0 到 1 的标幺值功率按各自额定值标幺再定权重这样调参才是可控的。5. 仿真调参中容易踩的坑完整排查链路这一章把我实际调试中遇到的最典型的几个问题列出来附带我的排查思路和最终解决办法。每一个坑我都踩过不止一次写出来算是给大家省点时间。5.1 预测时域 Np 和控制时域 Nc 怎么选先说结论不知道取多少时Np20、Nc5 是默认起点。Np 太短MPC 看不到光伏出力的趋势变化控制动作会偏向短视Np 太长一方面计算量增长很快另一方面远期的预测误差太大反而会带偏当前的决策。我调试过的功率跟踪场景里Np 从 5 加到 20系统超调量明显下降再往上加到 40效果几乎没变但单步求解时间从 20 毫秒涨到 80 毫秒。实时性要求高的场合这个代价不划算。Nc 通常取 Np 的四分之一左右即可保留后面几步不控制不会对跟踪效果有实质损害但能显著减少优化变量数量。5.2 硬约束导致无解把 SOC 边界改成软约束跑步仿真时遇到过特别经典的情况MPC 求解直接返回空解检查日志发现电池 SOC 在上一个时刻已经压到了下限。因为我把 SOC 上下限写成硬约束了一旦 SOC 越界优化问题就变成无解——但你物理系统明明还在运行。解决办法是把 SOC 约束从硬约束改成软约束。具体做法是在目标函数里加一个 SOC 越限惩罚项越限越深惩罚越大而不是直接从不等式约束里砍掉可行域。用quadprog实现时可以在目标函数里加二次惩罚项把 SOC 拉回目标区间。这样做以后极端工况下系统输出会偏离最优但不出错控制动作也平顺得多。5.3 权重系数调了几十轮还是抖权重调参是所有 MPC 项目里最费时间的一步。我自己的排查链路是这样的先固定 w1 为 1看功率跟踪效果如果跟踪没问题但 SOC 波动大加大 w2如果电池功率还是来回跳加大 w3 抑制波动重复几次直到系统在各种工况下都能接受。这里有一个容易被忽视的点权重不是越大越好。w3 如果太大电池出力被过度懒化所有该电池扛的低频分量也会堆到电容头上电容反而先爆容限。要观察的是一个平衡点我通常在功率跟踪误差和电池出力变化率之间画一条权衡曲线取拐点附近的值。5.4 超级电容 SOC 漂移分频之后还需要能量回补这是混合储能系统里最容易出现、也最容易被忽视的问题。低通滤波天然会把高频功率分给电容但现实中的高频功率往往是单方向的比如光伏持续被云层遮挡功率反复下跌再回升电容净能量会逐渐归零。我最后的处理方案是在滤波环节之后加一层电容 SOC 的慢速能量回补回路用 PI 控制把电容 SOC 拉回目标值回补功率不超过电容额定功率的 10%。这样一来分频特性仍然保留但电容的长期能量平衡被保证了。注意回补回路的时间常数要设得很大至少要几分钟级别否则会把低频能量又引回电容破坏分频的初衷。5.5 表格常见异常现象的快速定位异常现象可能原因排查方向MPC 返回无解SOC 硬约束越限改为软约束加越限惩罚电池功率抖动剧烈初始状态未正确传入优化器检查滚动初始化逻辑超级电容 SOC 持续漂移分频后缺少能量回补加入慢速 SOC 回补回路跟踪误差大但 SOC 正常w1 权重偏低增大功率跟踪项权重求解时间过长Np/Nc 过大缩短预测时域、变量离散化母线电压波动大下层响应太慢缩短下层采样周期6. 这套双层 MPC 还能往哪些方向走写到这里系统的主干已经完整。但干这行的人都清楚能量管理系统很少停在仿真能跑这一步总有各种新需求把系统往更复杂的方向推。我做过的延展方向里有几个效果不错列出来供你参考。6.1 预测模块升级前端的 BILSTM / 神经网络预测接入MPC 的效果上限由预测精度决定这一点怎么强调都不过分。我最早用随机波动的伪预测数据跑仿真控制效果自然漂亮但一接入真实光伏数据就露馅了——预测误差一大MPC 的提前规划就失去了依据。后来我把上层 MPC 的前端预测模块换成了基于历史气象数据的神经网络回归模型比如用 双向 LSTM 做光伏出力预测再把预测序列作为 MPC 的输入。整体结构不用动只需要把P_pv_pred这一个数组的来源替换掉。实际效果是当预测误差明显时MPC 的控制方差比原来规则控制低得多但要想让它不抖还是需要配合反馈校正别指望预测模型单方面神准。6.2 与深度强化学习DRL结合上层策略让算法去学MPC 需要模型模型不准时优化结果的可靠度就要打折扣。我研究过用深度强化学习做上层调度让 agent 直接学习电价序列下的锂电池最优出力策略。有些文献用的是 DQN、PPO 等算法一旦训练完成在线推理速度很快很适合做实时调度。但纯粹端到端 DRL 在仿真里跑光鲜落地时并不让人放心因为智能体在训练中没见过的极端工况决策不可解释。所以我现在更倾向 DRL 与 MPC 的混合架构DRL 在慢时间尺度选择运行模式或电价应对策略MPC 在快循环里负责精确执行。从效果来看经济性接近纯优化但鲁棒性比纯学习好不少。6.3 并离网切换的自适应控制实际微电网系统最怕的就是并网状态切换到离网状态的那一瞬间大电网突然不给支撑了母线电压和频率在几十毫秒内就可能跌出允许范围。MPC 在设计目标函数时如果只有经济性最优切换发生时会因为策略没有切换机制而出大问题。我的处理办法是预先定义两种模式的目标函数模板并网模式下 w1并网功率跟踪权重较高离网模式下瞬时功率平衡项和电压支撑项的优先级拉高。通过一个状态机监测大电网连接状态一旦切换到离网模式就会在下一个 MPC 周期自动换用离网模板。这种分层策略与 MPC 本身的滚动优化结构非常契合因为模型参数可以保持不变变的主要是目标函数与约束边界。6.4 从纯 Matlab 脚本到硬件在环仿真如果下一步要往工程走纯脚本仿真的说服力不够我建议至少把控制器部署到 Simulink 里接一个实时仿真机或者用支持代码生成的方式做一次硬件在环测试。MPC 在硬件上的主要挑战还是计算延迟因为每次要解一个带约束的二次规划在低成本控制器上不一定能在采样周期内算完。可行的简化路径有两个一是把 MPC 的可行域提前离线划分成多个区域在线只做区域查找和查表得到控制量也就是显式 MPC二是把预测时域缩短到 Np10 以内配合代码生成工具做定点化处理。这两个方案的共同思路都是一样的把能离线准备的东西尽量离线准备在线侧只做最快的实时计算。我在实际项目里做硬件在环测试时最大的体会是仿真里看起来再漂亮的控制曲线到了硬件平台上都会因为通讯延迟、传感器噪声、PWM 量化精度而打折。所以做这一块时一定要在仿真早期就把延迟和噪声因素建模进去别等上了硬件平台再返工重构。我自己从头到尾搭完这套系统最大的感受是模型预测控制不是一个算法而是一整套工程框架。你花在调权重、处理约束边界、修 SOC 漂移上的时间往往比搭模型的时间还长。但它的价值恰恰就在这里——当预测有误差、约束被触到边界、运行状态在切换的时候MPC 的滚动优化机制天然会把你拉回安全可控的轨道上。如果你正准备入坑这个方向我建议的路线是先把不带约束的滚动优化跑通再逐步加约束、加分层、接入真实数据和真实预测模型。每一步都确保这一层的现象我能解释再往下一层走。模型预测控制在混合储能微电网里的价值不在于算法本身门槛多高而在于你是否愿意把系统建模做细、把边界条件想清楚——这在任何微电网工程里才是真正决定系统能不能落地的关键。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →