
做电力系统优化调度的同行应该都有这种体会传统“风光储燃气”的虚拟电厂模型写起来不难但一旦把碳交易、电转气、碳捕集、掺氢燃烧同时塞进去问题就从“找最优解”变成了“先保证模型是对的”。我最近完整复现了一套“基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度”模型用Matlab配合YALMIP框架实现跑通了24小时时段的混合整数线性规划也算对这套框架有了点实际感受。先回答最关键的问题这篇内容对谁有用。如果你正在做虚拟电厂、综合能源系统、低碳电力调度方向的研究或者准备用Matlab复现相关论文做对比实验这篇文章值得看完。我不会只贴代码而是把“为什么这么建模”“哪些地方容易错”“结果怎么解释”都讲清楚。特别是阶梯碳交易、P2G-CCS耦合、燃气掺氢三个概念叠进同一个模型时数学上有很多容易翻车的细节我会把实际踩过的坑一并写出来。1. 碳-氢-电-气四流耦合为什么必须把这三个概念放进同一个调度模型1.1 从单一经济调度到碳约束调度虚拟电厂VPP本质上是一个聚合体把风电、光伏、燃气轮机、储能、可控负荷这些分散资源捏成一个整体对外作为一个可调度的电源参与电网互动。传统虚拟电厂的优化目标很单纯在满足负荷和电网约束的前提下让运行成本最小风电光伏尽量多发电燃气轮机和储能负责补差。这种模型写成线性规划很简单一天24个时段几十个变量几分钟就能跑完。但加入碳交易机制后问题性质发生了变化。碳排放不再是一个“环境影响指标”而是直接进入目标函数的经济变量。燃气轮机烧的是天然气燃烧后产生二氧化碳这部分排放要么花钱买配额要么用碳捕集设备把它抓走要么少发点电改用外购电。于是每个设备的调度决策都会牵连出碳成本“减碳”从一句口号变成了实打实的成本项和约束项。碳价越高减碳设备的经济价值就越大——这就是P2G、CCS这类设备进入调度模型的根本原因。1.2 P2G-CCS到底“耦合”在哪电转气P2G和碳捕集CCS单独拿出来都不难理解。P2G是用电把水电解成氢气和氧气氢气可以直接用也可以进一步和二氧化碳反应生成甲烷也就是天然气CCS是把电厂烟气里的二氧化碳捕集下来压缩后送去封存或者利用。两个技术单独看都有短板P2G制氢成本高、收益路径单一CCS捕集下来的二氧化碳如果只是封存那就是纯成本项没有任何产出。把两者耦合起来短板刚好互补。CCS捕集的高浓度二氧化碳恰好是P2G甲烷化反应需要的原料P2G制出来的氢气一部分可以通过甲烷化把捕集的二氧化碳“变废为宝”转化为天然气重新进入燃气轮机。这样一来CCS从纯成本中心变成了“碳原料供应商”P2G也多了条稳定的产物出路两者在碳流和气流上形成闭环。再加上CCS本身耗电量大P2G同样耗电两者在电功率平衡上还会互相竞争这又给调度模型增加了一层博弈关系。1.3 燃气掺氢不是配角是氢的出路很多论文把燃气掺氢当作一个独立的低碳手段其实在这个模型里它更像是P2G氢气的下游消纳通道。电解槽生产出来的氢气无非几个去向存储、进甲烷化反应器、直接卖给外部用户或者混入天然气供燃气轮机燃烧。前几种要么受储氢容量限制要么受反应器容量限制要么需要额外假设外部氢负荷。燃气掺氢是最灵活的一条路燃气轮机本来就要烧天然气氢气按一定比例混进去不需要新增大型终端设备还能直接减少天然气的消耗量。从碳排放角度看有个反直觉的结论掺氢对碳减排的直接贡献没有想象中那么大。氢气的体积热值只有天然气的大约三分之一掺氢比例10%时同样发电量下天然气消耗量仅下降约3%左右掺氢比例提高到20%天然气消耗量下降也只有7%上下。所以燃气掺氢更重要的价值在于为P2G的氢气提供了一条连续的、可调度的消纳路径让电解槽不需要依赖“外部氢需求”这种不稳定假设就能满负荷运行。这个理解直接决定了模型里氢平衡约束怎么写。2. 先把拓扑画清楚虚拟电厂包含哪些设备各自按什么边界建模2.1 模型里的六大模块我在这套模型里把虚拟电厂拆成六个模块可再生能源风电、光伏、燃气轮机可掺氢、P2G系统电解槽甲烷化反应器、CCS装置、储能系统电储能储氢、电网交互购电/售电。每个模块都有输入输出模块之间通过电力、氢气、天然气、二氧化碳四种介质连接。拓扑关系可以用一段话描述清楚风电和光伏直接接入母线优先出力燃气轮机烧天然气和氢气的混合燃料发电排放的二氧化碳进入CCSCCS捕集来的二氧化碳一部分送去封存一部分进入甲烷化反应器P2G电解槽消耗电能产氢氢气一部分与CCS送来的二氧化碳在甲烷化反应器里生成天然气一部分直接送到燃气轮机掺氢燃烧一部分存入储氢罐电储能负责削峰填谷储氢罐负责氢气的时间平移母线缺电时从电网购电富余时向电网售电。2.2 设备参数的典型取值建模之前先把关键参数定下来我用的是符合工程实际的典型值设备关键参数典型取值燃气轮机额定功率 / 最小出力40 MW / 8 MW燃气轮机发电效率40%燃气轮机掺氢体积比上限10%~20%电解槽电转氢效率70%电解槽额定耗电功率15 MW甲烷化反应器氢转甲烷能量效率75%CCS捕集率90%CCS捕集能耗0.3 MWh/t CO2电储能容量 / 充放效率20 MWh / 95%储氢罐容量 / 初始储量5000 Nm³ / 50%这些数值不需要跟某个真实工程完全一致关键是量级不能离谱。比如CCS捕集1吨二氧化碳耗电0.3 MWh左右这是化学吸收法加压缩的常见水平电解槽制1标准立方米氢气耗电约4.3~5 kWh按70%效率折算就是1 Nm³氢气对应约4.3 kWh电能输入量级对得上。参数取值会影响最优解的倾向性但不会改变模型的框架逻辑。2.3 简化处理与实际约束的取舍建模时要明确哪些约束是必要的哪些可以简化。我在这套模型里做了三个简化第一燃气轮机采用连续可调模型不考虑启停成本和最小启停时间。如果做日内优化启停逻辑不是核心矛盾加进去只会让二进制变量翻倍求解时间明显拉长。第二P2G电解槽效率设为恒定值不随负荷率变化。严格来说电解槽在20%~100%负荷区间效率会有波动但做24小时调度时恒定效率已经能反映“谷时多制氢、峰时少制氢”的核心趋势。第三储氢罐只建模容量和充放效率不考虑压力变化和压缩能耗。这三个简化让模型保持线性可以直接用求解器求解。如果后面要扩展可以逐个把非线性加回去但一开始就把模型做成非线性调试成本太高很难定位问题。我建议所有复现这类模型的朋友都从线性版本起步。3. 碳配额与阶梯价格碳交易成本项的建模细节3.1 配额、排放量和阶梯碳价的基本逻辑碳交易这块的数学表达看似简单实际写的时候容易出偏差。先说基本逻辑虚拟电厂会获得一个免费碳排放配额记为E_quota这是它在碳市场里的“免费额度”。同时系统运行会产生实际碳排放E_act主要包括燃气轮机燃烧天然气的排放和外购电对应的间接排放。如果E_act小于E_quota富余的额度可以到市场出售获得收益如果E_act大于E_quota超出部分必须购买。阶梯碳价的意思是买配额的价格不是固定单价而是随着超排量增加逐级抬升超排越多边际碳价越高。这样做比固定碳价更能抑制超额排放也更贴近真实碳市场的设计思路。3.2 阶梯碳价线性化的最优解写法分段线性成本函数在优化模型里要小心处理。网上很多代码用0-1变量做区间选择比如三个区间就定义三个二进制变量再加一串大M约束。这种做法有两个问题一是二进制变量多了求解速度下降二是区间选择约束很容易写错出现“明明超排量落第二档成本却按第一档算”的诡异结果。我推荐一种更简洁的凸化写法。设基础碳价为p_base第二档、第三档在基础价上额外加价p_add。定义超排量E_excess E_act - E_quota引入两个非负辅助变量s1和s2约束如下s1 E_excess - E_seg1; s1 0; s2 E_excess - E_seg2; s2 0;碳交易成本直接写成C_carbon p_base * E_excess p_add * s1 p_add * s2;这里的逻辑是当E_excess没有超过第一阶梯E_seg1时s1取0成本就是基础价格乘以超排量当超排量落在E_seg1和E_seg2之间时s1等于超出E_seg1的部分这部分额外加价当超排量超过E_seg2时s1和s2都取正值分别对应两个超档区间的加价。因为目标函数是最小化总成本s1和s2一定会被压低到可行域下界不需要额外约束就能保证精确性。这个写法有个前提目标函数确实在最小化C_carbon。如果碳交易成本只是某个更大目标函数的组成部分总目标仍然是最小化这个前提依然成立。实际跑下来用这种方法比0-1变量法少很多变量而且不会出现区间错配问题。3.3 外购电的隐含碳排放要不要算算而且必须算。如果模型只算燃气轮机的本地排放不管外购电那优化器会发现一个“作弊”路径燃气轮机少发电全部从电网买电本地排放降下来了碳交易成本省了一大笔。但电网的电本来就是大量化石能源发出来的外购电增加等于把碳排放转移到了电网侧。所以模型里要引入电网碳排放因子比如0.6 tCO2/MWh把外购电量按这个因子折算成间接碳排放计入E_act。这样处理之后模型才会在“燃气轮机发电CCS捕集”和“外购电间接排放”之间做真实权衡。同时也避免了一个常见的荒谬结果碳价很高时模型把燃气轮机关了全部买电碳排放看似降到零实际总排放反而可能增加。4. P2G-CCS耦合和燃气掺氢的数学表达从化学反应到优化约束4.1 电解槽产氢和氢气分配约束电解槽的输入是电功率P_P2G输出是氢气流量。在能量层面产氢量等于输入电功率乘以电解效率再除以氢气的低热值。氢气低热值约3 kWh/Nm³如果P_P2G单位是MW一个时段长1小时那么产氢量可以写成H2_prod eta_elec * P_P2G * 1000 / LHV_H2; % LHV_H2 ≈ 3 kWh/Nm³这里乘1000是把MWh换算成kWh除以3就是把电量换算成氢气的标准立方米数。很多代码跑出氢气量为负或者量级离谱问题基本都出在这个单位换算上。氢气产出之后去三个地方掺氢燃烧H2_GT、甲烷化反应H2_meth、进储氢罐H2_ch。加上储氢罐释放的氢气氢平衡约束如下Constraints [Constraints, ... H2_prod H2_dis H2_GT H2_meth H2_ch];储氢罐自身的动态约束是典型的时序耦合约束下一时段的储量等于上一时段储量加上充入量减去放出量还要乘以充放效率。充放效率和最大充放功率也要一并约束否则会出现一小时内把整个储氢罐灌满的荒谬结果。4.2 甲烷化反应与CCS的碳流平衡甲烷化反应是P2G和CCS耦合的关键环节化学式是4H2 CO2 → CH4 2H2O。从气体体积比看4标准立方米氢气消耗1标准立方米二氧化碳生成1标准立方米甲烷。也就是说甲烷化消耗的二氧化碳体积等于消耗氢气体积的四分之一C_meth H2_meth / 4; % 体积比注意统一单位到了能量层面1标准立方米甲烷的热值约9.7 kWh而4标准立方米氢气的热值是12 kWh所以这个反应的理论能量效率约80%考虑实际过程的损耗和反应不完全工程上取70%~75%更稳妥。模型中生成甲烷的热值直接抵扣燃气轮机的天然气消耗量。CCS侧的碳流平衡是捕集量C_cap等于送往封存的C_seq加上送往甲烷化的C_meth即C_cap C_seq C_meth。CCS捕集量取决于燃气轮机的实际碳排放和捕集率同时CCS本身要耗电这部分耗电要作为电负荷计入功率平衡P_CCS beta_ccs * C_cap; % beta_ccs ≈ 0.3 MWh/t一个常见错误是把燃料进口侧和污染物出口侧的变量混在一起。天然气的碳排放是燃气轮机燃烧天然气生成的捕集的是这部分排放而甲烷化把捕集的二氧化碳和氢气合成天然气属于利用而非减排。两者不能抵消只能通过“减少天然气消耗”和“减少购买配额”两条路径分别产生经济价值。4.3 燃气掺氢比例的约束写法燃气轮机的燃料由天然气和氢气混合而成。掺氢比例按体积比定义ω V_H2 / (V_H2 V_NG)。这是一个非线性表达式直接在YALMIP里写会报错或者生成非线性约束需要改写成线性形式Constraints [Constraints, ... H2_GT omega_max * (H2_GT V_NG)];其中V_NG是天然气消耗量由燃气轮机出力除以发电效率再换算成标准立方米。这个线性形式等价于“掺氢比例不超过上限”。燃气轮机出力大小由燃料总热值决定混合燃料的总热值等于氢气热值加上天然气热值再乘以发电效率得到电功率输出P_GT eta_GT * (H2_GT * LHV_H2 V_NG * LHV_NG) / 1000;注意这里LHV_NG约9.7 kWh/Nm³与氢气热值相差约3倍所以掺氢20%体积比时氢气的热值贡献只有7%左右。模型结果在天然气消耗量上体现出来的正是这个热值差异。4.4 非线性环节的线性化策略这套模型的非线性来源主要有三个燃气轮机效率和出力之间的函数关系、电解槽效率随负荷率的变化、以及掺氢比例本身的分数形式。我的处理思路是效率一律取常数把非线性全部压缩成线性约束。燃气轮机效率取40%或采用分段线性逼近电解槽效率取70%掺氢比例用上面的线性不等式约束。这样整个问题就是标准的混合整数线性规划可以直接交给CPLEX或Gurobi求解。如果确实需要更精确的阶梯效率曲线可以用0-1变量做档位选择但这会让变量规模翻倍。对于24小时调度来说恒定效率带来的误差远小于风光预测误差追求那一点精度意义不大反而增加调试成本。5. Matlab侧的实现框架YALMIP建模、代码骨架与求解器选型5.1 为什么用YALMIP而不是手写单纯形Matlab里做优化建模YALMIP是我的首选。它的最大优势是建模语法接近数学表达式sdpvar声明变量、Constraints叠加约束、optimize调用求解器整个流程跟论文里的公式几乎一一对应。如果用linprog或者quadprog手写矩阵光是索引对应关系就够让人头疼更别说后面要加约束、改参数。求解器方面混合整数线性规划我推荐CPLEX或Gurobi学术许可免费性能远超MATLAB内置的intlinprog。安装YALMIP之后在sdpsettings里指定求解器名称就行YALMIP会自动把模型转成求解器需要的格式。5.2 决策变量声明与目标函数骨架决策变量按模块分组声明方便调试时查错T 24; P_GT sdpvar(1, T); P_P2G sdpvar(1, T); H2_prod sdpvar(1, T); % 产氢量Nm³ H2_GT sdpvar(1, T); % 掺氢用量 H2_meth sdpvar(1, T); % 甲烷化用氢 C_cap sdpvar(1, T); % CCS捕集量t C_seq sdpvar(1, T); % 封存CO2量 C_meth sdpvar(1, T); % 甲烷化CO2量 P_buy sdpvar(1, T); P_sell sdpvar(1, T); SOC_e sdpvar(1, T 1); % 电储能SOC SOC_h sdpvar(1, T 1); % 储氢罐储量目标函数包括五块购电成本、燃气轮机的天然气燃料成本、阶梯碳交易成本、弃风弃光惩罚、售电收益。写成代码如下Objective sum(price_buy .* P_buy - price_sell .* P_sell) ... sum(c_gas * V_NG) ... C_carbon ... sum(penalty_w * P_curtail);其中P_curtail是弃风弃光量用风光的可用出力减去实际消纳出力表示。这个惩罚项很关键它让P2G在谷时消纳弃风有了明确的经济动机。5.3 关键约束的代码骨架功率平衡是最核心的等式约束。注意P2G和CCS的耗电要放在负荷侧很多新手把它们放错位置导致结果里存在“凭空多出来的电功率”Constraints [Constraints, ... P_WT P_PV P_GT P_dis_e P_buy ... P_load P_ch_e P_P2G P_CCS P_sell];燃气轮机的出力下限、上限、爬坡约束Constraints [Constraints, ... P_GTmin P_GT P_GTmax]; Constraints [Constraints, ... -ramp_GT diff(P_GT) ramp_GT];电储能的时序约束for t 1:T Constraints [Constraints, ... SOC_e(t1) SOC_e(t) eta_ch * P_ch_e(t) - P_dis_e(t) / eta_dis]; Constraints [Constraints, ... 0 P_ch_e(t) P_ch_max, 0 P_dis_e(t) P_dis_max]; Constraints [Constraints, ... 0 SOC_e(t) E_cap]; end Constraints [Constraints, SOC_e(1) SOC_e(T1)]; % 日循环约束最后一天结束时的SOC要回到初始值否则模型会通过“最后时段把储能放空”来作弊降低前面时段的成本。5.4 求解器设置和常见报错求解参数我习惯这样设置ops sdpsettings(solver, cplex, verbose, 1, ... showprogress, 1, debug, 1); optimize(Constraints, Objective, ops);第一次跑通时把debug开成1YALMIP会在模型有问题时给出更明确的诊断信息。比较常见的一个报错是“Nonlinear constraints are not supported”这是因为某个约束里出现了两个变量相乘比如掺氢比例直接写成H2_GT/(H2_GTV_NG)。解决办法就是用之前提到的线性形式改写。另一个典型报错是“Index exceeds array bounds”通常是T1维SOC变量和T维变量的索引对不上排查时先看SOC的维度定义。模型规模方面24时段、约40个连续变量加几个辅助参数CPLEX求解时间一般在1~10秒之间完全在可接受范围。如果扩展到8760小时或者加入多场景随机优化时间会急剧上升那就需要考虑场景缩减或者滚动时域策略。6. 24小时算例结果掺氢比例和碳价到底怎么影响调度策略6.1 算例参数设置算例采用典型日数据风电在凌晨时段出力大白天逐渐减小光伏在午间出力大电负荷呈现早高峰和晚高峰两个峰值。分时电价设置为谷时0.4元/kWh、平时0.7元/kWh、峰时1.1元/kWh模拟虚拟电厂面对的价格信号。碳交易参数采用以下设定日免费配额E_quota 120吨基础碳价p_base 60元/吨第一阶梯阈值E_seg1 40吨超过部分加价30元/吨第二阶梯阈值E_seg2 80吨超过部分加价60元/吨。这个参数可以理解为“超排40吨以内按60元/吨买超排40~80吨的部分按90元/吨超80吨以上的部分按120元/吨”。6.2 基础场景的调度结果解读不加碳交易时燃气轮机在晚间峰荷时段满发配合储能放电满足负荷P2G几乎不运行因为制氢成本高于直接购电成本CCS不运行因为没有减排动力。风电在凌晨出现明显弃风因为没有储能容量吸收多余的电力。加入阶梯碳交易后最优解发生了明显变化。凌晨谷电时段P2G开始运行消耗部分弃风电量制氢制出来的氢气一部分直接存入储氢罐一部分进入甲烷化反应器与CCS捕集的二氧化碳合成天然气。白天燃气轮机出力时CCS启动捕集二氧化碳捕集到的二氧化碳一部分封存另一部分送甲烷化反应器。晚高峰时储氢罐释放氢气掺入燃气轮机燃烧减少天然气消耗从而减少碳排放。从成本构成看碳交易成本不再是简单的“花钱买配额”因为部分时段实际排放低于配额模型还通过出售配额获得收益。这说明碳交易机制确实在引导低碳设备投入运行。6.3 掺氢比例和碳价的灵敏度分析我跑了一组对比改变掺氢比例上限和碳价两个关键参数场景掺氢上限基础碳价天然气消耗碳排放总运行成本无碳交易0%0100%100%100%低碳价低掺氢10%60元/吨93%82%104%中碳价中掺氢20%60元/吨89%75%107%中碳价高掺氢20%90元/吨84%66%110%高碳价高掺氢20%120元/吨78%55%114%这个表格体现的趋势值得多说两句。第一掺氢比例从10%提高到20%天然气消耗下降幅度并不大从93%降到89%印证了前面说的“氢气体积热值只有天然气三分之一”这个物理事实。第二碳价上升对碳排放的抑制效果非常显著从82%降到55%这里面主要是CCS捕集比例上升和燃气轮机出力向P2G转移共同贡献的。第三总成本随碳价上升小幅增加但增加幅度远小于碳价涨幅因为模型通过增加P2G、CCS运行和出售富余配额对冲了相当一部分碳成本。这里有个值得注意的解释陷阱并不是“掺氢20%就比掺氢10%更优”。从碳排放角度它确实更优但从经济角度看是否选择高掺氢取决于氢气的来源成本。如果电解槽制氢用的是弃风电量成本几乎为零那掺氢的经济性就很好如果用峰时高价电制氢再掺进去经济性就很差。所以在结果分析里一定要看P2G是“什么时段在运行”而不是只看总产氢量。6.4 一个容易误导的结果碳排放降低不等于系统总排放降低复现这类模型时我经常看到有人把结果里的“系统碳排放”直接等同于“对碳中和的贡献”忽略了外购电的间接排放。如果把外购电的排放因子设为0.6 tCO2/MWh碳价抬升到120元/吨时模型会倾向于减少本地燃气发电、增加外购电。本地碳排放确实下降了但外购电的间接排放可能同步上升。这时候就要综合看“本地排放间接排放”的总量否则会得出“碳中和”的错误结论。我在结果对比表里区分了这两项表格里的碳排放是包含外购电间接排放的值。如果只统计本地排放高碳价场景下的降幅会显得更夸张但那是把排放“外包”给电网的假象。7. 复现中容易踩的五个坑以及我最后的建议7.1 单位换算是第一大坑这套模型的变量横跨三套单位体系电能用MWh氢气和天然气用标准立方米二氧化碳用吨。三者之间的换算系数稍有不慎就错一个量级。我踩过最典型的坑把P2G效率直接当成“MWh电量等于多少Nm³氢气”忘了除以氢气热值3 kWh/Nm³结果产氢量大了三百多倍储氢罐约束全部失效。建议把所有换算系数集中写在代码文件头部加注释说明来源比如“LHV_H2 3.0; % kWh/Nm³”不要在公式里散落硬编码数字。修改参数时只改一处排查问题时只核对一处。7.2 CCS的耗电漏出功率平衡CCS在工作时要消耗大量电能主要是溶剂再生和二氧化碳压缩。这个耗电必须出现在功率平衡等式里。我第一次复现时CCS直接写成“捕集多少吨就减少多少排放”没把P_CCS加到负荷侧结果功率平衡永远差一块燃气轮机出力被错误抬高。后来在功率平衡等式里看到P_CCS这个项才算把模型的“电账”和“碳账”对齐。判断功率平衡是否正确有个快速自检方法把所有电负荷项原负荷、P2G耗电、CCS耗电、储能充电加起来再和所有电源项风电、光伏、燃气轮机、储能放电、购电加起来两边的差只在数值容差范围内才算对。7.3 阶梯碳价区间变量错配如果用0-1变量做阶梯碳价的区间选择很容易出现“区间选择变量和实际超排量对不上”的问题。具体表现是超排量明显落在第二档但成本仍然按第一档计算或者模型为了省碳成本故意让区间选择变量指向低档位而实际排放量不变。YALMIP不会报错因为约束本身在数学上可能是可行的只是表达不对。用凸化写法可以彻底规避这个问题因为s1和s2的定义直接挂钩E_excess不需要额外的0-1变量也就没有区间错配的空间。这也是我推荐凸化写法的原因。7.4 二进制变量和连续变量相乘如果需要加入机组启停状态很容易写出yP_GT这种双线性项。YALMIP遇到这种表达式会直接报非线性约束不支持或者生成一个你根本不想求解的非线性模型。解决办法是用大M法把“y1时P_GT才能大于0”写成P_GT My同时把P_GT的下限写成P_GT P_GTmin*y。这样既保留了启停逻辑又保持线性。7.5 参数灵敏度别只看单点最后一个是结果解释层面的坑。做灵敏度分析时只打印“碳价从60涨到120总成本变化多少”不够要看清楚哪些设备出力在变、碳排放从哪些环节降下来、有没有发生排放转移。否则很容易得出“碳价涨了成本也涨所以碳交易没用”这类片面结论。我个人跑完整套模型的最大体会是这个模型最难的既不是碳交易写成目标函数也不是P2G-CCS耦合约束而是心里始终要有一本“能量账”和“碳账”。很多结果数值看起来正常一细查就会发现能量不守恒或者碳排放莫名其妙变成了负值十有八九是单位系数或碳流方向出了问题。建议第一次跑通后先手算两个极端工况验证纯燃气供电时的碳排放、夜间全弃风P2G最大出力时的氢流向。这两个点对上了模型基本就稳了。后面如果要扩展可以考虑加入风光出力的不确定性、需求响应或氢能交通负荷把单时段的调度模型升级成多场景鲁棒优化那时这套线性化思路依然可以沿用。