楼宇微网虚拟储能与电池联合优化调度Matlab实现
开头做楼宇微网优化调度的人估计都有同感真正卡脖子的往往不是算法本身而是“储能系统从哪来”。一套能用的锂电池储能带PCS、带BMS、带施工动辄几十上百万项目还没立项预算就把你劝退了。但换个角度想楼宇里最大的一笔弹性负荷——空调其实本身就是一个“还没接入调度的半块电池”。这几年需求侧虚拟储能系统Virtual Energy Storage, VES在微电网研究里越来越热说白了就是利用楼宇围护结构的热惰性和温控负荷的可调节空间在电价低谷蓄冷、电价高峰释放从电网侧看起来跟电池充放电没有本质区别但几乎不用额外硬件投资。这篇文章我把一套可以跑的Matlab版本楼宇微网优化调度模型完整拆开讲从虚拟储能原理、楼宇热力学建模、数学优化问题列式到Yalmip / 优化工具箱代码、仿真结果和实操中容易踩的坑一条线梳理下来。适合正在做微电网调度、建筑能源管理、需求响应方向研究的学生和工程师参考照着这段代码改改参数就能迁移到自己的场景里。1. 需求侧虚拟储能到底是什么把楼宇本身变成“电池”1.1 虚拟储能的核心思想虚拟储能不是一个具体的物理设备而是一种“资源聚合视角”。它把楼宇里那些看起来只能被动用电的负荷重新定义成可以随调度指令改变用电时序的调节资源。最典型的对象就是空调、新风机组、电热水器这类具有热惯性的设备。你可以把整个楼宇想象成一个巨大的热水袋白天太阳晒、设备散热、人体散热让楼宇内部蓄满了热量空调需要不断做工把它抽出去但如果允许室内温度在舒适范围内波动比如22到26度那么空调完全可以在电价便宜的时段多制冷把“冷量”存在楼板、墙体、家具和空气里在电价贵的时段少开机靠建筑自身的热惯性维持住舒适度。对电网来说这个行为跟电池在谷时充电、峰时放电一模一样只是能量介质从电化学变成了热量。这段话里最关键的一个词是“舒适范围”。没有这个温度允许区间空调只能恒温运行虚拟储能就没有调节空间有了这个区间室温本身就是SOC墙体楼板本身就是电池容量。楼宇的热容越大、允许温度范围越宽虚拟储能的“容量”就越大。1.2 楼宇微网为何是虚拟储能的理想落地点楼宇微网是整个微电网家族里最适合吃虚拟储能红利的场景原因有三条。第一空调负荷占比足够高。以典型商业办公楼为例暖通空调系统能耗通常占到楼宇总能耗的40%到60%这意味着调节空调功率对整条馈线功率曲线的重塑能力非常可观。光伏出力在午间达到峰值时空调多制冷不仅不增加峰值购电反而把多余光伏电量就地转化为冷量存起来既提高了新能源自消纳率又压低了午后的制冷需求。第二楼宇具有天然的热时间常数。混凝土楼板和墙体、室内家具、隔断都是巨大的蓄热体等效热容动辄几十kWh/℃温度响应时间常数通常在1到3小时这跟电网分时电价的时间尺度完全匹配。夜间谷段预冷2小时可以支撑午高峰覆盖1到2小时调度窗口非常舒服。第三楼宇已经有现成的执行层。楼宇自控系统BAS/BA系统本来就是为暖通设备服务的温度设定值、风机盘管启停、水阀开度这些都是可写参数。代码层面的优化调度结果通过BACnet或Modbus下发到DDC控制器就能落地执行不需要像户用储能那样额外铺通信链路。为了直观理解容量尺度我经常用一个快速估算公式虚拟储能等效容量 ≈ 楼宇综合热容C × 允许温度范围ΔT。假设一栋楼的等效热容是40 kWh/℃后面我会讲怎么估温度范围取4℃等效冷/热储能容量就是160 kWh。要知道一套200 kWh的锂电池储能设备加施工成本少说几十万而这个“建筑电池”是楼宇本来就有的。2. 楼宇微网系统建模从设备到运行约束2.1楼宇微网的供电与用能结构先定义一下这篇里用的楼宇微网结构。它采取并网运行模式主要包含四部分屋顶分布式光伏、一组容量有限的物理储能电池磷酸铁锂假设已经配置好、楼宇常规负荷照明、插座、电梯、办公设备以下简称基础负荷以及若干台负责温控的空调/制冷机组。系统通过公共连接点与大电网进行功率交换只考虑向电网购电的工况余电不上网。这样的结构在商业楼宇里很常见。光伏容量大概在100到300 kWp数量级基础负荷白天峰值可能到200到300 kW夜间只有几十kW空调作为核心可调资源功率上限通常在50到100 kW物理储能电池容量取200 kWh量级功率上限100 kW。功率平衡关系可以写成P_pv(t) P_dis(t) P_grid(t) P_load(t) P_ch(t) P_hvac(t)其中P_pv是光伏出力P_dis是电池放电功率P_grid是购电功率P_load是基础负荷P_ch是电池充电功率P_hvac是空调电功率。t表示某个调度时段本文按1小时为间隔调度周期为24小时。2.2 温度控制负荷的ETP等效热参数模型虚拟储能能不能建模、调度准不准核心全在空调和建筑围护结构耦合的热力学模型上。这里我采用最常用也最容易被Matlab求解器接受的等效热参数模型Equivalent Thermal Parameters, ETP它把整栋楼宇的热动态等效成一阶RC电路热阻R代表围护结构阻止热量传递的能力热容C代表楼宇蓄热能力。连续时间的热平衡方程为C_th · dT_in/dt (T_out - T_in) / R Q_gain(t) - COP · P_hvac(t)其中T_out是室外温度T_in是室内温度Q_gain是室内热源增益人体、设备、透过玻璃的太阳辐射得热COP是空调制冷能效比P_hvac乘以COP就是空调实际从室内搬走的热功率。离散化后得到调度模型里实际用的递推式T_in(t1) T_in(t) (Δt / C_th) · [ (T_out(t) - T_in(t)) / R Q_gain(t) - COP · P_hvac(t) ]这个递推式的物理含义很直观如果室外热、太阳晒、人多室温上升如果空调制冷功率大室温下降。Δt取1小时整条温度轨迹由初始室温T_in(1)递推得到。2.3 物理储能与虚拟储能在调度中的角色差异物理电池和虚拟储能在时间尺度、成本结构和控制逻辑上有明显差异不能简单互相替代。物理电池响应速度快毫秒到秒级能量密度高可以平抑分钟级的功率波动但它有容量退化问题循环寿命有限虚拟储能响应速度慢分钟级容量取决于建筑热容和舒适度范围但它几乎没有边际使用成本而且用的时候不用心疼“充放电循环”。两个放在一起各自的定位就很清晰了物理电池负责快尺度调节和短时功率支撑虚拟储能负责慢尺度的能量搬移和削峰填谷。下表是我做的对比方便各位快速理解维度物理储能电池楼宇虚拟储能能量介质电化学能冷量/热量建筑蓄热体投资成本高电池PCS施工几乎为零利用既有设备响应速度毫秒至秒级分钟级容量来源电芯数量决定热容C × 允许温差ΔT循环寿命约束充放电次数受限建议加退化成本无磨损概念天然缺陷容量衰减、热失控风险受舒适度约束、泄放速率慢所以真实项目里最合理的策略是两者协同电池承担波动平抑和应急支撑虚拟储能承担分时套利和削峰填谷。这也是联合调度价值最大的原因。3. 优化调度问题怎么列式目标函数与约束条件3.1 目标函数设计从经济性出发先想清楚一个问题调度模块到底在优化什么对楼宇业主而言最直接的KPI就是一天下来花在电网购电上的总电费。所以目标函数的第一项也是最核心的一项是全天各时段购电功率与分时电价的乘积之和。在此基础上为了不让电池被“白嫖”我会在目标里加一项电池退化成本按充放电电量线性折算为了让温度稍微越限也没关系后面会说为什么需要松弛再加一个带惩罚系数的越限项。完整的目标函数如下min J Σ_t [ C_price(t) · P_grid(t) · Δt ] λ_deg · Σ_t [ P_ch(t) P_dis(t) ] · Δt M · Σ_t s_temp(t)C_price是分时电价λ_deg是电池退化成本系数M是温度越限惩罚的系数s_temp是温度越限的松弛变量。这个目标函数是线性的配合线性约束后可以交给线性规划或混合整数线性规划求解器高效求解Matlab生态里对应linprog和intlinprog。电价序列这一段我通常直接采用当地电网的峰谷分时电价。文章后面的仿真里我用的是简化三段式谷段0.35元/kWh、平段0.68元/kWh、峰段1.1元/kWh重点是验证方法电价高低不影响模型结构。3.2 约束条件详解每条约束的物理意义接下来是把上一节描述的设备特性转化成数学约束。整套约束分五组我按编号列一下第一组是功率平衡约束也就是前面提到的等式。这个约束不能被打破整个楼宇的发电、用电、买电、充放电在任何一个时刻都必须满足能量守恒。第二组是物理电池约束。包括SOC递推式、SOC上下限、充电功率上限、放电功率上限以及避免同时充放电的约束。SOC递推为SOC(t1) SOC(t) (η_ch · P_ch(t) - P_dis(t) / η_dis) · Δt / E_bat其中η_ch和η_dis分别是充放电效率E_bat是电池容量。避免同时充放电这个约束在纯线性规划里有时不加也能得到正常解但加了更稳妥防止求解器在效率参数特殊时出现“边充边放”的伪结果。第三组是空调/虚拟储能约束。包括ETP热平衡递推式、室温上下限带松弛、空调功率上下限。这是整个模型最容易出问题的地方温度约束如果写得太死夏季最热时段很可能无解。第四组是电网交互约束。购电功率非负且不超过联络线容量P_grid_max这一条在工程上对应变压器容量或并网协议中约定的最大需量。第五组是变量非负约束和初始值定义。初始SOC、初始室温都必须作为参数输入不能从优化里凭空冒出来。3.3 虚拟SOC的定义与“电池视角”如果想用储能的思路来理解虚拟储能就绕不开“虚拟SOC”这个概念。我定义虚拟SOC为VES_SOC(t) (T_max - T_in(t)) / (T_max - T_min)注意这是在制冷季的场景下。当室温等于T_min比如22℃说明楼宇已经充分蓄冷虚拟SOC等于1相当于电池充满当室温等于T_max比如26℃说明蓄存的冷量已经释放完毕虚拟SOC等于0相当于电池放空。这样定义的好处是虚拟储能可以和物理储能放在同一个框架下做联合调度优化目标、约束表达、结果分析都能沿用储能的语言体系读者看结果图的时候也不用切换思维。有个细节值得展开虚拟储能的“充放电功率”不是某个设备的功率而是相对基准的功率变化量。基准可以取“维持室温在设定值24℃所需的空调功率”高于基准的部分相当于充电低于基准的部分相当于放电。但实际建模时我根本不显式定义基准直接用ETP方程把空调功率和室温轨迹绑定在一起优化器自己会算出来最优的蓄放策略。4. Matlab代码实现全过程从模型到可运行的调度程序4.1 整体程序框架与输入数据准备我这套代码采用Matlab Yalmip的方式编写。Yalmip是一个建模层把优化问题用接近数学语言的写法描述出来然后再调用底层求解器。用它的原因是代码可读性好后续改成MPC、多场景随机优化都方便。如果不想装Yalmip也可以纯用linprog但要把所有约束化成矩阵形式代码会平白多出很多索引工作这里不推荐新手折腾。程序结构上我分成三个文件参数初始化脚本、数据文件Excel或mat文件、主优化脚本。数据文件里放的是24小时的室外温度、光伏出力曲线、基础负荷曲线、分时电价序列这些外部数据跟参数文件分开是为了换数据集的时候不污染代码。参数表如下这些数值是我基于典型商业楼宇估算的各位做自己的算例时替换成楼宇实际参数即可参数数值说明光伏峰值功率180 kW屋顶分布式光伏电池容量200 kWh物理储能电池电池充放电效率0.95 / 0.95充、放电电池最大充放电功率100 kW单方向初始SOC0.50到1空调功率上限80 kW合计电功率空调COP3.5制冷能效比等效热阻R0.05 ℃/kW围护结构等效热容C_th40 kWh/℃楼宇蓄热能力室温下限T_min22 ℃舒适区下限室温上限T_max26 ℃舒适区上限初始室温24 ℃设定值附近最大购电功率400 kW联络线容量4.2 目标函数与约束的Yalmip表达核心优化代码我直接贴出来这段建模可以对应到前面第3节的所有数学表达式%% 决策变量定义 P_grid sdpvar(1, T); % 购电功率 P_ch sdpvar(1, T); % 电池充电功率 P_dis sdpvar(1, T); % 电池放电功率 SOC sdpvar(1, T1); % 电池SOC多一个初始点 P_hvac sdpvar(1, T); % 空调电功率 T_in sdpvar(1, T1); % 室内温度多一个初始点 s_temp sdpvar(1, T); % 温度越限松弛量 %% 约束 Cons []; Cons [Cons, SOC(1) SOC_init]; Cons [Cons, T_in(1) T_init]; for t 1:T % 功率平衡 Cons [Cons, P_pv(t) P_dis(t) P_grid(t) ... P_load(t) P_ch(t) P_hvac(t)]; % 电池SOC递推 Cons [Cons, SOC(t1) SOC(t) ... (eta_ch * P_ch(t) - P_dis(t)/eta_dis) * dt / E_bat]; % 电池上下限与功率限制 Cons [Cons, SOC_min SOC(t1) SOC_max]; Cons [Cons, 0 P_ch(t) P_ch_max]; Cons [Cons, 0 P_dis(t) P_dis_max]; Cons [Cons, P_ch(t) P_dis(t) P_bat_max]; % 电网交互限制 Cons [Cons, 0 P_grid(t) P_grid_max]; % ETP热动态方程 Cons [Cons, T_in(t1) T_in(t) dt/C_th * ... ((T_out(t) - T_in(t))/R Q_gain(t) - COP * P_hvac(t))]; % 舒适度范围带松弛 Cons [Cons, T_min - s_temp(t) T_in(t1) T_max s_temp(t)]; Cons [Cons, s_temp(t) 0]; % 空调功率范围 Cons [Cons, P_hvac_min P_hvac(t) P_hvac_max]; end %% 目标函数 Objective sum(price .* P_grid) * dt ... lambda_deg * sum(P_ch P_dis) * dt ... M * sum(s_temp); %% 求解 ops sdpsettings(solver, , verbose, 1); optimize(Cons, Objective, ops); %% 结果提取 P_grid_opt value(P_grid); P_ch_opt value(P_ch); P_dis_opt value(P_dis); P_hvac_opt value(P_hvac); SOC_opt value(SOC(1:T)); T_in_opt value(T_in(1:T));这段代码的求解器设置我留空让Yalmip根据问题类型自动选择。如果系统里装了Cplex或Gurobi它会优先调用没有的话用Matlab原生的求解器也能解LP问题。4.3 结果可视化把调度计划画出来优化跑完之后光看数值变量没有直觉一定要出图。我个人习惯画三张图第一张是24小时的功率平衡堆叠图购电量、光伏、电池充放电、空调功率一目了然第二张是电池SOC和虚拟SOC的对比曲线直观看出两种储能各自的充放电节奏第三张是室温轨迹确认整个调度过程中舒适度约束没有被打破。figure; bar((1:T), [P_grid_opt; P_pv; -P_ch_opt; P_dis_opt; P_hvac_opt], stacked); legend(购电, 光伏, 电池充电, 电池放电, 空调功率); xlabel(时段/h); ylabel(功率/kW); grid on; figure; yyaxis left; plot(1:T, SOC_opt, -o, LineWidth, 1.5); ylabel(电池SOC); yyaxis right; plot(1:T, VES_SOC_opt, -s, LineWidth, 1.5); ylabel(虚拟SOC); xlabel(时段/h); legend(物理电池SOC, 虚拟SOC); grid on; figure; plot(1:T, T_in_opt, -o, LineWidth, 1.5); hold on; yline(T_max, --r); yline(T_min, --r); xlabel(时段/h); ylabel(室温/℃); legend(室内温度, 舒适上下限); grid on;看到室温曲线贴着上限走然后谷段往下探就说明虚拟储能被调度起来了模型没有白写。5. 仿真结果与对比分析三种方案省了多少钱、削了多少峰5.1 仿真场景设置三组方案对照为了验证虚拟储能和优化调度的价值我设计了三组方案。方案A是基准场景空调恒温24℃运行电池不参与优化调度固定出力或者不出力本质上是“被动楼宇”。方案B空调恒温物理电池接入优化调度调度器可以决定电池充放电时刻。方案C空调温度在22到26℃范围内可调物理电池和虚拟储能联合参与优化调度。三组方案都用同一个光伏出力、同一个负荷曲线、同一个分时电价以保证可比性。仿真采用夏季典型日数据室外温度白天最高35℃夜间28℃光伏出力中午12点左右达到峰值基础负荷白天约250 kW夜间约50 kW。这样设置的目的是让光伏和空调在午间有一段明显的“出力重叠区”最容易观察优化策略怎么利用虚拟储能消纳光伏、压低下午高峰购电。5.2 结果对比成本、峰值与温度轨迹三组方案的仿真结果对比如下指标方案A 恒温电池不调度方案B 电池优化调度方案C 电池虚拟储能联合调度日购电成本元约4280约3650约3320峰时购电最大值kW约330约280约235谷时购电最小值kW约45约90约105光伏消纳率%约72约85约95室温波动范围℃恒温24恒温2422.0 ~ 25.6注以上数值是基于本算例参数求得的代表性结果换了楼宇参数和气象数据后数值会变但趋势一致。从结果里能很清晰地看到几条规律。第一把电池接入优化调度后日成本直接降了约15%说明“什么时候充、什么时候放”这件事本身就值钱恒温策略完全靠天吃饭。第二加上虚拟储能后成本又降了约9%峰时购电最大值从280 kW压到了235 kW说明空调参与削峰的贡献不亚于一块200 kWh的物理电池。温度轨迹方面方案C下午14点到17点室温会升到接近26℃因为调度器在电价高峰时段刻意压低了空调功率到了夜间谷段室温又被拉低到22℃出头相当于“充满电”。这跟预期完全吻合。光伏消纳率提升到95%也验证了虚拟储能在午间光伏大发阶段多制冷、就地消纳的作用。5.3 联合调度为什么能产生额外收益很多人会问方案B里的电池已经做了分时套利为什么加入虚拟储能还能再省9%关键在于两者服务的时间尺度不同。物理电池容量有限200 kWh要同时兼顾晚高峰放电和午间光伏消纳经常顾此失彼。而虚拟储能等于额外提供了160 kWh的调节空间而且它消耗的能量直接来自光伏“多余”的电量边际成本几乎为零。更关键的一点是空调功率和室温之间存在耦合这种耦合给了调度器“提前行动”的抓手。电池只能在时段之间转移电量虚拟储能却能在“电量”和“温度”两个物理量之间架桥把原本必须即时消耗的电能转化成可以延迟释放的冷量。这几百字的分析就是整个项目的核心价值所在不要只盯着储能设备和分布式电源楼宇负荷侧的物理特性本身就是宝贵的调度资源。6. 实操中容易踩的坑与几个实用扩展6.1 温度约束写死导致的无解问题第一次跑这个模型的人十有八九会在夏季午间时段遇到“problem infeasible”报错。原因是14点到16点室外温度高、得热大空调功率上限又有限如果坚持室温不得超过26℃优化器找不到可行解。这也是为什么我在约束里必须加松弛变量s_temp的原因。松弛变量放进目标函数时要配惩罚系数MM的取值不能太大也不能太小。太小了求解器会利用温度越限来过度省钱室温跑到27、28℃就失去了调度的意义太大了松弛又形同虚设。我一般取M 1000用“越限1℃的代价远超购电成本”这个量级去标定。跑完看结果里s_temp的优化值如果全为0说明舒适度都被满足了如果某些时段不为0就要回头检查是不是空调功率上限或者热容参数设置得不合理。6.2 ETP参数怎么来从估算到实测辨识ETP模型里的热阻R和热容C是影响调度结果最敏感的两个参数但也最容易被随手拍脑袋填。有一个很实用的估算思路先查建筑围护结构类型重质混凝土楼板和实心砖墙的楼宇热容通常在30到60 kWh/℃轻钢结构厂房可能只有10到20 kWh/℃热阻可以从暖通设计图纸里的围护结构传热系数反推或者参考ASHRAE手册中同类建筑的典型区间。如果楼宇已经投运且装了点表更推荐做一次“阶跃辨识”凌晨让空调停1到2小时记录室温自然上升的速率和室外温度、室内得热就能拟合出R和C。实测数据校正过的模型优化结果的可信度会高一个档次。这步不用做得很复杂用Matlab的曲线拟合工具就能处理。6.3 从日前调度到滚动优化本文给的模型是日前调度假设全天光伏出力、负荷、电价都已知且不变。实际运行中光伏预测误差下午往往比上午大楼宇负荷也经常跟预测有偏差如果一套计划跑24小时不更新累计误差会越来越大。我在做工程落地时会把同样的模型改造成MPC滚动优化每个小时重新求解一次只取第一个时段的决策指令下发然后用最新的预测数据滚动刷新。改造起来也不难把P_pv、P_load、T_out的已知序列滚动更新将当前室温实测值作为初始值求解器还是同一个。这样既保留了优化模型的经济性又具备了应对预测误差的反馈能力。想往这个方向深入的同学可以在本代码基础上加一个for循环逐时段滚动求解很快就能跑通。6.4 不用Yalmip时的改造思路最后补充一个不依赖Yalmip的路线。如果只用Matlab自带的linprog或intlinprog需要把目标函数中所有变量拼接成一个大向量x然后把每一条约束改写成Aeq·x beq或A·x ≤ b的矩阵形式。代码工作量主要在“变量编址”上我会先把变量按P_grid(1:T)、P_ch(1:T)、P_dis(1:T)、SOC(1:T1)、P_hvac(1:T)、T_in(1:T1)、s_temp(1:T)的顺序排好然后逐行写约束。这样做的好处是不依赖外部工具箱缺点是模型改到哪里都要同步改索引比较费神。对于想彻底搞清楚矩阵化过程的读者这反而是个很好的练习。我自己这几年跑下来的一个很深体会是楼宇微网调度项目里算法代码只是最后20%的工作量前面80%的时间都花在搞清楚“楼宇里到底有哪些可调资源它们的物理边界在哪”。虚拟储能的价值不在于替代物理电池而是把那些原本白白浪费的调节空间纳入到优化视野里。这篇Matlab代码能帮你把整套逻辑跑通但真正让结果可信的是你对自己那栋楼热特性参数的理解。建议拿到代码后先拿一栋真实的、有BAS系统的楼去校准参数再谈怎么给业主省电费——那时候的优化结果才真正具有说服力。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →