资讯动态

虚拟储能+楼宇微网优化调度:Matlab实现峰谷套利与负荷削峰

发布时间:2026/10/16 10:52:56 来源:尧图企业网站定制
上一阶段帮某园区做楼宇能量管理优化需求很明确不额外加电池却要把光伏、空调和电网购电配合起来实现峰谷套利与负荷削峰。最终落地的方案是一套融合需求侧虚拟储能系统的楼宇微网优化调度模型全部在Matlab里完成建模与求解。这篇文章把从需求拆解、物理建模到代码实现的完整过程复盘一遍给准备入局虚拟储能和微网调度方向的朋友一个可参考的模板。这类项目的核心价值不在于代码本身而在于“看懂楼宇的热惯性”。很多做微网调度的人喜欢堆电池、堆模型却忽略了一个事实楼宇墙体和室内空气本身就是一块天然的储能介质。空调在电价低谷时多出力把楼宇“预冷”到舒适区下限电价高峰时少出力甚至停机让楼宇温度缓慢回升但仍然不越过舒适上限。这个过程在用户几乎无感知的情况下完成了能量转移效果上等效于一台虚拟电池在充放电。整套方案我按“物理建模—优化建模—Matlab实现—调试复盘”四层展开每一步都给出可以直接抄作业的公式、参数和代码同时把踩过的坑也一并整理了。1. 项目思路拆解虚拟储能凭什么替代电池1.1 楼宇微网里的“储能”要换一种理解方式传统微网里的储能默认是电化学电池有额定的功率上限、容量上限、SOC状态充电时吸收功率放电时释放功率。楼宇微网要配这样一台电池动辄几十万投资还有寿命衰减、消防验收、占地空间一堆麻烦。需求侧虚拟储能则完全是另一条路——它不新增任何硬件而是把楼宇中具有柔性调节能力的负荷比如中央空调、新风机组、电热水器、电梯回馈装置通过优化算法统一调度让这些负荷在时间轴上“灵活移动”。空调提前多制冷一会儿室内温度降低相当于把电能转化成了“冷量”储存在墙体、家具和空气里后面少运行一段时间温度慢慢回升相当于释放了这部分“冷量”。对电网来说这跟电池充放电没有本质区别都是在低谷吸收能量在高峰少吸收能量。这个视角转换非常关键。传统调度是“电源跟随负荷”光伏出力大就多用电光伏出力小就少用电负荷是被动的。引入虚拟储能之后负荷变成了部分主动的——空调可以主动移动用电时段。微网调度自由度增大购电曲线也就有了优化的空间。1.2 系统架构和调度对象这套方案面向的是典型的办公型楼宇微网主要设备包括屋顶光伏阵列出力随天气波动是主要的本地可再生能源单母线配电系统连接电网关口、光伏逆变器和各类负荷基础负荷指照明、插座、电梯等这部分不可调节只能作为刚性需求暖通空调系统通常是多联机或集中式中央空调是虚拟储能的核心载体能量管理系统运行本文介绍的优化调度算法下发空调功率设定值到楼宇自控系统。楼宇级微网和大型园区微网的区别在于楼宇的负荷规模小动辄几百千瓦但空调占比高尤其夏季空调负荷可以占到总负荷的40%甚至更高。所以楼宇场景天然适合做需求侧虚拟储能。而且办公室人员对温度的敏感度相对宽容舒适区间可以放宽到24℃~27℃这就提供了可观的温度调节空间。1.3 为什么不直接配一台物理电池这里并不是说物理电池不好。电池响应速度快、控制精度高如果需求是黑启动、无缝并离网切换那肯定要靠电池。但如果目标是经济性削峰填谷虚拟储能的性价比非常突出。对比一下维度物理电池储能需求侧虚拟储能初始投资高含设备与施工几乎为零复用现有空调运维成本电池衰减、更换、温控仅需调整控制策略容量来源电芯堆叠楼宇热容与舒适度区间响应速度毫秒级分钟级适合小时级调度环保与安全电池退役、热失控风险无额外风险控制难点BMS与PCS协同热参数辨识与舒适度保障当然虚拟储能的短板也明显受室内温度约束不能无限制放电依赖楼宇的使用规律夜间无人时段效果差如果楼宇保温很差热惯性很小容量也会缩水。所以业内更多把它看成“配合电池使用的一层灵活性”而不是完全替代。我实测下来对普通办公楼的夏季空调负荷只要楼宇墙体保温合格舒适区间放宽3℃虚拟储能的等效容量就能达到数百千瓦时而且这个容量“免费”。对于追求低成本需求响应的用户这几乎是最优解。2. 优化调度模型建立目标、约束与机理2.1 楼宇热动态模型虚拟储能的核心方程虚拟储能建模的基础是一阶等效热参数模型也叫ETP模型。它的物理图像很简单把整个楼宇看成一个热容节点室内空气和墙体混合在一起具有统一温度楼宇围护结构看成一个热阻室外热量通过热阻向室内传导。写成差分方程[ T_{in}(k1) T_{in}(k) \frac{\Delta t}{C_{th}} \left[ \frac{T_{out}(k) - T_{in}(k)}{R_{th}} - \eta_{ac} P_{ac}(k) \right] ]其中(T_{in}(k))、(T_{out}(k))室内外温度单位℃(C_{th})楼宇等效热容单位kWh/℃代表墙体、空气蓄热能力(R_{th})围护结构等效热阻单位℃/kW阻力越大室内温度受室外影响越小(\eta_{ac})空调能效比COP也就是每消耗1kWh电产生多少kWh冷量(P_{ac}(k))空调电功率kW(\Delta t)调度步长单位h通常取1h或15min。这个方程是整篇优化的“物理底子”。它可以这样理解房间温度的变化等于室外入侵的热量减去空调抽走的热量再除以楼宇的热容量。热惯性越大温度变化越慢虚拟储能可用的“缓冲时间”越长。很多初学者会困惑不是说虚拟储能吗为什么没有SOC变量实际上室内温度本身就是虚拟储能的状态量。如果把舒适区间定义为 (T_{min}) 到 (T_{max})那么室温柔和地从中点移到下限等价于储能“充电”从下限回升到上限等价于“放电”。你要是愿意可以定义[ SOC_{VES}(k) \frac{T_{in}(k) - T_{min}}{T_{max} - T_{min}} ]SOC越高表示房间越接近下限、储存的冷量越多。不过在优化模型中SOC只是室内温度的线性映射真正参与约束的仍然是温度本身。理解了这一点后面看代码就不会绕弯。2.2 目标函数经济性才是虚拟储能的驱动力优化调度的目标我选了运行成本最小化这也是工程落地最关心的问题。表达式如下[ \min \quad \sum_{k1}^{T} P_{buy}(k) \cdot price(k) \lambda \sum_{k1}^{T-1} | P_{ac}(k1) - P_{ac}(k) | ]第一项是向电网购电的费用电网分时电价 (price(k)) 是外部信号是虚拟储能“套利”的驱动力。峰谷价差越大系统越有动机在低谷多用电蓄冷、高峰少用电释放冷量。如果孤立地看空调本身不挣钱但它让购电时段的分布变得更有利整体电费下降。第二项是空调功率变化惩罚项用来抑制空调出力的频繁波动。这个项很重要实际工程里如果不加优化解往往是一会儿满负荷一会儿停机的“开关机式”运行不仅对压缩机和电网都不友好也让人不敢把结果下发给现场设备。(\lambda) 是一个权重系数我通常在0.1到1之间取值具体看峰谷价差和空调功率基数。注意 (\lambda) 不能太大太大就牺牲了削峰填谷的自由度太小又起不到平滑作用。如果你所在地区有绿电消纳考核还可以在目标中追加弃光惩罚项。对纯经济性项目来说保持购电成本这一项最简洁也最容易向业主解释。2.3 约束条件没有这些约束结果就会失控优化模型除了热动态方程还需要一组运行约束才能“落得下去”。逐条列出功率平衡约束(P_{buy}(k) P_{pv}(k) P_{base}(k) P_{ac}(k))。光伏出力作为负负荷处理购电功率为关口计量值温度舒适度约束(T_{min} \le T_{in}(k) \le T_{max})。这是虚拟储能的“容量边界”也是保护用户体验的硬底线空调功率限幅(0 \le P_{ac}(k) \le P_{ac,max})。对应空调设备的额定功率购电功率限幅(0 \le P_{buy}(k) \le P_{grid,max})如果允许余电上网也可以放开下限但本项目不做逆功率倒送初始温度约束(T_{in}(1) T_0)由实测室内温度给定终端温漂约束一天调度结束后希望室内温度能回到一个允许范围防止优化算法在最后一小时拼命放冷把终态搞得很离谱。可以加 (T_{in}(T)) 与 (T_0) 之差小于某阈值的约束或者干脆在滚动优化里处理。这套约束下来整个模型是一个线性规划。变量总共有三组(P_{buy})、(P_{ac})、(T_{in})各24个按小时调度规模极小Gurobi求解时间在秒级。如果后续要放大到多楼宇、多设备加入设备启停变量就会变成混合整数线性规划但核心结构与这里一致。3. Matlab代码实现全流程解析3.1 参数初始化与模型简化Matlab环境下我用的工具是Yalmip加Gurobi。Yalmip提供了非常自然的建模语法可以让人把精力集中在优化问题上而不是纠结求解器接口。Gurobi是商业求解器教育版免费如果没装也可以用CBC开源求解器凑合不过大规模整数规划建议还是上Gurobi。参数设置来自某园区综合办公楼的实际数据简化。楼宇空调额定功率100kW基础负荷在60~100kW之间波动光伏装机60kW。热参数我按常规办公楼的围护结构水平取热容(C80) kWh/℃热阻(R2) ℃/kW空调COP取3。室内舒适区间24~27℃初始室温26℃。分时电价取峰谷三段价峰时1.2元/kWh、平时0.8元/kWh、谷时0.4元/kWh。这些参数看着简单却是整个模型能不能“算得动”的关键。尤其是热容和热阻直接决定虚拟储能容量的估计是否靠谱。如果楼宇没有设计资料我建议做一次现场实测把空调全开一段时间记录室内温度下降曲线再关掉空调记录温度回升曲线。用这两条曲线拟合出一阶模型的(C)和(R)比任何理论估算都可靠。3.2 Yalmip建模变量、约束与求解器配置以下是核心代码保留了最简可运行的结构%% 基础数据 T 24; % 调度周期单位h dt 1; % 时间步长单位h Cth 80; % 楼宇热容kWh/℃ Rth 2; % 围护结构热阻℃/kW COP 3; % 空调能效比 T_min 24; T_max 27; % 舒适区下限/上限℃ T0 26; % 初始室内温度℃ P_ac_max 100; % 空调最大功率kW P_grid_max 300; % 关口最大购电功率kW % 基础负荷(kW)与光伏出力(kW)均为预测值 P_base [80 75 70 65 60 60 65 70 75 80 90 95 ... 100 95 90 85 80 75 70 65 60 60 70 80]; P_pv [0 0 0 0 0 1.5 5 12 20 32 45 52 ... 50 42 30 18 8 2 0 0 0 0 0 0]; % 室外温度曲线℃ T_out [28 27 26 25 25 24 24 25 27 29 30 31 ... 32 33 33 32 31 30 29 28 27 26 26 25]; % 分时电价元/kWh price [0.4 0.4 0.4 0.4 0.4 0.5 0.8 1.0 ... 1.2 1.2 1.2 1.0 0.8 0.8 1.0 1.2 ... 1.2 1.2 1.0 0.8 0.5 0.4 0.4 0.4]; %% 定义优化变量 P_buy sdpvar(1, T); % 购电功率 P_ac sdpvar(1, T); % 空调功率 T_in sdpvar(1, T); % 室内温度 %% 约束条件 Constraints []; for k 1:T % 功率平衡 Constraints [Constraints, P_buy(k) P_pv(k) P_base(k) P_ac(k)]; % 设备限幅 Constraints [Constraints, 0 P_ac(k) P_ac_max]; Constraints [Constraints, 0 P_buy(k) P_grid_max]; % 舒适区间 Constraints [Constraints, T_min T_in(k) T_max]; end % 虚拟储能热动态方程 Constraints [Constraints, T_in(1) T0]; for k 1:T-1 Constraints [Constraints, ... T_in(k1) T_in(k) dt/Cth * ( (T_out(k)-T_in(k))/Rth - COP*P_ac(k) )]; end %% 目标函数购电成本 调节平滑惩罚 lambda 0.5; reg 0; for k 1:T-1 reg reg abs(P_ac(k1) - P_ac(k)); end Objective sum(P_buy .* price) lambda * reg; %% 求解 ops sdpsettings(solver, gurobi, verbose, 0); sol optimize(Constraints, Objective, ops); if sol.problem 0 P_buy_opt value(P_buy); P_ac_opt value(P_ac); T_in_opt value(T_in); else disp(求解失败); sol.info end这里有一个小细节要注意热动态方程的符号。夏季制冷场景下室外温度高于室内((T_{out}-T_{in})/R_{th}) 是正值表示热量从室外渗入室内会推高室温(COP \cdot P_{ac}) 是空调抽走的冷量前面带减号会降低室温。正负号颠倒是最常见的建模错误算出来的温度曲线会跟预期完全相反排查时优先检查这里。3.3 算例结果怎么看空调出力体现出“电池”行为运行上面的算例典型的优化结果会是这样时段电价元/kWh空调策略室温变化0~5点0.4接近满负荷蓄冷从26℃降到25℃附近6~9点0.4~0.8出力回落维持低温小幅波动10~14点1.0~1.2低负荷甚至停机回升逼近27℃上限15~19点0.8~1.2跟随电价切换上下波动20~23点0.4~0.8重新蓄冷回落仔细对比 (P_{ac}) 和分时电价的关系会发现空调功率走势几乎就是电价的镜像电价低时满负荷蓄冷电价高时减少出力甚至停机。这就是典型的“虚拟储能充放电”行为——低谷充电蓄冷高峰放电释放冷量。购电曲线也会被削平一截尖峰负荷明显下降这正是业主最想看到的效果。需要提醒的是如果楼宇基础负荷本身就很小、光伏又强白天10点~14点购电功率可能接近零这时需要检查功率平衡约束会不会导致P_buy变成负值。本项目不允许倒送电所以我在约束中加了下限0正好把这种情况拦住了。3.4 调参心得一个权重值决定调度性格(\lambda) 的选择是可以“调”出来的。(\lambda0) 时空调功率可能在连续时段间大幅跳变比如前1小时100kW、后1小时0kW频繁启停设备受不了。 (\lambda) 拉大后曲线变平滑但空调不再敢在低谷时满负荷冲到底蓄冷深度也会变小。我实操的经验是先用(\lambda0)跑一遍看目标函数的第一项购电成本基准值再逐渐加大(\lambda)观察第二项平滑代价占总体成本的比例。平滑代价占2%~5%是一个比较舒服的区间既保持了经济性又让曲线可执行。另一个值得思考的是末端温度约束。代码里我没有强约束 (T_{in}(24)) 回到初始值结果是最后几小时空调可能一直不工作室温被放到接近上限27℃。这对单日调度的结果是正常的但对多日滚动优化不友好——第二天初始温度不能一直假设是26℃。务实做法是增加约束 (T_{in}(T)) 与 (T_0) 的偏差在0.5℃以内或者在滚动优化中把当前实测室温作为初值。4. 调试实录常见问题与排查方法4.1 模型报“Infeasible”从哪里下手这是最常踩的坑。楼宇虚拟储能模型看起来简单但不可行性往往出现在热动态方程与舒适度约束“打架”的时候。比如说初始室温T0是26℃第一时段室外温度30℃空调最大功率100kW、热容80kWh/℃热阻2℃/kW。算一下第一时段可能的最低温降[ \Delta T \frac{1}{80} \times \left( \frac{30-26}{2} - 3 \times 100 \right) \frac{1}{80} \times (2 - 300) \approx -3.7℃ ]空调满功率可以把室温降3.7℃但如果舒适下限是24℃而初始室温本来就只有24.5℃一个时段内就会冲破下限模型直接不可行。排查方法我一般分三步走第一步把舒适区间临时放宽到0~50℃看是否可行。如果可行说明功率平衡和设备限幅没问题问题出在温度边界第二步检查初始温度 (T(1)T_0) 是否被稳妥约束。有时候模型中 (T0) 传参错了导致初始温度本身就不在舒适区间内第三步用Yalmip的check(Constraints)查看每一条约束的残差残差最大的那条就是矛盾源头。这个方法屡试不爽。如果放宽到0~50℃仍然不可行那大概率是功率平衡或设备功率边界写错了比如基础负荷和光伏数据错位。4.2 空调曲线“锯齿”太严重怎么抑制有一次跑出来的结果空调功率在第8小时从0跳到100kW第9小时又跳回0第10小时再跳到85kW。从经济模型的角度这个解没问题但拿给运维人员看第一反应就是“这没法执行”。绝对值惩罚项正是为此加的。但是要注意Yalmip里abs(P_ac(k1)-P_ac(k))会引入二进制变量把原来的线性规划变成混合整数规划。24小时的规模无所谓如果以后扩展到几百个时段、几十台设备建议改用二次惩罚[ \lambda_2 \sum_{k1}^{T-1} (P_{ac}(k1) - P_{ac}(k))^2 ]这样做的好处是模型保持为二次规划求解速度更快坏处是对大幅跳变的惩罚力度大于小幅波动调度曲线会偏保守。我在实际项目中24小时单楼宇的场景直接用绝对值罚效果最直观。4.3 虚拟储能“不出力”温度不动怎么办有朋友跑出来结果室内温度全程贴着26℃不动空调功率和基础负荷几乎同步虚拟储能完全没用上。这种情况很少是因为代码bug更多是激励不足。关键检查项分时电价的峰谷差是否足够大。如果峰谷差价只有0.2元/kWh蓄冷再释放的收益还抵不上空调额外损耗和管理复杂度模型自然选择不调度。峰谷差在0.6元以上虚拟储能才有明显动作舒适区间是否太窄。如果舒适区间是25.5~26.5℃只有1℃的自由度等效储能容量太小调度空间被严重压缩。工程上建议至少留出2~3℃热容 (C) 是否设得过小。热容太小意味着楼宇几乎没惯性温度受空调影响立即变化没法“存储”虚拟储能容量趋近于零。我实测过一个有趣的现象同样一套模型舒适区间从25~26℃放宽到24~27℃总电费可以下降超过10%。这1~3℃的宽度就是免费储能容量的来源也是虚拟储能换钱的地方。4.4 求解器报错与参数标定问题Gurobi没有license、CBC求解器不支持某类约束这类环境问题在群里被反复问。解决思路不复杂如果机子上只装了Matlab和Yalmip把求解器指定为sdpsettings(solver,cbc)也能跑通多数线性规划唯一要注意的是CBC在碰到复杂整数问题时性能偏弱。如果只是几十个变量的楼宇模型完全够用。另外补充一个容易误导结果的问题热容 (C) 和热阻 (R) 如果是从其他论文里硬掰来的算出来的虚拟储能容量和实际楼宇差别会很大。我曾经按某教材的办公楼参数建了一版模型结果优化方案要求空调在凌晨连续满负荷运行4小时但现场楼宇保温远没这么好温度根本压不到那么低。后来重新做了一次停机升温实测拟合出 (C68)、(R1.8)结果才正常。强烈建议做项目前先花半天时间测一测楼宇的热特性。4.5 排查问题速查表异常现象常见原因解决方向模型不可行舒适区间与空调能力不匹配放宽温度边界或增大空调功率上限温度曲线反了热动态方程正负号错误检查室外渗热项与COP制冷项符号结果锯齿严重缺少调节惩罚项加绝对值或二次平滑惩罚虚拟储能不动作峰谷价差小或温度区间窄核对价格信号放宽舒适区间购电功率出现负值允许倒送但目标未设卖电收益加 (P_{buy}\ge0) 或增加余电上网价格末端温度失控缺少终端温度约束增加 (T_in(T)) 与 (T_0) 的偏差约束5. 个人经验与扩展方向这套方案在几个真实楼宇场景里复跑过最大的体会是虚拟储能的经济收益很大程度上藏在“温度上下限的1℃”里。把室内温度设定从严格25℃放宽为24~27℃用户几乎感觉不到差别但峰谷套利空间立刻变大。做项目汇报的时候我一般会跑三个对照场景无虚拟储能、温度区间2℃、温度区间3℃用一组电费数据说话比任何概念讲解都有说服力。代码实现本身不复杂真正花时间的是热参数C和R的标定。如果楼宇没有详细的热特性资料先做一次简单的空调停机升温实测拟合出时间常数比照搬论文参数可靠太多。这个实测的成本很低但能让模型结果从“纸面最优”变成“现场可用”。后续想扩展的同学可以把单楼宇虚拟储能往两个方向做深一是多楼宇聚合把同一园区里的几栋楼聚合成一个虚拟储能集群统一参与电价响应容量做大后能参与更高层级的市场博弈二是日内滚动优化每15分钟用实测数据刷新一次预测和功率指令滚动的修正能力可以很好地纠正光伏预测偏差和人员作息变动。这两块做下来虚拟储能就不再只是“楼宇节能工具”而是能直接参与电力系统运行的有效调节资源。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑