资讯动态

考虑需求响应的电-热综合能源系统两阶段日前日内多时间尺度调度

发布时间:2026/10/15 20:11:11 来源:尧图企业网站定制
最近不少搞综合能源方向的朋友来问我能不能复现一套“考虑需求响应的电-热综合能源系统两阶段日前日内多时间尺度优化调度策略”这已经成了这个领域的标配题目了。我把自己用Matlab从零搭起一套完整调度模型的思路和踩过的坑整理出来重点关注四个东西需求响应到底怎么建模、日前和日内两个阶段怎么衔接、多时间尺度的分辨率怎么设置、以及YALMIP调起商业求解器时哪些地方最容易翻车。这篇文章适合刚入门综合能源优化调度、或者想快速搭起可运行算例的读者也有一些给中后期调模型的人看的细节。1. 项目整体设计与思路拆解1.1 为什么一定要做“两阶段日前日内”先说核心逻辑。综合能源系统里最麻烦的就是源荷不确定性光伏和风电的出力预测不可能完全准确负荷也一样。如果只用日前调度等于拿一天前的预测数据赌明天的实际情况早晚会出问题要么机组爬坡跟不上要么储能充放计划错位严重的时候甚至会出现切负荷。所以业内普遍的做法是“两阶段”日前阶段做基准计划日内阶段做滚动修正。日前调度以1小时为分辨率把机组启停、储能的参考轨迹、可中断负荷的削减量这些“慢变量”先定下来日内调度以15分钟甚至5分钟为分辨率基于最新的超短期预测对机组出力、储能功率、需求响应执行量做修正。这样就把“计划”和“修正”拆开既保证了长时间尺度的经济性又兼顾了实时运行的安全性。用一句话概括日前负责“省钱”日内负责“不出事”。这个设计不是拍脑袋想出来的而是运行调度的实际需求倒逼出来的。如果没有日内滚动优化这一个环节系统面对突发性的风光波动时会非常被动。1.2 需求响应在电-热系统里到底扮演什么角色需求响应在这类项目里不是锦上添花它是真正能参与调度的灵活性资源。电力需求响应通常分成两类价格型和激励型。价格型需求响应本质是把电看成一种随价格变化的商品。用户电价高的时候就少用电价低的时候就多用。做优化调度时最常用的手段是价格弹性矩阵即一个时段的负荷变化量受到多个时段电价变化的共同影响。自弹性系数是负的用户会主动避峰交叉弹性系数是正数用户可以转移用能时间。激励型需求响应更直接调度方和用户签订合同约定系统紧急时可以切除或者削减一部分负荷用户获得补贴。这类响应适合放在日内阶段作为快速调节手段来处理短时功率不平衡。热力需求响应很多人会忽略其实很有看头。热力系统本身有大惯性建筑物就是一个天然的蓄热体室温在一定范围内波动用户感知不明显。所以可以给供热温度设置一个舒适度允许区间调度时在满足室温约束的前提下调节供热功率等于把建筑楼体当成储能用这是典型的“热力弹性”。电-热联合系统里这一块带来的经济性提升往往非常可观。1.3 多时间尺度的实质时间分辨率怎么选不踩坑所谓“多时间尺度”大多数实现用的是日前1小时加日内15分钟的组合。但这里有个细节不是随便定的它由系统设备的响应速度决定。燃气轮机和电锅炉的爬坡能力不同储能和需求响应的响应速度也不同。如果日内也只用1小时那超短期预测的精度优势发挥不出来如果日内用5分钟模型规模会成倍增长求解时间可能让滚动优化失去“实时性”的意义。一般来说日内时间窗取15分钟滚动周期取4小时到8小时是兼顾精度和计算代价的折中方案。我自己实测8小时滚动窗、15分钟分辨率、包含几十台设备的中型算例Gurobi求解时间基本能控制在几秒到几十秒完全能满足调度需求。2. 核心模型构建与关键技术细节2.1 电-热系统设备模型怎么搭一个典型的电-热综合能源系统通常包括风电、光伏、热电联产机组、燃气锅炉、电锅炉、蓄电池、蓄热罐以及可中断负荷和普通电负荷、热负荷。设备模型是整个优化的地基我先说几个最关键的。热电联产机组CHP是电-热耦合的核心必须区分背压式和抽凝式。背压式机组的电出力和热出力是强耦合的也就是热电比固定抽凝式机组则有一个可行的电-热运行区间可以在一定范围内调整热电比。建模时常用一个凸包络来刻画这种运行域用一组线性不等式把电出力和热出力限制在多边形内。我在代码里倾向于用分段线性化的方法表示运行域这样整个模型保持混合整数线性规划MILP性质用YALMIP加Gurobi就能直接求解。燃气锅炉和电锅炉相对简单只需要建能量转换模型加上输出上下限和爬坡约束。蓄热罐的模型和电池储能类似核心是能量状态的变化方程区别是要加入散热损失项不能默认热罐完全绝热。风电和光伏用预测出力曲线作为输入如果要做极限场景分析还可以加一层旋转备用约束。2.2 电负荷需求响应的数学表达价格型需求响应我用的是弹性矩阵模型。设基准负荷为实际负荷为弹性系数矩阵为则需求响应后的负荷可以表示为这个写法好处是简洁能直接体现出价格变化对用电量的影响。但实际做的时候要小心直接用矩阵乘法会让负荷变量变成两个连续变量相乘破坏线性性。常规处理方法是把弹性呼吸转化为新的价格信号或者采用简化形式——即将时段t的自弹性直接转化为“根据当前时段电价相对基准电价的偏差等比例调整本时段负荷”再通过约束限制调整幅度在设定百分比内这样既保留需求响应的核心行为又保持线性。可转移负荷的建模也值得单独说。比如工业用户的一批可转移工序工作总时长固定但可以整体移动到其他时段这需要引入二进制变量来表示开工状态并加总启动次数约束。可削减负荷则简单得多只需要在当前时段决策一个削减量并设置最大削减占比和最小连续削减持续时间。这里面最容易忽略的约束是需求响应调整后不能让每个时段的总负荷那么畸形。有些初学着会把弹性系数设得过大导致负荷在电价低谷时段暴涨反而抬高了对其他设备的出力需求最后系统总成本不减反增。所以需求响应幅度一定要加百分比上下限。2.3 热力系统建模的两种风格热力部分建模有两种常见风格要看你的精度需求。第一种是“热功率平衡”风格不考虑管网传输延迟和温度分布直接把热负荷当作普通热功率需求由CHP、燃气锅炉、电锅炉和蓄热罐共同满足。这种简化适合做经济调度为主的课题模型规模小求解快。第二种是“节点温度”风格把供热管网建模成节点-支路网络每个节点有供/回水温度变量管道支路有流量变量。热网动态特性由水在管道中的传输时间表示这会导致延迟约束非常容易引入非线性。为了维持线性通常需要把热网动态按离散时段处理写成带时间滞后的换热约束或者把每个管道做分段集总参数近似。做这个课题时我和某课题组合作复现过一个包含节点温度模型的算例发现最大的难点不是建模本身而是“温度变换”和“功率平衡”之间的量纲换算。热功率等于“流量乘以比热容乘以供回水温差”这个关系里有两个连续变量相乘天然非线性。所以很多论文会直接把热负荷等效成功率变量再额外加一个温差不越限的约束能省掉大量麻烦。2.4 两阶段优化模型的目标与约束完整模型可以在Matlab里这样梳理清楚目标函数最小化总运行成本包括燃料成本、购电成本、需求响应补偿成本、弃风弃光惩罚成本、储能充放损耗成本。其中为第t个时段各设备的燃料和运维成本为购电功率为第j类需求响应在t时段的削减量为对应的补偿价格为弃风和弃光功率为相应的惩罚系数。惩罚项的意义是让优化器在非极端情况下主动消纳新能源。约束条件分六大块电力功率平衡约束热力功率平衡约束设备出力上下限与爬坡约束储能设备的SOC递推与容量约束需求响应调整量上下限与调整次数限制网络传输约束如果做节点温度模型的话还需要节点温度约束在Matlab里建议把约束按块封装成函数方便后期加场景或换目标函数。这种结构化思路对调试非常重要不然模型一旦出现不可行你根本无从下手。2.5 两阶段协调的核心哪些边界状态必须传递两阶段模型最容易出错的地方是“状态怎么衔接”。日前调度算完后日内滚动优化需要用到的不是日前决策的所有变量而是经过筛选的边界条件和状态量。必须传递的包括机组的启停状态、储能的最终SOC、蓄热罐的热量状态、日前签订的可中断负荷合同量。这些都需要作为日内模型的初值或约束条件。不需要传递的包括日前每个时段的具体出力计划因为这些在日内要重新根据超短期预测优化。如果强制日内层完全绑定日前出力那滚动优化的灵活性就废了gg。有的实现里会加一个“计划跟随”的约束项即在日内目标函数里写上“日内的出力计划与日前计划的偏差尽量小”偏差项乘以一个权系数。这个办法很好用能兼顾计划的延续性和日内修正的灵活性。我一般在代码里这样实现日前计划作为参考值日内优化对偏差设置一个罚成本数值上等于波动性的惩罚成本。3. Matlab实现流程与核心算法环节3.1 整体程序架构怎么编排代码不凌乱一套典型的Matlab代码目录结构大致是这样的data文件夹存放负荷曲线、风电光伏预测曲线、电价、设备参数、需求响应参数model文件夹分别建立电力平衡约束、热力平衡约束、储能约束、需求响应约束的函数solver文件夹日前调度主函数、日内滚动优化主函数result文件夹保存结果、画图脚本我建议从一开始就按“数据-模型-求解-后处理”四层结构拆分。千万别把几百行约束平铺在一个大脚本里改参数的时候会疯掉的。3.2 用YALMIP建模的核心写法我用的是YALMIP作为建模层求解器选Gurobi。YALMIP的优势在于数学表达和Matlab语法几乎一一对应写起来很直观。核心栗子如下%% 定义变量 P_chp sdpvar(1, 24, full); % CHP电出力 H_chp sdpvar(1, 24, full); % CHP热出力 P_es sdpvar(1, 24, full); % 蓄电池出力正为放电 soc sdpvar(1, 25, full); % SOC状态 u_chp binvar(1, 24, full); % CHP启停状态 P_curtail sdpvar(1, 24, full); % 可中断负荷削减量 %% 目标函数 Objective sum(C_gas .* (P_chp ./ eta_chp) ... C_buy .* P_grid ... C_dr .* P_curtail ... C_curtail .* P_waste); %% 约束集合 Constraints []; Constraints [Constraints, P_load P_chp P_wind P_pv P_grid - P_es - P_curtail - P_waste]; Constraints [Constraints, H_load H_chp H_gb H_eb H_hs_out - H_hs_in]; Constraints [Constraints, soc(2:25) soc(1:24) P_es * dt / cap_es]; %% 求解 ops sdpsettings(solver, gurobi, verbose, 1); optimize(Constraints, Objective, ops);这段代码只要跑通整个模型骨架就有了。初学者容易犯的一个错是把二进制变量声明成sdpvar而不是binvar结果求解器输出“不满足MILP”或者干脆当成非线性问题处理速度慢一个数量级。3.3 日前调度的实现细节日前调度层的输入是24小时的风电、光伏、负荷、电价预测曲线输出包括CHP启停计划、各机组出力计划、储能充放电计划、蓄热罐热量管理计划、价格型需求响应的负荷调整量。实现时可以把这个阶段当作一个独立的MILP问题求解。特别提醒启停变量u_chp和时间有关联因此要在约束中加上最小启停时间约束。这个约束形式是逻辑约束需要写成线性不等式组可以用YALMIP提供的implies函数简化也可以手工补充但手工写着实繁琐还容易出错。我自己的经验是先用implies写逻辑关系求解完后检查约束条件是不是激活了如果求解器报“non-convex”或者“不支持的约束”错误再手动展开成不等式。这样做能显著提升调试效率。3.4 日内滚动优化的实现细节日内滚动优化的核心循环可以理解成这样在时刻基于超短期预测求解从到比如未来8小时的优化模型只执行当前时刻的决策结果时间步进到时刻更新预测数据再次求解。在Matlab里用一个for循环就可以实现。伪代码for k 1 : 96 % 设全天96个15分钟时段 % 更新超短期预测数据 pv_pred get_shortterm_pred(k, horizon); wind_pred get_shortterm_pred_wind(k, horizon); load_pred get_load_pred(k, horizon); % 读取日前计划传递来的状态初值 x0 state_from_day_ahead(k); % 构建并求解当前滚动窗的优化模型 [plan, status] solve_intraday_window(k, horizon, x0, pv_pred, wind_pred, load_pred); % 只取当前时段结果 record_result(k, plan); % 更新状态进入下一周期 state_update(k, plan); end这个循环最关键的变量是x0和horizon。x0代表当前系统实际运行状态比如储能SOC必须从上一时段的执行结果继承下来不能每次重新从日前计划里读否则滚动优化就失真了。3.5 日前与日内衔接的方式衔接处容易出的经典硬伤是日前输出的是1小时分辨率数据日内需要的是15分钟分辨率数据两者直接赋值会出现维度不匹配。解决方式有两种。第一种简单粗暴日前的小时计划直接作为日内对应小时的常数值然后在15分钟粒度上做调节。这种方式实现快日内关于该设备的自由度很小灵活性差一点。第二种更推荐日前计划只作为日内优化的参考轨迹日内层可以在某个百分比范围内偏离日前计划偏离的惩罚加在目标函数里通过乘一个足够大的罚因子来约束偏离程度。这样既给日内留下了调节空间又不会让日内计划完全背离日前经济调度。我强烈建议采用第二种方式因为第一种方式会让日前求出来的“经济最优”直接变成日内求解的硬约束稍微有点预测误差模型就会因为违反这些硬约束而不可行。4. 常见问题与排查技巧实录4.1 模型报不可行怎么定位到底哪条约束出错这是最典型的问题几乎每个做这个方向的人都会遇到。我的排查套路如下第一在模型里给每个平衡等式加一个松弛变量比如电力平衡松弛变量、热力平衡松弛变量它们的代价特别大。如果求解结果里某个松弛变量非零那就说明是这条平衡约束导致无解。第二检查初值状态。尤其是在日内环节SOC初始值如果和当天日出力预测对不上极容易出现不可行。最简单的验证方法把储能模型所有不等式暂时放开再看问题是否可行如果可行就说明问题出在储能约束上。第三检查有没有非物理的边际情况。比如热负荷峰值时段CHP最大热出力加锅炉最大出力还小于热需求那必然无解。这类问题直接用脚本画一张热平衡出力上限对比图一眼就能看出来。4.2 需求响应参数怎么调才合理弹性系数是参数重灾区。以我实测的经验自弹性系数在-0.2到-0.5之间比较常见交叉弹性系数在0.05到0.2之间。要记得需求响应的总调整量限制好比如不能超过总负荷的10%到20%。如果你发现优化后某些时段负荷被削了40%以上那说明弹性矩阵设置有毛病或者忘了加幅度约束。还有一个容易被忽视的点需求响应的使用不能过度追求成本最低。比如某个时段电价特别低系统会倾向于把大量负荷转移到那个时段但实际用户根本不可能在深夜把整个工厂搬起来干。所以模型里一定要加上“单一时段最大调整率”和“连续调整持续时间”这些现实约束。4.3 求解速度慢怎么加速模型规模一上来尤其加入了日内滚动循环后96个15分钟时段乘上几十台设备变量数量会到几千甚至上万这时YALMIP单纯调Gurobi可能还是慢。我尝试过几个有效的加速手段把热力模型从“节点温度级”简化成“区域功率平衡级”变量数能减少40%-60%去掉非必要的二进制变量比如可削减负荷可以用连续变量分段表示不必引入开关变量给Gurobi设置MIPGap参数比如MIPGap0.5%实际成本差别极小求解时间可能缩短一半对日内滚动优化上一时段的解可以作为当前时段求解的初始可行解通过Gurobi设置初始解能大幅减少分支数。4.4 热力部分简化后需要注意的误差把热网简化为功率平衡时你会失去管网延迟带来的热惯性这会导致日内修正层面对热负荷波动的调节能力被高估。实际热网里热量从热源送到用户端需要时间供水温度也不能突变这就是为什么很多论文会把“室温允许偏差”作为热弹性指标加入模型。我用过一种折中在功率平衡层盯住“等效热储能”的SOC即用室温上限和下限之间的热容量来代替整个建筑热惯性效果不错既保留了热力弹性的本质特征又避开了管网动态的复杂建模。如果后续想进一步细化再考虑加入每栋建筑的室温模型。4.5 结果出来后怎么验证代码逻辑跑完模型后不要急着画漂亮的图先做几个健康检查所有设备出力是否都在上下限内每个时段的电平衡和热平衡是否严格为零允许一个小容差储能的SOC初始值和最终值是否一致如果不一致说明储能被“免费”消耗了弃风弃光量只有在某些时段才不为零如果全时段为零检查惩罚系数是不是设得过高导致系统为了弃风弃光而买高价燃料打个比方如果某个场景下燃气轮机一路满负荷运行却同时存在大量弃风那大概率是约束里漏了“CHP最小热出力”相关约束或者热负荷必须由CHP承担的设计不合理。这类逻辑错误用代码调试很难发现用直观结果反推才是最快的方式。5. 算例结果与扩展经验5.1 一个典型小型园区的算例表现我用一个模拟小型园区做过验证包含一台CHP、一台燃气锅炉、一台电锅炉、一台风机、一块蓄电池和一个蓄热罐。取冬季典型日负荷峰谷差明显。在只做“日前调度固定执行”模式下系统运行成本为100单位归一化值但实际日内运行会出现因为预测偏差导致的额外调整成本总计约115单位。改用“日前日内滚动优化”模式且日内允许需求响应后总成本降到约103单位同时弃风率从原来的8%降到2%以下。需求响应贡献的成本下降约5到6个百分点主要来自两处价格型响应把部分高峰负荷转移至夜间风电出力较大的时段降低了购电成本热力弹性允许在供水温度上限范围内提前蓄热让CHP在电价低谷时段多发一些电并储存热量高峰期减少燃气锅炉用气这个结果很能说明问题需求响应不是简单的“削峰填谷”口号它在具体算例里确实能改变整个系统的运行方式尤其是热力弹性和电力弹性叠加之后会给CHP调度和储能调度创造非常大的调节空间。5.2 模型扩展的方向如果还想在这个框架上继续扩展可以考虑这几条线加入碳交易成本目标函数里加碳排放配额和交易费用这在“双碳”背景下是常见考察项把风光不确定场景改为鲁棒优化用区间预测代替单点预测把电-热系统扩展到电-热-气氢多能互补比如加入电解水制氢与燃料电池回电在日内滚动中加入模型预测控制也就是把当前时段的优化作为MPC的一步后续时段作为预测窗这些扩展在模型层面都不需要推翻现有代码只要把设备模型、平衡约束和状态变量按同样思路增加就能平滑迁移。这也是当初我把代码结构设计成模块化的原因前期每多花一点时间拆模块后期扩展就能节省数倍时间。5.3 我对这类课题的实操体会这个课题说难也难说容易也容易。难点在于约束多、两阶段衔接乱、数据维度不一致容易让人手脚忙乱容易之处在于把模型结构梳理清楚后它本质上就是一个标准的MILP问题剩下的事情交给求解器就行。我特别想强调一点做这类研究一定不要急着直接上手写一大堆约束。第一步必须是用白纸把能量流画清楚比如哪些设备产生电、哪些设备消耗电、电和热在哪里耦合、储能从哪里充能、需求响应在哪里发挥作用。画完图再建模错误率能低一半。再补充一个小技巧每完成一次模型修改都把当次的目标函数值、求解时间、关键设备出力记录下来做成一页纸的实验记录表。多次修改之后往回看你能清楚知道是哪一次改动让成本下降、哪一次改动破坏了可行性这是纯靠记忆调试完全做不到的。也是这些细节积累多了才让我在复现这类课题时越来越顺手。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑