尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

虚拟储能融入楼宇微网优化调度:Matlab实现与算例分析

虚拟储能融入楼宇微网优化调度:Matlab实现与算例分析 楼宇微网的优化调度说到底是供需两端的平衡问题。可大多数场景下大家的目光都盯在光伏、储能电池和燃气轮机这些“硬设备”上需求侧的空调、热水器、电动车充电桩反而被当成了被动负荷。我做调度模型这几年越来越意识到一件事楼宇里真正浪费的“储能资源”其实一直都在只是没被建模进去。所谓虚拟储能就是把楼宇自身热惯性、用户舒适度允许范围、设备可中断特性都折算成可以灵活调节的功率空间让它跟电池组一样参与调度。这篇文章就用一个Matlab实现的优化调度模型完整讲讲怎么把需求侧虚拟储能融合进楼宇微网从问题建模、数学变换到代码实现和算例分析挨个拆开。适合正在做微网调度、需求响应、或者毕业设计需要Matlab仿真支撑的朋友运行环境是Matlab R2021b以上用YALMIP加求解器做MILP求解。1. 楼宇微网里的虚拟储能为什么值得纳入调度1.1 楼宇微网基础形态与运行痛点典型楼宇微网包含光伏、风机、储能电池、燃气轮机或燃料电池、上级电网联络线以及大量楼宇负荷。光伏和风机出力随天气波动楼宇负荷又有明显的峰谷特性早上上班和傍晚下班后的用电高峰非常突出。如果只靠物理储能去平抑电池容量配置就得很大初始投资直接抬高一个量级。而且很多楼宇受屋顶面积、消防规范限制物理储能扩展空间有限。更麻烦的是峰谷时段高度重叠。夏天午后光伏出力处于高位但空调负荷也在飙升等到傍晚光伏骤降空调负荷却还没降下来电网电价高、燃气价格也可能波动这时候单靠调度规程来调节传统机组往往顾此失彼。我早期做过的几个案例里楼宇微网在峰时段的弃光率不高但购电成本占比却始终压不下来问题就出在需求侧几乎没有任何可调手段。1.2 需求侧弹性负荷如何变成“虚拟储能”需求侧资源要参与优化调度核心思维不是“限电”而是把负荷的用电时间、用电功率在用户允许的范围内进行平移或调节。空调就是典型例子。楼宇围护结构本身有热惯性房间温度不会因为制冷功率改变就瞬间变化。在人体舒适度范围比如24到27摄氏度内可以适当降低或升高制冷功率相当于把冷量储存在建筑体里当电价低时提前强化制冷把建筑预冷到下限相当于“充电”电价高时适当提高设定温度、降低制冷功率相当于“放电”。这一充一放和电池的充放电行为在数学形式上几乎一致。电热水器、地暖、蓄冷空调也有类似效果。电梯、水泵这类短时工作设备在保证服务水平的前提下也可以小幅错峰。再加上楼宇内少量柔性充电桩如果允许电动汽车充电桩延时启动也能聚合出一部分可调容量。虚拟储能就是把这一大堆分散的、无法统一控制的需求侧设备通过约束建模的手段聚合成一个等效储能池并在优化调度模型里参与功率平衡。1.3 虚拟储能与物理储能协同的调度价值从调度角度看虚拟储能比物理储能复杂很多。电池充放电功率只受SOC和功率上限约束但虚拟储能的“SOC”本质上是室内温度、热水温度或可延迟任务的完成状态它的可调范围是用户舒适度边界和服务约束。如果建模不准确调度结果会给出不切实际的负荷调节量。协同起来的好处是物理储能响应快、容量有限、成本高虚拟储能响应慢、容量潜力大、成本主要来自舒适度损失。电价波动剧烈时让物理储能承担短时功率不平衡让虚拟储能承担小时级别的负荷转移整体经济性会明显提升。这一点在后文的算例对比中会有量化数据支撑。2. 优化调度问题的数学建模与目标设定2.1 设备模型与功率平衡关系楼宇微网优化调度通常采用日前调度策略时间分辨率为1小时或15分钟调度周期为24小时。设调度时段集合为T微网与上级电网交换功率为P_grid买电为正物理储能充电功率为P_ch、放电功率为P_dis光伏出力P_pv新能源部分被消纳燃气轮机出力P_gt楼宇基础不可调负荷P_base温控型负荷功率P_hvac其他柔性负荷P_fl。功率平衡关系写成P_grid P_gt P_pv P_dis P_base P_hvac P_fl P_ch每个设备的运行范围要加边界约束。燃气轮机有最小技术出力要求爬坡率约束要离散化到相邻时段物理储能需要同时考虑SOC递推、充放电功率上限和同一个时段不能同时充放。虚拟储能模型按照设备类型分开建。空调负荷方面用一个简化热力学等效模型描述室内温度变化T_room(t1) T_room(t) Δt·(R·Q_hvac(t) T_out(t) - T_room(t)) / (C·R)其中C是楼宇等效热容R是等效热阻Q_hvac是空调制冷功率。约束舒适度范围T_min≤T_room≤T_max同时允许空调功率在Q_min和Q_max之间连续调节。不同楼宇热工参数差异很大实际应用中最好用现场辨识的参数不要沿用默认值。2.2 虚拟储能的可调节域与舒适度约束虚拟储能的“充电状态”不统一需要分别处理。空调的储能状态就是室内温度相对舒适区间上界和下界的距离热水器则是蓄水温度可控电梯或充电桩是有无任务的时间窗口。为了融入统一的优化框架我习惯把每一类虚拟储能都映射成一个容量受限的功率可调对象。以空调为例定义虚拟储能的“SOC”为S_hvac(t) (T_max - T_room(t)) / (T_max - T_min)S_hvac越高代表建筑预冷越充分相当于储能电量越高。空调功率和室温变化的关系可以近似为线性差分方程推导后得到的约束形式就变成S_hvac(t1) a·S_hvac(t) b·P_hvac(t) c(t)其中a、b由热工参数决定c(t)中包含室外温度影响。这样就能复用物理储能的SOC约束框架但注意S_hvac必须严格限制在0到1之间否则会算出不合理的负荷改动量。热水器建模类似用热水温度作为状态量加上热水使用量作为扰动项充电桩则是把“可延迟性”建模为每个时段可调上限和任务完成截止时间约束。把这些资源聚合成一个聚合可调功率区间用聚合后的上下限约束参与调度。2.3 目标函数经济性优先的多因素权衡调度目标一般设为全天总运行成本最小包括购电成本、燃气成本、储能折旧成本、虚拟储能调节带来的舒适度惩罚成本、弃光惩罚成本等。目标函数写成min Σ_t ( λ_buy(t)·P_grid(t) λ_gas·P_gt(t) C_dep·(P_chP_dis) C_comf·ΔS_hvac(t) C_curtail·P_curtail(t) )其中λ_buy是分时电价λ_gas折算成燃气发电成本C_dep是物理储能等效循环折旧系数C_comf是舒适度惩罚系数ΔS_hvac是虚拟储能SOC与初始值的偏差量C_curtail是弃光惩罚。舒适度惩罚这一项非常重要如果设得太小求解器可能为了省几分钱让室内温度一直在舒适边界上震荡体验很差设得太大又会让虚拟储能完全失去调节能力等于没建这个模型。有些研究还会把碳排放纳入目标把碳排放配额成本乘以电网排放因子放进目标函数作为带权重的多目标项。这里为了突出需求侧虚拟储能的效果主目标仍然用经济成本碳排放的影响通过电网购电量和燃气耗量间接反映。3. Matlab求解实现从约束线性化到MILP程序3.1 求解器选型与算法思路楼宇微网优化调度模型属于混合整数线性规划问题MILP。燃气轮机的启停状态是0-1变量物理储能为了避免同时充放电也需要引入0-1变量或采用充放电互斥约束。Matlab里可以用内置的intlinprog直接求解模型规模不大时没有问题更推荐的方法是安装YALMIP工具包再搭配Gurobi或Cplex外部求解器处理较大规模问题。YALMIP的优势是建模清晰代码可读性高方便修改目标函数和约束。Gurobi求解MILP的速度比intlinprog快不少。如果只是做毕业设计或者小规模算例intlinprog足够如果要做长时间尺度或含大量楼宇的广义场景还是建议上Gurobi。求解思路是把上一节的所有约束写成线性不等式和等式约束把目标函数拆成线性项然后调用求解器。遇到非线性项比如功率乘以分时电价在离散时段模型中是线性乘积不用担心但涉及储能效率时充电和放电的功率损耗会引入双线性项这时要做分段线性化处理。3.2 核心代码框架与关键函数说明我用YALMIP写调度代码整体分四步参数初始化、变量定义、约束建模、求解与结果回读。下面给出核心框架。首先定义时间参数和典型负荷、光伏数据%% 参数设置 T 24; % 调度时段数小时 dt 1; % 时间步长小时 LB 100; % 与上级电网最大购电功率kW GT_max 300; % 燃气轮机最大出力kW GT_min 50; % 燃气轮机最小出力kW %% 分时电价单位元/kWh price [0.42*ones(1,8), 0.92*ones(1,4), 1.25*ones(1,4), 0.92*ones(1,4), 1.25*ones(1,4)]; %% 光伏预测出力单位kW P_pv [0 0 0 0 0 0.2 0.5 1.2 2.8 4.5 6.2 7.1 7.5 6.8 5.5 4.2 2.5 1.1 0.3 0 0 0 0 0]*40;定义决策变量%% 决策变量 P_grid sdpvar(T,1); % 向电网购电功率 P_gt sdpvar(T,1); % 燃气轮机出力 u_gt binvar(T,1); % 燃气轮机启停状态 P_ch sdpvar(T,1); % 物理储能充电 P_dis sdpvar(T,1); % 物理储能放电 u_ch binvar(T,1); % 充电状态标记 u_dis binvar(T,1); % 放电状态标记 SOC_b sdpvar(T,1); % 物理储能SOC P_hvac sdpvar(T,1); % 空调功率 T_room sdpvar(T1,1); % 室内温度约束建模中储能SOC递推和温度递推都需要留意时间索引对齐。这里把初始室温设为26度舒适度范围24到27度。空调功率的上下限根据楼宇装机容量设定%% 功率平衡约束 C_power_balance []; C_power_balance [C_power_balance, P_grid P_gt P_pv P_dis P_base P_hvac P_fl P_ch]; %% 物理储能约束 C_ess []; C_ess [C_ess, SOC_b(1) 0.5*B_cap]; C_ess [C_ess, SOC_b(2:T1) SOC_b(1:T) (P_ch(1:T)*eta_ch - P_dis(1:T)/eta_dis)*dt/B_cap]; C_ess [C_ess, 0 SOC_b 1]; C_ess [C_ess, 0 P_ch P_ch_max*u_ch]; C_ess [C_ess, 0 P_dis P_dis_max*u_dis]; C_ess [C_ess, u_ch u_dis 1]; %% 虚拟储能空调约束 C_vem []; C_vem [C_vem, T_room(1) 26]; C_vem [C_vem, T_room(2:T1) C_air*A_coef*T_room(1:T) B_hvac*P_hvac(1:T) C_hvac*T_out(1:T)]; C_vem [C_vem, 24 T_room 27]; C_vem [C_vem, 0 P_hvac HVAC_max];这里的A_coef、B_hvac、C_hvac是热力学递推方程的系数由建筑热阻热容推导。C_air是综合系数实际使用时要根据具体楼宇参数标定。目标函数与求解%% 目标函数 obj 0; obj obj price * P_grid; obj obj gas_cost * ones(1,T) * P_gt; obj obj dep_ess * ones(1,T) * (P_ch P_dis); obj obj comfort_penalty * sum(abs(T_room(2:T1) - 26)); obj obj curtail_penalty * sum((P_pv - P_pv_use)); %% 求解 ops sdpsettings(solver,gurobi,verbose,1); optimize([C_power_balance, C_ess, C_vem, ..., C_gt], obj, ops);求解后回读变量画图展示结果P_grid_opt value(P_grid); P_hvac_opt value(P_hvac); T_room_opt value(T_room);3.3 数据与参数处理技巧参数初始化时最容易出错的是单位。电价单位是元/kWh功率单位是kW能量单位是kWh时间步长是小时那么储能SOC递推公式里的dt乘以功率直接就是kWh不需要额外换算。但很多初学者会把秒和小时混用导致递推结果发散。还有一个很隐蔽的问题YALMIP的约束中温度递推方程里若使用乘法表示热容系数务必要确保系数是数值而不是变量否则会生成非线性约束整个问题变成NLP求解难度陡增。我习惯先用工作区脚本把系数算好再写进sdpvar表达式中。4. 算例测试典型楼宇日调度结果剖析4.1 测试场景与参数设置我用一个中型商业楼宇做测试建筑面积约1万平方米空调额定功率120kW基础负荷峰值260kW光伏装机峰值150kW物理储能额定容量200kWh额定功率50kW。室外温度曲线采用典型夏日的实测数据上午9点到下午6点温度较高。分时电价采用峰平谷三段制峰段1.25元/kWh平段0.92元/kWh谷段0.42元/kWh。为了对比虚拟储能的效果设置三个方案方案是否考虑需求侧虚拟储能调度策略S1否纯物理储能日前调度S2是空调可调虚拟储能参与日前调度S3是空调充电桩可调虚拟储能参与日前调度S3在S2基础上增加2个可延时充电桩每个最大功率7kW允许在夜间谷段或下午平段充电但必须在次日早晨之前完成。所有方案都用同一个光伏预测曲线和负荷预测曲线燃气轮机均参与调度保证对比公平。4.2 调度结果对比与灵敏度分析先看总费用对比。S1方案全天运行费用大约6130元S2方案降到5780元S3方案进一步降到5420元。相比S1虚拟储能参与后总费用下降了约11.6%其中空调负荷调节贡献了大约350元/天的降幅充电桩延时贡献了另外360元。直接看数据可能觉得数值不大但放大到一个月就是上万元对楼宇运营方而言很可观。从功率分布看出关键原因S1中傍晚17点到20点的峰时段物理储能放电加上燃气轮机满发仍然要从电网买不少高价电而S2在下午14点到16点利用空调预冷把一部分电能转换成冷量储存在建筑内等效把傍晚空调功率从100kW压低到65kW左右峰时购电需求明显下降。这个时段的电价差约0.33元/kWh预冷时段谷电价格又便宜一充一放之间的收益空间就出来了。虚拟储能SOC即室温反向指标的变化曲线也很有意思S2方案中室温早上从26度缓慢上升到下午14点开始主动降到24度18点后维持在25度左右没有再触碰边界。这说明优化求解器充分利用了舒适度区间而不是让温度在边界来回撞。S1方案里室内温度完全自然波动没有主动调节。4.3 结果可视化与业务解读画图的时候我习惯把四张图放在一个Figure里第一张是各电源出力和购电功率堆叠图第二张是空调功率与室温变化曲线第三张是物理储能SOC和虚拟储能“冷量”状态的对比第四张是购电费用累计曲线。用Matlab的tiledlayout很方便。从业务角度解读虚拟储能最大的意义不是替代电池而是改变负荷形态。S3方案中充电桩全部避开了峰段集中在凌晨谷段充电既满足了车主第二天用车需求又把负荷转移到了电价最低时段。这种“时序平移”恰恰是需求侧虚拟储能的核心价值——它在不牺牲用户体验的前提下让负荷曲线跟随可再生能源出力和电价信号。灵敏度分析方面我把舒适度惩罚系数从0.01调到1元每摄氏度观察总费用和室温波动的关系。系数小时室温频繁接近24度下限节省的成本多系数大时室温几乎稳定在26度虚拟储能形同虚设。实际运营需要综合评估舒适度满意度与电费开支通常取0.1到0.3元/摄氏度比较合适。5. 代码调试经验与常见坑位复盘5.1 求解器配置与线性化检查第一次跑通这个模型的完整流程后我几乎可以确定新手会踩的坑有几个。第一个是YALMIP求解器找不到。很多人的Matlab里只有intlinprog但用sdpsettings指定了gurobi求解时会直接报错或者默认用内置算法。建议代码里加一段自动选择求解器的逻辑if exist(gurobi,file) ops sdpsettings(solver,gurobi); elseif exist(cplex,file) ops sdpsettings(solver,cplex); else ops sdpsettings(solver,intlinprog); end另一个坑是模型里偶发双线性项。空调负荷的制冷量有时候会写成P_hvac与室内外温差乘积的形式这种表达式一出现优化问题就从MILP变成MIQP求解难度陡增。如果确认要保留空调制冷量与温差耦合部分建议用分段线性化或引入新变量做Mccormick松弛但会牺牲精度。一般楼宇调度场景下简化的线性热模型已经足够不必过度纠结。5.2 虚拟储能聚合规模与计算性能的平衡把几十个房间的空调各自建模确实更精确但会引入大量状态变量和温度约束求解时间可能从几秒飙到几十秒甚至几分钟。对于日前调度来说这个耗时可以接受但如果要做滚动优化或者多楼宇联合调度就必须做聚合。聚合的思路是按热工参数相近的房间分组每组用一组温度和功率变量表示加权平均得到等效热容热阻。聚合误差通常控制在5%以内对优化结果影响很小。充电桩建模也是类似。每台充电桩都建二进制变量会大幅增加整数变量数量求解速度显著变慢。一种可行方案是采用聚合充电模型把所有充电桩的功率上限求和加一个总可延迟时间的滑动窗口约束。测试下来效果很好计算时间缩减到原来的四分之一。5.3 防止模型退化的若干边界处理我遇到过一个非常隐蔽的坑物理储能SOC递推约束中充电效率和放电效率分别乘在不同的位置但初始SOC和最终SOC没有设置约束导致优化结果会把SOC停在低值来省钱。实际上储能应该在调度周期末保持和初始差不多的SOC否则次日调度会无电可用。可以加一个软约束让最终SOC在一定范围内或者直接用终端约束SOC(T1) SOC(1)。虚拟储能同样需要终端状态约束。空调房间温度在调度周期末如果停留在舒适度边界第二天可能没有足够的冷量储备。我通常要求调度周期末的T_room接近初始值这样日与日之间的调度结果可以平滑衔接。还有一个小细节价格序列要和功率维度严格对齐。如果price是行向量而P_grid是列向量乘法计算结果维度不对YALMIP通常不报错但会生成错误的表达式最终求解结果完全不可用。用repmat或转置把维度统一写代码时最好养成dot(price, P_grid)的习惯明确按时段相乘求和。调试到模型没有infeasible报错并不代表结果可靠。我会习惯性检查每个时段的功率平衡约束残差是否在1e-6量级同时打印SOC和室温序列是否全程在可行域内。这一步看似繁琐却能快速发现时序错位的低级错误。最后分享一个小技巧模型跑通后试着把分时电价换成平电价再看虚拟储能是否还会主动调度。如果虚拟储能调节量明显减小说明模型的经济驱动逻辑是对的如果平电价下仍然出现大量预冷或负荷转移大概率是目标函数里舒适度惩罚项或者储能折旧项的量纲出了问题。这个验证思路能帮你快速从结果反推模型缺陷省下大量扒代码的时间。
返回列表