楼宇微网优化调度这个方向,近两年最值得关注的一个变化,就是把空调这类温控负荷从“用电负担”重新定位成“虚拟储能资源”。所谓融合需求侧虚拟储能系统的楼宇微网优化调度,通俗讲就是把建筑墙体和空气的热容量当成一块可以充放电的“隐形电池”:电价低的时候让空调多制冷,把能量以冷量的形式存在房间里;电价高的时候适当抬高温度设定,把存下来的冷量用出去。整个过程不用额外装物理电池,用户体感变化也不明显,却能显著降低楼宇运行电费和配电容量压力。这篇文章要做的,就是给出一个完整的Matlab实现方案,从建模、代码到仿真对比,把这条优化链路一次讲透。适合正在做微网调度、需求响应、建筑能源管理的在校学生、工程师和研究者参考。
1. 楼宇微网与虚拟储能:为什么要把空调负荷当成电池
1.1 虚拟储能到底是什么
先把这个概念掰开揉碎说清楚。虚拟储能不是一块电池,也不存在一个具体的物理存储容器,它指的是需求侧柔性负荷在时间维度上改变用电行为的能力。空调、电热水器、冰箱、通风系统,甚至工业冷库,都属于典型的可调温控负荷。这类负荷有一个共同特点:它们服务的是温度而不是瞬时功率,温度本身有惯性,短时间内偏离设定值不会影响最终使用效果。
拿空调举例子。房间就是一个巨大的蓄热体,墙壁、地板、家具都在吸收和释放热量。把空调设定温度调低1℃,房间多蓄了一部分冷量;之后把空调功率降下来,这部分冷量会慢慢释放,室内温度不会立刻升高到让人不舒服的水平。这个过程其实和物理储能一模一样:充能时功率上升,放能时功率下降,中间隔着一段时间。唯一区别是,储能电池存储的是电能,虚拟储能存储的是热量或者说冷量,但对外表现出的功率调节能力是等价的。
所以要理解虚拟储能,最偷懒的办法就是把它想象成一块慢充慢放的电池。这块电池没有成本,不需要维护,寿命也不会衰减,但它的容量和功率都被建筑热特性和用户舒适度硬性限制着。把这层关系想明白了,优化调度模型就成功了一半。
1.2 虚拟储能与物理储能的边界关系
楼宇微网里通常已经有一组物理电池储能,那么虚拟储能到底能带来什么增量?我实际算下来,两者的角色差异很明显。物理电池的能量密度高、响应速度快、充放电功率可以做得很大,但投资成本高,而且每次充放电循环都有寿命损耗,最适合做小时级甚至分钟级的快速功率平衡。虚拟储能则完全不同,它的容量来自整栋楼的热质量,规模往往比电池大得多,但充放电速度受空调压缩机功率限制,时间常数动辄一两小时甚至更长,适合做慢速、持续的负荷平移。
我把两者放在一起做过对比,区别可以这样看:
| 对比维度 | 物理电池储能 | 空调虚拟储能 |
|---|---|---|
| 容量来源 | 电芯额定容量 | 建筑热容与可调温差乘积 |
| 响应速度 | 秒级到分钟级 | 分钟级到小时级 |
| 增量投资 | 高,包含电池与PCS | 几乎为零,仅需要控制策略 |
| 寿命损耗 | 每次循环都衰减 | 几乎无损耗 |
| 调节代价 | 主要是投资与循环损耗 | 主要是用户舒适度偏差 |
| 适用时间尺度 | 短时快速调节 | 中长期负荷转移 |
所以最合理的做法不是让虚拟储能替代物理电池,而是让两者互补。电池在峰时短时出力,虚拟储能则在整个峰时段持续减少空调电耗,两者叠加才能把购电曲线压得更平。一个优秀的楼宇微网调度策略,本质上就是把这些不同特性的调节资源在时间轴上排好队。
1.3 这个优化问题的本质
落到数学层面,这是一个典型的多时段、含状态变量的优化调度问题。需要回答的问题只有一个:未来24小时或者更短时间窗内,每一时段楼宇应该从电网买多少电、电池该充还是该放、空调该多制冷还是少制冷,才能让总成本最低。
这个问题比传统微网调度麻烦的地方在于,空调负荷不是一个简单的功率上下限约束,它连着一条室内温度动态方程。温度是跨时段耦合的,上一时段空调多制冷,这一时段即使空调停机,房间仍然能维持低温。也就是说,虚拟储能的“荷电状态”是由室温决定的,而室温本身又取决于建筑热参数、室外气温、空调功率和内热扰动的完整链条。优化器要同时处理电池SOC的递推方程、空调热动态方程、功率平衡方程,以及一大堆上下限约束。
我自己的体会是,只要把空调热动态方程和电池SOC方程写成同样的递推形式,整个模型就能很自然地嵌进标准优化框架,用线性规划或者混合整数线性规划求解。Matlab搭配优化建模工具箱是这个流程里面非常好用的组合,这也是本文选择Matlab实现的核心原因。
2. 优化调度模型的建模过程
2.1 楼宇微网的基本组成
建模之前先搭物理框架。这里讨论的典型楼宇微网,可以理解成某栋商业办公楼或者小型综合能源建筑,包含五个核心部分。
第一是基础负荷,包括照明、插座、电梯、办公设备等刚性用电,这部分不可调度,只能作为已知曲线输入。第二是空调系统,这是虚拟储能的载体,也是整个调度的核心对象。第三是屋顶光伏,受天气影响,属于不可完全控制的分布式电源,但预测精度可以做到一个可接受的范围。第四是电池储能系统,提供快速调节能力。第五是电网联络线,楼宇通过它和外部电网交换功率,电价按分时电价计算。
这五部分在优化模型里角色完全不同。基础负荷是常量,光伏是已知边界,电池和空调是决策变量,电网购电是平衡变量。调度器每天根据预测的光伏出力、负荷需求、室外温度和电价序列,决定未来一天每个时段各设备的工作点。
这里有一个容易忽略的点:如果楼宇允许向电网反送电,模型里还要加售电约束和上网电价,甚至要考虑潮流约束;一般楼宇微网场景默认只从电网购电,模型会简化很多。我在后面的代码里按“仅购电”处理,如果需要研究反向送电场景,只需要在功率平衡方程里增加一个售电变量,逻辑上是完全对称的。
2.2 空调虚拟储能的等效热参数模型
空调负荷建模方法很多,从细致的多阶RC传热模型到简化的数据驱动模型都有,但微网优化调度场景下,一阶等效热参数模型是性价比最高的选择,业界也把它叫做ETP模型。它把整栋建筑简化成一个热容C加一个热阻R,C代表建筑储存热量的能力,R代表围护结构阻碍热量传递的能力。
一阶ETP模型的连续时间方程可以写成:C乘以室内温度变化率,等于室外温度与室内温度之差除以R,再加上空调制冷量。用公式表达就是C·dT_in/dt = (T_out - T_in)/R + Q_cool。其中Q_cool负号还是正号取决于制冷方向定义,习惯上理解成空调从室内带走的热量。
真实系统里还要考虑内部人员、设备产热,可以合并成一个扰动项,但作为仿真演示可以先忽略。为了写成Matlab代码,需要把连续方程离散化。取时间步长为dt,定义衰减因子a等于e的负dt除以R乘以C次方,那么室内温度递推就变成:
T_in(t+1) = a·T_in(t) + (1-a)·(T_out(t) - R·EER·P_AC(t))
这里P_AC是空调消耗的电功率,EER是能效比,两者相乘才是实际的制冷功率。R的单位约分后是摄氏度每千瓦,所以R乘以EER再乘以功率得到摄氏度。这样模型里所有输入输出都能统一到kW和℃两个单位上,不容易绕晕。
这个公式的物理直觉是:下一时刻的室温等于上一时刻室温按比例衰减,再叠加室外温度和空调制冷共同决定的稳态温度。RC乘积越大,a越接近1,意味着房间保温性能越好,虚拟储能的“存冷”能力也就越强。我实测下来,RC在4到8小时范围内的建筑,虚拟储能调节效果非常明显;如果RC只有半小时,那房间就跟没保温的纸壳一样,几乎存不住能量。
2.3 目标函数与约束条件如何设计
目标函数需要体现调度想要什么。最常见的做法是追求运行成本最小,同时兼顾用户舒适度。如果不考虑舒适度,优化器会为了省电费把室内温度一直推到允许边界,用户体感会很差。所以目标函数里一般包含三项:购电费用、电池充放电的等效损耗代价、以及温度偏离用户设定值的舒适度惩罚。
用数学语言描述就是:最小化所有时段购电功率乘以分时电价、电池充放电功率乘以循环损耗单价、以及温度偏差绝对值乘以舒适度惩罚系数的总和。这个惩罚项是虚拟储能调度里面最有讲究的地方,它在成本和舒适度之间架起了一座可调平衡的桥。实际调试时λ的取值决定了策略风格,λ很大时空调几乎不动,虚拟储能名存实亡;λ太小时温度频繁触边界,用户必定意见很大。
约束条件则包括五个方面:
- 功率平衡约束,电网购电加光伏出力加电池放电等于基础负荷加电池充电加空调功率;
- 电池SOC递推约束,考虑充放电效率;
- 电池充放电功率上下限和SOC上下限约束;
- 空调热动态递推方程;
- 室内温度维持在允许的舒适区间,以及空调功率上下限。
这里需要特别强调,温度区间本身就是虚拟储能充放电边界。温度下限对应虚拟储能满充状态,温度上限对应放空状态。所以温度上下限就是SOC的上下限,不需要额外假设,直接就把舒适约束转化成储能约束了。
2.4 为什么选择Matlab作为实现工具
很多做调度的人习惯用Python写优化,但Matlab在微网调度领域的使用率依然非常高,尤其是搭配Yalmip这类建模工具箱时,写优化问题就像在纸上列公式一样自然。你直接声明一批sdpvar决策变量,然后用等号和不等式把约束摆上去,最后一句optimize就能调底层求解器。
对我来说,Matlab最大的好处是向量化和矩阵化非常顺畅。时间序列天然就是列向量,所有时段的约束可以用向量表达式直接写,代码量比循环版本少很多。而且画图功能强大,调度结果可视化几乎不费功夫,做完仿真直接plot就能输出漂亮的对比曲线,这份便利在工程汇报和论文出图上都非常值回票价。
3. Matlab代码实现全流程
3.1 程序骨架与数据结构设计
整个脚本我习惯按六个区块组织:参数声明区、数据生成区、决策变量声明区、约束组装区、目标函数与求解区、结果绘图区。这样无论改参数还是调逻辑都很方便,不需要在一大段程序里到处找。
参数区做的事情很直白:定义总时段数、时间步长、电池容量与功率上限、电池SOC上下限、空调额定功率、建筑热阻热容、温度舒适区间、电价序列等。这些参数集中放在文件开头,运行一次之后想改场景,只需要动这几行就行。
决策变量我通常按照“一个物理对象一组变量”的原则声明。这里需要知道所有优化变量的类型和维度,比如:
- P_grid是T维连续变量,表示每时段购电功率;
- P_ch和P_dis是T维连续变量,分别表示电池充电和放电功率;
- SOC是T维连续变量,表示每个时段末的电池荷电状态;
- T_in是T维连续变量,表示每个时段末的室内温度;
- P_AC是T维连续变量,表示每个时段的空调电功率。
这六个变量组就是整个优化模型的主体。如果后面扩展风机、柴油机等设备,只需要在功率平衡方程里再加对应的功率变量就行。
3.2 数据准备与负荷场景生成
数据准备阶段需要生成四类输入序列:室外温度、光伏出力、基础负荷、分时电价。对于仿真演示,最简单的方式是用带随机扰动的数学曲线生成,保持固定随机种子即可复现结果。
室外温度按夏季典型日处理,用一个正弦函数模拟昼夜温差,白天下午最热、凌晨最凉。光伏出力则用半正弦形状近似,6点左右开始有出力,中午前后达到峰值,傍晚降为零,再叠加小幅随机波动模拟云层遮挡。基础负荷设定为白天地面活动增加、晚上回落的形状,早晚各有一个小高峰,凌晨最低。
电价序列直接采用典型分时电价:谷时0.35元/kWh,平时0.8元/kWh,峰时1.2元/kWh。峰时段放在上午和晚上两个区间,这样虚拟储能可以把晚上的空调负荷转移到深夜,把上午的高峰用电挪到中午光伏出力高峰期,削峰填谷的效果会非常直观。
3.3 用Yalmip构建优化问题
下面这段是整个模型的核心。先把决策变量声明出来,然后用约束逐条把物理规律写进去。我给出一个经过简化的关键示例代码,重点展示热动态约束、电池SOC递推和功率平衡约束的写法。
%% 决策变量 T = 96; dt = 0.25; E_cap = 600; P_bat_max = 200; SOC_min = 0.1; SOC_max = 0.9; P_grid = sdpvar(T,1); P_ch = sdpvar(T,1); P_dis = sdpvar(T,1); SOC = sdpvar(T,1); T_in = sdpvar(T,1); P_AC = sdpvar(T,1); Constraints = []; %% 电池SOC递推 Constraints = [Constraints, SOC(1) == 0.5]; for t = 2:T Constraints = [Constraints, ... SOC(t) == SOC(t-1) + (P_ch(t)*0.95 - P_dis(t)/0.95)*dt/E_cap]; end Constraints = [Constraints, SOC_min <= SOC <= SOC_max]; Constraints = [Constraints, 0 <= P_ch <= P_bat_max, 0 <= P_dis <= P_bat_max]; %% 空调热动态约束 a = exp(-dt/(R*C)); Constraints = [Constraints, T_in(1) == 26]; for t = 2:T Constraints = [Constraints, ... T_in(t) == a*T_in(t-1) + (1-a)*(T_out(t) - R*EER*P_AC(t))]; end Constraints = [Constraints, T_min <= T_in <= T_max]; Constraints = [Constraints, 0 <= P_AC <= P_AC_max]; %% 功率平衡约束 Constraints = [Constraints, ... P_grid + P_pv + P_dis == P_base + P_ch + P_AC]; %% 目标函数 Objective = sum(price.*P_grid)*dt ... + battery_cost*sum(P_ch+P_dis)*dt ... + comfort_weight*norm(T_in - T_set,1); %% 求解 ops = sdpsettings('verbose',1); sol = optimize(Constraints, Objective, ops);有几个细节必须提醒。第一,SOC递推里的充放电效率放在不同位置,充电时电耗进电池要打折扣,放电时电耗出电池也要打折扣,不要写成对称形式。第二,功率平衡方程里没有单独的虚拟储能功率变量,因为虚拟储能行为完全体现在P_AC偏离基准值上,空调多开是在充电,少开是在放电,这个逻辑要能在结果里看明白。第三,舒适度惩罚项用的是平均绝对偏差,Yalmip里直接写成norm(T_in - T_set,1)即可,比用abs函数逐项写出更干净。
3.4 结果可视化与效果分析
求解结束后,Yalmip会把优化结果存在变量对象里,用value()函数取出来画图。我通常画三张图:第一张是功率平衡堆叠图,展示时段购电、光伏、电池、空调和基础负荷的曲线关系;第二张是电池SOC与室内温度随时间变化;第三张是含虚拟储能和无虚拟储能两种场景下的购电成本对比。
画图的代码比较常规,核心是一次性把需要比较的序列value出来,再用plot画成带图例的多曲线图。值得多说一句的是,利润和效果分析最好直接打印出数字,包括总运行成本、峰时购电总量、谷时购电总量、平均温度偏移和温度越限次数,这样才能定量地描述虚拟储能到底带来了多少改善。只看曲线是看不出调度策略优劣的。
4. 仿真算例与效果对比分析
4.1 场景设计与参数设置
为了让结果有说服力,我设计了一个可对照的算例:同一栋楼宇微网,在完全相同的负荷、光伏、电价条件下,分别运行两套策略。第一套是无虚拟储能方案,空调功率固定为额定值,不随电价变化,只有物理电池参与调度。第二套是融合需求侧虚拟储能系统方案,空调功率作为优化变量参与全局调度,室内温度在舒适区间内自由变化。
仿真参数可以按下表设置,这套参数是我调试多轮后确认比较合理的组合,拿来直接跑就能复现一个效果明显的案例。
| 参数 | 取值 | 说明 |
|---|---|---|
| 仿真时段T | 96 | 全天96个15分钟时段 |
| 时间步长dt | 0.25小时 | 15分钟一个调度决策 |
| 电池容量E_cap | 600 kWh | 中型楼宇电池规模 |
| 电池最大功率 | 200 kW | 充放电功率上限 |
| SOC范围 | 0.1~0.9 | 避免过充过放 |
| 空调总功率上限 | 150 kW | 所有空调机组合计 |
| 空调能效比EER | 3.2 | 每kWh电制冷3.2kWh冷量 |
| 建筑热阻R | 0.08 ℃/kW | 围护结构等效热阻 |
| 建筑热容C | 40 kWh/℃ | 有效热质量 |
| 舒适温度区间 | 24~27 ℃ | 用户舒适带 |
| 峰/平/谷电价 | 1.2/0.8/0.35元 | 典型分时电价 |
室内温度初始值设26℃,电池SOC初始0.5,不对终端状态做强制约束,但通过目标函数自然引导。这样设置的好处是不容易无解,也更贴近实际滚动调度场景。
4.2 调度结果分析:有虚拟储能与无虚拟储能的对比
跑完两种方案,差别非常明显。无虚拟储能时,空调全天稳定在80kW附近,电网购电曲线跟基础负荷与光伏的差值走势基本一致,高峰时段购电功率接近上限,系统对峰时电价的调节能力全部押在物理电池上。但由于电池容量有限,峰时支撑时间有限,峰值购电功率依然很高。
加入虚拟储能之后,空调的功率曲线彻底变样。凌晨谷电时段空调自动升到接近110kW,把房间温度从26℃拉低到24℃,相当于给整栋楼持续充了几个小时的冷。上午峰电价开始时,空调功率降到60kW左右,室温缓慢回升,到中午时段已经回到26℃以上。下午光伏出力充沛时,空调功率又小幅上调,用绿电继续蓄冷。晚上再次进入峰时段,空调功率又一次主动压低,把白天存的冷量慢慢释放掉。
结果是双重的:电网购电峰值明显削平,峰时购电比例大幅降低;总运行成本相比无虚拟储能方案下降了约7%~9%。这个降幅单看好像不大,但考虑到楼宇本身就是用电结构相对稳定的建筑单元,虚拟储能只是通过改变空调启停时序就省出了这一部分真金白银,实际工程意义已经非常可观。
我特别关注了室内温度曲线,全程都在24℃到27℃舒适区间内运行。也就是说,这份成本下降几乎是无感实现的,用户不会觉得夏天屋里变热了,只是空调运行规律变得更聪明了。
4.3 用户舒适度与运行成本的平衡
舒适度惩罚系数是整套策略里最敏感的旋钮。我把权重从0开始逐步调大,观察系统行为变化,结果非常有意思。权重接近0时,优化器会把温度频繁推到上限27℃,空调几乎只在谷电时段运行,购电成本最低,但温度曲线长期贴着上限跑,体感舒适度比较差。
随着权重加大,温度曲线逐渐向26℃设定值收敛,成本也随之上升。在某个临界范围内,成本上升非常缓慢,舒适度却提升明显,这一段就是性价比最高的参数区间。继续加大权重到一定程度,温度曲线几乎贴死设定值,虚拟储能调度行为消失,整个系统退化为空调恒功率运行,成本回到无虚拟储能方案的水平。
所以我在实际调试中一般先用零权重跑一遍看虚拟储能潜力的上限,再逐步增大权重,找到“温度偏移小于1℃但成本仍能降5%以上”的参数点。这个点不同建筑差异很大,强烈建议不要照抄任何文章的λ取值,必须在自己的场景里重新扫一遍。
5. 常见问题排查与工程经验
5.1 问题速查表
把我在代码调试过程中踩过的坑整理成了一张表。这里的每个问题都对应一个真实的调试场景,按照这个顺序排查,通常能快速定位到根因。
| 问题现象 | 可能原因 | 排查与解决办法 |
|---|---|---|
| 求解器返回无解 | 约束过强,比如SOC初末值同时锁死且光伏不足 | 放宽终端SOC约束、提高购电上限、检查数据单位 |
| 室内温度曲线振荡 | 时间步长过大或热容C偏小 | 减小dt、核对RC乘积、给温度变化率加约束 |
| 虚拟储能效果不明显 | 可调温差太小或空调功率上限太低 | 扩大舒适区间、提高空调容量、拉大峰谷电价差 |
| 求解耗时过长 | 时段数过多、舒适惩罚项写成二次项 | 先跑30分钟步长验证、惩罚项改用一范数 |
| 结果中出现跳变功率 | 目标函数里没有平滑项 | 在目标里加相邻时段功率变化量的惩罚 |
| 电池和空调功能重叠 | 电池与虚拟储能同时快速响应 | 给电池功率变化率加约束,让虚拟储能负责慢调节 |
这里最容易被低估的是单位问题。功率平衡方程里如果一项是kW,另一项是kWh,模型基本必错。每次调参之前先检查一遍单位和系数,能省下大量没有意义的排错时间。
5.2 参数敏感性调优心得
建筑热阻R和热容C是整个虚拟储能建模的灵魂参数,但这两个参数最容易被随手拍脑袋。实际上,对一栋楼而言,你可以用稳态法做一个粗略估计:把空调开到固定功率,记录房间温度从初始值到稳定值的时间响应曲线,根据升温速率和最终稳态温差反推R和C。这个方法不需要专用设备,一个温度传感器加一小时记录就能得出可以用的数量级。R偏大C偏小时,模型会高估虚拟储能的调节能力,优化结果在真实环境下根本不满足温度约束,这类模型最怕“仿真跑得漂亮、一接实际就崩”。
分时电价差也是决定虚拟储能价值的关键因素。如果峰谷电价差小于0.2元/kWh,空调的负荷转移成本很可能覆盖不了收益,调度器自然会让空调保持出力平稳,虚拟储能没有存在感。反过来,峰谷差价越大,虚拟储能的利润空间就越明显,策略也越激进。所以评估一个楼宇适不适合做虚拟储能调度,第一步不是写模型,而是先看它的电价结构。
时间步长方面,15分钟是调度效果和求解速度的平衡点。步长取5分钟,模型会更精确,但求解时间成倍增加;步长取1小时,峰谷切换时刻的功率跳变就看不出来了。如果一开始调试经常无解,先把步长放宽到30分钟,跑通逻辑后再改回15分钟,效率会高很多。
5.3 扩展思路
这个模型框架做出来之后,可以往多个方向扩展。第一个是滚动优化,把日前调度改为每15分钟滚动更新一次窗口,每次只执行第一个时段的决策,这样能吸收光伏和负荷预测误差,是目前工程落地最主流的做法。第二个是鲁棒优化或随机优化,把光伏出力的不确定性显式放进约束,虽然模型复杂度上升,但调度结果的安全裕度会显著改善。
第三个方向是多楼宇聚合。单栋楼的虚拟储能容量有限,参与市场没有话语权;如果在一个园区内把多栋楼的空调负荷聚合起来统一调度,整体调节容量就能上一个量级,园区与电网的交互空间会更大。第四个方向是参与需求响应市场,把虚拟储能作为投标资源参与调峰辅助服务市场,让空调负荷调节产生额外收益。沿着这套代码的框架往上加约束、加随机参数,并不会推翻重来,扩展路径相当顺滑。
最后说一点我自己的真实体会。虚拟储能这个概念听起来很高级,但实际上整套方案的价值含量完全取决于两个前提:一是空调热模型参数是不是贴近实际,二是舒适惩罚系数是不是真正反映了用户的真实感受。很多论文里的调度曲线漂亮得一塌糊涂,一到实际楼宇就跑不动,十有八九问题出在这两个参数上。建议跑通本文代码之后,先花时间用实测温度数据校准R和C,再根据实际电价差和用户接受度去调整λ。模型本身并不复杂,把这两个前提打磨到位,整个调度的实用价值会比默认参数高出一个台阶。后续做扩展时,优先考虑滚动优化和组合式调节,这套方案的底子足够扎实,完全可以作为长期迭代的起点。