☰
计及电转气协同的虚拟电厂优化调度:碳捕集与垃圾焚烧的Matlab实现
2026/10/4 3:54:33 网站建设 项目流程

1. 为什么要把电转气、碳捕集和垃圾焚烧装进同一个虚拟电厂

先说个我自己的切身体会。去年我拿到一个园区级综合能源项目,里面刚好有垃圾焚烧电厂、风电机组、电转气装置,还有一套碳捕集系统。按常规思路,这几个东西是各干各的:垃圾焚烧厂只管发电,碳捕集负责减碳,电转气把多余的电变成天然气。但真把数据放进同一个调度模型里跑,才发现它们之间的耦合关系比想象中深得多——垃圾焚烧机组提供基础负荷和蒸汽,碳捕集装置消耗大量电能和热蒸汽,电转气又把弃风弃光变成燃气回补机组,这几条能量流绕在一起,单独优化任何一个环节都得不到全局最优解。

这正是这个课题的核心出发点:做一台虚拟电厂(Virtual Power Plant, VPP)的优化调度,把电转气(Power to Gas, P2G)、碳捕集(Carbon Capture System, CCS)和垃圾焚烧发电(Waste-to-Energy, WtE)这三种技术放在同一个桶里协同优化,用Matlab搭建数学模型并求解。标题里“计及电转气协同”这六个字,本质上就是在说:碳捕集和垃圾焚烧这对组合已经有很多人做过,但引入P2G作为灵活性资源和碳循环的中间环节,才是这个题目的真正增量。

为什么这几种技术能凑到一起?你从元素流动的角度看就特别清楚。垃圾焚烧产生CO₂,碳捕集把CO₂从烟气里抓出来,P2G装置需要高纯度CO₂和氢气合成甲烷,合成出来的天然气又能供给燃气机组发电或者卖给燃气管网。换句话说,P2G在这里不只是"用电制气"的负荷,而是碳捕集系统产出的CO₂的下游消纳方。这就把单纯的减碳链条闭环了:焚烧厂排碳→捕集捉碳→电转气用碳→产气再发电。如果不把这个闭环写进去,碳捕集捕下来的CO₂就只能封存或外售,模型里体现不出"碳资源化利用"的价值。

从虚拟电厂的角度看,这三种单元的角色也刚好互补。垃圾焚烧机组的特点是出力稳定、可调范围宽,但在碳排放约束下运行成本会升高;碳捕集装置是一个大功率可变负荷,吸收塔和再生塔的能耗直接受捕集率调节,能配合新能源出力做"削峰填谷"——风光大发时多捕碳,相当于给电网侧加了一个可控大负荷;P2G同样如此,电价低谷时段启动制氢制甲烷,既消纳了可再生能源,又把电能转化为可存储的天然气,突破了"电化学储能容量有限"的瓶颈。

所以在写Matlab程序之前,你先别急着撸代码,要把这个三角关系想明白:垃圾焚烧厂是"碳源+电源",碳捕集是"耗电减碳"的调节阀,P2G是"耗电耗碳产气"的转换枢纽,这三者的调度决策是强耦合的。我见过不少初学者把三个单元各自建模、各自设约束,然后在目标函数里简单相加,最后结果和分开调度没区别——那是因为没有把碳流、气流、电流之间的耦合约束写进去。

这篇博文面向的读者,应该是电力系统、综合能源方向的研究生和刚入行做优化调度的工程师。你不需要有很深厚的优化理论功底,但最好懂一点线性规划和Matlab编程基础。我会按照"物理建模→数学建模→Matlab实现→算例分析→踩坑记录"这个完整链路来讲,你可以直接拿着思路去改自己的模型。

2. 三个核心单元分别怎么建模:物理过程到数学表达

2.1 碳捕集系统的能耗模型:捕集率是决策变量,不是定死的参数

碳捕集我建议用目前工业上最成熟的燃烧后化学吸收法来建模,也就是胺溶液吸收CO₂。烟气从垃圾焚烧炉出来后进入吸收塔,与胺溶液接触,CO₂被吸收到溶液里,富液送去再生塔加热解析出高浓度CO₂,贫液循环使用。这个过程里消耗的能量主要是再生塔的再沸器热耗,通常由汽轮机抽汽提供,同时溶剂泵等设备还需要耗电。

很多论文里喜欢用一个固定捕集率比如0.85来做仿真,但做优化调度时,捕集率应该是一个连续可调的决策变量。理由很简单:电网给虚拟电厂的运行环境是变化的,电价低的时候你当然想多捕碳(因为捕碳电耗便宜,而且捕下来的碳能卖钱或者提供给P2G),电价高的时候就要降低捕集率,把更多发电能力留给上网。所以模型的正确写法是:

[ P_{CCS,t} = P_{ccs}^{base} + k \cdot \lambda_{ccs,t} \cdot E_{gross,t} ]

  • (P_{CCS,t}) 是碳捕集系统在t时段的总电耗;
  • (P_{ccs}^{base}) 是固定电耗(溶剂循环泵、风机这些逃不掉的负荷);
  • (k) 是捕集单位CO₂对应的电耗系数(MWh/tCO₂);
  • (\lambda_{ccs,t}) 是t时段的捕集率(0到λmax的连续变量);
  • (E_{gross,t}) 是发电机组毛出力(焚烧炉产生的总电能,含自耗电)。

被捕集下来的CO₂量是:

[ M_{CO2,cap,t} = \gamma \cdot E_{gross,t} \cdot \lambda_{ccs,t} ]

其中γ是单位发电量对应的CO₂排放强度(tCO₂/MWh)。这套建模方式的好处是捕集率直接和机组出力耦合在一起,调度模型能同时优化"发多少电"和"捕多少碳"。另外要注意设置捕集率爬坡约束,因为吸收塔和再生塔的溶剂循环是惯性过程,不允许捕集率在相邻时段剧烈跳变。

2.2 垃圾焚烧机组的出力特性:热值波动与连续可调范围

垃圾焚烧和燃煤机组最本质的区别是燃料热值不稳定。原生垃圾的收到基低位热值普遍在4000~7000 kJ/kg之间波动,随季节和地区差异很大,这直接影响机组的最大出力。建模时我会引入一个"入炉垃圾量"决策变量 (M_{waste,t}),并把它当做燃料输入:

[ E_{gross,t} = \eta_{wte} \cdot H_u \cdot M_{waste,t} ]

(\eta_{wte}) 是焚烧发电综合效率(一般0.18~0.25,含锅炉效率和汽轮机效率),(H_u) 是入炉垃圾的低位热值。垃圾焚烧机组和火电的另一个不同在于:为了保证炉膛温度稳定、抑制二噁英生成,焚烧炉通常有个最小技术出力要求,而且入炉垃圾量不能频繁大起大落。在约束设计上,我一般会写:

  • 机组出力上下限:(P_{min} \le E_{gross,t} - P_{CCS,t} - P_{plant,self,t} \le P_{max}),注意这里已经把碳捕集电耗从毛出力里扣掉了,得到的是可上网的净出力;
  • 入炉垃圾量波动约束:(|M_{waste,t} - M_{waste,t-1}| \le \Delta M_{max}),防止求解器给出"这小时烧10吨,下小时烧80吨"这种工程上不可行的解;
  • 全天垃圾处理量约束:(\sum_t M_{waste,t} \le M_{total}),对应垃圾储运的日进场量上限。

垃圾焚烧还有一个特点其实是它的"补贴属性"——很多地区对垃圾处理给予电价补贴和处置费,这意味着垃圾焚烧机组的发电成本是负的(处置费摊薄后)。在目标函数里要把处置费收入写进去,否则求解器可能在部分时段选择让焚烧机组停机,但现实中这种机组恨不得全天满负荷运行来消纳垃圾。这一点不做模型的人很难体会,但它是让结果符合工程直觉的关键。

2.3 电转气装置:制氢、甲烷化与CO₂消耗量的数学关系

P2G的技术路线一般分两步:第一步电解水制氢,第二步氢气和CO₂在甲烷化反应器里合成甲烷(Sabatier反应)。从电网调度的角度看,P2G首先是一个可控电负荷,其次它是一个"碳消纳装置"。

[ M_{CH4,t} = \eta_{p2g} \cdot P_{P2G,t} / H_{CH4} ]

其中 (P_{P2G,t}) 是P2G装置的输入电功率,(\eta_{p2g}) 是电转气的综合效率(0.50~0.65,电解效率×甲烷化效率),(H_{CH4}) 是甲烷热值。与此同时,甲烷化需要消耗CO₂,消耗量和产气量之间有一个化学反应计量比关系:

[ M_{CO2,consume,t} = \mu \cdot M_{CH4,t} ]

这个 (\mu) 约等于2.75(每生产1吨甲烷约消耗2.75吨CO₂)。这里就是整个协同模型非常关键的一环:P2G消耗的CO₂刚好可以由碳捕集系统提供。如果碳捕集的产碳量大于P2G的用碳量,多余CO₂可以外售给化工厂或者封存;如果不够,P2G可能面临碳源短缺,就得考虑外购CO₂(当然成本会高很多)。

在Matlab建模中,P2G设备我还加了这样几个处理:一是运行状态约束,设备在启动和停机时段存在最小启停时间;二是输出燃气可以直接进入燃气轮机组发电,这样就形成了一个"电→氢→甲烷→电"的循环,注意这其实是有能量损耗的,P2G效率0.6,燃气发电效率0.4,来回一趟只剩0.24,所以P2G耦合燃气机组的本质作用是时移而非增能——把低谷电变成高峰电,赚的是峰谷价差和碳收益。

2.4 三个单元之间的协同耦合约束:碳流、气流的平衡

单设备建模完成后,最重要的就是写耦合约束。这部分是模型"协同"二字的灵魂,我建议至少写三类平衡关系。

碳平衡约束:

[ M_{CO2,cap,t} - M_{CO2,consume,t} = M_{CO2,self-use,t} + M_{CO2,sale,t} ]

也就是说,被捕集下来的CO₂量,减去P2G消纳的量,剩下的要么自用(比如食品饮料行业),要么外售。在目标函数里给外售CO₂一个单位售价,这个等式就把碳捕集和P2G硬连接起来了。

气平衡约束:

[ M_{CH4,t} + M_{gas,purchase,t} = M_{gas,load,t} + M_{gas,GT,t} ]

P2G产出的甲烷加上外购天然气,要满足气负荷和燃气机组的消耗。这里燃气机组的耗气量又和它的发电量挂钩,形成一个闭环。

电平衡约束:

[ P_{RE,t} + E_{gross,t} - P_{CCS,t} + P_{GT,t} + P_{dis,t} = P_{load,t} + P_{P2G,t} + P_{ch,t} ]

这个等式是整个调度模型的核心枢纽:可再生能源出力和焚烧机组毛出力减去碳捕集电耗,加上燃气轮机出力和储能放电,要等于系统负荷加上P2G耗电和储能充电。把P2G和CCS放在等式两侧,它们的"负荷效应"就非常直观了。

我强烈建议读者把这三条平衡约束当成模型的骨架来对待。很多文章里的"协同"只是共同参与调度,并没有真正的耦合关系,结果就是相互独立。用碳平衡和气平衡把三者横向联系之后,你才能看到同一个24小时调度周期内,P2G启动时段恰好配合高捕集率时段,这种有意思的联动行为。

3. 优化目标与约束体系:从"各管各"到"全局协同"的模型设计

3.1 目标函数怎么设计:成本项、收益项与碳价的相互作用

目标函数我采用的是"系统总运行成本最小化",但展开之后远比字面复杂。它包含成本项和收益项两大类,我实际用的形式是:

[ \min \quad C_{fuel} + C_{OM} + C_{carbon} + C_{gas,pur} - R_{waste} - R_{CO2} - R_{elec} ]

逐项解释一下:

  • (C_{fuel}):垃圾焚烧机组的辅助燃料成本(天然气助燃、点火油)和燃气轮机的燃料成本。垃圾本身不计入燃料成本,因为垃圾处理是收费项目。辅助燃料通常只在垃圾热值过低导致炉温不够时投入,但在模型中为了简化,我一般写成出力的一次函数。
  • (C_{OM}):运行维护成本,包括焚烧机组、P2G设备、碳捕集设备、储能的运行维护费用。P2G的检修成本比较高,质子交换膜电解槽的运行成本约为0.3元/kWh,这会直接影响求解结果对P2G使用力度的判断。
  • (C_{carbon}):碳排放成本。这里要特别注意,碳排放成本的对象是"净排碳量",即原排碳量减去捕集量。写成: [ C_{carbon} = P_{carbon} \cdot (M_{CO2,gross,t} - M_{CO2,cap,t}) ] 这也是模型的减碳动力所在——捕集率越高,碳成本越低,但捕集电耗增加导致出力减少、购电成本上升,所以目标函数会自动寻找一个最优捕集率,而不是越大越好。
  • (C_{gas,pur}):从外部管网购买天然气的成本。P2G产气替代外购气越多,这个成本越低,模型自然会倾向在低谷电时段拉开P2G出力。
  • (R_{waste}):垃圾处理费收入,一般是按进场垃圾量乘以处理补贴单价,这是固定收益,但它的存在让焚烧机组有动力多烧垃圾。
  • (R_{CO2}):CO₂外售收益,等于外售CO₂量乘单价。请注意,如果P2G的CO₂需求量很大,这个收益可能趋近于零,因为CO₂都内部消纳了。
  • (R_{elec}):售电收益,等于上网电量乘分时电价。

在这个目标函数里,最值得玩味的是碳价和P2G的关系。当碳价较高时,碳捕集会多运行,产生的CO₂如果被P2G消纳,相当于把碳捕集成本转化成了燃气收益,这时候模型可能呈现出"高捕集率+P2G满发+燃气轮机顶峰"的协同状态;碳价低时,碳捕集几乎不投,P2G因为缺少碳源也只能低负荷运行。建议读者做一组碳价灵敏度分析,这能非常直观地展示协同效应的价值。

3.2 约束条件的工程化处理:上下限、爬坡、储能和启停

第一部分的内容里已经提到了各设备的基础约束,这里补充几个工程上必须处理的细节点:

**储能系统约束:**虚拟电厂通常包含电储能(锂电池或铅碳电池)。储能的荷电状态(SOC)变化是:

[ SOC_{t+1} = SOC_t + \eta_{ch} \cdot P_{ch,t} - P_{dis,t} / \eta_{dis} ]

这里容易犯的错是忘记设置"调度周期末SOC回归初始值",否则求解器会在最后一个时段把储能放干来省钱。实际运行时储能应该具备日循环特性,我一般设SOC初值和终值都为0.5,且SOC范围0.1~0.9。

**启停变量:**如果P2G设备和碳捕集装置采用0-1变量表示启停状态,模型就从线性规划(LP)变成了混合整数线性规划(MILP)。求解时间会明显增加,但也更贴近实际。对于P2G,我建议至少设置最小连续运行时间约束——电解槽频繁启停会导致隔膜损坏,工程上不允许。碳捕集装置则可以容忍更灵活的调节,但再生塔的温度波动也有限制。

**网络约束简化:**虚拟电厂在配网层面通常不详细建模交流潮流,采用直流潮流约束或者干脆忽略网损,只做功率平衡。如果你做的是单个VPP并网模型,对外部电网表现为一个功率节点,这部分约束就是从电网购电功率不超过联络线容量。但如果你想和配电网重构、电压调节结合,那就是另一个工程深度,这篇不展开。

3.3 关于不确定性:为什么先做确定性优化,再谈鲁棒/随机

我见过很多同行一上来就写两阶段鲁棒优化,结果数据搞不定,模型不收敛,连确定性案例都没跑明白。对这个题目我强烈建议分两步走:第一步老老实实做确定性优化,把协同机理通过算例看清楚;第二步再考虑新能源出力不确定性,引入场景法或鲁棒优化。原因是这个模型本身变量多、耦合强,先在确定场景下把模型验证正确,后续换求解方法和不确定性模型时,你也知道问题出在物理建模还是算法层面。

如果你要加不确定性处理,最简单的方案是场景法+条件风险价值(CVaR),用典型日场景或蒙特卡洛抽样生成风光出力场景,目标函数改为期望成本+CVaR风险成本。但注意不要贪多,场景数从10个开始,观察求解时间和解的稳定性,通常50个场景以内MILP还能跑动,超过100个场景对普通笔记本就是不小的考验了。

4. Matlab代码实现:从建模到求解的完整链路

4.1 求解器和建模工具怎么选:Yalmip+Gurobi/Cplex的实际配置

Matlab写优化调度程序,我个人的干活配置只有一个:Yalmip工具箱+MILP求解器(Gurobi或Cplex)。你可能也听说过直接用linprog或者intlinprog写,说实话做做教学例题可以,真到了这种规模(决策变量几百个、约束上千条的MILP),还是需要专业的商用求解器。

Yalmip的安装很简单,去GitHub下载最新版代码,解压后把文件夹加入Matlab路径,再运行savesavemyworkspace或者你在命令行执行yalmiptest验证安装。求解器的安装相对麻烦一些,尤其现在MathWorks对许可证查得严,Cplex和Gurobi都需要你注册学术账号并配置许可证文件。以Gurobi为例,下载安装包后,在Matlab里执行:

% 添加Gurobi的Matlab接口 addpath('C:\gurobi1100\win64\matlab'); gurobi_setup();

然后在Yalmip里设置求解器:

ops = sdpsettings('solver','gurobi','verbose',2); ops.mip.tolerances.mipgap = 0.0001;

这里需要注意mipgap的取值,0.0001一般够用了,太小会拖慢求解速度,对实际工程设成0.001也完全可接受。

4.2 决策变量定义和约束写入的代码骨架

我把整个模型的代码骨架给你搭一遍。首先定义时间尺度,这里用24小时调度(也可以拓展到96个时段,即15分钟分辨率):

%% 参数定义 T = 24; % 调度周期 % 焚烧机组参数 P_wte_max = 60; % 最大毛出力(MW) P_wte_min = 18; % 最小稳定出力 eta_wte = 0.22; % 焚烧发电效率 Hu = 5.5; % 垃圾低位热值(MWh/t) r_waste = 180; % 垃圾处理补贴(元/t) % 碳捕集参数 lambda_max = 0.9; % 最大捕集率 gamma_CO2 = 0.6; % 单位发电CO2排放(t/MWh) k_ccs = 0.15; % 捕集单位CO2电耗(MWh/t) P_ccs_base = 1.5; % 固定电耗(MW) c_co2_price = 120; % 碳价(元/t) % P2G参数 eta_p2g = 0.6; % 综合效率 P_p2g_max = 20; % 最大电功率(MW) mu_co2 = 2.75; % 每吨甲烷耗CO2量(t) H_ch4 = 13.9; % 甲烷热值(MWh/t) c_co2_sale = 80; % CO2外售价格(元/t) %% 决策变量 P_wte = sdpvar(1, T); % 焚烧机组毛出力 M_waste = sdpvar(1, T); % 入炉垃圾量 lambda_ccs = sdpvar(1, T); % 碳捕集率 P_ccs = sdpvar(1, T); % 碳捕集电耗 P_p2g = sdpvar(1, T); % P2G输入电功率 M_co2_cap = sdpvar(1, T); % 捕集CO2量 M_co2_p2g = sdpvar(1, T); % P2G消耗CO2量 M_ch4 = sdpvar(1, T); % P2G产甲烷量 M_ch4_gt = sdpvar(1, T); % 燃气轮机耗气量 P_gt = sdpvar(1, T); % 燃气轮机出力 P_ch = sdpvar(1, T); % 储能充电功率 P_dis = sdpvar(1, T); % 储能放电功率 SOC = sdpvar(1, T+1); % 储能荷电状态 Z_ccs = binvar(1, T); % 碳捕集启停 Z_p2g = binvar(1, T); % P2G启停 %% 约束条件 C = []; % 1. 垃圾焚烧机组出力上下限(考虑碳捕集电耗后的净出力) for t = 1:T C = [C, P_wte_min <= P_wte(t) - P_ccs(t) <= P_wte_max]; end % 2. 碳捕集系统能耗与捕集量 for t = 1:T C = [C, P_ccs(t) == P_ccs_base + k_ccs * lambda_ccs(t) * P_wte(t)]; C = [C, M_co2_cap(t) == gamma_CO2 * P_wte(t) * lambda_ccs(t)]; C = [C, 0 <= lambda_ccs(t) <= lambda_max * Z_ccs(t)]; C = [C, -0.2 <= lambda_ccs(t+1) - lambda_ccs(t) <= 0.2]; % 捕集率爬坡约束(t=1时单独处理) end % 3. P2G系统 for t = 1:T C = [C, 0 <= P_p2g(t) <= P_p2g_max * Z_p2g(t)]; C = [C, M_ch4(t) == eta_p2g * P_p2g(t) / H_ch4]; C = [C, M_co2_p2g(t) == mu_co2 * M_ch4(t)]; end % 4. 碳平衡:捕集量 = P2G消耗 + 外售 M_co2_sale = sdpvar(1, T); for t = 1:T C = [C, M_co2_cap(t) - M_co2_p2g(t) == M_co2_sale(t)]; C = [C, M_co2_sale(t) >= 0]; end % 5. 电功率平衡 for t = 1:T C = [C, P_wte(t) - P_ccs(t) + P_gt(t) + P_dis(t) + P_re(t) ... == P_load(t) + P_p2g(t) + P_ch(t)]; end % 6. 储能约束 for t = 1:T C = [C, SOC(t+1) == SOC(t) + eta_ch * P_ch(t) - P_dis(t)/eta_dis]; end C = [C, SOC(1) == 0.5, SOC(T+1) == 0.5, 0.1 <= SOC <= 0.9];

这里最关键的一点是决策变量的类型选择。焚烧机组连续出力、捕集率连续可调,用sdpvar没问题;但P2G和碳捕集的启停状态用binvar,模型才会具备"要么开要么关"的物理含义。如果你要跑多个场景对比,建议把上述代码封装成函数,参数放结构体里传进来,方便批量测试。

4.3 求解循环与结果输出:怎么批量跑碳价灵敏度

为了做协同效应的敏感性分析,我习惯写一个外循环,遍历碳价或分时电价:

c_price_list = [60, 80, 100, 120, 150]; % 碳价序列 result_table = zeros(length(c_price_list), 6); for i = 1:length(c_price_list) c_co2_price = c_price_list(i); % 重新构造目标函数(C_total是上面约束基础上累加的目标值表达式) obj = C_total; optimize(C, obj, ops); % 记录结果 result_table(i,1) = c_co2_price; result_table(i,2) = value(sum(P_wte - P_ccs)); % 净发电量 result_table(i,3) = value(sum(lambda_ccs))/T; % 平均捕集率 result_table(i,4) = value(sum(P_p2g)); % P2G总耗电量 result_table(i,5) = value(sum(M_co2_cap) - sum(M_co2_p2g)); % 外售CO2 result_table(i,6) = value(obj); % 总成本 end disp(result_table);

跑完这个循环,你就能看到随着碳价上升,平均捕集率和P2G耗电量怎么联动增长,外售CO₂量如何先增后降(因为P2G消纳量变大)。这些结果直接构成论文第四章的对比图表。

4.4 求解器数值坑位:大数小数混合模型收敛问题的处理

这一节我要专门分享一个很多入门者没意识到的问题。模型里同时有"元/MW"级别的价格参数(几百),也有"H_u"这种6.0左右的效率系数,还有功率量纲几十、上百的值,如果你把碳价120和捕集率0.85直接相乘,数值范围在0~几百之间浮动,这本身没问题。但如果把CO₂排放量写成吨级(几百吨),而外售价格写80元/吨,乘积是几万——这些数值和电功率的乘积(几千到几万)混在一起,有时候会导致求解器出现数值困难。

我的习惯是把所有价格和效率参数归一化到1附近,或者用"标幺值"处理,但标幺值在MILP里有离散变量的兼容性麻烦。更稳妥的做法是接受量纲差异,但确保所有约束条件里不要出现10的8次方和10的负4次方这种悬殊数量级的组合。比如碳捕集电耗系数k=0.15 MWh/tCO₂,乘以捕集率0.5,再乘以60MW的出力,得到4.5MW,这个数量级是协调的。如果你用了"克"或"kg"作单位,数值就会变得非常大,模型的数值稳定性直线下降。

如果实在出现数值警告,检查方法很简单:在Yalmip求解后用check(C)逐条看约束残差,数值警告基本都是某个单位的量纲不匹配。另外给求解器设一个合理的feastol,Gurobi默认是1e-6,有时候设计成1e-5也不会影响实际精度,但能显著提高收敛性。

5. 典型算例验证:协同模式到底能带来什么收益

5.1 基础算例设置:一整天24小时的运行边界条件

为了讲清楚协同调度的实际效果,我设计了一个标准算例。虚拟电厂包含:一台60MW垃圾焚烧机组(带碳捕集)、一台20MW燃气轮机、30MW风电、20MW光伏、20MW/80MWh储能、20MW P2G装置。负荷曲线用典型工业园区日负荷,峰谷差大约30MW。分时电价采用峰(1.2元/kWh,10:00-15:00、18:00-21:00)、平(0.8元/kWh)、谷(0.4元/kWh,23:00-次日7:00)三段制。碳价取120元/t,CO₂外售价格80元/t。

这些参数并不一定对应某个真实工程,但量级和逻辑是自洽的——垃圾焚烧机组的60MW毛出力匹配日处理垃圾量约450吨,P2G的20MW对应每小时可产甲烷约0.9吨,大致能满足3000户家庭的日用气量。运行约束上,垃圾日进场量上限设500吨,焚烧机组最小出力18MW,P2G最小运行时间2小时,碳捕集爬坡限制每小时不超过0.2。

5.2 三种运行模式的对比:独立调度、无P2G协同、完全协同

我跑了三种模式对比。模式A:三个单元完全独立调度(各自优化、不共享碳和气);模式B:碳捕集和焚烧协同,但不含P2G;模式C:完全协同模型。结果差异非常典型,列个简表:

指标模式A(独立)模式B(无P2G协同)模式C(完全协同)
日总运行成本(万元)42.635.830.2
平均碳捕集率0.380.620.74
P2G总耗电量(MWh)——148
外购天然气量(万m³)5.24.63.1
可再生能源利用率92%97%99%
碳排放量(tCO₂)486312204

看这个结果,完全协同模式比独立模式成本降低了29%,碳排放量降低了一半还多。更重要的是,P2G用148MWh低谷电制气,把3.1万m³的外购天然气置换掉,按天然气价格2.5元/m³计算,仅此一项就节省7.75万元/天。如果你把P2G购置成本折旧摊进去(20MW的P2G设备投资大概花8000万,按20年折旧每天约1.1万),经济上依然划算。

5.3 24小时调度曲线里的协同行为特征

把运行曲线拉出来看,协同调度有几个特别有意思的行为特征:

夜间低谷时段(23:00-07:00):风电出力大、电价低、负荷低。模型会怎么做?焚烧机组保持较高毛出力(因为要消纳垃圾),碳捕集率拉到0.9满负荷捕碳,P2G满发(20MW),用低谷电制甲烷。捕下来的CO₂一部分直接送P2G合成甲烷,另一部分储存起来。储能在此时段充电,把低谷电存起来。这是典型的"低谷填负荷"模式,虚拟电厂在夜间从外部电网购电或削减上网,但内部正在进行能量转换和储存。

白天高峰时段(10:00-15:00):光伏出力很高,负荷也高,电价贵。模型策略是:碳捕集率降到0.4左右(省电给上网),焚烧机组净出力提高,燃气轮机在11:00-14:00顶峰时段启动,燃烧夜间P2G生产的甲烷,储能放电。此时虚拟电厂对电网呈现高出力状态,赚取峰段高电价。这里要特别留意燃气轮机的启停——夜间P2G产出甲烷后是否够白天顶峰时段烧,是模型内部自动权衡的。

过渡时段:P2G在早晚时段会出现短时启停行为,比如早上7:00电价刚变平段,P2G出力开始下降,碳捕集率同步调低。这种联动响应说明耦合约束起了作用:P2G减少用碳量后,碳捕集器的CO₂外售量开始增加,模型在"多捕碳外售"和"少捕碳多发电"之间找到了新的平衡点。

5.4 碳价变化的非线性响应:为什么不是单调递增

我做碳价从60元/t升到200元/t的灵敏度扫描时,遇到了一个反直觉的现象:P2G的耗电量并不是单调上升的,而是先升后略有回落。仔细看原因——碳价很高时,碳捕集系统几乎满负荷运行,捕集率接近0.9,此时捕碳电耗也很大,挤压了P2G可用的电量空间。换句话说,碳捕集和P2G在用电侧其实是竞争关系,它们的协同不是无条件的,而是受制于总可用电功率的平衡。这个发现如果写论文,是很好的分析点;如果做工程,它提醒你需要同时考虑碳捕集和P2G的容量配比,不能盲目地"两个都上最大的"。

6. 从代码到论文再到工程应用:踩坑记录与进阶建议

6.1 我踩过的最典型的五个坑及排查方法

第一个坑是捕集率爬坡约束维度不匹配。我第一次写的时候把爬坡约束写成lambda_ccs(t+1)-lambda_ccs(t)<=0.2,但忘记t=1时刻没有前值,导致求解时第一时段约束缺失,结果模型"聪明"地在初始时段直接拉到最高捕集率,后面再缓慢回落——这实际上利用了模型的初始状态漏洞。后来我在约束循环外面单独定义了lambda_init作为初始捕集率,问题就解决了。

第二个坑是P2G设备的最小运行时间约束写法不对。如果你用常见的逻辑约束大M法写法,需要引入附加辅助变量,否则整型变量Z_p2g在时序上不连接。我建议直接写成三个约束的AND组合:启动检测变量、停机检测变量和基于这两个变量的最小运行/停机约束。虽然引入了额外变量,但求解稳定性比在约束里硬凑要强得多。

第三个坑是储能的SOC初值导致模型早高峰放电异常。我已经解释过,忘记设置SOC周期末回初始值,求解器会在最后一个时段疯狂放电。除此之外,充放电功率和SOC的约束耦合里,如果充电效率0.95、放电效率0.9,那两个方向不能同时为正——需要加P_ch <= M*Z_ch和P_dis <= M*Z_dis以及Z_ch+Z_dis<=1。这是非常基础但特别容易被忽视的互斥约束。

第四个坑是垃圾处理量约束的量纲。我把M_waste写成吨,把热量H_u写成MWh/t,本来是自洽的。但后来我在目标函数里给垃圾处理补贴写的是"元/吨",和功率"MW"相乘后出现了"元/小时"和"元"混用的错误,最后我统一把所有涉及时间的项都按小时换算,才在报告的收支平衡表里对上账。这里提醒你,在Yalmip里写目标函数时一定检查每一项的单位时域(是功率还是能量)。

第五个坑是求解时间失控。最开始模型变量数大约300个、约束1000条,Gurobi一般几十秒能解完。但加了P2G的最小启停时间约束后,因为我用了一个不太恰当的建模方式,引入了大量二值辅助变量,变量数翻倍到600多,求解时间暴涨到十几分钟。优化解法是把启停约束写成组约束而非逐时段二值约束,用implies封装逻辑,求解时间降回40秒左右。如果你遇到求解时间过长,第一反应不是去买更强的机器,而是检查你的0-1变量建模是否冗余。

6.2 进一步扩展的几个方向

如果你的目标是发论文或者做更深层的工程应用,我建议在现有模型基础上往三个方向延伸。

第一是考虑热-电联产耦合。垃圾焚烧机组和碳捕集再生塔都需要蒸汽,如果你引入供热负荷,形成"热电联产+碳捕集抽汽"模型,耦合关系会更复杂但也更真实。这时汽轮机抽汽供碳捕集再沸器,会减少发电出力,模型需要权衡供热收益和发电收益。

第二是引入氢能转换的多时间尺度优化。P2G制出来的氢气不一定要全部甲烷化,一部分可以直接供氢燃料电池车或者工业用氢。这样你要建立"电-氢-气-碳"四网耦合模型,决策变量再加一个氢流的分配比例。多时间尺度上,碳捕集吸收塔的溶剂循环有小时级惯性,氢储能可以支持跨日调度,这些时间尺度的错配和匹配都值得写几章内容。

第三是考虑垃圾焚烧与碳捕集设备检修计划的中期优化。短期调度更多的只是运行决策,如果你把时间尺度拉长到一个月或一年,加入检修计划0-1变量,模型的维度又会再上一个台阶。这种中线优化在真实的园区能源管理系统中非常受欢迎,因为运营方既需要日前的调度指令,也需要未来一周甚至一个月的机组检修建议。

6.3 关于Matlab求解结果可信度的自我检验清单

最后送你一份我每次跑完模型都会过一遍的检验清单,它能帮你快速发现模型里的低级错误:

  • 检查功率平衡约束逐时段是否严格满足(残差小于1e-6);
  • 检查储能SOC曲线是否在上下限之间平滑变化,周期末是否回到初值;
  • 检查碳捕集率在爬坡约束下没有阶跃跳变;
  • 检查P2G在启停状态约束下没有频繁启停(比如一小时开、一小时关这种振荡解);
  • 检查目标函数值在增加约束后只增不减——如果加了约束总成本反而下降,说明之前的模型有漏洞;
  • 检查各设备出力都在物理上下限内,不能有负功率;
  • 最后,把优化得到的调度方案手动带入平衡方程算一遍,确认不是求解器的数值误差在"作弊"。

这套清单花不了十分钟,但能挡住至少一半的返工。我见过太多人拿结果去汇报,结果被人一问"你这个时段的电平衡怎么差着2MW"就答不上来——那种时刻非常尴尬。

写Matlab代码实现这套含碳捕集、垃圾焚烧和电转气协同的虚拟电厂调度模型,我的体会是:建模的物理理解比公式推导更花时间,耦合约束比目标函数更容易出错,算例验证比代码调试更考验耐心。如果你现在正在跑这个方向,先把碳、气、电三条平衡关系烂熟于心,再动手写代码,整个过程的产出效率会完全不同。模型初步跑通后,可以试着改一改碳价、P2G容量、垃圾热值这几个参数做几组对比,你会看到模型涌现出不少反直觉但逻辑自洽的行为,那些细节恰恰是最值得写进论文里的亮点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询