ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

考虑用户侧柔性负荷的社区综合能源系统日前优化调度

考虑用户侧柔性负荷的社区综合能源系统日前优化调度 很多做能源系统优化的人一上来就盯着供给侧那几台设备转把燃气轮机、电锅炉、储能电池的参数调到极致觉得把设备效率抠上去就万事大吉。但真把系统跑起来之后你会发现社区这一级的综合能源系统供给侧设备就那么大再怎么优化也就那几个点的提升。真正能撬动系统经济性和低碳性的关键恰恰在用户侧那些看起来不起眼的柔性负荷——空调、热水器、电动汽车充电桩甚至是一栋楼里的照明和电梯。这篇想分享的就是我近期在做的“考虑用户侧柔性负荷的社区综合能源系统日前优化调度”这个项目从建模思路、模型细节到求解过程踩过的坑都会摊开来说清楚。如果你正在做综合能源系统优化相关的工作或者想了解柔性负荷到底怎么参与调度这篇文章应该能帮你省下不少摸索的时间。这个课题的核心说白了就是把用户侧这些灵活的用电用热需求纳入到社区综合能源系统的日前调度计划里。传统调度里用户负荷是硬约束给多少就得满足多少最多靠储能和购电来削峰填谷。但当我们把一部分负荷理解成“可以商量”的——比如空调温度高一度低一度不影响居住、热水器提前两小时烧好也不影响使用、电动汽车晚一个小时充满也没问题——调度就有了更大的操作空间。这个“商量”的量化过程就是柔性负荷建模而把它放进整个系统里做滚动优化就是日前优化调度的核心工作。1. 项目整体设计与思路拆解1.1 为什么把目光投向用户侧柔性负荷社区综合能源系统这几年提得很多概念上就是把电、热、冷、气几种能源形式在社区尺度内耦合起来通过设备转换和储能来提升整体能效。常见的配置是一台小型燃气轮机或者内燃机做热电联产配上溴化锂机组、电锅炉、储电和蓄热罐再加分布式光伏。这个架构本身已经很成熟真正难的是怎么把调度策略做好。我在做前期调研的时候发现一个很突出的问题大量文献和实际项目里用户侧负荷都被当成刚性需求处理预测给多少就满足多少。这在工业园区这类负荷集中、需求刚性的场景里说得通但在居民社区场景就很浪费——居民的用电用热行为本身就有很强的弹性和时间灵活性你不管它它就是一个波动很大的刚性曲线你要是管了它它能帮你腾出很大的调节空间。柔性负荷参与调度的价值可以从一个简单的例子看出来。假设某天傍晚光伏出力骤降而社区负荷因为居民下班做饭、开空调快速攀升这时候如果负荷全是刚性的系统只能靠燃气轮机和购电顶上燃气轮机要爬坡购电价格又处于峰时段运行成本一下就被拉高。但如果此时有相当一部分空调负荷和电动汽车充电负荷可以被延迟或者降功率运行调度系统只需要把这些柔性负荷的功率曲线往后再挪一两个小时就能避开这个供需矛盾最尖锐的时段燃气轮机不用满负荷冲购电成本也能降不少社区的总运行成本自然也就下来了。1.2 社区综合能源系统的整体架构做这个项目之前我先把系统的物理架构摸了一遍。我这里用的配置是社区综合能源系统里比较典型的一种一台微型燃气轮机MT负责热电联供排烟余热进溴化锂机组制冷或者通过换热器供热光伏PV作为可再生能源主力接入电储能ESS和蓄热罐TST负责小时级能量平移外部电网作为电能补充燃气锅炉作为热力备用的最后保障。能量流动关系是这样的电母线侧光伏、燃气轮机发电、储能放电和购电一起满足社区电负荷含柔性电负荷热母线侧燃气轮机余热回收、燃气锅炉和蓄热罐放热一起满足社区的采暖和生活热水负荷含柔性热负荷冷负荷则由溴化锂机组和电制冷机联合供给。因为燃气轮机在电热两种能量之间具备强耦合关系所以整个系统的调度就变成了一个典型的混合整数优化问题而且决策变量里还得加上柔性负荷的调整量模型复杂度比我最初预想的要高出不少。1.3 日前调度的边界设定与策略选择我选择做日前调度而不是日内实时调度有两个原因。第一社区综合能源系统里的燃气轮机和储能设备都存在明显的启停和爬坡约束实时调度很难兼顾这些设备的时间耦合特性而日前调度有完整的24小时信息能把设备运行状态和储能策略统一规划好。第二需求响应和柔性负荷调整需要提前跟用户沟通比如预约充电时段、提前调整公共区域的空调设定温度这些都是小时级甚至日级决策不是实时候补来得及的。日前调度的输入数据是预测得到的典型日的电负荷原始需求、热负荷预测、光伏出力预测、分时电价和燃气价格。输出则是第二天0到24小时我为了计算方便把一天分成96个时段每15分钟一个点所有可控设备的出力计划和柔性负荷的调整计划。这个调度计划要在前一天晚上生成所以对求解时间有比较苛刻的要求不能算七八个小时才出结果否则天都亮了。这里还有一个策略选择问题柔性负荷的调整要不要付出代价。我一开始天真地以为柔性负荷可以随便调后来发现这显然不对。空调温度拉高两度用户可能能忍拉高八度就要投诉了电动汽车说好了明早七点要用车你给它排到九点才充满肯定不行。所以我在模型里给柔性负荷设置了可调区间并且引入一个用户不满意度系数调整幅度越大这个惩罚成本就越高优化求解时会在省钱和保体验之间自动找平衡。2. 柔性负荷分类与建模的实操细节2.1 柔性负荷分三类建模思路完全不同我根据负荷的物理特性和调节方式把用户侧柔性负荷分成三类可平移负荷、可削减负荷和可转移负荷。分类不同建模的时候约束形式差别很大如果混在一起处理求出来的调度计划在实际执行时很大概率会出问题。可平移负荷典型代表是洗衣机、洗碗机这类居民用电。它们的特点是整体用电过程时间固定电量固定但启动时间可以提前或延后。建模时需要引入一个二进制变量表示启动状态配合持续时间约束保证它是一个连续完整的用电过程。这类负荷在数学上处理最麻烦因为二进制变量很容易把模型搞出很大的求解规模。可削减负荷典型代表是空调、电采暖这类温控负荷。它们的运行功率在一定范围内连续可调用户舒适度允许的范围内可以适当降低功率。这类负荷用连续变量表示削减功率占比就行但需要额外加一条室内温度变化的约束把削减功率和温度偏离关联起来不然模型会把空调功率随便削到底完全不管屋里是不是已经热得待不住人。可转移负荷典型代表是电动汽车充电桩。充电需求总量不变充电时段可以在时间窗内灵活分配类似把一块充电需求面积在约束时间内平铺开。这类负荷建模比较友好只需要设置充电起始时间和结束时间窗口再对总充电量做一个等式约束就行。2.2 温控负荷建模的关键不能忽略热惯性温控负荷占居民负荷的比例超过三成尤其是夏季空调和冬季电暖器这部分必须认真建。我之前看到不少文章简化处理直接把空调功率乘一个削峰系数就完事这太粗糙了。空调降功率以后室内温度会慢慢升高这个变化是渐进的有很强的“热惯性”。如果不把这层惯性的动态约束建出来调度结果可能在纸面上很好看实际执行起来用户早就热得受不了了。温控负荷我这里采用的是等效热参数模型ETP一阶形式就够了不用上二阶模型。核心公式T_in(t1) T_in(t) Δt / (R*C) * [T_out(t) - T_in(t) - R * Q_AC(t)]其中T_in是室内温度T_out是室外温度R是建筑等效热阻C是建筑等效热容Q_AC(t)是空调的制冷功率对冬季制热就取反方向。这个公式不复杂但参数标定很烦不同建筑的R和C差异非常大。我这里用了一个相对折中的办法取社区建筑的平均值同时给室内温度约束留出舒适带比如夏季允许24到27度只要预测温度不越界就行。这样即便个别建筑参数偏了也还有舒适带的冗余兜底。2.3 电动汽车充电负荷的不确定性处理社区里的电动汽车充电负荷是近几年增长最快的柔性负荷但也是最难建模的一个因为用户插枪时间和目标电量都带很强的随机性。我这期项目里采取了一个工程化的简化处理把社区里的充电桩统一看成“夜间可调度充电资源”所有车辆在回家时段比如18点到次日8点内必须完成充电总量具体每个时段充多少由调度统一分配。这样做的好处是模型简单只需要一个总量约束加功率上下限约束不需要把每辆车的充电行为单独建模。坏处是约束过于宽松调度会倾向于把所有充电功率都压到谷电时段导致凌晨出现新的负荷高峰。后来我补了一个约束把夜间充电负荷在低谷时段内的峰谷比限制在一个合理范围比如不超过1.5这样既利用了谷电也避免制造新的尖峰。这个思路在实际项目里验证过很有效推荐有类似需求的朋友直接抄作业。2.4 用户不满意度约束怎么设才合理柔性负荷参与调度不能牺牲用户体验所以必须设置不满意度约束。我采用的是“调整量惩罚”方式在目标函数里加一项对柔性负荷的实际调整量乘以一个惩罚系数调整得越狠惩罚越大。具体系数怎么定我参考了需求响应项目里常用的弹性系数法再用当地居民电价做个参照。比如舒适温度调整1度折算成电费补偿大约是0.1元每度电对应的调节量那惩罚系数就按这个数量级设置。实际跑出来的效果是系统优先调度惩罚系数低的充电负荷其次才是空调类负荷这符合预期——充电时间稍微挪一下用户几乎无感但让人家屋里热两度用户肯定不乐意。3. 优化模型搭建与求解的实战过程3.1 目标函数经济性和低碳性的权重之争这个项目的目标函数我用了两个维度运行成本和碳排放。很多文献喜欢直接把两个目标加权成一个单目标我一开始也是这么干的但很快就发现权重系数极难定。成本权重给大了系统专门挑便宜的电买碳排放没降多少碳排权重给大了为了多用光伏少用气成本飙升得厉害根本不现实。后来我换了一种做法用“碳排放配额”的方式把两个维度统一起来。系统给一个全天的碳排放额度比如按社区户数和历史排放水平定碳排放超标时要额外付费购买碳配额这个费用计入目标函数。这样一来碳约束就从软约束变成了有价格的市场信号优化器在决策时会自动权衡购电、燃气轮机和柔性负荷调节的组合最终得到的结果既不会出现成本失控也能实实在在降碳。这个思路参考了碳交易机制的逻辑在项目落地时说服力强很多。目标函数表达式整理一下min F Σ C_buy(t)*P_buy(t) C_gas(t)*F_gas(t) C_ess_oper(t) C_flex_penalty(t) C_carbon_over(t)C_buy是分时购电价P_buy是购电功率C_gas是燃气成本C_ess_oper是储能的充放电老化折算成本C_flex_penalty是柔性负荷调整的补偿成本C_carbon_over是碳配额超标的惩罚成本。每一项的单位最后都要归一到元别混着算。3.2 约束条件从设备模型到系统平衡约束条件是这个模型里最费心思的地方。我按三个层级搭设备自身约束。燃气轮机有出力上下限、爬坡速率限制、最小运行时间和最小停机时间储能电池有充放电功率限制、SOC上下限、充放电效率还要防止同一时段边充边放燃气锅炉同样有出力限制。这些约束的物理含义很明确主要工作是把设备厂商给的技术参数翻译成数学表达式。能量平衡约束。电平衡、热平衡、冷平衡三个方程都要满足公式形式是“供给侧总功率 需求侧总功率 储能充电功率”。这一层约束看似简单但最容易出错的地方在于设备之间的耦合关系。最典型的是燃气轮机发电功率和产热功率不是独立的而是强耦合的我用的微型燃气轮机的热电比大约在1.2到2.1之间会随着负载率变化这个耦合关系没建对后面热平衡一定会出问题。柔性负荷相关约束。包括前面提到的可平移负荷启动二进制约束、温控负荷的温度动态区间约束、充电负荷的总量约束以及所有的上下限约束。这一层约束变量多、类型杂是最容易引起模型求解困难的地方。3.3 求解工具选型YALMIP求解器还是直接用Python我这次用的是MATLAB YALMIP Gurobi的组合。YALMIP最好的地方是建模环境非常友好写约束跟写数学公式差不多不容易出错Gurobi做混合整数线性规划的求解速度在业界属于第一梯队对付我这个规模的模型没有压力。当然你也可以用Python的Pyomo或PuLP来搭效果差不多选哪个主要看你更熟悉哪种语言。我个人的习惯是模型探索阶段用YALMIP因为改约束方便调试的时候可以直接看模型的结构要往生产环境部署了再迁移到Python。有一次我试过全用开源的CBC求解器跑同一个模型结果在同一个算例上CBC跑了将近40分钟才找到可行解Gurobi两分钟就出最优解了差距非常明显。如果你的课题组没有商业求解器授权可以考虑用SCIP开源求解器里它算是综合实力比较好的。3.4 模型线性化处理把非线性约束变漂亮建模过程中遇到最多的问题是模型里存在非线性项Gurobi这类商业求解器虽然也能处理一些二次约束但求解速度会大打折扣。我的做法是尽可能把所有约束线性化。两个典型的线性化场景第一个是燃气轮机的热电比变化原来是一个分段曲线我用了分段线性化处理把热电比曲线用三到四段直线逼近精度足够但求解速度提升非常明显第二个是储能电池的效率描述充放电过程中电池有损耗如果直接用非线性表达式求解起来很慢我改成固定效率系数加一个二进制变量防止同时充放电模型一下就干净了。还有一个小技巧值得分享对于二进制变量和连续变量相乘的项比如“充电桩在某时段是否工作乘以该时段的充电功率”不要直接在模型里写乘法要用大M法引入辅助变量和辅助约束来线性化。这个如果处理不当模型会变得非常难解甚至直接报错。4. 日前调度全流程实操记录4.1 数据准备预测数据的精度决定调度质量做日前调度最怕“算得准但数据不准”调度结果再漂亮也是空中楼阁。我这次的数据准备分三块负荷预测、光伏预测、能源价格。负荷预测用的是历史负荷数据加温度修正的方法。我是把过去三个月的社区总负荷曲线拿出来剔除节假日等异常日按“工作日/周末”分别做典型日曲线再用当天的天气预报温度做一次修正——温度每偏离基准值1度冷热负荷大约修正3%到5%。这个方法虽然简单但在社区这个尺度上精度完全够用没必要上神经网络那套重型工具。光伏预测我用的是数值天气预报的辐照度数据折算成光伏出力。这里有一个坑实际光伏出力还受温度影响组件温度升高后发电效率会下降所以夏季中午的时候光伏出力不是跟着辐照度走的需要额外加一个温度修正系数。我一开始漏了这个修正结果中午时段的光伏预测值比实际高了8%左右导致调度计划里购电安排偏少实际执行时不得不临时从电网多买高价电。电价和燃气价格相对简单直接用当地电网和燃气公司的分时价格表。要注意的是不同季节的峰谷时段划分不一样做年度项目时要动态调整模型参数。4.2 模型参数设定计算步长和时段数的权衡我们这里把一天分成96个时段每段15分钟。为什么选96而不是24主要原因是燃气轮机和储能设备的运行特性在小时级以下有比较明显的变化15分钟粒度能更准确地捕捉到负荷波动同时也跟现货市场的交易时段对齐方便以后扩展到电力现货市场环境。代价是模型规模明显变大。96个时段乘上几十个决策变量再加柔性负荷的整数变量我的模型大概有几千个变量、几千条约束。好在都是线性约束Gurobi解起来并不吃力一般一两分钟就能收敛到最优解。如果你的模型求解时间过长可以先把时间粒度放宽到60分钟跑通逻辑再逐步加密。4.3 核心代码实现思路模型求解的核心流程大致是数据读入、变量定义、约束写入、求解、结果输出。我这里的习惯是先用稀疏矩阵的方式定义变量索引然后逐块添加约束每个约束块用注释标明物理含义。这里给出一个柔性负荷约束的代码片段YALMIP语法方便大家快速上手%% 柔性充电负荷约束示例 % 假设: N_ev 个充电桩, T 个时段 % P_ev(t): t时段总充电功率, Pmax_ev: 最大总充电功率 % E_req: 总充电需求, eta_ev: 充电效率 P_ev sdpvar(1, T, full); % 充电功率决策变量 constraints [constraints, 0 P_ev Pmax_ev*ones(1,T)]; constraints [constraints, sum(P_ev)*dT E_req / eta_ev]; % 低谷时段集中度限制 indices_valley 33:56; % 凌晨2点到6点,即第33到56个时段 constraints [constraints, sum(P_ev(indices_valley)) 0.6 * E_req / eta_ev];这里dT是每个时段的小时数15分钟就是0.25。最后那条约束是我加的“防负荷搬移过度”约束限制低谷时段的充电电量占总需求的比例不超过60%避免优化结果制造新的凌晨负荷尖峰。4.4 求解器参数调优可行解优先还是最优解优先Gurobi求解这类模型通常很顺畅但也遇到过几天连续不收敛的“卡壳”情况。我的经验是先把MIPGap参数放宽到1%也就是允许优化结果跟理论最优值偏差在1%以内这样可以大幅缩短求解时间等模型逻辑验证无误、需要出正式结果时再收紧到0.1%。另一个有用的参数是TimeLimit我设置为300秒。如果超时我会把当前最好的可行解不是最优解但工程上可接受输出而不是一直等下去。实际项目中99%的情况下用MIPGap0.5%、TimeLimit300秒的组合几分钟之内就能拿到稳定结果。这里还要提醒一个细节Gurobi这类求解器的结果不是严格确定的尤其是整数变量特别多的时候不同版本或者不同机器上求解结果可能略有差异这不代表程序有bug。生产环境使用时最好把求解随机数种子固定下来保证结果可复现。5. 算例设置与调度效果评估5.1 三种场景对比刚性负荷、价格型柔性、激励型柔性为了验证柔性负荷参与调度的价值我设计了三种场景做对比。场景A是基准场景所有负荷都是刚性需求也就是传统调度模式场景B是价格型需求响应用户根据分时电价自行调整用电行为但这种调整是分散的、用户侧的不纳入统一优化场景C是激励型需求响应也就是我们这个项目的核心场景柔性负荷由调度中心统一优化调度用户获得补偿。为什么要做这个对比因为只有跟基准场景比过之后才能量化出柔性负荷调度到底带来了多少收益。同时对比价格型和激励型也能反映出“用户自觉削峰”和“系统统一调度”两种模式的效果差异这也是实际项目方案论证时最有说服力的数据。5.2 典型日调度结果分析我选取了一个夏季典型日高温、光伏出力强、傍晚负荷尖峰高来做详细分析。在场景A中傍晚18点到20点之间出现明显负荷尖峰燃气轮机几乎满载运行同时还要从电网购入大量峰段高价电。场景C中优化系统在下午时段提前降低了部分空调功率室内温度从24度升到25度左右用户几乎无感把电动汽车充电基本安排到了22点以后傍晚的负荷尖峰下降了将近18%燃气轮机负载率保持在高效区间避免了高负荷工况下的效率衰减。从日运行成本来看场景C相比场景A降低了约11.3%其中大部分来自峰段购电量的减少和燃气轮机运行效率的提升。碳排放方面因为系统减少了峰段碳排放因子较高的购电全天碳排放也下降了约7.8%。对比场景B场景C的成本降幅更明显说明统一调度比用户自发响应更高效这也验证了我们选择“日前优化调度”路由的正确性。5.3 柔性负荷调节深度与系统效益的关系我还专门做了一个敏感性分析看柔性负荷的可调比例从10%逐步提升到50%时系统效益指标的变化趋势。结果很有意思当可调比例在10%到20%区间时系统成本下降非常明显每增加1%的柔性负荷成本大约下降0.6%但超过30%以后边际效益递减明显每增加1%柔性负荷成本只下降0.15%左右。这个趋势背后的逻辑其实很好理解当可调比例较低时系统优先调度最“便宜”的柔性负荷即用户不敏感度最低的那部分比如充电桩用最小的代价换取最大的削峰收益当这些好调的负荷都用完之后继续增加调度深度就不得不动那些用户敏感度高的负荷比如空调温度补偿成本大幅上升净收益自然就下来了。实际的工程启示是社区在推进柔性负荷接入时不一定要追求把所有负荷都变成可调状态把充电桩、部分温控负荷等接入调度覆盖大约20%到30%的峰值负荷就够了这个比例下投入产出比最优。6. 常见问题与排查技巧实录6.1 模型无可行解怎么排查我在项目初期频繁遇到模型提示“infeasible problem”几乎崩溃。排查方法后来逐渐摸清了核心是怀疑“约束设硬了”或者“数据里有矛盾”。排查顺序应该是先查能量平衡约束尤其是热平衡和冷平衡看是不是燃气轮机产热和热负荷之间的耦合关系写错了再查储能的SOC约束看是不是初始SOC和充放电约束加起来导致无解最后查柔性负荷的总量约束看是不是充电需求写成独立固定值跟其他约束冲突了。YALMIP有个非常有用的命令在求解前用check命令检查每条约束的可行性能帮你快速定位是哪条约束导致的无解。如果一批约束同时有问题优先检查模型里时段的索引是否正确很多无解问题就是索引错了一位导致的。6.2 求解时间过长如何优化如果你发现模型规模不大但求解时间异常长首先检查是不是存在数值病态问题比如某些参数的量级差异过大电价是零点几容量是几千这种跨了数量级的系数会让求解器的数值处理变得非常慢。解决办法是对所有变量做归一化统一在0到1之间。其次检查二进制变量的数量。可平移负荷的启动二进制变量非常“昂贵”如果社区里洗衣机这类负荷数量太多可以考虑用聚类方式把它们聚成几组每组用一个代表变量表示求解速度能提升一个数量级。最后检查约束里有没有冗余的大M约束把问题的可行域切割得太碎。我之前习惯性地给每个设备都加上启停二进制变量导致模型里整数变量爆炸后来精简了部分连续调节设备的启停变量求解时间从十几分钟降到了两分钟以内。6.3 调度结果不够“平”怎么办有时候你会发现自己算出来的调度计划负荷曲线依然存在小幅波动没有想象中那么平滑。这多半是因为目标函数里没有对设备出力变化的惩罚项优化器倾向于在多个方案之间选一个“刚刚好”的解而不是“最稳定”的解。解决方式可以在目标函数里增加一个小幅度的出力波动惩罚项比如对储能充放电功率做一阶差分惩罚对燃气轮机出力也做类似的限制。这样最终的调度曲线会平滑很多在实际执行时对设备寿命更友好。6.4 调度结果与日内实时运行偏差大还有一种常见情况是日前调度结果看着挺好但到第二天实际运行时发现实际负荷跟预测偏差太大导致调度计划完全失效。这种问题根源不在优化模型而在预测环节。我建议在日前优化之后再加一层日内修正机制每15分钟更新一次超短期预测未来4小时窗口在这个窗口内重新优化一次但不改变日前已经确定的设备启停状态只调整连续变量的出力值。这样可以兼顾日前优化的全局性启停决策和日内运行的自适应性出力微调。关于这个问题我的体会是综合能源系统调度真正的核心竞争力不是把数学模型做得多么精巧而是把预测、优化和执行三个环节之间的误差闭环管理好。模型再精细预测跟实际对不上一切都是白算。6.5 用户参数不准导致结果失真最后一个经常被忽略的坑是用户侧参数的准确度。柔性负荷建模依赖很多用户行为参数比如空调的设定温度偏好、电动汽车的期望充满时间、热水器的用水时间分布这些参数在模型里都是做优化的边界条件。如果参数设置得跟实际情况偏差大——比如你把用户室内温度容忍度设成3度实际用户只能忍1度——那调度结果肯定会遭到用户投诉。我的做法是在项目启动阶段做一个为期两周的社区负荷数据采集通过智能插座和户内传感器统计各类负荷的实际使用模式用这部分真实数据来标定模型参数。在项目持续运行阶段每个月对比一次模型假设和实际行为的偏差做一次参数修正。听起来工作量不小但这是保证调度策略能真正落地的必要投入。整体做下来我最大的感受是这个方向最大的难点不在数学建模而在工程落地。怎么让用户感觉不到调度发生怎么把不同设备厂商的数据接口打通怎么让调度策略在异常天气下依然稳健——这些问题比推导一个漂亮的公式要复杂得多也重要得多。如果你也在做类似的项目建议把精力重点放在负荷机理的理解和真实数据的获取上这些才是项目成败的决定性因素。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表