ARTICLE DETAIL

资讯详情

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

计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度方法

计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度方法 说实话接手“计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度”这个题目时我第一反应是这不就是给虚拟电厂模型多加几个设备约束嘛无非是垃圾焚烧、碳捕集、P2G各自建个模拼在一起求解就行。等真正开始搭模型才发现问题远没有想象中简单。垃圾焚烧在虚拟电厂里承担着城市固废处理的刚性任务碳捕集则是一个高耗能装置而P2G既是负荷又需要碳源这三个家伙放在一起谁也不愿意好好配合——直到我把它们之间的能量流和碳流理清楚优化模型才真正“活”起来。这篇文章会围绕这个模型的物理背景、数学表达、MATLAB实现和实测结果把整个建模和调度过程完整讲一遍适合正在做虚拟电厂、碳捕集或P2G相关课题的研究生也适合想从零复现类似论文代码的工程师。1. WTECCSP2G为什么值得放在同一个虚拟电厂里1.1 垃圾焚烧机组在VPP中的角色刚性电源与碳排放大户虚拟电厂的核心思想是把分散的分布式能源、储能和可控负荷聚合成一个对外表现为“单一电源”的调度实体。常见的虚拟电厂里面无非是风电、光伏、燃气轮机、储能电池这些成员而垃圾焚烧机组在其中属于比较特殊的存在你不能像对待燃气轮机那样随意启停它因为城市每天都在产生垃圾焚烧厂承担着固废无害化处理的任务垃圾处理量基本是刚性的。这意味着从电力调度视角看WTE机组更像是一个“必须运行却有一定调节范围”的基荷电源。但麻烦也在于这里。垃圾焚烧的烟气中含有高浓度的CO2按典型参数估算焚烧1吨生活垃圾大约产生0.4~0.5吨CO2一座日处理量300吨的焚烧厂每天要向大气排放120吨以上的CO2。在碳排放被纳入运营成本的背景下这个排放指标是绕不开的硬约束如果虚拟电厂作为一个整体参与碳市场交易垃圾焚烧机组的碳排放会直接吃掉整个VPP的碳配额。1.2 碳捕集的“可变负荷”属性碳捕集系统CCS装到垃圾焚烧机组上听起来像是一个纯粹的“负担”设备——它需要消耗大量能量来再生吸收剂捕集率越高厂用电越高机组净出力就越低。很多同行第一次做含CCS的虚拟电厂调度时都习惯把它当作一个固定能耗的“减去项”但这恰恰忽略了CCS最有价值的运行特性配了储液罐之后碳捕集系统的吸收过程和再生过程可以在时间上解耦。白天电价高的时候可以少开再生塔只用贫液维持低捕集率运行晚上电价低的时候让再生塔满负荷运转把白天吸收的CO2集中解吸出来。这样一来CCS在系统里就变成了一个“可平移的用电负荷”——它吃电的时段完全由调度决策说了算这是让虚拟电厂整体运行成本下降的一个关键抓手也是为什么这套模型值得用优化调度而不是固定策略去控制的原因。1.3 P2G是CCS的出路也是灵活的电力缓冲电转气系统P2G本质上是一个大功率柔性负荷电解槽把电能变成氢气氢气再和CO2发生甲烷化反应生成合成天然气SNG。如果这个CO2直接来自碳捕集系统就形成了一条“焚烧产生碳、捕集系统回收碳、P2G把碳固化进天然气”的内部循环链。P2G对虚拟电厂的价值在于两点。第一它提供了一个范围很大、响应很快的电力调节手段——在风电光伏大发而负荷不足的时段P2G可以像一个大功率充电宝一样把多余电能转化为气态燃料储存起来减少弃风弃光。第二它是碳捕集产品高纯CO2的出口让捕集下来的CO2不再是需要花钱封存的负担而是可以进一步转化为有市场价值的天然气。没有P2G时CCS捕集CO2后要么封存要么外售成本高且受制于外部渠道有了P2G虚拟电厂内部就能消化一部分碳源经济性显著改善。2. 各单元数学模型参数怎么选关系怎么表达2.1 整体能量流与碳流框架在建模之前我习惯先画一张能量流和碳流的拓扑图把虚拟电厂内部各单元的输入输出关系理清楚。这个VPP包含的成员是一台垃圾焚烧机组WTE、一套碳捕集装置CCS、一套电转气系统P2G、一组电化学储能、一定容量的风电和光伏以及与外部的购售电通道。能量流上风电、光伏、WTE净出力、储能放电、外购电共同供给本地负荷、CCS再生能耗、P2G消耗、储能充电和外送售电。碳流上WTE燃烧产生烟气CO2一部分被CCS捕集未捕集的直接排放被捕集的CO2分流到P2G甲烷化反应器剩余的以高纯CO2产品形式外售或送去封存外部购电对应的间接排放根据电网排放因子计入碳账。这个框架一旦画清楚后续写约束条件就只是把每条支路翻译成数学表达式而已。2.2 WTE机组的出力与排放模型WTE机组的建模很多人一开始容易过度复杂化——去算炉膛温度、蒸汽参数、汽轮机热力循环这些在目前调度级模型里完全没必要。调度级模型只需要抓住三个关键特性出力范围、爬坡能力、碳排放强度。出力方面机组电出力满足上下限约束[ P_{WTE}^{min} \le P_{WTE}(t) \le P_{WTE}^{max} ]爬坡约束限制了相邻时段出力变化量。由于WTE的燃料是垃圾处理量波动不大爬坡速度通常比燃煤机组还要慢一些但调度研究中给一个相对宽松的斜坡约束不会影响主要结论。碳排放模型按排放因子法处理[ E_{WTE}(t)\epsilon_{WTE} \cdot G_{WTE}(t) ]其中(G_{WTE}(t))是垃圾处理量(\epsilon_{WTE})是单位垃圾处理量对应的CO2产生量。这个因子建议参考实际焚烧厂的在线监测数据或者从文献里取值。我常用的做法是默认一个日处理300吨的中型焚烧厂发电效率18%左右单吨垃圾发电量约350~400 kWhCO2排放因子约0.4 t/t代入模型后得到的量级比较符合工程实际。2.3 CCS系统捕集、储液罐与等效电耗CCS的建模核心是把捕集量和能耗量写成线性关系。设第t时段捕集CO2量为(C_{cap}(t))捕集率(\eta_{cap})定义为捕集量与烟气CO2总量之比运行中一般限制在0.6~0.9之间。捕集到的CO2量还受吸收塔处理能力和再生塔处理能力双重约束——如果简化处理可以只约束捕集量上下限。再生能耗的处理是CCS建模最需要花心思的地方。胺法捕集实际消耗的是低压蒸汽而蒸汽来自汽轮机抽汽抽汽量的增加会让汽轮机发电出力下降。工程上常用“等效电耗”来折算这个损失即每捕集1吨CO2对应机组净出力减少约0.25~0.45 MWh具体数值取决于热力系统集成水平。于是WTE净出力可以写成[ P_{WTE}^{net}(t) P_{WTE}^{gross}(t) - \lambda \cdot C_{cap}(t) ]配了储液罐之后还要加入富液/贫液的库存平衡方程。储液罐的存在使得捕集和再生在时间上解耦这也是前面提到的“CCS作为可平移负荷”的模型基础。在日前优化中储液罐的液位方程是一条跨时段的状态转移约束本质和储能电池SOC约束一模一样只是物理量的含义不同。2.4 P2G从电力到天然气效率与碳需求P2G系统建模需要反映两个化学过程的能量转化关系。第一步是电解水制氢输入电功率(P_{P2G}(t))按一定效率产生氢气第二步是甲烷化理论上1 mol CO2需要4 mol H2[ CO_2 4H_2 \rightarrow CH_4 2H_2O ]从能量折算的角度我习惯用一个总效率参数来简化——P2G全流程电解甲烷化把电能转化为合成天然气的效率大约在50%~65%区间。计算CO2需求量时按化学计量关系折算每输入1 MWh电能约消耗0.11吨CO2。模型中可以写成[ C_{P2G}(t) \beta_{P2G} \cdot P_{P2G}(t) ]同时设置储氢罐容量约束和P2G输入功率上下限。P2G在虚拟电厂里的角色是双向的对电力系统它是柔性负荷对碳循环它又是碳汇——把捕集的CO2固化到甲烷中这部分碳最后以燃气形式销售不再以CO2形式排入大气。3. 优化模型完整推导从目标函数到约束集合3.1 目标函数设计这个模型的目标函数我采用“总运行成本最小化”将碳交易成本作为一项独立成本显式写入。相比只追求电费最小的传统模型这个设计更能体现“计及电转气协同”的意图。目标函数包含六项WTE机组燃料与维护成本、CCS运行维护成本吸收剂损耗、设备维护与捕集量线性相关、P2G运行维护成本与输入电功率相关、储能退化成本、与外部电网的购售电费用、碳市场交易成本。写出来就是[ \min \sum_{t1}^{T} \left[ C_{WTE}(t) C_{CCS}(t) C_{P2G}(t) C_{ESS}(t) C_{grid}(t) C_{carbon}(t) \right] ]碳交易成本一项的表达式值得单独说。设系统配额为(E_{quota})实际碳排放为(E_{total})碳价为(P_{CO2})则[ C_{carbon} P_{CO2} \cdot (E_{total} - E_{quota}) ]当实际排放低于配额时这项成本为负意味着虚拟电厂可以向碳市场出售富余配额获得收益。这也是为什么加入碳捕集之后即使CCS本身增加了运行能耗整个系统仍然可能在碳价较高时跑出更优的总成本——碳减排收益抵消了一部分设备能耗成本。3.2 功率平衡与储能约束功率平衡是调度模型里最基础也最容易出错的约束。系统的功率平衡可以写成[ P_{WTE}^{net}(t) P_{WT}(t) P_{PV}(t) P_{dis}(t) P_{buy}(t) P_{load}(t) P_{P2G}(t) P_{ch}(t) P_{sell}(t) ]注意WTE这一项要使用扣除CCS能耗之后的净出力这是含碳捕集虚拟电厂与普通VPP模型的本质区别——功率平衡方程中的来源项不再等同于机组毛出力而是耦合了碳捕集量这一决策变量。储能电池采用常规的SOC状态转移模型[ SOC(t1) SOC(t) - P_{dis}(t) \cdot \eta_{dis} \cdot \Delta t P_{ch}(t) \cdot \eta_{ch} \cdot \Delta t ]同时要添加充放电功率限制和SOC上下限以及“不能同时充放电”的约束。后者在MATLAB里需要用二进制变量实现或者用两个互相排斥的约束表达式。3.3 碳平衡与耦合约束整个模型最关键、也最能体现行业特色的是CCS与P2G之间的碳流耦合约束。设捕集系统的CO2捕集量为(C_{cap}(t))其中用于P2G甲烷化的量为(C_{P2G}^u(t))剩余部分外售或封存则[ C_{P2G}(t) C_{P2G}^u(t) \le C_{cap}(t) C_{from_storage}(t) ]系统实际碳排放量等于WTE烟气排放减去CCS捕集量再加上外购电力的间接排放[ E_{total} \sum_{t1}^{T} \left[ E_{WTE}(t) - C_{cap}(t) \epsilon_{grid} \cdot P_{buy}(t) \right] ]这里需要注意如果模型允许虚拟电厂向外部售电那么售出电力的碳排放责任通常归用户侧承担不记入本VPP的排放账。这样做符合目前主流碳核算边界也简化了模型。3.4 模型类别与复杂度评估到这里可以做一些统计。决策变量包括各机组出力、CCS捕集量和储液罐液位、P2G功率和储氢罐储气量、储能SOC、购售电量如果还考虑WTE机组启停就需要引入整数变量。整体来看这是一个典型的混合整数线性规划MILP问题。为什么强调线性因为目标函数和约束中出现的都是线性表达式只要保持这种线性结构就能用现成的MILP求解器在秒级或分钟级求解24时段日前调度问题。如果谁把P2G效率写成电功率的二次函数模型就会变成非线性规划求解难度和求解时间都会大幅上升工程上没有必要。我在建模前就反复提醒自己能线性化的一定要线性化这是这个模型能否“跑得快”的关键。4. MATLAB实现YALMIP建模与求解代码骨架4.1 工具链选型MATLAB实现了这个模型之后第一步要解决求解器的问题。我的环境是MATLAB R2023b YALMIP工具箱 Gurobi求解器。YALMIP的优势在于语法简洁能用符号化方式定义决策变量和约束写出来的代码几乎和数学表达式一一对应调试的时候非常直观。如果没有商业求解器授权MATLAB自带的intlinprog也可以直接用YALMIP底层会把模型传递给intlinprog求解。不过实测下来Gurobi在MILP求解速度上通常比intlinprog快一个数量级尤其当模型包含较多整数变量时。做24时段的日前调度两者都能跑完但如果要扩展到8760小时年运行模拟强烈建议上Gurobi或CPLEX。4.2 决策变量与参数表YALMIP定义决策变量非常简单。针对24小时调度所有时变变量都用(1 \times 24)的sdpvar向量表示T 24; P_wte sdpvar(1, T, full); % WTE毛出力 C_cap sdpvar(1, T, full); % 碳捕集量 P_ccs sdpvar(1, T, full); % CCS再生能耗 P_p2g sdpvar(1, T, full); % P2G输入功率 C_p2g sdpvar(1, T, full); % P2G消耗CO2量 V_lean sdpvar(1, T, full); % CCS储液罐液位 V_h2 sdpvar(1, T, full); % 储氢罐储气量 SOC sdpvar(1, T, full); % 储能电池SOC P_buy sdpvar(1, T, full); % 外购电 P_sell sdpvar(1, T, full); % 外售电 u_wte binvar(1, T, full); % WTE启停变量参数部分建议单独做一个结构体或者存在一个params.mat文件里包括机组容量、爬坡率、效率系数、储罐容量、分时电价、碳价、负荷曲线、风光出力曲线等。把这些统一放在模型函数外部改参数时不用动核心约束代码后续做灵敏度分析会非常方便。4.3 约束和目标函数的代码写法约束条件用中括号拼接成一个约束集合对象YALMIP会自动识别等式和不等式Constraints []; % WTE出力约束 Constraints [Constraints, P_wte_min P_wte P_wte_max]; Constraints [Constraints, -Ramp_wte diff(P_wte) Ramp_wte]; % CCS捕集约束 Constraints [Constraints, 0 C_cap 0.9 * E_wte]; Constraints [Constraints, P_ccs lambda * C_cap]; % CCS储液罐液位平衡 Constraints [Constraints, V_lean(2:T) V_lean(1:T-1) C_cap(1:T-1) - C_regene(1:T-1)]; % P2G约束 Constraints [Constraints, 0 P_p2g P_p2g_max]; Constraints [Constraints, C_p2g beta_p2g * P_p2g]; % 功率平衡 P_wte_net P_wte - P_ccs; Constraints [Constraints, P_wte_net P_wt P_pv P_dis P_buy ... P_load P_p2g P_ch P_sell]; % 储能约束 Constraints [Constraints, SOC(2:T) SOC(1:T-1) eta_ch*P_ch(1:T-1) - P_dis(1:T-1)/eta_dis]; Constraints [Constraints, SOC_min SOC SOC_max]; Constraints [Constraints, 0 P_ch P_ch_max, 0 P_dis P_dis_max]; % 目标函数 Cost_wte sum(wte_cost_rate * P_wte); Cost_ccs sum(ccs_om_rate * C_cap); Cost_p2g sum(p2g_om_rate * P_p2g); Cost_grid sum(price_buy .* P_buy - price_sell .* P_sell); Cost_carbon carbon_price * (E_total - E_quota); Objective Cost_wte Cost_ccs Cost_p2g Cost_grid Cost_carbon; % 求解 ops sdpsettings(solver, gurobi, verbose, 1, mipgap, 0.001); result optimize(Constraints, Objective, ops);这段代码骨架可以直接跑通但有几个细节要特别注意。第一(diff(P_wte))在MATLAB里结果是(1 \times 23)的向量和(1 \times 24)的变量维度不一致写爬坡约束时需要补一个端点否则YALMIP会报维度错误。第二储液罐和储氢罐的状态方程涉及(t)和(t1)时段的变量需要仔细对齐索引不能错位——我调试时连续踩过好几次这个坑。4.4 结果提取与绘图建议求解完成后用value函数提取各变量的数值P_wte_opt value(P_wte); C_cap_opt value(C_cap); P_p2g_opt value(P_p2g);绘图方面我建议至少输出三张图第一张是各电源出力与负荷平衡的面积堆叠图直观展示功率平衡关系第二张是CCS捕集量、P2G功率和储液罐液位随时间变化的曲线能清楚看到“低价时段多捕集、多制气”的调度策略第三张是碳平衡柱状图对比有无碳捕集P2G时系统总碳排放量的差异。这三张图也是论文或结题报告里最常用的结果呈现方式。5. 算例验证三方案对比与结果解读5.1 算例参数为了验证模型和代码的正确性我设计了一个中等规模的虚拟电厂算例。虚拟电厂包含一台额定出力15 MW的垃圾焚烧机组配套处理日300吨垃圾30 MW风电20 MW光伏10 MW/20 MWh储能电池以及10 MW的P2G装置。24小时日前调度时段间隔1小时。关键参数取值为WTE单吨垃圾CO2排放因子0.42吨/吨CCS捕集率上限0.85CCS等效电耗0.35 MWh/吨CO2P2G总效率55%每MWh电输入消耗CO2约0.11吨碳配额按60吨/日碳价350元/吨分时电价采用典型的峰平谷三段式结构。5.2 三方案对比我设置了三个方案做对比分析方案A是完全不含CCS和P2G的传统虚拟电厂方案B含CCS但不含P2G捕集到的CO2直接外售方案C是完整模型CCS和P2G协同运行。指标方案A方案B方案C总运行成本万元/日18.620.416.9碳排放量吨/日126.019.019.0弃风弃光率8.2%6.5%1.8%P2G产气收益万元002.1方案B的总成本反而最高这个结果很多人一开始看不明白——加了碳捕集碳排放大幅下降为什么总成本还升高了原因在于CCS的再生能耗增加了运行成本而捕集下来的CO2按外售价格处理收益远不足以覆盖能耗成本。这种情况在现实中确实存在所以单把CCS装上去并不等于经济性改善。方案C则完全不同。P2G在风电光伏大发时段启动把原本要被弃掉的多余电能转化为天然气同时消耗CCS捕集下来的CO2产出的合成天然气按市场价出售。这一套联动把“弃电”变成了“产品”把“碳排放负担”变成了“碳源原料”所以总成本反而比方案A还低。调度的智慧不在单个设备上而在设备之间的时序配合里。5.3 碳价的灵敏度分析进一步做了一个碳价从100元/吨逐步上升到600元/吨的灵敏度测试观察三个方案总成本的变化趋势。结果很规律碳价越低方案A越有优势因为排放成本可以忽略碳价一旦超过某个阈值本例大约在260~300元/吨之间方案C的总成本开始低于方案A此后碳价越高方案C的优势越明显。这个阈值正好是当前碳市场的实际交易区间说明碳排放成本已经不是一个可以忽略不计的“软约束”而是真实影响调度决策的经济信号。这套MATLAB模型的最大价值也体现在这里可以快速地扫碳价、扫设备容量、扫电价曲线找到虚拟电厂在不同市场环境下的最优配置和最优调度策略。6. 复刻这个模型时容易踩的五个坑6.1 模型不可行问题YALMIP返回infeasible是复刻这类模型最常见的挫败来源。功率平衡之和差一个量储罐状态约束写反一个符号都可能让整个模型无解。我调试时总结出一套经验先把所有变量替换成固定数值跑一遍约束集合确认每一条约束在数学上都成立然后从最简单的模型开始逐步加约束每加一条就求解一次出现infeasible时就能迅速定位到新加的那条约束上。不要一次性把所有约束都写完再开始调试那样定位问题会非常痛苦。6.2 求解时间与整数变量如果模型里引入WTE机组启停和储能充放电互斥的整数变量24时段MILP的求解时间可能从几秒涨到几分钟。经验做法是日常调试阶段先去掉整数变量在LP松弛下验证逻辑确认模型无误后再加回整数约束做最终计算。如果模型依然偏慢给求解器设置一个合理的MIP gap比如0.1%~0.5%牺牲微小精度换取显著提速。6.3 单位换算与数据量纲这个坑隐蔽度很高。MW、MWh、吨、kg、立方米、GJ如果单位不统一结果会天差地远。我最初跑出来总成本连差好几个数量级查了整整半下午才发现是CO2排放因子把吨写成了千克。建议所有参数表都统一为“MW/MWh/吨”体系排放因子用吨CO2/吨垃圾能耗系数用MWh/吨CO2购售电价用元/MWh这样代入模型不容易出错。另外把最终结果输出时再转换展示单位。6.4 储罐类动态约束的初始值储液罐和储氢罐的状态方程需要设定初始液位而调度周期结束时的液位如何处理直接影响调度结果。如果不对末时段液位做任何约束优化器很可能会在最后几个时段把储罐“掏空”来降低成本导致结果失真。我通常的做法是加一个周期末液位不小于初始液位的约束或者把末态液位目标写进目标函数让储罐在调度周期结束时恢复到合理状态。这和在储能电池SOC调度里常用的做法完全一致。6.5 结果分析时的陷阱跑通模型拿到数据之后还会有一个陷阱只看总成本不看各设备的运行曲线。我见过不少同学拿着一个总成本很低的方案就准备写结论但画出来一看WTE机组在凌晨时段被压到最小出力P2G却在同一时段满负荷运行导致大量购电——这在经济上虽然划算但在实际运行中可能受到机组最小运行小时数和电网购电协议的限制。所以结果分析一定要回到物理过程去验证看每个决策变量在24小时内的曲线是否都有合理的工程解释。这套模型从搭框架到跑通算例前后花了大约两周时间。工程上最大体会是虚拟电厂优化调度模型的难点从来不在单个设备的约束推导上而在于把跨设备、跨时段、跨能量形态的耦合关系用线性约束准确表达出来——碳捕集的等效电耗扣减、P2G的碳源匹配、储罐的状态衔接每一项都是这种“模型翻译”能力的体现。把这套MATLAB代码跑通一次之后再遇到UPS、电解制氨、熔盐储能这类五花八门的单元你会发现建模思路都是一样的理清能量流和物质流找到决策变量之间的线性映射然后把问题交给求解器。最后提醒一句第一次跑通模型时请一定把每小时的运行曲线逐条画出来看看——那些能在图上解释得通的结果才是真正能落地的调度方案。
返回列表