ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

阶梯碳交易与电制氢的热电联供优化建模及MATLAB实现

阶梯碳交易与电制氢的热电联供优化建模及MATLAB实现 做综合能源系统优化的人肯定绕不开一道坎热电联供模型建好了结果碳交易价格一变整个调度方案就跟着翻车或者把电制氢加进去之后目标函数直接变得别扭MATLAB里一跑就报错。我做这套“阶梯型碳交易电制氢”的热电优化最初就是被这类问题反复折磨。整套系统跑通之后回头看真正的难点不在MATLAB语法而在于三种不同时间尺度的机制怎么在同一个优化框架里自洽热负荷的惯性、氢能的可存储性、碳价格的阶梯跳跃。这篇文章把我从建模到求解、从参数设置到调参避坑的完整过程整理出来。适合正在做综合能源系统、热电联产优化、碳交易机制建模相关课题的研究生和工程师参考。核心内容包括三条能量流的建模框架、阶梯碳价格的分段线性化处理、电制氢设备的运行约束、以及基于MATLAB的求解器选型与结果校验。文中用到的参数都是我自己跑过的实际设置你可以直接拿来做模板再按自己的系统规模调整。1. 三条能量流的耦合逻辑为什么要把碳交易和电制氢放进热电优化1.1 系统里到底有哪些设备能量是怎么走的先交代我搭建的这个园区级综合能源系统的基本结构。它不算复杂但足够把热、电、氢三条线串起来供能侧光伏、风电、燃气轮机CHP机组含余热回收、燃气锅炉、电锅炉、电解槽P2H。储能侧储氢罐、储热罐。负荷侧电负荷、热负荷、氢负荷。这三条能量流不是各走各的而是通过设备耦合在一起。电这一侧最热闹光伏和风电出力、CHP发电、外购电汇入母线然后分配给固定电负荷、电锅炉和电解槽。热这一侧主要靠CHP余热、燃气锅炉和电锅炉供应走储热罐缓冲。氢这一侧就简单一些电解槽产氢进储氢罐再输出给氢负荷。我在建模时特意画了一张能量流图放在代码注释里每次改模型都先看它一眼。说实话不管后面数学约束写得再漂亮只要能量流方向搞错优化结果一定是乱的。这个习惯建议保留。1.2 碳交易机制在优化模型里的作用边界传统热电优化只看经济成本碳排放是事后算账。碳交易进入目标函数后碳排放从“账外指标”变成了“带价格资源”。这一步变化非常关键之前调度员没有动力为减碳改变方案现在每一吨排放都要付出代价优化器自然会重新分配出力。阶梯型碳交易和固定碳价最大的区别在于超过免费配额后超额越多单价越贵。政策意图很明确就是“层层加码”倒逼减排放到数学上这构成了一个凸的分段函数。它的直接效果是系统在排放量逼近配额边界时会主动调整运行方式比如减少外购电、压低燃气锅炉出力、把更多电量拿去制氢而不是简单地在所有时段均匀减碳。从优化角度看阶梯碳价给决策变量增加了一个全局性的成本信号。如果没有这个机制优化器只在“买电还是烧气”之间做局部权衡有了阶梯碳价之后系统必须从全天24小时的整体排放量出发去做计划。1.3 电制氢增加的灵活性到底值在哪里电制氢进入系统最大的变化是电负荷从固定参数变成了一部分决策变量。以前母线电负荷是刚性的优化器只能被动满足现在电解槽是一个“可调大负荷”它可以选择在某个时段多用电制氢也可以停机不用。这在运行上意味着三件事第一低谷消纳。光伏大发或者电价便宜的时段电解槽可以抬升用电量避免弃风弃光把多余电能变成氢气存起来。第二碳排转移。外购电和天然气都伴随碳排放制氢的耗电会把一部分排放在时间上“挪走”——比如用半夜的低排放电力制氢替换白天高排放的燃气供热整体碳排放水平就降下来了。第三热电解耦。CHP机组存在“以热定电”的天然耦合。有了电制氢之后系统在热负荷低的时段也可以让CHP多发电去制氢相当于给热电比例解了绑。我搭建的模型里没有放燃料电池只考虑氢负荷和储氢罐所以电解槽的实际作用是消纳可再生能源和间接调整热电比例。如果后续加一个燃料电池氢能还能反哺电力高峰灵活性会更大但那部分超出本文主题先不展开。2. 设备层建模CHP机组、燃气锅炉与电解槽的参数体系搭建2.1 CHP机组的热电耦合可行域多边形近似与线性不等式CHP机组建模是整个系统里最需要谨慎的一步。燃气轮机加余热锅炉之后电出力和热出力之间存在强耦合发了多少电就必然产生相应的热。如果把这种耦合关系简化成固定热电比在小范围里没问题但一旦负荷波动大固定热电比会严重影响优化精度。更通用的做法是用“热电运行可行域”来描述。这个可行域在电出力热出力平面上是一个多边形每个边对应一个线性不等式。工程中常见的提取凝汽式机组可行域会有六到八个顶点对园区里常见的小型燃气轮机一般用矩形加斜坡边就能近似。我实际用的是四个线性不等式组合% 假设CHP电出力范围为[Pmin, Pmax]热出力为[Hmin, Hmax] P_chp_min P_chp P_chp_max; H_chp_min H_chp H_chp_max; P_chp alpha * H_chp S_max; % 电热妥协约束 P_chp - beta * H_chp L_min; % 低负荷约束这里的alpha和beta是热工参数alpha通常可以取机组电功率与热功率同时达到上限的斜率beta控制低负荷区域的边界。为什么用这种不等式而不是精确多边形因为线性规划求解器对这类约束处理效率极高而多边形精确顶点组合在变量多的时候反而容易让矩阵变稀疏、求解变慢。CHP还有两个不能漏的约束爬坡约束和最小启停时间。爬坡约束表达成相邻时段出力差值的绝对值限制在MATLAB里用两对不等式实现P_chp(t) - P_chp(t-1) ramp_up; P_chp(t-1) - P_chp(t) ramp_down;最小启停时间这种整数约束在园区级系统里可以暂时忽略因为CHP一般作为基荷连续运行但如果你的系统里CHP需要频繁调整最好加上。燃料成本方面CHP消耗的天然气量按电效率和热效率分别折算。简化做法是直接按总供能折算气耗V_gas_chp (P_chp / eta_e H_chp / eta_h) * delta_t其中eta_e和eta_h分别是发电效率和余热回收效率。注意这里不能把电效率和热效率直接相加使用它们对应的是不同的能量输出端口。2.2 电解槽P2H模型效率、最小负荷与启停状态电解槽的物理特性比CHP简单但有几个细节必须处理否则模型跑出来不符合实际。首先是效率。电解槽的V-I特性导致负荷率低时效率偏低但这会让模型变成非线性。工程论文里最常见也最稳的简化是给定一个综合效率eta_p2h把电功率直接折算成氢气热值H2_kg eta_p2h * P_p2h * delta_t / LHV_H2;LHV_H2是氢气低热值约33.33 kWh/kg。我用的eta_p2h取0.70这个值在碱性电解槽的典型范围内。如果你想做得更细可以用一条分段线性效率曲线但那样模型就变成MIQP了求解器选择要跟着变。其次是运行区间。电解槽不能无限降低功率一般有最小负荷率。这就需要一个0-1启停变量u_p2hu_p2h * P_min P_p2h u_p2h * P_max;这个约束的意义在于停机时功率必须为0运行时功率必须高于最小负荷率对应的值。如果不加这个优化器会给出“功率0.001 kW但仍在线”的荒谬方案结果储能曲线会一直抖动。第三是启停代价。如果模型允许电解槽每个时段随便开关优化结果会出现频繁启停实际设备根本受不了。处理办法有两种一是在目标函数里加启停成本项二是限制一天内启停次数。我用的是加启停成本C_start K_start * max(0, u_p2h(t) - u_p2h(t-1));这种max形式在MILP里要用辅助变量实现。MATLAB中可以直接写成v_start sdpvar(T,1); % 启动指示变量 v_start 0; v_start u_p2h(t) - u_p2h(t-1);然后在目标函数里加上K_start * sum(v_start)。实测下来K_start取200元左右就能有效抑制频繁启停又不至于让电解槽完全没有调节能力。2.3 储氢罐、储热罐与电网交互接口的预留储能建模的通用逻辑是状态量递推上一时段剩余量加上本时段充入量减去本时段放出量。储氢罐我用的单位是kg递推式如下SOC_hst(t1) SOC_hst(t) eta_ch * Q_hst_in(t) - Q_hst_out(t) / eta_dis; SOC_min SOC_hst SOC_max; SOC_hst(T1) SOC_hst(1); % 周期平衡约束周期平衡约束非常重要。如果不加优化器会把储氢罐在最后时段“用空”在第一个时段“灌满”相当于白嫖了初始储能结果没有实际意义。热罐和电储能都是同一套路。储氢罐的充放速率也要限制。这里有一个常见的隐含问题充入功率和放出功率不能同时为正。如果模型允许同时充放优化器会想办法做无意义的“充放循环”来消耗多余能量导致结果失真。解法是加互斥约束或者接受轻微的违反并用一个小惩罚项压制。我采用互斥约束因为求解器处理起来不复杂。电网交互接口要提前定好边界。外购电功率有上限P_buy_max这是实际合同容量决定的是否允许售电也要提前决定。我做的模型里不允许向电网反送电原因有两个一是园区并网协议通常限制反送二是允许售电会让优化器在最便宜的时段疯狂购电再高价时段卖出掩盖了热电优化的核心问题。如果你研究的系统确实允许双向互动再单独放开这个约束。分时电价曲线也是在这里接入的。我用的典型工商业分时电价谷段0.35元/kWh、平段0.70元/kWh、峰段1.20元/kWh。这个价格结构直接影响电解槽的运行时段——后文结果部分能看到制氢基本都集中在谷段和午间光伏大发时段。3. 阶梯碳交易机制的数学化配额计算、阶梯定价与线性化改造3.1 配额怎么算基准线法在企业园区系统里的落地口径碳交易成本的第一步是确定碳排放配额。学术论文里配额计算五花八门但园区级综合能源系统最常见的口径是“基准线法总量控制”的组合思路。先用一个简单公式表述系统每日免费配额E_free lambda * D其中D是系统总电负荷需求含固定电负荷和可调负荷lambda是配额系数单位是吨CO2/MWh。lambda的取值可以参考当地碳交易试点给热电联产企业的免费配额比例一般在0.4到0.7之间调整。碳排放来源要按边界清楚核算。我采用的标准口径是“净购入电力和天然气”外购电排放E_buy mu_e * P_buy * delta_tmu_e取电网平均排放因子典型值0.581 tCO2/MWh。实际区域值可能更低但重点在于口径一致。天然气排放E_gas mu_gas * V_gas_total按天然气热值折算mu_gas取0.202 tCO2/MWh这里MWh指天然气低热值。一个很容易犯的错误是把光伏、风电的“零排放”和配额分配混在一起。可再生能源本身不产生直接排放但外购电的排放因子已经反映了电网结构的平均水平。如果你同时把可再生能源当作减排抵扣等于重复计算碳收益。3.2 阶梯碳价函数的MILP建模有序区间拆解阶梯碳价是我在建模时最有挫败感、也最有收获感的一块。直接思路是把碳价写成if-else的分段函数但这在优化模型里完全没法用——求解器不可能对条件判断求导。必须把分段函数线性化转成MILP约束。假设阶梯一共有三级定义如下若E_total E_free碳交易成本为0。若E_free E_total E1超出部分单价为c1。若E1 E_total E2E1以下部分按c1计超出E1部分按c2计。若E_total E2再多出来的部分按c3计。标准做法是把总排放拆成四个变量免费配额部分、第一档超出部分e1、第二档超出部分e2、第三档超出部分e3。为了让优化器“按顺序”进入高档区间需要引入三个0-1指示变量d1、d2、d3配合次序约束d1 d2 d3。这一步是线性化成功的关键。如果没有次序约束优化器会直接跳过低价区间用高价区间的额度去凑超额排放算出来的碳成本完全失真。在MATLAB里用YALMIP表达这组约束非常直接。完整的MILP片段如下E_free 18; E1 22; E2 26; % 单位吨CO2/日 c1 30; c2 45; c3 60; % 单位元/吨 E_total sdpvar(1,1); % 系统总排放由能源消耗算出 e1 sdpvar(1,1); e2 sdpvar(1,1); e3 sdpvar(1,1); d1 binvar(1,1); d2 binvar(1,1); d3 binvar(1,1); % 排放拆分 E_total E_free e1 e2 e3; % 各档上限 0 e1 (E1 - E_free) * d1; 0 e2 (E2 - E1) * d2; 0 e3 (Emax_upper - E2) * d3; % 次序约束必须先用完低档额度才能进入高档 d1 d2; d2 d3; % 碳交易成本 C_co2 c1 * e1 c2 * e2 c3 * e3;一个小技巧Emax_upper不一定要设成无穷大可以取一个实际可能达到的最大排放量比如系统全部用高碳设备满发时的排放量乘以1.2。这样既能保证可行域不被人为截断又能避免大M值过大导致MILP数值问题。3.3 MATLAB里的具体实现变量定义与约束写法如果你不用YALMIP直接用optimproblemMATLAB优化工具箱自带的基于问题的方法也能建这个模型。区别在于YALMIP的语法更像数学表达式错误定位容易optimproblem的语法更“MATLAB原生”但处理0-1变量和辅助变量时要多写几行。我自己的习惯是YALMIP做建模、intlinprog做求解因为YALMIP底层会把模型自动编译成求解器需要的标准形式切换求解器只需要改一行sdpsettings。如果你不想安装第三方工具箱完全可以用optimproblem替代核心变量定义如下prob optimproblem(ObjectiveSense,minimize); P_chp optimvar(P_chp, T, 1, LowerBound, 0); u_p2h optimvar(u_p2h, T, 1, Type, integer, LowerBound, 0, UpperBound, 1); % 其他变量同理两种方式我都试过最后留在YALMIP是因为调试多目标或者加灵敏度分析时表达式方式改起来更快。不过要注意YALMIP是第三方工具箱跨平台和版本兼容偶尔有小坑2026b上实测目前没有问题。4. 优化模型落地目标函数、约束集与求解器选型4.1 目标函数四项成本怎么拼目标函数我采用了“经济成本碳成本”的最小化形式共四项Objective sum(C_buy) sum(C_gas) C_co2 sum(C_om);逐项解释C_buy是购电成本等于分时电价乘以购电功率再乘以时段长度。这里用delta_t统一为小时一天24个点delta_t1。C_gas是购气成本等于天然气价格乘以CHP和燃气锅炉的总气耗。注意CHP的气耗和燃气锅炉的气耗要单独算再相加。C_co2是阶梯碳交易成本来自3.3节的变量。C_om是设备运维成本写法是各设备单位出力乘以运维系数后求和。设备包括CHP、燃气锅炉、电锅炉、电解槽储氢罐和储热罐一般不单独算运维成本因为充放量已经间接反映在电费和热费里。这里要特别提醒电制氢的“原料成本”本质上是电价已经包含在购电成本里了不需要在目标函数里再给电解槽加一个“耗电成本”。我见过不少初稿在这里重复计算导致电解槽明明有消纳价值优化器却始终不肯开机。如果目标函数里打算体现电解槽的电解液、水耗、催化剂损耗等物料成本应该把它们折进运维系数而不是按耗电量二次计费。4.2 约束集分四类整理我习惯把所有约束在代码里分区注明方便排查。总共有四类。第一类是能量平衡约束这是模型的“物理底盘”电平衡P_pv P_wind P_chp P_buy P_load P_eb P_p2h P_hst_ch。热平衡H_chp H_gb H_eb H_load H_hst_ch储热罐放热为负向充入。氢平衡H2_p2h H2_load H2_hst_ch。注意电平衡里P_hst_ch是储热罐的电加热功率如果系统有电储能还要再减去电储能的充电功率。第二类是设备出力与爬坡约束。CHP的可行域已经在2.1节给出燃气锅炉和电锅炉只需要上下限0 P_eb P_eb_max; 0 H_gb H_gb_max;电解槽的启停和最小负荷约束在2.2节给出。第三类是储能约束。储氢罐、储热罐的SOC递推、容量边界、充放速率边界、互斥约束都在这一类。第四类是网络交互约束。购电功率上限、购气量上限、外购电的爬坡不太需要因为电网侧通常只给容量限制。在代码组织上我建议把所有约束放进cell数组里比如Constraints{1} ...、Constraints{2} ...最后统一用[Constraints{:}]组合。这样定位问题时可以单独注释掉某一类约束看结果变化排查效率高很多。4.3 求解器选择直接intlinprog还是YALMIP套壳这个问题取决于模型规模和是否包含整数变量。我的模型里有电解槽启停0-1变量、阶梯碳价指示0-1变量、储充互斥变量所以必然是MILP。求解器选项如下场景推荐方案备注纯线性无0-1变量linprog速度快MATLAB自带小规模MILP几百个0-1变量intlinprog2026b的预处理能力足够大规模MILP上千个0-1变量YALMIP Gurobi/Cplex分支定界效率明显更高有二次项效率曲线非线性YALMIP GurobiMIQP或fmincon做启发式对园区级综合能源系统变量规模一般不会太大24个时段设备十来台0-1变量几十到一两百个intlinprog完全够用。如果做的是年8760小时的长周期优化那就必须上Gurobi这类专业求解器了。YALMIP求解设置一行就够ops sdpsettings(solver,intlinprog,verbose,1,debug,1); optimize(Constraints, Objective, ops);debug1是个好习惯。模型有冗余或冲突约束时YALMIP会直接告诉你省掉大量的盲猜时间。5. 仿真场景与结果解读三组对照实验下的优化规律5.1 三组场景的设置与参数为了看清楚阶梯碳交易和电制氢各自的作用我设计了三个对照场景Case 1不考虑碳交易只做经济调度。Case 2引入固定碳价碳价为80元/吨但不设阶梯也没有电制氢。Case 3完整方案阶梯碳价加电制氢。其他参数三组完全一致。负荷数据我用的是冬季典型日曲线光伏出力中午高、傍晚低风电夜间有一定出力。系统总电负荷峰值约5MW热负荷峰值约4.5MW氢负荷恒定在20kg/h左右。设备容量如前文参数表CHP电额定3MW燃气锅炉2MW电解槽1MW储氢罐500kg。在这个基础上每组场景都求解24小时调度方案记录总成本、碳排放量、弃风弃光率、制氢运行小时数等指标。5.2 典型结果热电分配、制氢时段与碳排量的联动我调参时得到的一组典型结果如下具体数值会因你的参数设置和负荷曲线不同而变化主要看趋势指标Case 1Case 2Case 3日总成本元322003350032800碳排放总量t27.524.822.1弃风弃光率8.2%7.4%3.1%电解槽日运行小时数009Case 1的结果符合预期CHP基本贴着热负荷走燃气锅炉在早晚高峰补热弃风弃光比较明显因为夜间风电多、负荷低又没有可调负荷去消纳。Case 2加入固定碳价后系统会减少外购电外购电对应较高的电网排放因子同时适度提高CHP出力替代部分燃气锅炉供热。碳排放下降了但成本上升弃风弃光改善有限。Case 3是变化最大的一组。电解槽在凌晨谷电时段和中午光伏大发时段开机把多余电能转化为氢气储氢罐在日间放氢满足氢负荷。这个运行方式的额外效果是光伏大发时不再弃电而是通过电解槽“储存”下来所以弃风弃光率大幅下降。碳排放总量也明显低于前两组因为外购电在谷段时段的排放因子更低等量电能制氢比白天高峰购电供热的碳排放更划算。把Case 3的调度曲线画出来能看到一个很有意思的现象电解槽开机时段与电价谷段高度重合而CHP出力曲线相比Case 1有整体抬升。这说明阶梯碳价让“燃气发电谷电制氢”的组合在成本上变得比“单纯外购电燃气锅炉”更优。5.3 灵敏度探索碳价斜率和P2H容量的拐点做完三组对照我又做了两个灵敏度分析目的是确认机制是否真的有效。第一个是固定碳价从小到大的影响。把碳价从20元/吨扫到120元/吨观察碳排放总量。结果是一条斜率逐渐变缓的下降曲线碳价从20提到60时碳排下降很快从60再往上下降速度明显变缓。这说明单位减排成本在递增优化器已经把最便宜的减排手段用完了。第二个是阶梯碳价区间的宽度。我把E1和E2的间隔从2吨拉到8吨结论很有意思区间越窄系统越倾向于把排放控制在E1边界以内区间越宽系统更愿意“买一点超标额度”来换取运行灵活性。这个规律验证了阶梯碳价“政策参数直接改变运行边界”的本质。第三个是P2H容量从0.5MW增加到3MW。总成本先降后升拐点出现在1.5MW左右。低于拐点电解槽是净收益资产因为它消纳了原本要丢弃的绿电高于拐点额外容量没有足够的氢负荷和储氢容量来消化反而增加了设备折旧和维护成本。这三个灵敏度都可以用MATLAB的循环包裹优化函数实现外层循环改参数内层调用intlinprog最后画两条曲线看趋势。这个流程不复杂但非常能说服别人你的模型不是“调参调出来的漂亮结果”。6. 调试中踩过的坑从维度报错到结果失真的完整排查过程6.1 维度对齐从“矩阵维度必须一致”说起第一个把我卡住半天的报错是“Dimensions of arrays being concatenated are not consistent”。原因非常简单负载曲线是24×1的列向量而我在构造某个设备参数时用了1×24的行向量YALMIP在拼接约束时直接拒绝执行。这类报错本身不难改麻烦的是你往往要翻好几个文件才能定位到哪一行。我的解决办法是所有时间序列变量统一用列向量T×1所有标量参数用1×1所有设备参数矩阵先写成T×1再参与运算。在代码最前面定义一个assert检查assert(size(P_load,1) T size(P_load,2) 1, P_load must be T x 1);这个习惯帮我省了至少一天的调试时间。6.2 阶梯碳价的次序约束漏写伪最优的典型症状这个坑非常隐蔽。我很早的一版模型里e1、e2、e3的区间约束都写了但把d1 d2 d3这套次序约束漏了。跑出来的结果表面上看一切正常成本很低、排放量刚好在合理范围、SOC曲线平滑。但仔细一查发现优化器在总排放没有到E1的情况下直接把一部分排放算进了e2区间——因为e2没有要求必须先填满e1。这种伪最优在目标函数上体现为碳成本异常低。因为系统用了高额度的低单价绕开了低价区间。检查方法是打印E_total和e1、e2、e3的实际值人工核对是否满足“先e1后e2再e3”的物理逻辑。我后来把这段逻辑写成了一个单独的函数输入E_total输出碳成本再做几组手工验算确保分段函数边缘情况下数值正确才放心放进优化里。6.3 单位口径kW、MW、kWh与万元单位的换算陷阱严格说这不是MATLAB报错而是结果失真的头号原因。我有一版结果里碳排放总量看起来小得离谱排查了半天发现天然气排放因子用的单位是tCO2/MWh但气耗量用的是m3两边差了十几倍。建议在代码头部写一个单位清单注释% 单位约定 % 功率kW % 能量kWh时段长度 delta_t 用小时 % 氢气kg热值 LHV_H2 33.33 kWh/kg % 碳排放t CO2 % 成本元 % 电价元/kWh气价元/m3碳价元/t每次从论文或数据表里抄来一个参数先换算成注释里的单位再写进代码。这个笨办法比事后查错高效得多。6.4 intlinprog求解时间爆炸的缓解办法当我把电解槽启停变量的颗粒度细化到15分钟一个时段一天96个点后intlinprog的求解时间从几秒暴涨到几分钟有时候甚至卡住不动。加了0-1变量之后分支定界算法的搜索空间指数增长这是MILP的固有特性。三个有效手段第一利用warm start。给u_p2h等0-1变量提供一个合理的初始可行解能大幅缩短分支定界初期的搜索时间。assign(u_p2h, initial_u); % YALMIP的assign函数第二打破对称性。多个同型号设备如果可以互换求解器会在对称分支上反复搜索。我给两台电解槽加了排序约束任意时刻1号机的启停状态不低于2号机。人为打破对称性后求解时间能下降一个数量级。第三适当放宽间隙容忍度。intlinprog默认的gap tolerance是1e-4对工程问题可以放开到1e-3成本误差不到千分之一求解时间却快得多。options optimoptions(intlinprog,RelativeGapTolerance,1e-3,Display,iter);6.5 结果合理性校验堆叠图和SOC曲线是最佳debug工具最后一条经验也是我每次跑完优化必做的一步画图。画出电平衡堆叠图、热平衡堆叠图、氢平衡堆叠图把每个时段的供给和需求都叠起来。如果某个时间点供需曲线没有闭合说明平衡约束有问题。画出储氢罐SOC曲线、储热罐SOC曲线看是否在上下限内、是否满足周期平衡。我第一次跑完整模型时储氢罐SOC在凌晨出现了一个莫名其妙的跳变查了一个小时才发现是充放效率单位写反了——效率应该是0.95被我写成了1.05。这种问题光看数值很难发现但画成图之后一眼就能揪出来。还有一个简单但有效的小技巧把每个设备的最优出力曲线单独画出来和它的上下限放在同一张图上。如果某个变量长期贴在某个边界上往往意味着约束系数有问题或者目标函数里某项成本被错误地忽略了。后续可以往哪儿走从静态优化到在线调度的扩展思路这套模型做完之后我最大的感受是综合能源系统优化里真正决定方案优劣的往往不是求解器而是你对“机制”的建模颗粒度。阶梯碳交易的“阶梯”和电制氢的“灵活性”本质都是在给优化器提供价格信号和可控自由度。两者放在一起很多原本靠经验拍板的调度规则会被自动涌现出来比如“谷电制氢、峰电卖氢”“光伏大发时段压燃气锅炉”这类结论不是我写进模型的是优化器自己算出来的。如果后续想从离线优化走向在线调度可以考虑两条路一是用强化学习比如DQN或PPO把优化结果作为训练样本训练一个可以实时决策的调度策略二是先用BiLSTM这类时序模型做负荷预测再把预测结果输入到这套优化模型里做滚动优化。两条路我都正在另一个项目里试目前看前者的难点在奖励函数设计后者的问题在预测误差对优化结果的鲁棒性。先把这套MATLAB模型跑通后面的扩展会顺畅很多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进