ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

综合能源系统优化调度:计及需求响应与阶梯碳交易的MILP建模及MATLAB复现

综合能源系统优化调度:计及需求响应与阶梯碳交易的MILP建模及MATLAB复现 做综合能源系统优化调度的同学这几年应该没少和“综合需求响应”“阶梯型碳交易机制”这两个词打交道。论文里写起来是一页公式真正拿到MATLAB里复现从设备建模、分段线性化到求解器配置每一步都有暗坑。我最近把“考虑综合需求响应和阶梯型碳交易机制的综合能源系统优化调度策略”完整复现了一遍整理出一份能直接照着做的路径。这篇就把整个建模思路、MILP转换细节、Yalmip实现代码和调试心得一次说清楚目标是让你少走弯路尽快跑出自己的结果。先说清楚这套模型是干什么的。给定电、热、气三类负荷的24小时预测曲线加上风电、光伏的出力预测系统里有CHP、燃气锅炉、电锅炉、P2G和储能可以从电网和气网购能目标是让一个调度周期内的总成本最低。总成本里既包含购电购气成本、设备运维成本也包含碳交易成本和综合需求响应的补偿成本。最终输出的是每个设备各时段的出力计划、负荷侧响应后的曲线、总碳排放和碳交易费用。这个框架在近几年的论文里非常常见也是低碳园区、综合能源站优化运行的标配模型适合正在做课题的研究生、想快速搭建调度框架的工程师参考。1. 问题背景与方案总体思路1.1 为什么要把需求响应和碳交易放在一起考虑综合能源系统最核心的特点就是多能互补电、热、气多种能量形式在同一个框架下耦合源侧有CHP、燃气锅炉、电锅炉、P2G荷侧有电负荷、热负荷、气负荷。这时候如果只做供给侧优化所有调节压力都在设备出力上储能和P2G容量不足时根本调不过来而且高峰时段让燃气机组多发虽然能满足负荷成本却不低。需求响应把负荷侧从“被动满足”变成“主动参与”削峰填谷、转移用电时段、削减可调负荷等于给系统多了一层调节资源。碳交易机制则是从另一个维度施加约束。它给碳排放一个经济价格超出免费配额的部分要花钱买阶梯碳价下排得越多边际价格越高这会直接改变设备的出力排序。比如碳价高的时候燃气锅炉和CHP这种直接烧天然气的设备用起来会变贵系统就更倾向于用电锅炉供热、用外购电满足电负荷甚至启动P2G把多余风电转成天然气。但这里有个关键问题如果只做需求响应不考虑碳价负荷曲线被改平了碳排放不一定降低只做碳交易不考虑需求响应高碳价下系统可能会简单粗暴地少用燃气设备但部分时段的风电弃掉、设备利用率下降经济性很差。所以综合需求响应和阶梯碳交易必须放进同一个优化模型里联合求解让两种机制互相配合。举个很直观的例子。夜间风电大发、电价低如果当天碳价预测很高单看电平衡系统会让电锅炉多用电产热但这会增加外购电量外购电按电网平均碳排放因子折算后总碳排放可能不降反升。如果只看碳约束系统又不敢多用电最后只能让燃气锅炉多烧气供热。两者耦合之后的最优解很可能是把一部分可转移电负荷挪到夜间去消纳风电同时让P2G启动制气补充气网两边协同碳排放和经济性同时改善。这种跨能源品种的联动就是这套模型的核心价值。1.2 整体调度框架与建模流程整个模型的搭建流程我实际做下来基本是六步数据准备。包括24小时的电、热、气负荷预测曲线风电和光伏的预测出力分时电价、天然气价格CHP、燃气锅炉、电锅炉、P2G、储能的技术参数碳交易参数免费配额、区间长度、各段碳价需求响应的可调比例和补偿单价。变量定义。所有设备的逐时出力、储能充放电功率和SOC、外购电和外购气量、需求响应量转移、削减、碳排放缺口和每个阶梯区间的排放量。约束建模。设备容量和爬坡约束、电热气三类能量平衡约束、储能SOC递推约束、需求响应行为约束、碳排放分段约束全部写成线性等式或不等式。目标函数。总成本最小化包括购电成本、购气成本、设备运维成本、碳交易成本、需求响应补偿成本。Yalmip建模。用sdpvar定义连续变量binvar定义0-1变量把约束和目标函数拼装成Yalmip模型调用Gurobi或CPLEX求解。结果后处理。提取各设备出力序列绘制负荷响应前后曲线拆分各项成本做场景对比。需要说明的是这个模型我用的是混合整数线性规划MILP不是非线性规划。原因是模型里有0-1变量可转移负荷的启停时段要用整数变量表达碳排放阶梯区间要用0-1变量做分段指示。线性模型的好处是稳定、快、能保证全局最优而如果让碳交易成本变成非线性函数求解器可能陷入局部最优复现起来非常麻烦。所以下面所有非线性逻辑我都会在线性化环节处理掉。2. 综合需求响应的建模细节2.1 负荷分类与可调潜力分析综合需求响应相比传统电力需求响应最大的区别是把热负荷和气负荷也纳进来了。我习惯把负荷分成四类来建模固定负荷必须在对应时段满足不参与响应。这是每类负荷的基础盘。可转移负荷可以在时间窗口内整体平移到其他时段但调度周期内的总用电量或总用能量不变。典型例子是工厂的非连续生产线、洗衣房设备、蓄热电采暖提前或延后一两个小时运行不影响生产生活。可削减负荷在高峰时段可以削减一部分削减掉的部分不需要在别处补回来。典型例子是空调、照明、部分工业辅助负荷降低一点运行功率或者缩短运行时间。可替代负荷原本用某种能源形式现在可以改用另一种能源形式。比如天然气热水器换成电热水器气负荷下降、电负荷上升或者集中供热的一部分原本靠燃气锅炉现在可以由电锅炉分担。这个在实际建模里通过热平衡约束自然体现不需要额外定义专门的可替代变量。可调潜力分析方面我参考了文献里的常见取值电负荷可转移比例一般在5%到15%可削减比例在5%到10%热负荷因为热惯性大短时间降低供热功率不会立即影响室温可削减比例能到15%到20%气负荷由于管网压力和用户用气连续性的限制可转移和可削减比例一般控制在5%左右太高的话优化器会把气负荷削得面目全非结果不真实。2.2 电/热/气负荷的响应建模方法电负荷的响应建模是我最先写的一步也是最容易出错的一块。以电负荷为例响应后的实际负荷可以写成P_load(t) P_load0(t) P_shift(t) - P_cut(t)其中P_load0(t)是原始预测负荷P_shift(t)是转移带来的净变化量正为转入、负为转出P_cut(t)是削减量。这里有几个约束必须写全第一个是转移量的上下限约束-ΔP_shift_max ≤ P_shift(t) ≤ ΔP_shift_max这个好理解每个时段能转移的量有限。第二个是总电量守恒sum(P_shift(t))0。这个约束极其关键。如果不写优化器会把负荷直接转移到成本最低的时段凭空制造或消灭电能结果完全失真。实际编程时我建议把P_shift拆成两个非负变量P_shift(t) P_shift_up(t) - P_shift_down(t)然后约束sum(P_shift_up(t)) sum(P_shift_down(t))。这样做的好处是后续算需求响应补偿成本时可以直接用P_shift_up(t) P_shift_down(t)表示总转移量不需要处理绝对值。第三个是削减量上限0 ≤ P_cut(t) ≤ δ_cut × P_load0(t)δ_cut是允许削减比例。第四个是可削减总量限制sum(P_cut(t))要小于某个上限避免系统在个别时段把负荷削到零、其他时段又全部恢复出现不合理的锯齿形曲线。热负荷的响应建模相对简单主要就是削减。因为热负荷有热惯性短期降低供热功率后室内温度不会立刻变化所以约束只需要写0 ≤ H_cut(t) ≤ δ_h × H_load0(t)就行。如果你的模型里有蓄热罐或者建筑热动态方程可以进一步细化热负荷的响应约束但作为第一版复现用比例上限就够了。气负荷的响应建模和电负荷类似V_load(t) V_load0(t) V_shift(t) - V_cut(t)同样有总量守恒和上下限约束。需要注意的是气负荷响应在实际工程里约束更多比如很多工业用户用气是连续的、不能随意中断所以可转移比例不要设太大。我最后用的气负荷可转移比例只有3%可削减比例5%。2.3 响应成本的计算方式需求响应不是白调的用户参与响应需要补偿这部分成本必须写进目标函数。综合需求响应的补偿成本我写成C_idr Σt [ c_shift×(P_shift_up(t) P_shift_down(t)) c_cut×P_cut(t) c_h_cut×H_cut(t) c_gas_cut×V_cut(t) ]补偿单价的取值要参考当地电价水平和用户停电损失。我查了一些文献和工程案例电负荷削减补偿一般按峰谷电价差的一半左右估算0.3元/kWh是一个比较常见的值电负荷转移因为对用户影响更小补偿单价可以低一些0.15到0.2元/kWh热负荷削减按等价热值折算我取0.2元/kWh气负荷削减补偿一般取0.15元/kWh。这些单价最后会直接影响优化结果里需求响应用了多少后面讲参数敏感性时我再细说。这里有一个实操细节要提醒补偿成本里的转移量必须是绝对值但MATLAB里写绝对值会让模型变成非光滑的。把P_shift拆成P_shift_up和P_shift_down之后成本直接写两者之和这是我在复现过程中觉得最顺手的线性化方式。3. 阶梯型碳交易机制的数学建模3.1 从统一碳价到阶梯碳价的演进逻辑统一碳价的模型很简单超额排放部分按固定单价计算C_co2 λ×(E_total - E_free)排放少了还可以卖出配额获得收益。问题在于线性碳成本对高排放系统的约束力有限。假如某时段多排一吨碳的成本只有几十块钱而多烧天然气供热的收益超过这个数优化器就会选择继续多排反正价格不变。阶梯碳价的核心是“梯度递增”碳排放量超出免费配额越多边际碳价越高类似居民阶梯电价。比如第一档0.25元/kg第二档0.35元/kg第三档0.5元/kg系统多排到第三档时继续增加排放的边际成本就是0.5元/kg这时很多高碳出力方案就不再经济了。用这种方式碳交易机制对系统碳排放的引导作用会明显增强低碳改造的边际收益也更大。3.2 免费配额与阶梯碳价的数学表达免费配额的确定工程上常用基准线法也就是按系统输出能量的碳排放基准值分配。我在模型里简化处理设了一个固定的日配额E_free单位为kg。你也可以按负荷比例动态折算比如E_free α_e×ΣP_load α_g×ΣV_load效果类似。阶梯碳价的数学表达我给出复现时常用的一组参数超额排放范围边际碳价0 ~ L1c1 0.25元/kgL1 ~ L1L2c2 0.35元/kg L1L2c3 0.5元/kg其中L1和L2是阶梯区间长度我设的是L12000kg、L22000kg也就是超额排放2000kg以内按第一档价2000到4000kg区间内的部分按第二档价超过4000kg的部分按第三档价。注意这是“区间内增量”计价不是总量一刀切。总碳交易成本表达式是C_co2 c1×d1 c2×d2 c3×d3这里的d1、d2、d3分别是落在第一、第二、第三档区间内的排放量三者相加等于超额排放量ΔE。实际计算时还要考虑碳排放可以用于出售的情况如果ΔE 0说明系统实际排放低于配额可以出售配额获得收益。为了让模型简单我设定ΔE最小为0也就是不允许负排放套利。如果你要处理出售配额的情况可以加一个max(ΔE, 0)处理但会多一个非线性项建议第一版先不做。3.3 分段线性化的MILP实现阶梯碳价的分段函数是连续的但非线性不能直接扔给Gurobi求MILP解必须做分段线性化。这一步是复现过程中最容易踩坑的地方我在这里卡了差不多一整天。先说思路。我用三个0-1变量z1、z2、z3表示超额排放落在哪一个“最高档”这三个变量互斥约束z1z2z31。比如ΔE1000kg落在第一档那z11d11000d2d30ΔE3000kg落在第二档因为超过了L12000此时z21d12000d21000d30ΔE4500kg落在第三档此时z31d12000d22000d3500。关键约束是确保“前档填满才有后档”。完整约束组如下ΔE d1 d2 d3z1 z2 z3 10 ≤ d1 ≤ L10 ≤ d2 ≤ L20 ≤ d3 ≤ Md1 ≥ L1×(z2 z3)d2 ≥ L2×z3d2 ≤ M×(z2 z3)d3 ≤ M×z3逐个解释一下。d1≥L1×(z2z3)表示当最高档是第二或第三档时d1必须等于L1也就是第一档先填满d2≥L2×z3表示当最高档是第三档时第二档也必须填满d2≤M×(z2z3)表示如果最高档是第一档z11那么d2不能有值d3≤M×z3保证只有最高档是第三档时第三档才有排放。M的取值要注意不能太小否则限制约束不能太大否则数值病态。我取的是最大可能超额排放量的1.2倍大约8000kg。这里特别提醒一个新手常见的错误写法只写0 ≤ d2 ≤ L2×z2然后z1z2z31。这样当ΔE4500kg需要落在第三档时z31、z20d2就被强制为0了但实际第二档应该填满2000kg结果完全错乱。所以一定要用“前档填满”的逻辑而不是“每个档独立开关”。4. 综合能源系统设备建模与约束体系4.1 能量枢纽模型与设备选型这个模型我按单母线能量枢纽来搭建。输入端是电网和气网风电和光伏直接并入母线内部耦合设备包括CHP、燃气锅炉、电锅炉、P2G和电储能输出端是电负荷、热负荷和气负荷。这里用单母线模型的好处是暂不考虑网络潮流和网损先把设备耦合逻辑跑通后续要扩展多节点再引入支路功率和节点电压约束。设备选型上有一个心得CHP是整个热电耦合的核心建模必须严谨它的出力范围、热电比、效率曲线直接决定优化结果P2G的主要价值是消纳风光和参与碳减排容量不需要贪大按风电峰值功率的50%到80%配置比较合理储能是平抑净负荷波动的主力容量和功率要匹配峰谷差。4.2 CHP、燃气锅炉、P2G与储能的数学模型CHP我按背压式机组简化这种机型热电比固定约束最简洁。出力约束为P_chp_min ≤ P_chp(t) ≤ P_chp_maxH_chp(t) k_chp × P_chp(t)耗气量折算公式为V_chp(t) P_chp(t) / (η_e × LHV)。这里LHV是天然气低热值按9.7 kWh/m3算。如果论文里用的是抽凝式CHP可行域变成一个P-H平面上的多边形需要用凸包顶点法写线性约束逻辑类似但更复杂第一版建议先用背压式。燃气锅炉模型简单H_gb(t) η_gb × V_gb(t) × LHV出力范围0到额定热功率。电锅炉同理H_eb(t) η_eb × P_eb(t)0 ≤ P_eb(t) ≤ P_eb_max。P2G模型描述的是电转气过程先把电能通过电解水制氢再通过甲烷化反应生成天然气。简化的能量关系是V_p2g(t) η_p2g × P_p2g(t) / LHV出力范围0到额定功率。这里要注意P2G消耗的电能和产出的气量之间是线性关系可以直接写进平衡约束不需要引入非线性项。另外P2G甲烷化过程会消耗CO2所以有的模型把P2G的减碳量当成碳排放的负项处理我建议第一版可以先不加跑通基础模型后再扩展这样排查问题时好定位。电储能是最常见的设备用SOC递推方程描述SOC(t1) SOC(t) (P_ch(t)×η_ch - P_dis(t)/η_dis)×Δt / Cap约束包括SOC上下限、充放电功率上下限还有始末SOC相等SOC(25)SOC(1)保证调度周期内的周期性。充放电不能同时发生这个可以加一个0-1变量互斥也可以直接用充放电功率乘积为0的非线性约束再线性化。我实际用的是引入二进制变量b_sto约束P_ch(t) ≤ b_sto(t)×P_ch_max、P_dis(t) ≤ (1-b_sto(t))×P_dis_max这样既物理合理又不影响线性性。4.3 系统功率平衡与网络约束能量平衡约束是整个模型的骨架也是最容易被忽视的地方。三类能量平衡如下电平衡P_grid(t) P_wt(t) P_pv(t) P_chp(t) P_dis(t) P_load(t) P_eb(t) P_p2g(t) P_ch(t)热平衡H_chp(t) H_gb(t) H_eb(t) H_load(t)气平衡V_gas_buy(t) V_p2g(t) V_chp(t) V_gb(t) V_load(t)这里P_load、H_load、V_load都必须是经过需求响应之后的实际负荷不是原始预测值。很多刚开始复现的同学在这犯迷糊直接用了原始负荷结果需求响应部分的约束形同虚设。风电和光伏我要单独强调。它们按预测功率上限输入但实际使用量可以小于预测值多出来的部分就是弃风弃光。也就是说P_wt_use(t) ≤ P_wt_forecast(t)P_pv_use(t) ≤ P_pv_forecast(t)弃风弃光量是预测值和实际值之差是非负变量。如果不允许弃风系统强制全额消纳P2G和储能的容量就会被逼得非常大有时候甚至导致无解。5. MATLAB复现的完整实现路径5.1 环境准备MATLAB Yalmip Gurobi复现这套模型标准配置是MATLAB Yalmip Gurobi。我用的MATLAB是R2023bR2020b以上的版本都没问题Yalmip是MATLAB的免费建模工具箱下载后把文件夹加入路径就能用不需要编译Gurobi是商用MILP求解器学术版免费申请求解速度比MATLAB内置的intlinprog快非常多。安装完成后在MATLAB命令行输入yalmiptest如果显示All tests passed说明环境正常。如果没有Gurobi先用intlinprog跑小规模案例也可以但24个时段、多个0-1变量的模型求解时间会明显变长强烈建议把Gurobi装上。5.2 核心代码架构与关键实现代码结构我分成六个模块参数初始化、变量定义、约束拼装、目标函数、求解调用、结果提取。先看参数定义部分T 24; % 调度周期小时 % 设备参数 P_chp_max 1.5; P_chp_min 0.1; k_chp 1.3; eta_chp_e 0.35; H_gb_max 3; eta_gb 0.9; P_eb_max 2; eta_eb 0.95; P_p2g_max 0.8; eta_p2g 0.6; Cap 2; P_sto_ch_max 0.5; P_sto_dis_max 0.5; eta_ch 0.95; eta_dis 0.95; LHV 9.7; % 天然气低热值kWh/m3 % 负荷曲线、风光预测、电价气价均为24×1向量按实际数据填入 P_load0 ...; H_load0 ...; V_load0 ...; P_wt_f ...; P_pv_f ...; price_e ...; price_gas ...; % 碳交易参数 E_free 5000; L1 2000; L2 2000; M 8000; c1 0.25; c2 0.35; c3 0.5;决策变量用Yalmip的sdpvar定义连续变量、binvar定义0-1变量P_chp sdpvar(1,T); H_chp sdpvar(1,T); V_chp sdpvar(1,T); H_gb sdpvar(1,T); V_gb sdpvar(1,T); P_eb sdpvar(1,T); H_eb sdpvar(1,T); P_p2g sdpvar(1,T); V_p2g sdpvar(1,T); P_grid sdpvar(1,T); V_gas_buy sdpvar(1,T); P_wt_use sdpvar(1,T); P_pv_use sdpvar(1,T); P_sto_ch sdpvar(1,T); P_sto_dis sdpvar(1,T); SOC sdpvar(1,T1); P_shift_up sdpvar(1,T); P_shift_down sdpvar(1,T); P_cut sdpvar(1,T); H_cut sdpvar(1,T); V_cut sdpvar(1,T); b_sto binvar(1,T);目标函数拆成五项成本Objective sum(price_e .* P_grid) ... % 购电成本 sum(price_gas .* V_gas_buy) ... % 购气成本 sum(0.02 * P_chp) ... % CHP运维成本 sum(0.015 * H_gb) ... % 燃气锅炉运维成本 sum(0.01 * P_eb) ... % 电锅炉运维成本 C_co2 ... % 碳交易成本 C_idr; % 需求响应补偿成本约束拼装部分我列出最关键的储能和碳交易逻辑。储能互斥约束是关键之一Constraints [Constraints, SOC(1) 0.5]; for t 1:T Constraints [Constraints, SOC(t1) SOC(t) (P_sto_ch(t)*eta_ch - P_sto_dis(t)/eta_dis)/Cap]; Constraints [Constraints, 0 P_sto_ch(t) P_sto_ch_max*b_sto(t)]; Constraints [Constraints, 0 P_sto_dis(t) P_sto_dis_max*(1-b_sto(t))]; Constraints [Constraints, 0.1 SOC(t) 0.9]; end Constraints [Constraints, SOC(T1) SOC(1)];碳交易分段约束是重点E_total sum(P_grid .* e_grid) sum((V_chp V_gb) .* e_gas); deltaE E_total - E_free; d1 sdpvar(1,1); d2 sdpvar(1,1); d3 sdpvar(1,1); z1 binvar(1,1); z2 binvar(1,1); z3 binvar(1,1); Constraints [Constraints, deltaE d1 d2 d3]; Constraints [Constraints, z1 z2 z3 1]; Constraints [Constraints, 0 d1 L1, 0 d2 L2, 0 d3 M]; Constraints [Constraints, d1 L1*(z2z3)]; Constraints [Constraints, d2 L2*z3]; Constraints [Constraints, d2 M*(z2z3)]; Constraints [Constraints, d3 M*z3]; C_co2 c1*d1 c2*d2 c3*d3;求解调用部分ops sdpsettings(solver,gurobi,verbose,1,showprogress,1); sol optimize(Constraints, Objective, ops); if sol.problem 0 P_grid_opt value(P_grid); % 继续提取其他变量 else disp(sol.info); end这套代码看起来不复杂但每个模块的细节都有讲究。比如E_total里e_grid是电网碳排放因子单位是kg/kWh我按0.7 kg/kWh取e_gas是天然气碳排放因子按2.16 kg/m3折算。这个要在单位上小心计算出来才准确。5.3 仿真参数设置与典型场景我用的典型参数如下设备/参数数值CHP额定电功率1.5 MW最小0.1 MW热电比1.3燃气锅炉3 MW效率0.9电锅炉2 MW效率0.95P2G0.8 MW效率0.6电储能2 MWh充/放功率0.5 MW效率0.95风电预测0~1 MW波动光伏预测0~0.6 MW波动典型日我选了冬季负荷曲线因为冬季热负荷高CHP、燃气锅炉、电锅炉都会出力热电耦合关系非常明显碳交易和需求响应的效果也最容易被看出来。场景对比建议设三组场景1不考虑需求响应碳交易用统一碳价场景2不考虑需求响应碳交易用阶梯碳价场景3综合需求响应 阶梯碳价也就是完整模型。三组场景跑完分别记录总成本、碳排放、购电购气量、需求响应量这样能清楚地看出两个机制各自发挥了什么作用。5.4 结果分析调度方案与碳排放曲线结果输出的形式一般是几张曲线图各设备24小时出力堆叠图、电热负荷响应前后对比图、储能SOC曲线、P2G启停状态、碳排放和碳交易成本变化。以我实际跑出来的典型结果看大趋势是CHP在热负荷高峰时段接近满发低谷时段降低出力储能在低电价时段充电、高电价时段放电P2G在夜间风电大发和碳价较高的时段启动需求响应把部分高峰电负荷转移到了风电大发的夜间同时削减了少量热负荷。成本对比大致呈现出这样的规律成本项场景1统一碳价场景2阶梯碳价场景3完整模型购电成本8200元8150元7800元购气成本4300元4350元4200元碳交易成本1350元980元640元需求响应补偿0元0元320元总成本13850元13480元12960元数据是示例值参数不同结果会有差异但趋势是一致的阶梯碳价能显著压低碳排放和碳交易成本综合需求响应则进一步改善负荷曲线、减少弃风让系统以更低的购能成本运行。6. 复现过程中遇到的坑与调试心得6.1 常见问题排查速查表复现过程里我遇到的最典型问题整理成一张速查表方便你们对号入座现象可能原因解决办法求解器返回Infeasible约束互相冲突先只保留能量平衡约束再逐条加回其他约束定位冲突源结果里储能同时充放电缺少互斥约束引入0-1变量b_sto用大M约束限制碳交易成本一直是0免费配额E_free设得过大检查E_total和E_free的数量级是否合理P2G从不启动P2G收益不如其他供能方式提高碳价、允许弃风、增大P2G容量可转移负荷变成随意漂移没写电量守恒约束加sum(P_shift_up)sum(P_shift_down)求解时间过长整数变量太多MIPGap设为0.01或减少阶梯分段数6.2 模型求解不收敛怎么办很多同学说“模型不收敛”实际上MILP不存在不收敛的概念要么是Infeasible要么是求解太慢。Infeasible的定位方法我刚才提到过先把所有约束注释掉只保留最基本的电热水平衡跑通了再加设备容量约束、储能约束、需求响应约束、碳交易约束每加一组跑一次哪一步导致不可行问题就出在哪一组里。如果求解太慢优先减少整数变量的数量。比如可转移负荷如果每个时段都用0-1变量标记启动状态24个时段就是24个整数变量加上储能互斥的24个、碳交易分段的3个总共几十个整数变量规模不大但也要注意。如果觉得慢可以把可转移负荷的0-1建模改成连续变量加总量守恒的做法整数变量一下就少了。碳交易的分段数从3档降到2档求解时间也能明显缩短。Gurobi的参数里MIPGap设为0.01甚至0.05允许1%到5%的最优性误差求解速度往往能快好几倍。对于这种调度策略类的问题1%的误差完全不影响决策分析。6.3 参数敏感性调整经验最后一节讲点实际心得。需求响应的可调比例我试过几组10%左右是比较合理的太高会让负荷曲线严重扭曲优化结果失去实际意义碳价c1取0.2到0.3元/kg比较合适阶梯斜率用1.4倍左右这种情况下系统会主动减碳又不会过度牺牲经济性P2G容量按风电峰值功率的50%到80%配置太大会在无风时段闲置太小起不到减排作用。另外电网碳排放因子越大P2G和储能的减排价值就越明显如果你的研究场景里电网更“脏”模型结果里P2G的启动频率会显著上升。我个人实际测下来这套模型最花时间的反而不是求解那一下而是把每个约束的物理含义和经济逻辑想透。尤其是需求响应的电量守恒和碳交易的分段线性化这两个地方一旦想明白了整个复现就会顺畅很多。做这类仿真课题慢一点没关系跑通第一版之后再逐步加细节你会发现后面的扩展——比如加蓄热罐、加多节点网络、加源荷不确定性——都会变得非常顺手。
返回列表