恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
区域并网型微电网电热联合调度:MILP建模与工程落地实践
首页
资讯中心
/
区域并网型微电网电热联合调度:MILP建模与工程落地实践
区域并网型微电网电热联合调度:MILP建模与工程落地实践
发布时间:2026/10/6 16:53:21
区域并网型微电网运行优化这活儿我做了好几个项目之后才真正摸到门道。早期我总觉得电热联合调度是“锦上添花”把电功率平衡算明白就够了直到一次工业园区的并网型微电网仿真被现场老师傅一句话问住“冬天热负荷这么大你这边还在烧电锅炉补热那边燃气机组却在拼命发电上网能源账到底怎么算的”那个瞬间我才意识到只要系统里同时存在热电联产、电锅炉、蓄热罐这类设备电和热就必须放进同一个优化模型里一起调度。后来的事实证明一套完整的区域并网型微电网电热联合调度模型不仅能压成本还能显著减少弃风弃光、提高设备利用率。这篇算是我自己从建模、数据准备、代码实现到算例对比的完整复盘主要面向园区微电网规划人员、综合能源系统方向的研究生以及对多元储能调度感兴趣的朋友。内容不绕弯子全部是可落地的思路和容易踩的坑。1. 项目背景与核心问题拆解1.1 为什么“电热联合调度”不是锦上添花区域并网型微电网和离网型微电网最大的区别在于系统与上级电网相连既能从电网买电也能把多余的余电上网销售。也就是说供电侧多了一个“缓冲阀”。但有缓冲阀不代表电和热可以分开管理因为实际系统里最常见的热电联产CHP机组天生就把电和热绑在一条生产线上。你可以把CHP机组理解成一个“边发电边烧热水”的装置。你看重它的发电功率时它的余热也被生产出来如果区域里热负荷刚好消耗不掉这些热量就只能白白散掉或者倒逼机组降出力反过来如果热负荷很大你要它多产热它又会同步多发电电可能就超过本地负荷了。这个时候尽管微电网并网了可以上网卖电但上网电价通常低于本地购电价甚至低于机组发电成本盲目倒送电是会亏的。单纯做电调度时我们要么把CHP当成固定热电比的黑盒要么只安排电出力、不管热平衡。这两种办法都容易让结果“电好看、热离谱”。只有把热负荷、蓄热罐、电锅炉和热泵都纳入优化才能让热这个“第二能源”也参与灵活调节。打个比方只做电调度就像只盯着灶台火候锅里的水烧干了也不管电热联合调度则是把灶火、锅盖、保温壶当成一个整体来统筹该保温的保温该放热的放热。1.2 这个模型到底要解决哪三个问题我在设计模型前先把需求拆成了三个核心问题后面所有代码和约束都围绕这三个问题展开。第一给出未来24小时的可执行运行计划。说白了就是每个时段告诉你光伏风电发多少、CHP机组发多少电/产多少热、电锅炉开多大、电储能充还是放、蓄热罐蓄还是放、从电网买多少电、向上级电网卖多少电。这个计划要满足所有负荷需求还要满足设备物理限制。第二在安全可行基础上做到成本最低。这里的成本不只有电费还包括CHP机组天然气费用、设备运行维护费用、启停费用同时要考虑售电收益。很多没做过工程优化的人会漏掉启停费用结果求解器会给出每个小时都在启停的疯狂策略实际工程里根本没法用。第三把电热之间的强耦合约束真正写进模型。电功率平衡要算热功率平衡也要算同一台CHP机组的电出力和热出力要满足可行域蓄热罐能够把热能在时段间转移电储能能够把电能在时段间转移。模型最终要让“电跟随负荷”和“热跟随负荷”两条线都闭环同时利用储能实现跨时段套利。2. 模型整体设计与边界确定2.1 系统元件与潮流接口我搭的系统边界是典型的园区级并网微电网拓扑一条10kV母线连接上级电网、分布式光伏、分散式风电、燃气内燃机热电联产机组、电锅炉、热泵、电储能和蓄热罐。热网侧不做具体地理拓扑简化为一个“热母线”所有热源向热母线注入热量热负荷从热母线取热。这样做的主要原因是调度模型关注的是能量平衡与设备运行状态不是管网水力计算如果一上来就把热网潮流、管损、温度节点全部塞进去模型规模会爆炸求解速度也受不了。母线模型理解起来很简单就像家里多个水龙头接到同一根水管上水箱水位、龙头出水量一算就知道够不够不用关心水流经过哪个弯头。对于区域微电网日前调度这种简化完全够用。系统关键参数可以这样预设设备容量/参数效率/经济参数备注光伏2 MWp运维成本 0.02 元/kWh出力曲线按典型日给定风电1.5 MW运维成本 0.02 元/kWh出力曲线按典型日给定CHP机组2 MW电/最大1.8 MW热电效率42%热效率45%启停成本80元/次热电比可调 0.8~1.2电锅炉0.6 MW效率95%运维成本0.01元/kWh纯电转热热泵0.5 MWCOP3.5运维成本0.012元/kWh消耗0.5MW电产1.75MW热电储能1 MW / 2 MWh充放效率95%运维成本0.02元/kWhSOC范围0.1~0.9蓄热罐0.5 MW / 2 MWh散热损失1%/h运维成本0.005元/kWh首末状态约束可选并网点3 MVA购电上限3MW售电上限1.5MW购售电状态互斥这套参数来源于常见工业园区微电网示范项目的典型容量不是随意拍的。实际项目里如果设备类型不同直接替换容量和效率即可。2.2 目标函数怎么定才不“失真”目标函数我采用的是运行总成本最小化包含四部分向电网购电成本、天然气燃料成本、设备运维成本和启停成本再扣除售电收益。写成大家熟悉的数学形式就是min Σ_t [ 购电价(t)×购电功率(t) − 售电价(t)×售电功率(t) 气价×燃气耗量(t) Σ(设备运维系数×出力) Σ(启停成本×启停状态) ] × Δt这里有几个容易忽略的细节。一是“同时购售电”问题。如果并网点约束里没有强制状态互斥求解器为了套利可能做出又买又卖的荒唐决定所以必须加购电和售电二元状态互斥的约束。这在实际算例里非常常见不加约束成本可能会被“算”得很低但工程上根本不可行。二是运维成本要不要算。很多文章只算电费和气费忽略设备运行磨损成本。在电价波动不大的项目里运维成本可能占到总成本的2%~4%但更重要的是它影响设备出力的排序。比如热泵COP高、运维成本低会在优化里优先被用电锅炉效率低、运维成本高则排在后面。三是如果当地电费包含需量电费目标函数还要加一项最大需量成本。这种情况下目标函数会多一个 max 项需要引入辅助变量做线性化。我的项目暂时用单一制电价所以没加但读者如果做工业用户侧微电网一定要问清楚电费结构。2.3 约束条件里最容易翻车的四个细节模型的核心约束不少我挑四个我实际建模时最容易被绕晕的地方说一下。电功率平衡。这是最基础也是最容易漏项的约束。区域里所有电源出力加总必须等于所有负荷与储能充电消耗之和。我常用等式写为P_pv(t) P_wt(t) P_chp(t) P_es_d(t) P_buy(t) P_load_e(t) P_eh(t) P_es_c(t) P_sell(t)注意 P_eh 是电锅炉和热泵消耗的全部电功率不是它们输出的热功率。很多新手会把电锅炉产热功率直接当作耗电功率这就不对了效率/COP 一定要单独处理。热功率平衡。所有热源产热加蓄热罐放热必须等于热负荷加蓄热罐蓄热。我用H_chp(t) H_eh(t) H_ts_d(t) H_load(t) H_ts_c(t)其中 H_eh 是电制热设备的总产热功率它和耗电功率之间有关联关系。比如热泵的 H_eh COP × P_hp电锅炉的 H_eh 0.95 × P_boiler。如果同时有电锅炉和热泵最好拆成两个设备分别建模不然效率参数混在一起调度结果会失真。CHP机组电热耦合可行域。单台CHP机组的热出力不能想多大就多大也不能完全独立于电出力。我的简化做法是让 CHP 的电热比在 0.8~1.2 之间连续可调同时热出力有上限。写成约束就是两行不等式H_chp(t) ≥ 0.8 × P_chp(t)H_chp(t) ≤ 1.2 × P_chp(t)再加 H_chp(t) ≤ H_chp_max。这种方法保留了热电联产“电多热多、电少热少”的基本特征又给优化留出了调节空间。储能能量状态与充放电互斥。电储能和蓄热罐的SOC递推式必须写对同时区分充电/放电功率的损耗。电储能公式是SOC(t1) SOC(t) η_c×P_es_c(t)×Δt − P_es_d(t)×Δt / η_d蓄热罐类似但散热损耗我写成每个时段状态值乘一个(1−损耗率)。充放电状态互斥要加二元变量同一时刻不能既充电又放电、既蓄热又放热。虽然目标函数通常不会让这种情况出现但加了约束能防止数值上的微小抖动。2.4 为什么我把模型锁定在MILP这套模型最终选择了混合整数线性规划MILP来求解。原因很简单设备启停是0/1状态购售电互斥也是0/1状态这些都是离散变量天然适合整数规划而目标函数和约束经过处理仍然保持线性求解器能保证全局最优。如果改用非线性规划热泵的COP随负荷变化、CHP的燃料曲线非线性模型更复杂而且容易陷入局部最优。MILP还有个优势是求解器生态成熟。Gurobi、CPLEX、Cbc、GLPK 都支持这类问题工程上大家也更认可“分支定界线性松弛”的求解结果。如果遇到非线性效率曲线我一般用分段线性化处理而不是直接上非线性求解器。分段线性化虽然增加了一些变量但求解稳定性和可调试性都大幅提升。对于区域并网型微电网这种规模的问题MILP 完全够用。3. 数据准备与参数标定3.1 电价、热价、气价的场景化设定电价结构直接影响储能和蓄热罐的调度行为。我算例里采用国内典型工商业分时电价峰时段 1.10 元/kWh平时段 0.65 元/kWh谷时段 0.32 元/kWh售电上网价格统一按 0.45 元/kWh 算。峰谷价差达到 0.78 元/kWh足够让电储能和蓄热罐发挥作用。天然气价格按工业用户实际到户价 2.8 元/m³ 设置天然气热值取 9.7 kWh/m³。有了这个基础值可以估算CHP燃料成本。比如CHP电效率42%不考虑热回收时每度电的燃料成本是 2.8/(9.7×0.42)≈0.69 元/kWh比峰时购电价低但比平段谷段购电价高。这就是为什么优化会让CHP在峰时段多发电在谷时段反而少发电、多用低谷电制热储能。有人会问热价怎么设。这里有个常见误区我们做的是区域微电网内部调度热负荷通常是自身用户需求并没有真正的“售热”给外部所以目标函数里一般不会直接放热价。如果项目要考核对外供热收益才需要在目标函数中加上售热收入项。我这边是把热负荷当作刚性需求来满足。3.2 新能源出力序列算例的“地基”光伏和风电的出力曲线是调度模型的输入边界直接决定CHP要不要发电、储能要不要充电。我强烈建议不要用一条理想正弦曲线糊弄过去至少要用典型日实测数据或合成数据把“低光照但有热需求”“大风加上高光伏”这类场景覆盖到。我这次用的是冬季典型日光伏峰值约1.2MW因为太阳角度低加上部分云遮挡整体出力曲线比较矮风电峰值约1.0MW夜间风速不错白天有一段低谷。时间分辨率为1小时一天24个点。热负荷我取了工业园区的采暖负荷曲线峰值1.5MWth谷值0.4MWth白天因为人员作业和设备散热略高晚上厂房保温需求下降。数据准备阶段最重要的一件事是对比场景必须用同一套新能源和负荷曲线。否则后面对比联合优化和纯电调度的收益差异时说不清楚到底是算法带来的收益还是换了数据。3.3 设备参数表与启停逻辑设备参数前面给过表格这里单独说一下启停逻辑的建模。CHP机组如果只在部分时段运行就会产生启停成本。我设置了最小连续运行时间约束吗严格工程调度会加但这会让模型复杂很多。我的做法是初级阶段先不加只看优化会不会频繁启停如果求解结果出现每小时启停一次说明缺少启停惩罚或爬坡约束再补上。实际算例中对CHP最小运行/停机时间做了简化处理只加爬坡约束限制CHP电出力每小时变化不超过0.6MW同时启停成本设为80元/次。加了启停成本后求解器会主动减少不必要的机组切换。调试中发现这一点非常关键没有启停成本时CHP可能在谷时段停机、平时段开机、峰时段满发看似合理但实际机组寿命受大影响一旦把启停成本加上CHP运行曲线马上平滑很多。3.4 典型日选取与时间分辨率我最初把时间分辨率设成15分钟一天96个点加上电储能、蓄热罐和CHP启停的二元变量求解时间一度超过20分钟。后来先把分辨率降到1小时跑通模型后再缩到15分钟验证边界情况。实际工程里日前调度通常用1小时分辨率就足够日内滚动优化才用5分钟或15分钟。典型日选取要看项目目标。如果重点是电热联合调度和蓄热罐收益我建议选一个“热负荷峰谷差大、光伏出力中等”的冬季日这样才能把热电矛盾暴露出来如果重点是新能效消纳则选“光伏满发且热负荷较低”的春秋日。我这次两个典型日都试了但文章里的基准算例用冬季日。4. 建模与求解实操记录4.1 工具选型YALMIPGurobi还是Pyomo工具选型这块我试过三条路线分别说一下感受。MATLABYALMIPGurobi 是最快出结果的组合。YALMIP 的语法和数学表达式几乎一一对应非常适合前期建模验证我大部分时间都在用这个组合。缺点是Gurobi需要许可证如果不方便申请许可证可以先用免费的Cbc求解器但求解大规模MILP时速度会差一些。PythonPyomoGurobi/Cbc 更适合部署到生产环境。因为Pyomo模型可以直接放进自动化运行平台和数据处理、报告模块对接。我后来把最终版本迁移到了Python平台调度结果每天自动生成。如果你要长期做优化调度系统建议直接学Pyomo如果只是做学术算例或方案比选YALMIP足够。GAMS或AMPL 老牌专业建模系统建模能力强但语法学习成本和授权费用都很高我一般不推荐初学者一上来就用。我自己的主流路径是先用YALMIP快速建模验证算例再把代码改写为Pyomo用于工程部署。两者表达思路相同迁移成本可以接受。4.2 核心代码片段与建模细节下面给一段基于YALMIP的核心建模片段不是完整可运行程序但关键变量和约束逻辑都在里面。%% 参数设置 T 24; dt 1; % 时间点数与步长 P_pv ...; % 光伏出力 P_wt ...; % 风电出力 P_load_e ...; % 电负荷 H_load ...; % 热负荷 Price_buy ...; % 分时购电价 Price_sell ...;% 售电价 %% 变量定义 Pchp sdpvar(T,1); % CHP电出力 Hchp sdpvar(T,1); % CHP热出力 Pbuy sdpvar(T,1); % 购电 Psell sdpvar(T,1); % 售电 Pes_c sdpvar(T,1); % 电储能充电 Pes_d sdpvar(T,1); % 电储能放电 SOCes sdpvar(T1,1); % 电储能SOC Heh sdpvar(T,1); % 电制热设备产热 Peh sdpvar(T,1); % 电制热设备耗电 Hts_c sdpvar(T,1); % 蓄热罐蓄热 Hts_d sdpvar(T,1); % 蓄热罐放热 S_ts sdpvar(T1,1); % 蓄热罐状态 yBuy binvar(T,1); % 购电状态 ySell binvar(T,1); % 售电状态 yChp binvar(T,1); % CHP运行状态 %% 约束 Constraints []; % 电平衡 Constraints [Constraints, P_pv P_wt Pchp Pes_d Pbuy ... P_load_e Peh Pes_c Psell]; % 热平衡 Constraints [Constraints, Hchp Heh Hts_d H_load Hts_c]; % CHP运行范围与热电比 Constraints [Constraints, 0.3*yChp Pchp 2*yChp]; Constraints [Constraints, Hchp 0.8*Pchp - 100*(1-yChp)]; Constraints [Constraints, Hchp 1.2*Pchp 100*(1-yChp)]; Constraints [Constraints, Hchp 1.8*yChp]; % 并网点购售电互斥 Constraints [Constraints, Pbuy 3*yBuy, Psell 1.5*ySell]; Constraints [Constraints, yBuy ySell 1]; % 电储能约束 Constraints [Constraints, SOCes(1) 0.2]; Constraints [Constraints, SOCes(t1) SOCes(t) 0.95*Pes_c*dt - Pes_d*dt/0.95]; Constraints [Constraints, 0.1 SOCes 0.9]; Constraints [Constraints, 0 Pes_c 1, 0 Pes_d 1]; %% 目标函数 Cost dt * sum(Price_buy.*Pbuy - Price_sell.*Psell ... Price_gas * Fchp OM_chp.*Pchp ... OM_eh.*Peh OM_es.*(Pes_c Pes_d)) ... Start_cost * sum(zStart); ops sdpsettings(solver,gurobi,verbose,1); optimize(Constraints, Cost, ops);代码里我特意写了两个“大M系数”100用来把CHP停机时的热电比约束松弛掉。这是MILP建模常用的技巧。实际使用中大M不用取太大取到比所有变量上界都大就行太大了会影响求解稳定性这一点很多教程不会提醒。4.3 求解结果怎么读先看平衡再看收益模型跑完之后我建议按下面顺序检查而不是直接读成本数字。第一步把每个时段的电功率和热功率代回平衡等式看误差是否接近零。如果误差大于1e-6多半是约束写漏了或变量单位混了。第二步检查有无同时购售电、同时充放电的情况。理论上约束已经写死了但仍要看求解器是否因为容差出现了零点几兆瓦的重叠。有的话收紧MIP gap或者增加互斥惩罚。第三步画四个关键曲线电负荷与供给曲线、热负荷与供热曲线、电储能SOC、蓄热罐状态曲线。我最看重蓄热罐曲线因为它最能反映“热跟着价格走”的逻辑低谷时段蓄热罐充热高峰时段放热曲线应该和电价峰谷方向相反。第四步再看总成本和各项成本占比。如果燃料成本占比过高说明CHP可能被过度使用要检查是否受并网购电上限约束影响如果购电成本占比很高再看是不是蓄热罐容量不足或电价峰谷差不够大。5. 算例对比联合优化到底赢在哪5.1 三种调度策略设计为了验证联合优化的实际价值我设计了三个策略做对比。策略A是“纯电调度基准”只做电功率优化CHP按固定热电比为1.0运行热负荷不足部分用电锅炉补充不使用蓄热罐的跨时段调节能力。策略B是“电热联合但无蓄热罐”满足电热平衡CHP热电比在0.8~1.2之间可调每时段的热平衡必须即时满足没有蓄热罐。策略C是“完整电热联合优化”在策略B基础上加入蓄热罐允许热能在不同时段间转移同时保留电储能。三个策略用相同的新能源出力、负荷曲线、电价和并网容量唯一差异就是调度模型包含的灵活性资源不同。这样可以分离出电热耦合与蓄热罐分别带来的收益。5.2 成本、弃电、设备利用率的实测对比算例结果非常有意思指标策略A策略B策略C日运行总成本元412603892035870向上级电网购电量MWh12.611.49.8上网售电量MWh2.11.70.6弃电率%9.36.82.1CHP启动次数432蓄热罐利用率%0035.4策略C比策略A成本下降了约13%主要是三部分贡献一是蓄热罐把低谷电制热转移到高峰放热替代了峰时高价购电二是电热联合让CHP不再被固定热电比锁死热负荷大时可以让CHP多产热热负荷小时甚至可以停机由蓄热罐顶上去三是光伏和风电出力更大胆地接入系统弃电率从9.3%降到2.1%。当然这个收益不是白来的。蓄热罐和电锅炉的初始投资也需要计入项目全周期经济性。我做的运营优化只是运行侧收益如果要做投资决策还需要把设备年化投资成本加进目标函数再做容量配置优化。这是另一个项目的事这里就不展开了。5.3 边界变化下的灵敏度分析灵敏度分析能回答“这个模型在什么条件下才值得用”我做了几个关键单因素扫描。第一个是峰谷价差。当峰谷价差从0.3元/kWh逐步提高到1.0元/kWh时蓄热罐的日循环次数明显增加联合优化的收益差异也随之扩大。价差低于0.4元/kWh时策略C相比策略B的优势很小说明蓄热罐套利空间不足可能不值得增加投资。第二个是光伏渗透率。我把光伏从2MWp提高到4MWp后弃电率在策略A中大幅升高但策略C因为有电储能和蓄热罐两条消化路径弃电率只有策略A的三分之一左右。这说明联合调度模型不仅能省钱还能提高新能源消纳能力。第三个是热负荷峰谷差。热负荷曲线越“尖”策略C的优势越明显。因为蓄热罐可以用相对平缓的出力应对尖峰热负荷拉平CHP和电锅炉的负担。如果热负荷一天到晚都很平蓄热罐就基本没什么用武之地。6. 常见报错与排查经验实录6.1 求解器报“Infeasible”时怎么定位约束MILP最让人头疼的就是一句“Infeasible”没有告诉你哪条约束出了问题。我踩过很多次坑后总结出一套定位方法。第一步把目标函数改成0只求解可行解。如果依然不可行说明约束之间存在硬冲突如果可行说明是目标函数数值问题或数值过大导致求解器判定不可行。第二步加入一组非负松弛变量把每条关键约束都放宽一点比如松弛掉电平衡和热平衡然后求解最小松弛量。看哪些松弛变量被激活就能很快锁定冲突源。我遇到过最多的是储能SOC等式写错方向导致末时刻SOC无法回到初值。此时只需要单独把SOC状态方程和初末约束拿出来测试就能定位。另外大M系数如果取值太大可能造成数值病态出现假不可行遇到这种情况把大M从10000降到100左右问题往往就消失了。6.2 热负荷抖动导致的出力振荡刚开始用实测热负荷数据时我发现CHP和电锅炉出力曲线像锯齿一样一个小时大一个小时小。问题出在原始热负荷曲线里夹杂着大量尖峰和突变而优化模型对负荷波动非常敏感会频繁调整机组出力。解决办法有两个。一是对热负荷做预处理用移动平均或中值滤波把高频尖峰削掉保留总体趋势二是在调度模型里给CHP、电锅炉和蓄热罐增加爬坡约束限制相邻时段的出力变化量。爬坡约束不仅让运行计划可执行也大幅减少了不必要的设备磨损。实际项目里我还是推荐两个办法一起用先平滑数据再加爬坡约束兜底。6.3 储能SOC漂移的坑电储能SOC还有一个容易踩的坑如果不加首末SOC约束求解器会“聪明”地利用初值把SOC初始值设成很高然后不断放电看起来优化效果很好但前一天积累的电量并没有计入成本明显失真是错误的。蓄热罐也有类似问题。我处理的办法是加首末状态约束SOC(1)SOC(T1)蓄热罐状态同理。不过完全锁死有时会限制最优解因为实际连续运行时各天间状态本来就允许浮动。我的工程做法是允许终值在初值正负5%范围内浮动同时在目标函数中给末状态偏离加一个很小的惩罚项这样既能防止“白嫖”能量又能保持调度的灵活性。6.4 MILP求解时间太长怎么压缩模型跑不动也是常见问题尤其是15分钟分辨率、多台机组、多种储能时。我试过几个有效措施见效最快的是设置合理的MIP gap。Gurobi默认gap很小我一般设置1%也就是优化结果距离理论最优差1%以内就接受。对于工程调度1%完全够用但计算时间可能缩短数倍。第二个有效手段是给求解器提供好的初始解。可以先跑一次去掉整数变量的松弛模型把得到的连续结果离散化后作为MIP的初始可行解传入分支定界就能少探索很多坏分支。第三个手段是减少无用二元变量比如某些时段明确不可能启停的机组可以用约束固定状态而不是让求解器自由搜索。最后再分享一个习惯调完一组算例不要急着把成本数字当结论。我会把同样的模型换到两三个不同典型日里各跑一遍看结论是否稳定。有一次我兴冲冲说蓄热罐收益很大结果换成热负荷曲线较平的春季日收益几乎没了原因只是基准典型日热负荷峰谷差特别大。后来我把敏感性分析写进项目报告再也没人质疑模型的价值。这一整套流程走下来区域并网型微电网电热联合调度模型才算是真正落地了。