
1. 为什么说楼宇本身就是一座隐形电池你可能觉得储能必须是一排磷酸铁锂电柜或者至少得有个大号的铅酸电池组。但如果你把视角从硬件设备切换到负荷的可调潜力整栋楼宇本身就是一个天然的储能系统——这就是需求侧虚拟储能系统的核心逻辑。先说结论楼宇里的空调、新风系统、热水器、电梯、照明这些看似只会消耗电力的设备它们的用电行为其实都存在弹性。空调提前半小时把房间预冷到舒适区下限后面半小时就可以低功率运行甚至停机楼宇的热惰性会在这一小段时间内把室温维持在可接受范围。这个过程在电网侧看起来和电池放电没有任何区别——功率曲线下降、电量冷量被释放出来。反过来电价低谷时段让空调满负荷运行把建筑结构充满冷量就等同于电池在充电。这个思路放到楼宇微网优化调度里价值非常直接。微网调度的本质是在满足用电需求的前提下追踪分时电价、光伏出力、负荷曲线之间的最优匹配让购电成本最低。物理储能电池的容量是硬约束有多少千瓦时就有多少调节能力但虚拟储能的容量取决于楼宇本身的热惯性、温度舒适度区间、以及可平移负荷的总量。换句话说虚拟储能不花设备购置费不占机房面积不产生电池衰减的忧虑却能实打实地减少从电网高价时段购电的量。我在实际项目中体会最深的一点是楼宇微网的调度优化难点不在物理设备光伏、电池、常规负荷的建模而在于如何把看不见摸不着的柔性负荷潜力转换成一个可量化、可进优化模型的数学表达。这需要两步第一步是选定哪些负荷具备虚拟储能特性第二步是把它们的物理约束写成和电池SOC方程类似的递推约束让优化器能看到这块虚拟电池的充放电边界。这套思路在2017年电工杯A题里其实已经露过头——那道题的核心就是光伏储能分时电价下的微电网日前优化调度很多参赛队伍把储能简化成了单一SOC模型得分差异很大。而融合需求侧虚拟储能等于给这个经典问题加了一层更贴近工程实际的维度。无论你是做毕业设计、准备竞赛还是真的在做一个楼宇能源管理平台这篇文章里讲到的建模思路和Matlab代码框架都能直接改来用。2. 楼宇微网调度建模把每个设备翻译成数学表达式2.1 微网拓扑与设备清单一个典型的楼宇微网它连接的是380V/220V低压母线往上通过变压器接市电自己家里通常有这几样东西屋顶或幕墙光伏装机容量一般在20kW到200kW之间一套物理储能电池容量50kWh到500kWh不等多数项目没装或者只装了很小的容量楼宇负荷群空调系统包括冷水机组、风机盘管、新风机组占40%~60%的用电照明插座占20%左右电梯水泵占10%剩下的是各种小型动力设备。调度优化的决策变量是未来24小时每个时段通常按1小时或15分钟一个点各路功率怎么分配。时间粒度越细模型越精确但求解规模也成倍增长。我的经验是如果只做日前计划1小时间隔足够如果要滚动优化15分钟间隔加上预测误差修正效果会明显更好但建模工作量大概要翻3倍。2.2 光伏、电池与电网交互的基础建模先建立三类基本设备模型这是所有微网调度的地基。光伏出力模型光伏功率给到预测曲线 (P_{pv}(t)) 作为已知输入。严格意义上光伏效率受温度影响但日前调度通常直接用预测值不额外建辐照-功率转换模型。物理储能电池模型需要一个递推的SOC方程[ E_{bat}(t1) E_{bat}(t) \eta_{ch} \cdot P_{ch}(t) \cdot \Delta t - \frac{P_{dis}(t)}{\eta_{dis}} \cdot \Delta t ]其中 (P_{ch})、(P_{dis}) 是充放电功率(\eta_{ch})、(\eta_{dis}) 是效率。约束条件包括电池SOC上下限SOC_min E_bat(t) / E_cap SOC_max充放电功率上限0 P_ch P_rated0 P_dis P_rated充放电互斥约束同一时刻不能既充又放用二进制变量标记充放电状态。很多初学者会在这里省略互斥约束直接让优化器自己决定。但线性规划里如果没有互斥限制优化器会同时输出充电正功率和放电正功率两个功率在平衡方程里互相抵消白白占用了变量的自由度还可能导致目标函数计算失真。加一个二进制变量是最稳妥的做法。电网交互模型在允许余电上网的前提下功率平衡方程写成[ P_{grid}(t) P_{pv}(t) P_{dis}(t) P_{load}(t) P_{ch}(t) P_{hvac}(t) ](P_{grid}) 为正表示从电网买电为负表示向电网送电。如果微网不允许倒送则需要加 (P_{grid}(t) \ge 0) 的约束。这三块内容属于基础中的基础网上随便一搜就是一整套代码。我不想花费大量篇幅去重复这类内容但后面的虚拟储能建模必须依赖这个地基先把它们列清楚后续扩展才有支撑。3. 虚拟储能的建模核心三类柔性负荷怎么变成可充放电的电池楼宇里具备虚拟储能潜力的负荷我按工程上能否方便地纳入调度模型分成三大类。每一种都要找到它和电池模型的对应关系。3.1 热惯性负荷空调系统最像电池的一类空调的虚拟储能机理是建筑围护结构的热惯性。墙体、家具、空气本身有热容房间不是瞬时被加热或冷却的。你把空调关掉半小时室温不可能立刻回到室外温度你在电价贵之前提前猛开半小时室温降到舒适区下限后面一段时间空调就能停机——这种提前储能、延迟释放的行为和电池充放电在数学上完全同构。空调的热力学模型用一阶等效热参数模型即可[ T_{in}(t1) T_{in}(t) \frac{\Delta t}{R_{eq} \cdot C_{eq}} \left( T_{out}(t) - T_{in}(t) \right) - \frac{\Delta t \cdot COP \cdot P_{hvac}(t)}{C_{eq}} ]这里 (C_{eq}) 是等效热容单位kWh/K(R_{eq}) 是等效热阻单位K/kW(COP) 是空调能效比(P_{hvac}(t)) 是空调耗电功率。室内温度 (T_{in}(t)) 就是这个虚拟电池的SOC而温度舒适度区间 ([T_{min}, T_{max}]) 就对应SOC的上下限。空调功率相对基准运行功率的增减量就是虚拟电池的充放电功率空调功率高于基准 → 相当于放电向房间释放冷量温度下降空调功率低于基准 → 相当于充电冷量补充温度回弹。把温度上下限写成硬约束[ T_{min} \le T_{in}(t) \le T_{max} ]这样优化器在价格高的时段必须让空调功率维持在能把室温拖在舒适区内的最低水平价格低的时段则可以多出力预冷把冷量蓄在墙体里。一进一出就是一次完整的充放电循环。我在实际项目中取过一组满足工程经验的数据某栋办公楼的等效热容 (C_{eq}60) kWh/K等效热阻 (R_{eq}0.08) K/kWCOP 3.2舒适区设为22℃~26℃。这样算下来允许室温波动4℃等价于虚拟储能容量约为 (C_{eq} \times \Delta T 60 \times 4 240) kWh——这已经是一套中型电池组的容量了而它的设备成本为零。3.2 可平移负荷与可削减负荷补充两个灵活变量可平移负荷洗碗机、洗衣机、热水器、部分工业设备的特点是用电总量固定但用电时间可以在一定窗口内浮动。举个例子热水器每天晚上需要消耗20kWh只要在18点到22点之间任意时段完成即可但通常不能半夜才烧好。建模方式是用启动时间标志的二进制变量或者按调度时段定义启动标志配以持续用电功率和运行时间窗约束。可削减负荷就更好理解照明、部分插座在需求响应时可以削减到额定值的70%~80%但削减量不能超过限定比例削减时间也不能太长。这类负荷被限制在最大削减功率和最大削减时长以内当作灵活的负变量处理即可。3.3 虚拟储能聚合约束与能量回归问题前面说三类负荷能当电池用但它们和真电池有一个本质区别电池的能量守恒是自动满足的——你不能凭空造电。而虚拟储能如果不施加额外约束优化器会倾向于把所有的冷量热量在一天内全部透支比如让温度永远贴着下限运行这样空调功率全天最小成本看着最优但第二天早上办公室里的人已经冻得受不了了。所以必须加一个周期能量回归约束最简单的形式是要求调度周期结束时室内温度等于初始温度[ T_{in}(24) T_{in}(0) ]严格说这是让冷量守恒的最简做法——系统运行一天后蓄在建筑里的冷量和早上一样多你白天透支的那部分必须在当晚某个时段还回来。类似地可平移负荷的总用电量本来就是固定的自动满足能量守恒可削减负荷则需要统计全天削减总量不超过某个阈值。加了能量回归约束之后虚拟储能的建模就完整了。从优化器视角看它面前摆着一个容量240kWh、没有投资成本、但充电放电都受舒适度约束的电池。后面所有调度决策都会像伺候真电池一样伺候这栋楼的热惰性。4. 目标函数与约束条件分时电价驱动的24小时优化问题4.1 目标函数购电成本与电池损耗楼宇微网日前调度最常见的目标函数是全天购电成本最小[ \min \sum_{t1}^{24} Price(t) \cdot P_{grid}(t) \cdot \Delta t ](Price(t)) 是分时电价。这是最核心的一项。如果还要考虑电池寿命损耗可以再加一项电池充放电功率的惩罚项 ( \lambda_{bat} \cdot (P_{ch}(t) P_{dis}(t)) )如果要对舒适度做软约束而不是硬约束可以采用惩罚函数 ( \lambda_{temp} \cdot (\text{超出量}) ) 把温度曲线约束转换成目标函数里的惩罚项。工程上我喜欢用硬约束做温度边界——这样可以保证任何可行解都满足用户舒适度不需要反复调惩罚系数。4.2 约束清单一次全部列全完整的约束体系包括以下几组功率平衡约束P_grid P_pv P_dis P_load_base P_ch P_hvac P_shiftable物理储能相关约束SOC递推、SOC边界、功率上下限、充放电互斥空调热力学约束室内温度递推方程、温度舒适区边界空调功率上下限0 P_hvac P_hvac_max虚拟储能能量回归约束调度结束时温度回落到初始值可平移负荷窗口约束只能在规定时段启动启动后连续运行完规定时长可削减负荷约束削减比例上限、最大削减时长。这些约束合在一起构成一个混合整数线性规划MILP问题——因为有充放电互斥的二进制变量和可平移负荷的启动标志变量。规模不大24个时段变量数通常在几百个量级主流求解器秒解。4.3 为什么分时电价差越大虚拟储能越值得做虚拟储能赚的是峰谷价差的钱。它的充电成本是低谷电价放电收益是高峰电价的减少单次循环的账面收益可以粗略估算为[ \text{收益} \approx \text{虚拟储能可用容量} \times (\text{峰价} - \text{谷价}) \times \text{等效循环次数} ]假设峰谷价差0.8元/kWh上面那栋楼相当于有240kWh的虚拟容量理论上每天完成一次等效循环理论收益约192元/天。当然实际运行中受舒适度约束和负荷曲线形态限制不可能满打满算但按50%~60%的利用率算一天省个百元级电费是完全现实的——单位建筑面积的电费密度如果不高这已经是非常可观的优化空间。分时电价本身是虚拟储能的催化剂。峰谷价差小的地方虚拟储能再便宜也不值得做——优化半天省下来几毛钱不如大家手拉手人工关两台空调。所以楼宇做需求侧虚拟储能先抬头看看当地的分时电价政策是否够有吸引力这一步决定了项目到底有多大经济价值。5. Matlab落地YALMIP建模与求解器的配合5.1 为什么用YALMIP而不是手写线性规划Matlab自带的linprog只能求解连续线性规划而我们的模型里带了二进制变量必须上MILP求解器。手写单纯形法或者分支定界算法在这个问题上纯属浪费时间。YALMIP是一个非常成熟的Matlab建模工具箱你可以把它理解为优化问题的编译器你用接近数学表达式的语言描述变量、目标、约束它负责翻译成求解器能识别的标准格式再交给cplex、gurobi这类求解器去算。我建议的搭配是Matlab YALMIP 至少一个商业求解器。学生可以用cplex的学术版如果环境受限先用intlinprogMatlab自带的MILP求解器顶上也完全能跑只是大规模问题下性能有差距。楼宇仿真的规模三种方案都能顺利解决。5.2 一段可运行的核心框架代码下面这段代码是框架性的参数我都做了注释替换你可以直接放到自己的脚本里改参数运行%% 参数定义 T 24; % 调度时段数 dt 1; % 时间步长小时 % 分时电价峰1.2 / 平0.7 / 谷0.3 price [0.3*ones(8,1); 0.7*ones(2,1); 1.2*ones(5,1); ... 0.7*ones(1,1); 1.2*ones(2,1); 0.7*ones(3,1); ... 0.3*ones(3,1)]; % 24x1 % 光伏预测曲线kW P_pv ... % 根据你本地的预测数据填入 % 基础负荷kW P_load_base ... % 楼宇除空调外的基础负荷 % 物理储能参数 E_cap 100; % 电池容量 kWh E0 50; % 初始SOC P_bat_rated 50; % 功率上限 kW eta_ch 0.95; eta_dis 0.95; SOC_min 0.1; SOC_max 0.9; % 空调虚拟储能参数 C_eq 60; % 等效热容 kWh/K R_eq 0.08; % 等效热阻 K/kW COP 3.2; P_hvac_max 30; % 空调额定电功率 kW T_in_0 24; % 初始/回归温度 T_min 22; T_max 26; % 舒适度区间 T_out 28 4*sin((0:23)/24*2*pi); % 室外温度简化示例 %% 变量定义 P_grid sdpvar(T,1); P_ch sdpvar(T,1); P_dis sdpvar(T,1); E_bat sdpvar(T1,1); P_hvac sdpvar(T,1); T_in sdpvar(T1,1); u_ch binvar(T,1); % 充电状态标志 u_dis binvar(T,1); % 放电状态标志 %% 约束 C []; % 电池初始与递推 C [C, E_bat(1) E0]; for t 1:T C [C, E_bat(t1) E_bat(t) eta_ch*P_ch(t)*dt - P_dis(t)/eta_dis*dt]; C [C, SOC_min*E_cap E_bat(t1) SOC_max*E_cap]; C [C, 0 P_ch(t) P_bat_rated*u_ch(t)]; C [C, 0 P_dis(t) P_bat_rated*u_dis(t)]; C [C, u_ch(t) u_dis(t) 1]; end % 空调热力学虚拟储能核心 C [C, T_in(1) T_in_0]; for t 1:T C [C, T_in(t1) T_in(t) dt/(R_eq*C_eq)*(T_out(t)-T_in(t)) ... - dt*COP*P_hvac(t)/C_eq]; C [C, T_min T_in(t1) T_max]; C [C, 0 P_hvac(t) P_hvac_max]; end C [C, T_in(T1) T_in_0]; % 能量回归约束 % 功率平衡 C [C, P_grid P_pv P_dis P_load_base P_ch P_hvac]; %% 求解 ops sdpsettings(solver,cplex,verbose,1); Objective price * P_grid * dt; optimize(C, Objective, ops); %% 结果提取 P_grid_opt value(P_grid); P_hvac_opt value(P_hvac); T_in_opt value(T_in);这段代码的核心是空调热力学递推方程和能量回归约束。光伏数据、基础负荷数据、分时电价表你从任何现成的楼宇能耗数据集里都能填进去跑通。跑完画一条室温和电价对照图你会发现室温在电价峰时贴着上限走、在电价谷时贴着下限走——这个规律就是虚拟储能产生收益的直接证据。5.3 结果的三种场景对比我自己验证时通常跑三个场景做对比场景A只有物理储能空调恒温运行场景B物理储能加空调虚拟储能但不含可平移负荷场景C全套物理储能虚拟储能可平移负荷。对比的指标只有一个全天购电总费用。经验数据是场景B比场景A节省10%~20%的日购电费用取决于楼宇热惯性和电价差场景C比场景B再多省5%~10%。这类项目里虚拟储能的边际效益通常比物理储能更亮眼因为它几乎没有边际成本。不过要提醒一句节省比例高不代表绝对值高。如果楼宇本身耗电量小一天省几十块一年也就小几万那还要看项目投入产出比。虚拟储能不是无本万利它的本是用户舒适度边界和前期建模调试投入如果这两项无感收益就是安静的被动收入。6. 实测避坑记录与调参心得6.1 能量回归约束漏掉后的怪现象我第一次跑这个模型时忘了加温度回归约束。结果优化出来的空调功率曲线非常激进全天几乎满功率运行在凌晨低电价时段把室温压到22℃白天高电价时段干脆关机室温一路飙升到26℃傍晚再次疯狂预冷。表面上购电成本很低但仔细一看室内温度在上午十点就已经逼近26℃上限到下午的人体感受已经非常不舒服——温度看着在约束边界内实际上连续几个小时处在不过线但很难受的水平。其实温度边界约束确实没被违反但缺少能量回归约束意味着优化器把整个建筑当成了一个可以无限透支冷量的无底洞。它发现白天高价时段不吹空调最省钱代价是让建筑在傍晚进入一个极端的低温状态再用晚间低谷电价还债。从电网角度看这确实省了钱但对楼里的人来说完全不可接受。加了 (T_{in}(T1) T_{in}(0)) 之后优化结果立刻变得理性高价时段室温升高但升幅有节制低价时段会预冷但不会疯狂透支。这个约束是虚拟储能建模里最重要的一条没有之一。它决定了你是在合理利用热惯性还是在压榨用户舒适度。在和甲方、导师汇报结果时这条约束也是最容易一眼看出模型专业度的分水岭。6.2 温度舒适区间设太宽的代价另一个常见问题是为了充分释放虚拟储能潜力我一开始把温度舒适区设成20℃~28℃想着反正模拟嘛区间宽一点收益高一点。结果优化器给出的空调功率曲线完全是二进制特征——要么满功率要么停机几乎没有中间状态。因为线性规划里线性目标函数配合线性约束最优解往往在顶点上而温度区间越宽这个顶点效应越明显。这种运行方式有几个现场问题首先是空调压缩机频繁启停会缩短设备寿命其次风机盘管吹出的风温波动大人在房间里能明显感知到一阵冷一阵热舒适度体验极差最后真实的空调系统功率也不是能从0跳到额定值的变频空调有爬坡约束定频空调有最小运行时间和最短停机时间约束。工程上我的处理办法是把温度区间压缩到2℃~3℃同时给空调功率加一个爬坡约束或者最小功率约束。模拟精度虽然略降但调度结果在现实中有执行价值。做优化调度的人最容易犯的错就是为了追求目标函数好看而忽略了物理设备的实际执行能力——温度区间设窄就是在逼优化器做一个有分寸的虚拟储能策略。另一个技巧是把温度目标从一个区间改成一个带死区的惩罚函数。具体做法是目标函数加一项 (\lambda \cdot \max(0, T_{in}(t)-\bar T)^2) 之类的惩罚项让温度尽量贴近设定值但允许在边界内小幅偏离。实测下来这样的空调功率曲线平滑很多室内温度也更接近12平均日变化。6.3 求解器选择与MILP的求解效率楼宇微网这个量级的问题其实压根不构成求解压力。24个时段、几个二进制变量那点规模在cplex手里连热身都算不上。真正让我卡的是目标的线性化处理和约束条件的变形方式。我印象很深的一次是我引入了空调功率与温度耦合的非线性方程因为用了二阶热动力学模型在YALMIP里写了几个二次项结果MILP直接变成了MIQP混合整数二次规划求解时间从秒级暴涨到几分钟还不一定保证全局最优。后来我把二阶模型简化成一阶等效热参数模型MIQP退回MILP求解时间立刻回到毫秒级结果却差不了多少。所以经验是楼宇微网调度这类问题能用线性模型就绝不用二次模型能用MILP就绝不用MIQP。热动力学模型的精度提升是边际递减的——一阶模型已经能捕捉到建筑热惯性的主特征在日前调度的维度下完全够用。如果求解器不可用Matlab自带的intlinprog配合YALMIP也能跑但速度要慢不少。我实测过24时段的模型cplex大约0.2秒出结果intlinprog要2~3秒。差距在单次求解上完全没感觉但如果要做滚动优化一天可能要解几十上百次这个差距就比较明显了。6.4 光伏预测误差怎么处理光伏预测不可能完全准确。如果日前调度计划里光伏出力预测得过高实际运行时光伏发不出来功率平衡就会出现缺口最终要么从电网多买高价电要么切负荷。最常见的工程应对是滚动修正反馈校正把调度周期从24小时缩成4小时或6小时每个周期结束前根据最新光伏实测和超短期预测重新求解一次。这样即使日前预测有偏差滚动的频率也能把误差控制在较小范围内。此外还有一个很实用的技巧在做日前计划时把光伏出力打折处理——比如预测值的90%作为输入。看似保守但能避免预测乐观、实际打脸被高价电惩罚的情况。它本质上是用一点点计划保守性换取了更大的运行弹性在分时电价差大、惩罚电价高的项目里非常划算。6.5 虚拟储能扩展到电动汽车充电桩最后说一个可以延伸的方向如果楼宇停车场配了电动汽车充电桩这些充电桩本身就是移动的虚拟储能单元。电动汽车的电池容量动辄50kWh起步比楼宇单个空调系统的热容大多了。把充电桩纳入虚拟储能池需要额外管理用户的充电截止时间和最低电量需求但调度潜力非常可观。我在一个带40个充电桩的园区项目里做过粗略估算在不影响用户出行需求的前提下把充电时间从到即充改成谷时集中充配合楼宇空调虚拟储能日购电费用可以再降8%~12%。这还只是保守估算如果未来V2G车到电网技术普及电动汽车电池对楼宇微网的支撑范围会更远。楼宇微网优化调度这个题目做深了你会发现它永远不只有光伏储能分时电价这三个关键词而是要不断回答负荷侧到底还有多少弹性没用起来这个问题。虚拟储能让楼宇自身成为调度资源而Matlab给了你低成本试错的环境——参数敏感性分析、策略对比、滚动修正逻辑一天之内就能全跑完。我强烈建议拿到代码后先把分时电价、热容系数这两个最敏感的参数的敏感性曲线跑出来你会对这套系统从哪里赚钱、靠什么赚钱有非常直观的体感。