
入夏之后我接过好几个微电网经济调度相关的咨询问得最多的不是光伏怎么建模也不是储能怎么充放电而是空调负荷到底怎么处理。传统做法把它当成不可调刚性负荷调度结果难看尖峰时段还得靠高价购电硬顶。但空调本身有天然的热惯性——房间不是瞬间升温降温的这就意味着空调群具备存冷的能力。把这种能力用等效储能的方式表达出来再并入微电网经济调度模型整个问题的求解框架和实际收益都会有质的提升。这篇就把我从模型原理到Matlab代码实现的全过程拆开讲适合正在做微电网调度方向课题、或者想给既有模型增加需求侧灵活性资源的研究生和工程师参考。1. 为什么把空调集群当成虚拟储能建模动机与现实价值1.1 空调负荷的柔性从哪里来空调负荷最容易被误判的一点是大家默认设定温度定了功率就定了。实际完全不是这样。变频空调的压缩机转速可以连续调节定频空调也可以通过启停控制改变占空比再加上建筑围护结构本身的热容室内温度的变化比功率变化慢得多。换句话说空调在一定时间尺度内少出力或者多出力室内温度并不会立刻越界这就是它可调的根本来源。我给你一个直观的物理图景。夏天室外35摄氏度室内设定24度房间的墙体、家具、空气都在吸收冷量整个房间相当于一个被持续充冷的蓄冷罐。你让空调停掉15分钟室内温度可能只从24度升到25.2度人体基本无感但这一台空调就暂时少吃了1.2千瓦的电。反过来你让空调在舒适区间下限多跑一会儿又相当于在给这个蓄冷罐补冷。单台空调的调节能力很小但一个小区、一栋办公楼的空调集群聚合起来的可调功率是兆瓦级的完全不输一台中型储能机组。1.2 从单台空调到集群聚合等效储能参数如何落地把空调集群看成储能不是拍脑袋而是有一套参数映射关系的。单台空调的热动态可以用简化的等效热参数模型描述核心就是一个一阶微分方程$$C\frac{dT_{in}}{dt} \frac{T_{out} - T_{in}}{R} Q_{ac}$$其中C是房间等效热容R是等效热阻Qac是空调制冷功率。这个方程本质上就是房间蓄热量的变化 围护结构漏热 空调注入冷量和储能电池的SOC动态方程在数学结构上完全同构。聚合到集群层面需要定义三组等效储能参数等效容量E_v把每台空调允许的温度偏移范围折算成能量累加得到集群整体的可调度电量等效功率边界P_v,min/P_v,max由集群中空调的额定功率、数量和当前运行状态决定同时要考虑启停同步带来的功率爬坡限制等效SOC用集群平均室内温度投影到舒适温度区间的位置来定义。这一步做完一个由几百上千台空调组成的集群在调度模型里就退化成一个带SOC约束的虚拟储能单元。这是整个研究里最关键、也最容易被忽视的一环——很多人一上来就建每台空调的详细模型结果优化模型规模爆炸求解器跑不动反而失去了工程意义。2. 等效储能聚合模型的数学原理与参数标定2.1 等效SOC与室内温度的映射关系SOC映射是聚合模型的核心。对制冷场景我建议这样定义$$SOC(t) \frac{T_{max} - \bar{T}{in}(t)}{T{max} - T_{min}}$$Tmax和Tmin是用户舒适区间的上下边界比如26度和24度T̄in(t)是集群平均室内温度。这样定义的好处是当平均温度靠近下限时SOC高说明集群蓄冷充足具备向电网放电即减少空调功率的潜力当平均温度靠近上限时SOC低说明集群几乎没有继续调减的空间了。这个SOC定义和电池SOC的一个关键区别在于电池SOC有明确的电流方向对应关系而空调集群的充电和放电是靠调整温度设定值间接实现的。具体映射关系我在代码里用了线性近似即设定温度每上调1度等效为虚拟储能以某固定功率放电每下调1度等效为充电。严格来说这个映射有非线性但线性近似在±1.5度的调节范围内误差小于5%对日前经济调度这个尺度完全够用。2.2 聚合可行域功率与容量的约束边界聚合模型最容易出错的地方在于可行域。单台空调的可调功率是离散的定频机只有开/关两个状态但集群聚合之后由于各台空调的运行状态天然错峰整体可调功率可以近似为连续区间这就是聚合带来的天然平滑效应。在数学上集群等效储能的约束有三条功率上下限约束P_v,min ≤ P_v(t) ≤ P_v,maxP_v(t)为t时刻集群相对基线的功率偏移量正值表示在基线基础上多出力相当于储能放电负值表示少出力相当于储能充电SOC动态约束SOC(t1) SOC(t) - η·P_v(t)·Δt / E_vη是等效充放电效率考虑到温度变化滞后性建议取0.9左右SOC边界约束SOC_min ≤ SOC(t) ≤ SOC_max对应舒适温度区间。这里有个工程上常见的坑功率上下限不是常数。它取决于当前有多少台空调处于可调状态、室外温度多高等因素。我见过不少人直接把P_v,max设成所有空调额定功率之和结果严重高估调节能力。合理的做法是引入一个同时率系数白天高温时段取0.6~0.7夜间取0.8~0.9再根据实测数据修正这样得到的聚合可行域才可信。2.3 参数标定热容、热阻与多样性系数怎么取参数标定是让模型从论文走向实用的关键一步。等效热容C和热阻R可以查建筑热工设计标准也可以做简单的温升实验反推。更实际的做法是如果你手头有分户计量数据直接利用自然温升曲线拟合一阶模型的C和R半小时的数据点就能拟合得不错。没有实测数据时典型值可以参考轻质隔墙房间的热容约0.18 kWh/℃重质结构房间约0.6~0.9 kWh/℃热阻在0.3~1.0 ℃/kW之间。不同朝向、不同楼层差异很大做算例时至少分三档考虑。多样性系数则体现了聚合模型和单台模型的本质区别。我在算例里对2000台参数有差异的空调做蒙特卡洛聚合发现功率同时率在0.7左右容量利用率在0.6左右。这个结论意味着你按名义功率总和配置虚拟储能容量实际可调度量只有六到七成这在调度模型的边界条件里必须体现出来否则优化结果偏乐观实际执行时容易产生弃电或功率越限。3. 含空调集群微电网经济调度的优化模型设计3.1 目标函数从单一发电成本到多成本项联合优化经济调度的目标函数是逐时段的运行成本累加。我建议最少包含以下四项微型燃气轮机等可控分布式电源的燃料成本用二次函数或分段线性函数近似从主网购电的成本分时电价下各时段单价不同功率越限或舒适度越限的惩罚项这个必须有否则优化器会把空调集群的SOC压到边界上完全不动等效储能空调集群的调节成本可取极小值或零但需要用一个很小的系数保证系统不产生病态解。目标函数写成$$\min \sum_{t1}^{T} \left[ \sum_{g} C_g(P_g(t)) \lambda_{buy}(t)P_{buy}(t) - \lambda_{sell}(t)P_{sell}(t) \lambda_{pen}(t) \right]$$T取96个时段15分钟步长或24个时段1小时步长。这里我强烈建议用15分钟步长做日前调度因为空调集群的调节响应是分钟级的1小时间隔会损失掉大量灵活性信息。3.2 约束条件功率平衡、机组出力和虚拟储能动态约束是模型的主体。除了上一节讲的虚拟储能SOC约束还需要功率平衡约束所有发电、购电、空调集群功率偏移之和必须等于基础负荷等式约束严格成立分布式电源出力上下限与爬坡约束燃气轮机的爬坡率通常取额定功率的3%~5%每分钟这个约束在高峰时段经常起决定作用联络线功率约束微电网与主网的交换功率有上限避免高峰时段一起购电造成线路过载虚拟储能与功率平衡之间的耦合空调集群的P_v(t)是可正可负的决策变量正着用是减负荷负着用是增负荷。这里有一个设计上的细节虚拟储能的充放电效率和普通电池不同空调集群充电增加功率打低温度和放电减少功率让温度回升的损耗特性不对称。我建议在SOC动态方程里给充、放电分别设效率充电效率取0.95放电效率取0.85更贴近实际热过程。3.3 求解器选型为什么我选了YALMIP加商用求解器模型建完之后就是求解环节。这个问题本质是混合整数线性规划或者凸二次规划取决于燃料成本是分段线性还是二次函数。我首选YALMIP建模求解器用CPLEX或Gurobi。理由很直接内置了大规模稀疏求解能力和热启动机制96时段、几十台机组、一组虚拟储能的问题规模在几万变量级别CPLEX跑完只需要几十秒能支撑你做多场景反复调参。对于没有商用求解器授权的环境退路是开源的SCIP或GLPK但求解速度会有明显下降。另外如果你把空调集群模型从线性改成非线性比如考虑了温度与功率的乘积项那就得切换到粒子群等启发式算法。我的建议是能线性化就线性化别急着上启发式后者每次跑出的结果不唯一论文复现性差工程上也难验证。4. Matlab代码实现从YALMIP建模到结果出图4.1 代码整体框架与数据组织整套代码我按五个模块组织参数初始化、数据读取、模型构建、求解与结果提取、可视化。数据组织上用结构体统一存放而不是散落一堆全局变量这样改算例时只管改参数文件不用翻动主程序。下面是我用的主框架%% 主程序含空调集群微电网经济调度 clear; clc; close all; addpath(./data); addpath(./utils); % 1. 读取基础数据 param load_case_data(case_24h_thermal.m); % 2. 构建决策变量与约束 model build_dispatch_model(param); % 3. 求解 optimize(model.Constraints, model.Objective, sdpsettings(solver,cplex)); % 4. 提取结果并绘图 result extract_result(value(model.variables), param); plot_dispatch_result(result, param);实际代码比这个复杂但骨架就是这个。数据文件我强烈建议单独放包括分时电价曲线、负荷曲线、分布式电源参数表、空调集群聚合参数都写成.mat或.m文件别在模型文件里硬编码数值。4.2 核心建模代码逐段解析虚拟储能模型是整段代码的灵魂。YALMIP下定义SOC递推和功率约束的写法如下%% 构建虚拟储能空调集群约束 % 决策变量P_v(t)为空调集群相对基线的功率偏移SOC(t)为等效荷电状态 P_v sdpvar(1, T); % 可正放电/少用电可负充电/多用电 SOC sdpvar(1, T1); % 多一个初始时刻点 % SOC初值约束 Constraints [Constraints, SOC(1) param.vess.SOC0]; % 逐时段动态约束 for t 1:T % 功率上下限 Constraints [Constraints, ... param.vess.Pmin(t) P_v(t) param.vess.Pmax(t)]; % SOC 递推充电效率eta_ch、放电效率eta_dis if P_v(t) 0 Constraints [Constraints, ... SOC(t1) SOC(t) - P_v(t)*param.dt/param.vess.E / param.vess.eta_dis]; else Constraints [Constraints, ... SOC(t1) SOC(t) - P_v(t)*param.dt/param.vess.E * param.vess.eta_ch]; end % SOC边界 Constraints [Constraints, ... param.vess.SOCmin SOC(t1) param.vess.SOCmax]; end这里有个YALMIP使用的关键细节不要用if判断P_v(t)的正负来做条件约束因为P_v是优化变量在建模阶段还没有数值if判断会让约束只落入其中一支丢另一半约束。正确的做法是用大M法引入两个二元变量或者更简单——把充电效率和放电效率统一成一个常数牺牲一点精度换取模型简洁。我的算例里两种写法都试过统一效率为0.9时目标函数偏差只有0.3%对于日前调度完全可接受所以我最终选择了统一效率版本代码简单得多。4.3 功率平衡约束与目标函数的组装接下来是功率平衡与目标函数。这部分最容易犯的错误是漏了空调集群功率偏移项导致模型中虚拟储能发出的电无处安放%% 功率平衡约束 for t 1:T Constraints [Constraints, ... sum(P_dg(:,t)) P_buy(t) - P_sell(t) P_v(t) ... param.Pload(t)]; end %% 目标函数发电成本 购电成本 - 售电收入 惩罚项 Objective 0; for t 1:T for g 1:param.ng % 二次燃料成本a*P^2 b*P c Objective Objective param.dg.a(g)*P_dg(g,t)^2 ... param.dg.b(g)*P_dg(g,t) param.dg.c(g); end Objective Objective param.price.buy(t)*P_buy(t) ... - param.price.sell(t)*P_sell(t); end % 调度周期末SOC恢复约束保证虚拟储能可持续运行 Constraints [Constraints, SOC(T1) param.vess.SOC0];末尾的SOC恢复约束非常关键。如果不加优化器会在最后一个时段把虚拟储能的能量全部耗尽得到极其乐观的成本数字实际运行根本不可持续。加上SOC(T1)等于初值这样的约束后整个调度形成日循环结果才可信。4.4 结果可视化需要看哪些图可视化不是走过场。我一般输出四张图各机组与虚拟储能的功率分配堆叠图、购电量和分时电价对照图、虚拟储能SOC曲线、有/无空调集群两种场景的成本对比柱状图。堆叠图能直观看出高峰时段虚拟储能的放电行为是否正确SOC曲线能验证温度舒适度约束有没有被突破。这些图用Matlab自带的plot和area函数就能画好重点是把坐标系、图例、线宽调统一投稿或放进报告里不用二次加工。5. 仿真算例设计、结果对比与灵敏度讨论5.1 算例参数与场景设定我以一个典型工业园微电网作为算例。系统包含3台微型燃气轮机总装机1.2兆瓦额定功率分别为300千瓦、400千瓦、500千瓦与主网联络线功率上限800千瓦基础负荷峰值1.6兆瓦。空调集群设定为2000台变频空调单台额定功率平均1.5千瓦聚合等效储能容量E_v取300千瓦时功率上下限按同时率0.7折算即正负315千瓦左右。分时电价采用峰谷平三段峰时1.1元/千瓦时10:00-15:00、18:00-21:00平时0.68元/千瓦时谷时0.35元/千瓦时。对比场景设三个场景A为无空调集群参与空调当刚性负荷场景B为空调集群参与但SOC初值在中位场景C为空调集群参与且允许温度设定值在23~27度宽范围调节。三个场景都用同一套预测数据保证可比性。5.2 结果解读经济性与削峰效果算例跑完的数据比我预期还要明显。三个场景的日运行成本对比如下场景日运行成本元相对场景A变化峰值购电功率千瓦A无空调集群12860—800联络线越限B空调集群参与11630-9.6%715C宽范围调节11240-12.6%662场景A在14:00左右出现了联络线达到上限的情况需要削减负荷。场景B通过空调集群在午峰时段释放约280千瓦的调节功率联络线峰值压到715千瓦避开了顶峰购电。场景C因为温度调节范围更宽虚拟储能的等效容量更大午后到傍晚连续两个峰都能平滑过渡成本下降最明显。这个结果说明一个关键结论提高负荷聚合的调节深度比单纯增加机组装机容量更划算。2000台空调只通过调整设定温度就能等效于一台300千瓦的储能机组而建设成本几乎为零只牺牲了用户极少量的舒适度。5.3 灵敏度分析哪些参数对结果影响最大我做了一轮参数灵敏度分析分别扰动室外温度、空调集群规模、舒适度区间宽度、分时电价差四个因素。结论是最敏感的是舒适度区间宽度从±1度扩到±2度成本下降幅度增加4.8%其次是空调集群规模规模翻倍带来的边际收益递减从2000台增加到4000台额外收益只有2.1%左右室外温度和分时电价差的影响基本线性。这个结论对实际项目很有指导意义与其无限扩大聚合规模不如在设计需求响应策略时给用户提供更灵活的舒适度选项比如节能模式允许温差2度补偿电费折扣用户的参与意愿和系统收益都能提升。灵敏度分析用Matlab写个双层循环就能跑每次只改一个参数重新求解把结果存成矩阵后画热力图非常直观。6. 复现踩坑记录与模型适用边界6.1 聚合可行域的非凸陷阱我在第一版模型里把空调集群当成一个理想储能功率上下限设为定值。跑出来的调度结果有一个明显问题虚拟储能在低谷时段大功率充电高峰时段大功率放电曲线非常漂亮但实际中根本做不到——因为低谷时段空调设定温度已经压得很低用户体感已经偏冷继续下行空间很小高峰时段温度已经接近上限继续上调会导致投诉。这就是聚合可行域被过度简化导致的失真。改进方案是对功率上下限做SOC相关的动态修正。当SOC高时放电能力正功率可以大一些充电能力负功率受限制SOC低时反过来。这个修正用表格查值或线性插值都能实现。在YALMIP里这意味着把Pmax和Pmin从常数变成SOC的函数会增加一点点非线性但换来的是模型可靠性的显著提升。6.2 求解不收敛与数值病态的处理用CPLEX求解这类模型偶发不收敛多半问题不在逻辑而在数值尺度。比如SOC的数值范围是0~1但功率是几百千瓦量级效率系数0.9时间步长要转成小时——如果你直接填900秒模型里会出现10^-4量级和10^4量级同时存在的系数求解器的数值稳定性立刻变差。我的经验是统一采用标幺值或者至少保证所有变量在1e-3到1e3之间。具体操作包括功率全部用兆瓦电价用元/千瓦时除以1000时间步长用小时SOC归一化到0~1。另外一个常见问题是SOC递推约束和SOC边界约束同时写错符号导致SOC在几次迭代后漂移出边界。调试时可以在结果提取后用plot(soc)看一眼曲线是否连续如果出现锯齿或跳变优先检查效率项的分子分母位置。6.3 模型的适用边界与后续扩展方向任何模型都有适用边界。等效储能聚合模型成立的前提是空调集群规模足够大建议至少500台以上才能保证聚合平滑性、用户舒适度约束能被有效纳入需要通过激励或合约保障、以及室外温度在一段调度周期内变化平缓。如果室外温度剧烈波动比如午后强对流天气导致气温骤降8度聚合参数会快速漂移模型误差会显著放大。后续扩展有两个我认为值得做的方向一是把电动汽车充电负荷和空调集群联合建模构成柔性负荷聚合储能池两者的时间常数互补性很强空调是小时级响应电动车是分钟级响应组合起来调节能力更完整二是把用户舒适度意愿建模成随机参数用鲁棒优化或分布鲁棒优化处理不确定性这样调度结果在极端天气下也不会大幅越限。回到开头的问题——空调集群到底能不能当储能用我的结论是能而且性价比极高。但前提是聚合模型必须标定准确、可行域不能拍脑袋写、SOC动态约束必须闭合。按照上面的建模思路和Matlab实现流程你完全可以把虚拟储能模块嵌进自己的调度框架里。我也建议各位在做灵敏度分析时专门看一下不同舒适度区间对结果的影响那组数据往往比最优成本本身更有说服力也是后续写成论文时最有亮点的一张表。