基于电热联合调度的区域并网型微电网MATLAB优化模型解析

发布时间:2026/9/23 4:32:04
基于电热联合调度的区域并网型微电网MATLAB优化模型解析 一开始做微电网优化调度的时候我踩过一个大坑。当时给一个园区做并网型微电网的调度方案团队里所有人盯着电功率调来调去储能、光伏、柴发都用上了结果一到冬季采暖期运行成本怎么都压不下来。后来把热力系统也拉进优化模型里用储热罐把热电机组的电出力从“以热定电”的刚性约束里解放出来一个采暖季下来天然气费用直接省了十多个百分点。这件事让我彻底想明白一个道理区域并网型微电网能不能降本增效关键往往不在“电”本身而在“电”和“热”有没有放在同一个优化框架里统筹决策。这篇内容就围绕基于电热联合调度的区域并网型微电网MATLAB优化模型展开把目标函数怎么建、约束怎么设、MATLAB里怎么求解、实际工程里有哪些坑一次说清楚。适合正在做微电网优化调度、综合能源系统研究的研究生和工程师也适合刚接触这个方向、想快速搭建一个可用模型的朋友。1. 为什么“电热联合”是区域并网型微电网降本的核心抓手1.1 传统电调度模式下看不见的三笔浪费很多微电网项目在做优化调度时默认只对电力系统建模热负荷划给锅炉房单独管。这种“电热分离”的思路在区域并网型微电网里会造成至少三笔隐性浪费。第一笔浪费出在热电联产机组CHP上。CHP的出力带有着典型的“以热定电”特征也就是说机组为了满足热负荷电出力被锁定在某个区间内。如果只看电功率做优化调度系统会发现CHP机组在低价时段没法降出力、在尖峰电价时段又没法满发整个运行曲线非常被动。储能此时只能去补电功率的缺口但补完电价谷段的电量又浪费了。第二笔浪费来自热力生产设备的能效差异。同样是产热燃气锅炉的热效率通常低于CHP的余热回收效率而电锅炉又受制于分时电价。如果热力系统不参与全局优化调度员只能凭经验在“烧气”和“烧电”之间二选一完全没有办法根据当天电价、气价的实时比值动态切换产热路径。第三笔浪费是储热装置被闲置。很多园区的蓄热水罐仅仅被当作热力系统的缓冲罐没有参与优化调度。实际上储热罐是打破“以热定电”约束最便宜的手段热电机组可以在电价高峰多发点电把多余的热存在罐里到了晚上热负荷上来再放热。一个几千立方米的储热罐运行得当对系统成本的改善幅度甚至超过扩建储能电池。1.2 并网型微电网的独特优势大电网才是最大的“虚拟储能”独立型微电网做优化调度难点在于必须严格保证任意时刻的电力电量平衡风、光出力波动全靠储能和柴油机扛成本高、约束紧。并网型微电网不一样它与大电网的交换功率本身就是优化变量。在分时电价机制下并网型微电网相当于拥有一条可以双向流通的“电力走廊”。电价低谷时段可以多从大电网购电给储能充电、给储热罐蓄热甚至让电锅炉直接产热电价尖峰时段可以少购电、多放电甚至反过来向电网售电。这种“低买高卖”的套利空间是并网型微电网成本优化的主要利润来源之一。但要注意并网型微电网的“并网”不是无限容量的。实际项目中线路容量、变压器容量都会限制交换功率的上限这部分作为约束条件进入优化模型后调度方案会明显更贴近工程实际。很多论文里的模型不考虑这个上限算出来的结果在工程上是不可行的。电热联合调度真正解决的问题是把“电网购售电决策”“机组出力决策”“储能充放电决策”“储热罐充放热决策”全部耦合进同一个优化问题里让不同能源品种之间形成互补而不是各自为战。2. 优化模型设计目标函数、决策变量与约束条件逐层拆解2.1 目标函数一天运行成本到底由哪些项组成电热联合调度的优化目标一般取系统日运行总成本最小。这个成本由四个典型项构成与电网交互的购售电成本、天然气燃料成本、设备运行维护成本、以及可选的碳排放成本。购售电成本是逐时段计算的。微电网在t时段从电网购电产生购电费用向电网售电获得售电收入。分时电价下购电价和售电价往往不对称建模时要把两个方向分开处理。燃气成本主要来源于CHP机组和燃气锅炉的天然气消耗。CHP机组的燃气消耗量是电出力和热出力的函数为了保持模型线性可解实际操作中通常用一组线性化系数来近似。燃气锅炉的气耗则近似为产热量除以热效率。运维成本相对简单通常取各设备出力与单位运维系数的乘积。储能和储热罐的运维成本可以按充放电/充放热功率计算也可以按累计吞吐电量计算看具体项目的统计口径。目标函数的数学形式如下[ \min C \sum_{t1}^{T} \left[ c_{\text{buy},t} P_{\text{buy},t} \Delta t - c_{\text{sell},t} P_{\text{sell},t} \Delta t c_{\text{gas}} V_{\text{CHP},t} c_{\text{gas}} V_{\text{boiler},t} \sum_{i} k_i P_{i,t} \Delta t \right] ]如果项目需要计算环境效益还可以在目标函数里叠加碳排放成本项。这里要注意一个细节目标函数的量纲一致性。电功率单位是kW热功率单位是kW或kWth时间步长Δt通常是1小时那么能量的单位就是kWh。燃料消耗量单位是m³或kg需要根据天然气热值换算成kWh再参与计算。2.2 决策变量连续变量为主启停整数变量按需取舍模型里的决策变量包括各时段购电功率和售电功率、CHP机组的电出力和热出力、燃气锅炉的热出力、电锅炉的耗电功率和热出力、储能电池的充放电功率、储热罐的充放热功率、储能和储热罐的SOC状态以及各机组的启停状态。启停变量是0-1整数变量引入后模型从LP或QP问题变成MILP问题求解难度会上升一个量级。但在实际工程里CHP机组和燃气锅炉的启停是真实存在的运行方式。如果忽略启停变量模型会默认机组在任意时段都可以自由调节出力甚至可能出现机组在一天内频繁开关的荒谬结果。一个折中的方案是典型日调度只考虑机组运行状态连续让模型自己决定是否启动机组。但如果要做全年8760小时的仿真不引入启停变量和最小启停时间约束计算量和结果可信度都会出问题。2.3 约束条件物理规律比数学公式更值得花时间电功率平衡约束是微电网模型的底线公式表达为[ P_{\text{PV},t} P_{\text{WT},t} P_{\text{CHP},t} P_{\text{dis},t} P_{\text{buy},t} P_{\text{load},t} P_{\text{ch},t} P_{\text{sell},t} P_{\text{EB},t} ]等式左边是电源侧包括光伏、风电、CHP电出力、储能放电、电网购电右边是负荷侧包括电负荷、储能充电、电网售电、电锅炉耗电。值得注意电锅炉在这里被当作负荷处理因为它消耗电能来产热是电热两个系统之间的耦合点。热功率平衡约束为[ H_{\text{CHP},t} H_{\text{boiler},t} H_{\text{EB},t} H_{\text{dis,tank},t} H_{\text{load},t} H_{\text{ch,tank},t} ]热源包括CHP余热、燃气锅炉、电锅炉、储热罐放热热负荷包括热力负荷和储热罐充热。CHP机组的热电耦合关系是整个模型里最核心也最容易出错的地方。简单的做法是把机组视为一个固定热电比的设备即电出力和热出力严格成比例。但实际机组在部分负荷工况下热电比是变化的更合理的做法是用一个“电出力-热出力可行域”来描述可行域通过几个线性不等式围成。这样机组可以在一定范围内调节电出力和热出力的比值灵活性大幅提升。储能电池的约束包括充放电功率上下限、SOC递推关系、SOC上下限以及充放电状态互斥约束。互斥约束意味着同一时刻不能同时充电和放电。这里有个工程上的细节如果模型是LP问题且不考虑电池老化损耗优化求解器会倾向于同时充电和放电来“套利”因为这样在数学上可以制造无风险收益。避免这个问题需要加入互斥约束或效率损失成本。储热罐的建模思路和储能电池类似也要考虑储热容量上下限、充放热功率限制和热量损失。不过储热罐有一个特殊性它的热损失率通常用一个与SOC成正比、与环境温差相关的系数来近似部分模型里为简化会忽略热损失但在冬季长周期仿真里热损失会导致明显的热量流失忽略它会让优化结果过于乐观。与电网交互的约束包括购售电功率上限、购售电互斥约束。实际工程中还应考虑变压器容量限制即购电功率和售电功率的绝对值都不能超过线路输送容量。3. MATLAB求解框架从YALMIP建模到MILP求解器的完整链路3.1 工具选型心得为什么推荐YALMIP配合商用求解器MATLAB里做优化调度常见的方案有几种直接用Optimization Toolbox自带的linprog/intlinprog、用YALMIP或CVX建模、或者用MATLAB的Problem-Based Optimization Workflow。直接使用linprog的问题在于建模代码冗长遇到类似储能SOC这样的时序递推约束需要手写矩阵组装改一个时间步长就要重写一堆代码非常痛苦。YALMIP的建模方式更接近数学表达式本身sdpvar定义决策变量constraints用约束表达式组装目标函数直接用sum和表达式写出来然后调用外部的求解器求解。这种建模层和求解层分离的方式让研究阶段的迭代速度快很多。求解器方面我强烈建议使用CPLEX或Gurobi。MILP问题的求解器选择直接影响求解效率尤其在考虑机组启停、购售电互斥等整数变量之后问题规模会迅速膨胀。Gurobi和CPLEX在数学规划求解效率上远超MATLAB内置求解器在学术许可下两者都能免费使用。如果条件受限退而求其次可以用intlinprog但求解速度和稳定性差距明显。YALMIP安装后用ops sdpsettings(solver,gurobi)来指定求解器。构建好约束和目标是optimize(Constraints, Objective, ops)。3.2 代码架构五段式搭建一个可复用的优化框架我强烈建议把微电网优化模型写成模块化的结构而不是一个脚本从头写到尾。一个可复用的框架可以按下面五个模块拆分。参数初始化模块负责定义所有基础参数时间步长、总时段数、负荷曲线、光伏风电出力预测曲线、分时电价、设备容量效率参数、储能初始SOC等。把这些参数集中放在模型文件顶部的结构体或者参数表中改场景时只需要改动这里。变量定义模块用YALMIP的sdpvar定义决策变量包括连续变量和整数变量。例如Pbuy sdpvar(T, 1); % 各时段购电功率 Psell sdpvar(T, 1); % 各时段售电功率 Pchp sdpvar(T, 1); % CHP电出力 Hchp sdpvar(T, 1); % CHP热出力 SOC_es sdpvar(T, 1); % 储能SOC Pch_es sdpvar(T, 1); % 储能充电功率 Pdis_es sdpvar(T, 1); % 储能放电功率 % 如果需要机组启停 u_chp binvar(T, 1); % CHP启停状态使用YALMIP的一个好处是不需要手工推导约束矩阵每条约束都直接以逻辑表达式的形式写进去。约束组装模块把上一节提到的所有约束写成Constraints [Constraints, ...]的形式。这部分的代码量最大但逻辑上跟数学表达式一一对应。求解与结果输出模块调用optimize求解然后用value()提取各决策变量的值绘图或导出。optimize有第三个返回值其中包含求解状态和耗时等信息。调试模型时一定要先检查problem的值0表示求解成功。3.3 核心代码片段与避坑说明以目标函数为例YALMIP代码可以写成Objective sum(buy_price .* Pbuy) - sum(sell_price .* Psell) ... gas_price * sum(V_chp) gas_price * sum(V_boiler) ... om_chp * sum(Pchp) om_boiler * sum(H_boiler) ... om_es * sum(Pch_es Pdis_es);这里的点乘是MATLAB数组运算的典型用法buy_price是T×1的价格向量Pbuy也是T×1的变量向量点乘按两个向量的对应元素相乘后求和得到全过程总购电成本。储能SOC递推约束写成SOC_es(1) SOC_es_initial; % 初始SOC for t 2:T SOC_es(t) SOC_es(t-1) (eta_ch_es * Pch_es(t) - Pdis_es(t) / eta_dis_es) * dt / E_es_capacity; end这个SOC递推约束有几个容易犯错的地方。一个是时间步长Δt的单位如果储能容量单位是kWh、功率单位是kW、Δt单位是小时那么能量单位一致。另一个是SOC上下限约束必须写完整SOC_min SOC_es SOC_max; 0 Pch_es Pch_es_max * u_es_ch; 0 Pdis_es Pdis_es_max * u_es_dis; u_es_ch u_es_dis 1;最后一行购售电互斥约束和充放电互斥约束是为了防止模型同时充电和放电、同时购电和售电。YALMIP对这类带0-1变量的约束支持很好求解器会自动处理。求解器设置还有一个常用的优化技巧就是为Gurobi设置MIP gap容差。默认gap是1e-4对于大型MILP问题可以适当放宽到1e-2或1e-3求解速度会有数量级的提升而成本结果差距通常小到可以忽略。ops sdpsettings(solver,gurobi,gurobi.MIPGap,0.01);4. 案例验证典型日调度结果与成本对比分析4.1 案例场景与基础参数设置为了更直观地展示电热联合调度的效果这里以一个典型的区域并网型微电网为例系统结构包括光伏、风机、CHP机组、燃气锅炉、电锅炉、锂电池储能和储热罐与大电网通过变压器相连。系统的关键参数如下表所示设备参数数值光伏装机容量600 kW风电装机容量400 kWCHP机组额定电功率500 kWCHP机组额定热功率600 kW燃气锅炉额定热功率800 kW电锅炉额定热功率400 kW锂电池储能容量/最大功率1000 kWh / 300 kW储热罐容量/最大充放热功率3000 kWh / 500 kW变压器交换功率上限800 kW负荷数据取冬季典型日电负荷峰值约1200 kW热负荷峰值约1000 kW光伏出力按冬季晴天数据风电按典型出力曲线。分时电价设定为峰段1.2元/kWh、平段0.8元/kWh、谷段0.4元/kWh天然气价格为2.5元/m³。4.2 电热联合调度 vs 传统电调度成本与运行策略差异在相同负荷、相同价格参数下分别跑两个场景。场景A忽略热力系统优化只做电功率调度热负荷由燃气锅炉和CHP按固定政策承担场景B使用电热联合调度模型CHP、燃气锅炉、电锅炉、储热罐全部参与优化。结果对比如下指标场景A电调度场景B电热联合日运行总成本21478元19325元购电成本9842元8715元燃气成本10136元9210元CHP电出力峰时段占比62%87%储热罐日累计充放热量0 kWh2860 kWh成本下降约10%主要来源是三个机制储热罐在午间光伏大发时段蓄热让CHP在电价尖峰时段提高电出力燃气锅炉在谷段减少出力改用电锅炉配合储热罐满足热负荷储能和储热罐形成“电-热”双通道的削峰填谷降低了从电网购电的峰值功率进而减少需量电费。之前表里的数据都需要实际计算验证。购电成本的变化来自购电量和购电价结构的改变CHP在峰段多发600 kW·h的电相当于减少了峰段购电量600 kW·h按峰电1.2元计算可以节约720元但峰段CHP多发也会增加燃气消耗。这个权衡正是优化模型要自动完成的。如果在项目里把“需量电费”也纳入目标函数按月度最大需量收费电热联合调度的优势会进一步放大。因为CHP在峰段多发一度电、少从电网买一度电削掉的可能是整个月最大需量这部分成本节约是长期的、复利的。4.3 参数敏感性规律什么时候联合调度收益最大几个关键参数会影响电热联合调度的收益幅度。电价峰谷差越大储热罐和储能的套利空间越大联合调度收益越明显。气电价格比越低CHP发电的相对经济性越好联合调度越倾向让CHP多发电、储热罐调节热出力。热负荷占比越高热力系统优化的价值越突出夏季热负荷很小时电热联合的意义就不大。储热罐容量也值得做敏感性分析但结论不是“越大越好”。储热罐容量增加初期收益快速上升达到某个临界点后收益增速放缓因为受限于CHP热出力和热负荷的匹配关系过多的储热容量利用率会降低。建议大家在模型里做一次容量扫描画一条“储热容量-系统日成本”曲线就能找到本项目的经济最优配置。5. 实践中的踩坑记录建模、求解与工程落地的经验教训5.1 建模阶段最容易被忽略的三个约束先说说风光出力预测数据的处理。YALMIP模型的输入如果是风光实测数据通常建议做一次平滑处理和极端值处理。光伏出力在云层快速移动时可能出现锯齿状波动风电出力存在随机性尖峰这些如果原样输入模型会让优化结果出现一些极端充电/放电指令在实际场站执行时根本无法跟踪。模拟仿真可以用典型日数据工程校验建议用聚类后的场景集。再说储热罐SOC初值的问题。储热罐和储能电池一样SOC初值会影响优化结果。更关键的是如果只做单日优化模型会在日末把储热罐放空以追求当日成本最小这与实际运行“让储热罐跨日蓄热”的需求是矛盾的。工程上处理的办法是加末时段SOC约束比如要求SOC_T等于SOC_0代表一个完整调度周期的循环或者直接用滚动优化的思路把调度窗口向后延伸。最后是时段粒度和优化周期的匹配问题。做全年经济评估时如果每个时段设为1小时优化变量数是8760乘以决策变量数量求解规模非常庞大。实际上不需要直接全年优化可以先做典型日聚类再按典型日权重折算全年成本。典型日选取方法有K-means或K-medoids聚类特征向量取光伏出力、风电出力、电负荷、热负荷四条曲线拼接聚类数取4或12分别代表季节和月份。5.2 求解阶段的两类高频问题不可行和求解超时模型不可行这是YALMIP用户最常遇到的报错。不可行的原因排在前几位的是功率平衡约束与设备容量上限冲突比如某时段热负荷需求超过了所有热源叠加储热罐放热的供给上限储热罐SOC递推与充放热功率限制冲突购售电互斥约束和交换功率上限放得太紧。排查方法是用YALMIP的check命令定位问题约束或者给约束添加松弛变量逐个放松约束找出最小的不可行约束组合。求解超时通常发生在MILP模型里。首先检查求解器日志看gap是否在快速下降。如果gap长时间不下降可能是约束中存在大M系数或数值范围差异过大的问题。微电网模型里储能容量可能是几千kWh、电价只有零点几元尺度差异过大会让求解器的数值稳定性变差。解决办法是统一量纲比如电价单位用元/kWh时功率用kW如果出现成本和功率的乘积在1e9级别可以考虑改用万元或改用更大单位的变量表示。5.3 从单日模型走向工程项目的三个扩展方向如果模型已经跑通下一步可以把碳交易机制纳入目标函数。碳交易价格和碳排放配额会在目标函数里增加一个与碳排放量线性相关的项CHP机组相比燃气锅炉有综合能效优势加入碳成本后这个优势会被进一步放大调度策略可能从“以热定电”转向“以碳定电”。还可以做不确定性优化对风光出力预测误差进行处理。常见做法包括基于场景的随机优化和两阶段鲁棒优化。场景随机优化相对容易实现对预测误差的分布生成若干场景然后目标函数变成期望成本最小化。鲁棒优化则要在最坏场景下保证可行性保守性更强实际工程里要根据项目对可靠性的要求来选择。从研究模型走向工程落地还需要考虑与实时控制层MPC的衔接。日前优化调度给出未来24小时各设备的出力计划实时控制层根据实际风光出力和负荷偏差做滚动修正。这种“日前优化实时调整”的分层架构是目前综合能源系统项目的常见做法MATLAB里可以分别实现两层模型再通过数据接口联动。我在实际项目中体会最深的一点是模型跑通只是第一步能不能让现场运维人员理解并执行调度曲线才是项目是否真正创造价值的关键。电热联合调度的结果有时候看起来“反直觉”——比如在夏天让CHP停机、全靠电锅炉供生活热水比如在电价很高时反而从电网买电喂给电锅炉。这些策略背后都有严格的数学推导和成本依据但需要给团队讲清楚逻辑现场才会放心执行。这一步如果省了再好的优化模型也只是一堆图纸。