ARTICLE DETAIL

资讯详情

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

基于阶梯碳交易与P2G-CCS耦合的虚拟电厂掺氢优化调度

基于阶梯碳交易与P2G-CCS耦合的虚拟电厂掺氢优化调度 做虚拟电厂优化调度的同行应该都有同感模型越建越复杂约束越加越多真正跑通一个能复现、能改参数、能跟实际业务对上的算例并不容易。我最近刚完成一个比较有代表性的调度算例——基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度全程用Matlab实现从建模到求解再到结果分析踩了不少坑也沉淀了不少经验。这个项目核心是把碳交易成本做成分段阶梯式再把电转气P2G与碳捕集利用与封存CCS耦合起来同时让燃气机组掺氢燃烧最后用混合整数线性规划求最优日前出力计划。它解决的问题很直接在低碳约束下通过多能协同把虚拟电厂的总运行成本压到最低。适合正在研究碳市场机制、综合能源系统、虚拟电厂优化调度的学生和工程师尤其适合想在Matlab里快速搭起一套可行模型、并继续扩展的人。1. 项目背景与整体设计思路1.1 为什么要把阶梯碳交易、P2G-CCS、燃气掺氢放在一起虚拟电厂VPP的本质是把分布式光伏、风电、储能、燃气机组、柔性负荷等聚合成一个可调度的整体再参与电能量市场和辅助服务市场。传统调度模型通常只关注电力平衡和机组成本很少把碳成本和碳流耦合放进去。但双碳目标之下碳交易成本已经成为影响机组出力的重要因素尤其当虚拟电厂内部包含燃气机组时碳配额缺口会直接转化成运营成本。阶梯碳交易和固定碳价最大的区别在于碳排放量越高超出免费配额的部分需要按更高的价格购买配额。这就像阶梯电价一样边际碳成本是递增的。对于调度模型来说这个机制会显著影响机组出力排序——高排放机组的负荷会被压低低碳设备比如P2G、储能、碳捕集装置的利用率会上升。P2G-CCS耦合则是在“碳流”上做文章。P2GPower to Gas设备先电解水制氢再把氢和二氧化碳通过甲烷化反应合成天然气SNG其中二氧化碳来自CCS碳捕集与封存捕获的燃气机组烟气。捕集下来的CO2被P2G吃掉一部分另一部分封存。这样一来燃气机组的排放不再是简单的“排放-购买配额”而是形成“排放-捕集-利用-再燃烧”的局部碳循环。燃气掺氢则是给P2G产氢找了一个更直接的去路。氢气可以注入燃气管网或直接掺入燃气机组燃烧。氢气燃烧不产生CO2所以掺氢比例提高后单位发电量的碳排放因子明显下降。但掺氢也不是越多越好燃气轮机对掺氢比例有安全上限P2G制氢需要消耗电能可能抬高购电成本。三种机制放在同一个虚拟电厂里就构成一个“电-氢-气-碳”多能耦合的复杂优化问题。1.2 虚拟电厂内部多能流的基本架构我搭建的虚拟电厂拓扑比较典型风电、光伏、燃气轮机、蓄电池、P2G装置含电解槽和甲烷化反应器、CCS装置、储氢罐、储气罐以及外购电力和外购天然气接口。调度周期取24小时步长1小时。优化变量包括燃气轮机每小时的出力、启停状态、掺氢比例、P2G消耗电功率、产氢量、产甲烷量、CCS捕集率、蓄电池充放电功率、购售电功率、碳交易量以及阶梯区间辅助变量。耦合关系体现在几个平衡方程上电力平衡风电光伏燃气轮机储能放电外购电 负荷储能充电P2G耗电CCS耗电气平衡外购天然气P2G产甲烷储气罐放气 燃气轮机燃料消耗储气罐充气氢平衡P2G产氢 掺入燃气轮机的氢储氢罐充放如果考虑制氢外售也可以延伸碳平衡燃气轮机燃烧产生的CO2 排放到大气部分CCS捕集部分如果尾部有碳捕集率约束CCS捕集的CO2 P2G甲烷化利用的CO2封存的CO2。这些平衡方程看起来多但只要用矩阵形式在Matlab里一次性构建其实并不复杂。难的是阶梯碳交易和掺氢比例这类分段非线性项的线性化处理后面会详细讲。1.3 为什么用Matlab而不是Python或GAMSMatlab在这一类优化调度问题里依然是主流工具尤其对学术研究和工业验证场景。原因有几个第一Matlab的矩阵化思维方式非常适合写电力系统调度模型。24小时的变量可以定义成行向量或矩阵约束可以直接写Constraints [Constraints, sum(Pwind Ppv Pgt Pdis - Pch - Pp2g - Pccs) Pload]这种形式不需要像Fortran/GAMS那样配置复杂的集合。第二Matlab里的YALMIP工具箱提供了非常友好的建模接口底层可以无缝切换CPLEX、Gurobi、GLPK等求解器。对于带二进制变量的混合整数线性规划MILP我们只需要定义binary(n,1)求解器自动处理分支定界。第三Matlab的数据可视化和结果后处理非常顺手。调度结果可以直接用stairs、plot画出力曲线、碳交易区间、SOC变化等导出Excel也方便。2. 数学模型构建与关键公式2.1 目标函数运行成本、碳交易成本与惩罚项优化目标是最小化虚拟电厂一天内的总成本包含六部分燃气轮机燃料成本由天然气和掺入氢气的混合燃料热值折算后计算。启停成本燃气轮机启动和关停产生的额外费用。P2G运行成本主要是电解槽和甲烷化反应器运行维护成本近似与产氢/产甲烷量成正比。储能退化成本蓄电池充放电导致的寿命折损通常折算成每kWh的循环成本。购售电成本从主网购电按分时电价付费上网售电按上网电价计费。阶梯碳交易成本包括初始免费配额内的零成本、超出部分的阶梯购碳成本。目标函数数学形式可以写成min C_total C_fuel C_start C_p2g C_bess C_grid C_co2 C_penalty其中 C_penalty 是弃风弃光惩罚项单位是元/MWh用来鼓励消纳可再生能源。这里必须注意单位统一功率用MW时间用小时能量就是MWh碳排量用吨。气体体积和能量之间用热值换算。我一开始就是用混了kW和MW导致约束数值差1000倍排查了很久。阶梯碳交易成本 C_co2 的计算需要单独建模。碳排放量 E_actual 等于燃气轮机燃烧排放量减去CCS捕集量E_actual E_gt - E_captureE_gt sum( P_gt(t) / eta_gt * EF_mix(t) )其中 eta_gt 是燃气轮机发电效率EF_mix 是混合燃料的单位发电碳排放因子。免费配额 E_free 提前给定如果 E_actual E_free碳交易成本为0如果超出则按照阶梯价格分段累计。2.2 阶梯碳交易的线性化建模方法阶梯碳定价的典型设置第一段排放量超过免费配额但不超过免费配额30吨碳价为50元/吨第二段30~60吨区间碳价为65元/吨第三段超过60吨碳价为80元/吨。这本质上是一个分段线性函数。在Matlab/YALMIP里我们有两种办法处理第一种是引入辅助非负变量 Q1, Q2, Q3分别表示落在三个区间内的碳排量并通过二进制变量强制区间顺序。核心约束包括enforce ordering:如果 z11则 Q2必须为0如果 z21则 Q3必须为0等等。实际上可以用以下标准Milp编码Q1 Q2 Q3 E_actual - E_free 当 E_actual E_free 时 0 Q1 M1 * z1 0 Q2 M2 * z2 0 Q3 M3 z1 z2 z3 1 z1 z2 z3 表示先填满第一段再填第二段不过更简洁的方式是使用YALMIP内置的carboncost piecewise或者手动用if逻辑生成约束。我实际测试下来用三点分段两个断点时二进制变量只有两三个求解速度几乎没有影响但如果有10个碳价阶梯就需要谨慎因为二进制变量会指数增长。第二种更技巧性的做法是把碳成本写成“固定价 阶梯增量”的形式。例如总碳成本 50 * Q_total 15 * max(0, Q_total-30) 15 * max(0, Q_total-60) 等等再用max函数激活。YALMIP支持直接写max但底层也会自动引入二进制变量。所以本质上一样只是代码更简洁。我自己喜欢用第二种这样后期改碳价区间很方便。2.3 P2G-CCS耦合的机理模型P2G通常分为两段电解水制氢以及氢与CO2的甲烷化。电解反应2H2O → 2H2 O2 甲烷化反应CO2 4H2 → CH4 2H2O从化学计量关系能看出为了生产1单位CH4需要4单位H2和1单位CO2。所以在建模时要严格约束P2G的产甲烷量不能超过CCS提供的CO2量同时产甲烷量乘4就是所需氢气量这部分氢气不能同时拿去给燃气轮机掺烧。P2G的效率模型电解效率 eta_ele单位电能产氢量H2_p eta_ele * P_p2g_ele甲烷化效率 eta_meth单位氢气产甲烷量CH4_p eta_meth * H2_used。因此P2G总耗电 P_p2g 与产出的甲烷和氢气之间存在线性关系。这一块的参数我建议参考实际设备手册不要随便拍脑袋。常见电解效率在0.6~0.75甲烷化效率在0.75~0.85。如果追求简化也可以合并成“P2G总效率 0.6~0.65”直接定义CH4_p eta_p2g * P_p2g但这样没法建模产氢掺烧路径所以我采用的是分开建模。CCS建模核心是捕集率和捕集能耗E_capture p_capture_rate * E_gt_total其中 p_capture_rate 是捕集率常见范围0.85~0.95。捕集过程需要消耗额外电能近似为P_ccs k_co2 * E_capturek_co2 的单位是MWh/tCO2。这个参数大概在0.1~0.3 MWh/t之间。捕集下来的CO2分子一部分进入P2G用于甲烷化另一部分压缩封存。压缩封存也有能耗但为了简化可以并入捕集能耗中。需要强调CCS捕集CO2再循环利用并没有从物理上消除所有碳排放P2G制取的甲烷最终又被燃气轮机燃烧CO2再次生成。但在碳交易核算时人为规定“捕集下来且被利用的CO2可以抵扣排放量”——这就是我模型里的重要前提。如果你实际要跟碳市场核算规则对齐需要仔细确认CCS抵扣政策不同试点规则差异很大。2.4 燃气掺氢的建模与热值修正燃气轮机使用的燃料是天然气与氢气的混合物。设氢气体积掺混比例为 alpha取值范围0~0.2很多燃气轮机厂商目前允许到20%少数甚至到30%但为了保守我取20%。混合燃料的低热值LHV按体积分数加权LHV_mix alpha * LHV_H2 (1-alpha) * LHV_CH4氢气LHV约10.8 MJ/Nm3甲烷LHV约35.8 MJ/Nm3所以混合燃料热值随掺氢比例上升而下降。为了在燃气轮机内产生相同的发电功率需要的燃料体积会增加但单位燃料的碳排放下降。更准确的建模方式是把氢气的体积流量从天然气流量中分离单独计算燃料成本。天然气价格按元/Nm3计氢气成本则由P2G制氢成本决定电耗运维或者在虚拟电厂内部定价。我模型里设定P2G产氢优先用于燃气掺烧剩余部分进入储氢罐如果燃气轮机需要更高掺氢量还可以从储氢罐取用。掺氢约束的主要线性表达H2_used(t) alpha_max * V_fuel_mix(t) 按体积比例上限 H2_used(t) H2_avail(t) 储氢放气量等这里的难点还是单位换算MW、MWh、Nm3/h、kg/h之间转换频繁。我的建议是统一用“热量单位”MWh作为燃料计量的中间量。具体做法定义一个基础燃料热值然后用热值折算天然气流量和氢气流量。这样线性表达式会非常干净。3. 基于Matlab的代码实现与求解3.1 程序整体框架我的Matlab程序结构大致分5个模块input_data.m输入预测负荷、风电、光伏、电价、碳价参数、设备参数。build_variables.m定义所有连续变量、二进制变量、辅助变量。build_constraints.m逐条写入功率平衡、设备约束、碳约束、阶梯碳交易约束。build_objective.m按权重组合各成本项。solve_model.m调用YALMIP求解并把结果保存到结构体中输出调度曲线。整个项目放在一个文件夹里主程序main.m按顺序调用即可。使用YALMIP Gurobi求解MILPMatlab版本我用的是R2026b亲测YALMIP最新版可以正常加载Gurobi。如果你用的是老版本Matlab建议先检查YALMIP版本兼容性——很多“求解器 not found”的问题其实是工具箱路径没设置好。3.2 阶梯碳交易成本的分段线性实现示例下面给出一个实操性很强的YALMIP代码片段简化版% 碳排量 E_actual 已经通过其他约束计算出来 E_free 500; % 免费配额 t Q sdpvar(3,1); % 三个阶梯的CO2量 z binvar(2,1); % 两个断点对应的二进制变量 % 阶梯断点30和60吨 X_break [30, 60]; Price [50, 65, 80]; % 区间价格第一段50第二段65第三段80 y sdpvar(1); Constraints [Constraints, E_actual - E_free sum(Q), y sum(Price .* Q)]; % 注意只有 E_actual E_free 时才有碳成本实际模型要处理负值 % 可以引入辅助变量 E_excess max(0, E_actual - E_free) % 或者直接约束 E_actual E_free 0.01 然后测试无关紧要 Constraints [Constraints, Q(1) X_break(1) * z(1)]; Constraints [Constraints, Q(2) X_break(2)*z(2)]; Constraints [Constraints, z(1) z(2)]; % 顺序约束 Constraints [Constraints, Q 0]; C_co2 y;这段代码没有处理“如果E_actual小于E_freeE_excess为0”的情况实际项目中要增加E_excess max(0, E_actual-E_free)或者用另一个二进制变量强制非负。比较优雅的办法是引入变量e_em E_actual - E_free然后约束0 e_em M_big * z_emit当 e_em0 时z_emit1否则z_emit0。但这样会加一个二进制变量对求解速度影响不大。如果你不想处理二进制变量太细还有一个取巧办法直接用C_co2 max(0, piecewise_linear(E_excess))。YALMIP支持max和piecewise会自动转换代码更少但底层依然是一样的。3.3 P2G-CCS耦合和燃气掺氢的约束写法P2G-CCS耦合约束核心代码如下% 变量 P_ele sdpvar(1,T); % P2G耗电 H2_prod sdpvar(1,T); % 产氢量 (MWh, 低热值) CH4_prod sdpvar(1,T);% 产甲烷量 (MWh) CO2_captured sdpvar(1,T); % CCS捕集CO2 (t/h) E_gt sdpvar(1,T); % 燃气轮机总排放 (t/h) % P2G关系 H2_prod eta_ele * P_ele; CH4_prod eta_meth * H2_prod_used; % 用于甲烷化的氢气 % 甲烷化需要氢气量按比例 H2_for_CH4 4 * (CH4_prod / LHV_CH4) * 22.4 / 16; % 注意摩尔体积换算简化时可写H2_for_CH4 k_m * CH4_prod % 产甲烷需要的CO2量 CO2_used k_co2_use * CH4_prod; % CCS约束 0 CO2_captured p_cap_rate * E_gt; % 但实际捕集量上限还受CCS容量限制 CO2_captured CCS_capacity; % CO2流向 CO2_captured CO2_used CO2_stored;里面最烦人的地方是氢气量和甲烷量之间究竟按什么单位换算。我的经验是先把所有气体量统一到“MWh热值”单位。这样氢气与甲烷的关系只需要写H2_for_CH4 CH4_prod * (LHV_CH4 / LHV_H2)因为化学计量是1mol甲烷对应4mol氢气所以更准确是4倍摩尔数关系。1MWh的甲烷对应的氢气能量是4*(LHV_H2/LHV_CH4) MWh这个比例算出来接近1.2。如果你把代码写成H2_for_CH4 CH4_prod / (LHV_H2 * 0.25) / LHV_CH4就很容易把单位搞乱。我建议先在注释里写清每个变量的单位再用常量表格换算最后再写约束。燃气掺氢的约束可以简写为% 掺入燃气轮机的氢量 H2_to_gt H2_to_gt alpha_max * (H2_to_gt CH4_fuel); % 按体积比实际用热值单位时需要乘以修正系数 % 这里按热值比例近似H2_to_gt r * CH4_fuel % 燃气轮机燃料热平衡 P_gt eta_gt * (CH4_fuel H2_to_gt);严格起见掺氢比例要按体积流量而不是热值比例但工程上如果氢气热值约是甲烷的1/3体积掺氢20%热值掺混比例大约7%。如果用热值表述需要做转换。我在代码里写的是“体积掺氢比例”的输入参数内部转为热值比例alpha_heat alpha_vol * LHV_H2 / (alpha_vol*LHV_H2 (1-alpha_vol)*LHV_CH4)。这样既符合工程实际又不会让模型非线性。3.4 求解器选择与求解设置模型规模24个时段变量大约500~800个含二进制变量在MILP中属于小型问题正常几秒到一分钟就能解完。求解器我用Gurobi设置参数options sdpsettings(solver,gurobi,verbose,2,gurobi.MIPGap,0.001,gurobi.TimeLimit,300);MIPGap设置为0.1%基本可以保证近优解。如果求解器找不到可行解我会先尝试把阶梯碳交易的分段数减到2段或者去掉储氢罐约束。通常无解都是因为某个耦合约束过紧比如P2G同时要产氢和产甲烷而P2G总容量不够导致所有等式无法同时满足。3.5 参数设置与数据准备输入数据我列一个参考表方便你直接用参数取值单位燃气轮机容量40MW气轮机效率0.55-风电容量80MW光伏容量50MW蓄电池容量20 MWh功率5MWP2G电解功率上限15MW电解效率0.7-甲烷化效率0.8-CCS捕集率0.9-CCS耗电系数0.2MWh/tCO2掺氢体积比例上限20%-免费碳配额500t/日阶梯碳价三段50/65/80元/t弃风弃光惩罚120元/MWh这些参数来自常见论文和设备手册的结合。你可以根据自己的场景调。比如沿海工业园区蒸汽需求大就可以给P2G加一个热电联产模式如果燃气轮机是老旧机组掺氢上限最好只设10%。4. 仿真结果分析与调度策略讨论4.1 基准场景下的优化结果我设置了一个典型冬季日场景风电夜间出力很大光伏白天出力高负荷呈双峰特性。在基准确认下不参与阶梯碳交易、无P2G-CCS、无掺氢虚拟电厂的风电弃风率高达12%以上燃气轮机白天高峰满发产生大量CO2碳交易成本按固定碳价50元/吨计算。加入阶梯碳交易后由于超出免费配额越多碳价越高优化模型倾向于削减气轮机在高峰时段的出力转而增加蓄电池放电和外购电力。虽然外购电成本可能上升但碳交易成本下降明显。总碳排放在这个场景下大约降低8%~10%。再加入P2G-CCS耦合情况变得更有意思。夜间风电富余时P2G启动制氢一部分直接储入储氢罐另一部分与CCS捕集的CO2甲烷化生成的SNG注入储气罐。到了白天SNG和储氢被燃气轮机使用替代部分外购天然气。由于CCS捕集CO2抵扣了排放燃气轮机的碳配额需求进一步下降。结果对比可以做成下面这样的表我这边数值是模拟出来的代表典型趋势场景总成本(万元/日)碳排放(t/日)弃风率(%)天然气消耗(万Nm3/日)基准无碳交易18.246012.14.8固定碳价50元/t18.94219.84.5阶梯碳价19.33988.74.6阶梯碳价P2G-CCS18.73324.23.4阶梯碳价P2G-CCS掺氢20%18.43153.63.0需要说明的是加入P2G-CCS后总成本不一定立刻下降因为设备投资折旧和运维成本也会增加。我这里算的是“日运行成本”没有摊投资所以P2G-CCS的收益主要来自降低购气和减碳。如果碳价继续上调P2G-CCS的价值会更加明显。4.2 掺氢比例对调度策略的影响我专门做了掺氢比例从0%到20%的敏感性分析。结果发现当虚拟电厂内有足量P2G产氢时提高掺氢比例会显著降低天然气消耗量但同时需要消耗更多电力制氢。如果风电弃风量很大这部分电力属于“边际成本接近0”的电力掺氢的经济价值就非常高。反过来说如果夜间没有弃风为了制氢而额外购电则掺氢成本的临界点取决于分时电价和碳价的相对水平。模拟结果显示在碳价50元/吨、夜间谷电电价0.15元/kWh的情况下掺氢15%是最优选择掺氢20%虽然碳排放最低但总成本反而略有反弹因为P2G耗电导致日间购电量上升。这也说明了一个工程上很重要的点不要盲目追求高掺氢比例而是要纳入整个虚拟电厂的统一优化中去求解。很多燃气轮机的掺氢改造项目单独讨论时都算不清账必须放到系统级模型里才能看出真实价值。4.3 关键发现与调度策略启示从仿真结果能看到几个规律阶梯碳交易比固定碳价更能“挤出”低碳调度行为因为当气轮机把排放压到较低阶梯时碳价增量带来的边际成本会低很多这会影响机组组合的优先级。P2G-CCS耦合在弃风率高、碳价高的场景下收益最大。如果你的虚拟电厂所在区域冬季供暖期风电大发、谷电价格很低那P2G-CCS基本可以做到正收益。燃气掺氢本质上相当于给P2G制氢增加了一个“消纳出口”。如果没有这个出口P2G制氢只能先存储储氢成本可能吃掉电解制氢的收益。因此耦合设计不是越多越好而是要让氢能流、气流、碳流都找到需求侧。实际安排调度计划时我会把优化结果结合滚动预测做日内修正每4小时更新一次风电光伏预测然后重新优化未来24小时计划。这样能应对预测误差同时保留阶梯碳交易带来的低碳调度惯性。5. 常见问题与排查技巧实录5.1 模型无可行解如何快速定位这是新手最容易卡住的地方。我建议按以下顺序排查第一先去掉碳交易、掺氢、P2G等耦合约束只保留电力平衡和燃气轮机最小约束如果这时无解说明基础功率平衡有问题多半是风电光伏预测数据大于负荷又没有相应的储能或购售电边界。第二加上P2G耗电和CCS耗电后用“0容量”测试把P2G耗电直接置0检查电力平衡是否还能满足。如果必须在某时段P2G耗电为正而可再生能源出力不够就会导致外购电越界。第三检查碳平衡约束。常见错误是CCS捕集的CO2量与P2G甲烷化所需CO2量不一致。比如捕集率90%但P2G容量很大一天需要消耗500吨CO2而燃气轮机一天排放只有400吨就算全部捕集也不够P2G用。这时模型就会无解。解决办法是把P2G产甲烷量约束为“不超过CCS捕集量外部CO2购买量”。5.2 求解时间太长如何提速对于24时段模型如果求解时间超过5分钟多半是二进制变量过多。常见原因每台设备都加了启停状态甚至储能也加了充放电状态。如果只是日前调度储能可以不用二进制变量只需要约束充放电功率上下限和SOC连续性让SOC允许自然过渡碳交易如果设置了10个阶梯可以适当合并为3~4个阶梯。还有一个技巧给整数变量设置良好上界。比如燃气轮机启停次数上限P2G运行时长上限都会缩小分支定界搜索空间。另外把目标函数的整数容忍度从默认值1e-4改成1e-3求解时间通常能下降一半。5.3 YALMIP和Matlab环境常见坑我在Matlab R2026b上跑通但有时会遇到“No suitable solver found”。这多半是YALMIP没有识别到Gurobi或CPLEX。解决办法是检查yalmiptest的输出如果找不到Gurobi极有可能是Gurobi版本与Matlab版本不匹配或者Gurobi的环境变量没有加入系统PATH。还有一个常见问题用盗版或非官方安装包时Gurobi的license文件路径错误报错信息会显示“license -8”。这类问题建议直接联系官方支持不要在配置上浪费时间。如果只用Matlab自带的intlinprogYALMIP也能调用但求解大规模MILP会比较慢。对于学术研究我强烈建议装一套学术版Gurobi或CPLEX免费且速度快很多。5.4 单位换算和数值量级问题最后强调一下单位这是我踩过最大的坑。碳交易价格是“元/吨”碳排放量是“吨”而P2G产甲烷是“MWh”燃气轮机燃料消耗是“MWh”。如果直接用燃料热值除以二氧化碳排放因子得到的是吨CO2/MWh燃料。但氢气燃烧不排碳所以混合燃料的排放因子要重新计算。这里给出一个简化公式混合燃料CO2排放因子 (tCO2/MWh) [CH4体积比例 * CO2排放因子_甲烷 H2体积比例 * 0] / 混合燃料低热值所以要保证代码里所有热值单位统一用MWh不要一会儿用MJ一会儿用Nm3。建议在程序开头定义一个统一单位常量表LHV_CH4 9.7; % MWh/千Nm3 (约35.8MJ/Nm3) LHV_H2 3.0; % MWh/千Nm3 (约10.8MJ/Nm3) EF_CH4 1.9; % tCO2/MWh燃料 (不严格实际根据CH4燃烧反应计算)然后在所有约束里引用这些常量避免硬编码数字。5.5 代码运行结果的可视化与后处理调度结果画图时我通常会输出三张图第一张是24小时电力平衡堆叠图包括负荷、风电、光伏、气轮机、储能、P2G耗电第二张是燃气轮机燃料构成天然气、氢气和碳排放曲线第三张是碳交易区间的累积量和成本柱状图。Matlab代码例子figure; bar(1:24, [Pwind Ppv Pgt Pdis -Pch], stacked); hold on; plot(1:24, Pload, r-, LineWidth,2); legend(风电,光伏,气轮机,储能放电,储能充电,负荷);这里的柱状图堆叠正负值会有问题我通常会把储能放电和充电分开画或者用面积图area更清楚。分析报告则建议把结果存成Excel用Matlab的writetable导出方便后续对比不同参数组合。最后再分享一点个人体会这个项目做下来我最深的感觉是“模型的骨架不重要约束间的相互咬合才决定成败”。阶梯碳交易、P2G-CCS、掺氢单独拎出来每个都不难难就难在它们共享一套电力平衡、燃料平衡、碳平衡约束任何一处单位没统一就会让模型彻底崩溃。我自己调试时花了很长时间在排查“为什么氢气既想进储氢罐又想进燃气轮机结果两边都能用但约束却冲突”——最后发现是甲烷化需要的氢气量和掺烧的氢气量没有做总量上限约束。解决办法很笨但有效把所有气体流向都画成一张表每个变量列一行每个约束列一列做交叉检查。另外如果要把这个算例扩展成更贴近实际的项目建议加入热负荷和热电联产模型因为P2G的甲烷化反应本身会产热这部分热量如果不利用就很可惜。再往下走还可以把碳交易从日尺度拉长到年尺度考虑碳配额的滚动结转。总之这套Matlab代码给我留了充足的扩展空间以后再做类似项目时直接在这个骨架上改参数和约束就好。
返回列表