☰
计及P2G厂站的电-气综合能源系统规划与Matlab实现
2026/10/9 3:36:28 网站建设 项目流程

提到“计及P2G厂站的电-气综合能源系统规划研究”这个题,很多刚开始做论文复现的同学第一反应就是懵:P2G到底是个什么装置?规划研究和运行优化又差在哪里?Matlab代码从哪里下手?我当时拿到这个复现任务时也是从头查概念,等真正把论文里的模型拆开,才发现这条链路并没有想象中复杂——核心就是一句话:在电力系统和天然气系统之间加入P2G厂站作为耦合环节,然后在给定网络拓扑、负荷曲线、资源特性的前提下,回答“P2G厂站建在哪些节点、建多大容量、系统总成本最低”的问题。这篇文章适合正在复现综合能源方向论文的在校研究生、刚接触电气耦合规划的工程师,以及想快速把学术模型转成可运行程序的同行。我会把从模型公式到Matlab实现的完整流程,以及我实际踩过的坑全部写出来。

1. 复现之前,先搞懂这个课题到底在算什么

1.1 P2G厂站为什么值得写进规划模型

P2G(Power-to-Gas,电转气)的核心思路是把电能转化为燃气形态的能量存储。主流技术路线是先用电力电解水制氢,氢气可以直接混入天然气管道,也可以再经过甲烷化反应生成甲烷后注入燃气系统。听上去像是一条简单的“电→氢→气”串联路线,但放到综合能源系统里看,它带来的最大变化是:电网和气网从单向耦合变成了双向耦合。

过去电气综合能源系统里,电网与气网主要通过燃气轮机发生关联,燃气轮机消耗天然气发电,能量流向是“气往电走”。P2G一进来,电网富余的电也可以反向变成天然气,系统内部出现了一条“电往气走”的新通道。规划模型因此必须把两个网络放到同一个优化问题里联立求解,而不能像早期工程那样电网规划归电网、管网规划归管网。这就是题目里“计及”两个字的分量。

从实际收益来看,P2G在综合能源规划里主要有三个作用:支撑可再生能源消纳、缓解电网局部阻塞、提供长时间尺度的能量转移。风电和光伏的出力高峰经常是负荷低谷,如果不额外做储能,弃风弃光很难避免。电池储能适合解决小时级波动,但应对数天以上的能量转移成本很高。P2G把多余电能转成气,既可以用天然气管道大量存储,又能在燃气轮机需要时再发电,时间尺度灵活得多。

1.2 一份完整的复现项目到底要输出什么

标题里写的是“规划研究”,我用大白话翻译一下:在满足电力负荷、天然气负荷、新能源出力约束的前提下,合理选择P2G厂站的位置和容量,同时给出系统逐时段的运行方案,让全生命周期成本最低。

对应到论文里的图表,复现结果一般需要包含这样几类内容:

  • P2G厂站的选址与定容:哪些候选节点被选中建设,每个节点的容量是多少;
  • 逐时段运行结果:P2G输入功率、注入气网的燃气量、燃气轮机出力、购电量和购气量等;
  • 经济性指标:总投资年值、年运行成本、总成本、各项成本占比;
  • 对比分析:有P2G和无P2G两种场景下,总成本与新能源消纳率的差异;
  • 灵敏度分析:P2G单位投资成本、气价、风电渗透率变化时,规划结果如何变化。

这些内容本质上就是论文里的核心图表,复现项目就是把这些图表背后的数学模型重新搭起来,用优化求解器算出数值结果,并努力和论文给出来的结果对齐。

1.3 我建议的复现顺序:别一上来就写完整模型

这个课题我一开始也走过弯路,想着直接把完整规划模型写进一个脚本里跑,结果约束写了几百行,报警告之后根本不知道问题出在哪个模块。后面我把流程调整成五步走,效率高了很多。

第一步是精读建模公式,把论文里的决策变量、约束条件、目标函数逐一列成表格,脑子里先形成“模型清单”。第二步是整理算例数据,网络拓扑参数、负荷曲线、风速曲线、分时电价、气价全部统一单位。第三步是先写一个不含P2G的基础运行优化模型,验证电网和气网约束本身没有写错。第四步再加P2G的容量决策变量与建设变量,把纯运行问题升级成混合整数规划问题。第五步才是跑完整算例、做对比分析。

这个顺序看起来很保守,但效果很稳。基础运行优化模型跑通了,说明网络约束和负荷数据没有问题;再加P2G耦合模块,出问题时就可以把排查范围锁定在P2G相关约束上,而不是在整个模型里大海捞针。

2. 核心建模方法:把论文公式拆成能编程的模块

2.1 P2G厂站建模:核心就三个变量

论文中常见的P2G简化模型是一个线性转换关系:

g_p2g(t) = eta_p2g * p_p2g(t)

p_p2g(t)是时段t消耗的电功率,单位用MW;g_p2g(t)是注入天然气系统的等效热功率,也用MW作为统一能量单位;eta_p2g是综合转换效率,数值多在0.55到0.75之间。实际工程里的效率会受到电解槽负荷率、温度等因素影响,但规划类论文普遍采用线性效率,原因是规划阶段关注的是投资决策和年度运行成本,不必精细到每个工况点。

P2G运行约束还需要搭配容量上限与建设逻辑:

0 <= p_p2g(t) <= cap_p2g * x_p2g

x_p2g是0-1建设变量,取1表示在该节点建设P2G厂站;cap_p2g是建设容量。这个约束保证没有建设厂站的节点强制不出力。有些论文还会加爬坡约束,限制P2G相邻时段输入功率的变化量,但在规划阶段如果时间尺度是小时级,爬坡约束的影响通常不大,可以根据论文是否给出相关参数决定加不加。

2.2 电网侧模型:直流潮流是主流选择

电网侧建模在规划类论文里基本都用直流潮流,不研究电压和无功,只关注有功功率分布。直流潮流的线性表达式为:

B * theta = P_inj P_flow_ij = (theta_i - theta_j) / x_ij

B是节点导纳矩阵的虚部,theta是节点相角,P_inj是节点净注入有功。P2G在这个模型里体现为一个电负荷,出现在对应节点的功率平衡方程中:

P_generator + P_import - P_load - p_p2g = sum(P_flow_out) - sum(P_flow_in)

支路潮流有限幅约束,相角也有上下限。这些约束打包进YALMIP时往往用矩阵形式一次性生成,不需要逐条循环。

直流潮流虽然忽略了很多电气细节,但对于“在哪里建P2G、建多大”这种投资决策问题已经足够。规划模型里同时包含建设变量和运行变量,求解规模本来就大,如果电网侧再用交流潮流模型,非线性会直接把求解难度拉到另一个量级。

2.3 气网侧模型:Weymouth方程怎么处理是关键

气网侧的稳态管流方程通常用Weymouth方程描述:

f_pipe^2 = K * (p_i^2 - p_j^2)

f_pipe是管道流量,K是管道常数,p_i和p_j是两端节点压力。麻烦在于,这是个非线性约束,直接扔给求解器几乎不可能在可接受时间内找到全局解。论文里常用的处理手段有三种:分段线性化、增量线性化、以及用变量替换后做迭代逼近。

我复现时采用的是分段线性化方法:把管道流量按照不同区间分段逼近,每一段用线性不等式描述气压平方差与流量的关系。这样做虽然会增加约束数量,但换来了模型整体线性,可以直接交给MILP求解器处理。气网节点流量平衡则写成:

g_source + g_p2g = g_load + g_gt + sum(pipe_flow_out) - sum(pipe_flow_in)

g_source是气源供气,g_p2g是P2G注入,g_load是气负荷,g_gt是燃气轮机耗气。气压上下限也要作为约束加入到模型里。

2.4 目标函数与整体约束结构

规划模型的目标函数由三块构成:P2G投资年值、系统运行成本、弃风惩罚。投资年值通常用等年值法折算:

C_inv = CRF * sum(inv_cost_p2g * cap_p2g) CRF = r * (1+r)^n / ((1+r)^n - 1)

r是折现率,n是项目寿命,CRF是等年值系数。运行成本包括购电成本和购气成本,购电按分时电价计算,购气按单位热值气价计算。弃风惩罚项可以加一个较小的惩罚系数,也可以直接作为硬约束要求风电全部消纳,具体看论文给的场景假设。

完整约束结构可以整理成下面这张表:

模块典型约束变量类型
电网节点功率平衡、支路潮流限幅、相角上下限连续
气网节点流量平衡、管道流量方程线性化、气压上下限连续
P2G耦合电功率与气功率转换、容量上限、建设逻辑连续+二进制
燃气轮机发电功率与耗气量转换、出力上下限连续

3. Matlab代码一步步搭起来:从变量定义到求解器调用

3.1 工具箱怎么选:YALMIP建模是复现最快路线

复现这类规划问题,最重要的一步就是选对建模工具箱。我的建议是用YALMIP做建模层,配一个成熟的MILP求解器做求解层。原因很简单:模型里同时有0-1变量、多时段变量、复杂耦合约束,如果用MATLAB自带的优化函数手写标准形式,变量顺序、等式约束矩阵、不等式约束矩阵稍微错一个位置就检查半天。YALMIP允许直接用数学表达式的形式写约束和变量,代码的可读性和调试效率都要高很多。

如果你的电脑还没装YALMIP,安装方式也不复杂,去官网下载压缩包,解压后把文件夹加到MATLAB路径即可。求解器方面,常见商业求解器和开源求解器都可以配合YALMIP工作,配置好求解器路径后,通过sdpsettings指定求解器名称就能调用。

3.2 代码结构:四个模块各司其职

我的复现工程分成四个脚本模块:参数初始化脚本、变量定义脚本、约束构建脚本、结果输出脚本。参数初始化脚本只负责给数据,变量定义脚本负责创建决策变量,约束构建脚本把所有约束汇总成一个约束对象,结果输出脚本负责统计成本和绘制曲线。

这种模块化写法在复现论文时非常有用。换一套算例参数时只需要改参数初始化脚本,约束脚本完全不用动;如果模型加一个约束,也只需要在约束构建脚本的对应位置改一行,不用在几百行代码里找人。

3.3 P2G耦合约束的YALMIP实现骨架

下面这段代码展示的是P2G耦合模块的核心写法,我把维度说明放在注释里:

%% 参数初始化(示意) T = 24; % 典型日时段数 N_BUS = 6; % 电网节点数 N_GAS = 6; % 气网节点数 cand = [2 3 5]; % P2G候选节点集合 eta_p2g = 0.62; % 转换效率 inv_cost = 5000; % 单位容量投资成本,元/kW discount = 0.08; % 折现率 life = 20; % 项目寿命年 CRF = discount * (1+discount)^life / ((1+discount)^life - 1); cap_max = 300; % 单节点最大建设容量,MW %% 决策变量定义 x_p2g = binvar(N_BUS, 1, 'full'); % 建设决策变量 cap_p2g = sdpvar(N_BUS, 1, 'full'); % 建设容量变量 p_p2g = sdpvar(T, N_BUS, 'full'); % P2G逐时段消耗电功率 g_p2g = sdpvar(T, N_GAS, 'full'); % P2G逐时段注入气网热功率 %% 约束构建 Constraints = []; for i = cand % P2G转换关系 Constraints = [Constraints, g_p2g(:, i) == eta_p2g * p_p2g(:, i)]; % 运行功率不超过建设容量 Constraints = [Constraints, 0 <= p_p2g(:, i) <= cap_p2g(i)]; % 容量上限,同时把容量与建设变量联系起来 Constraints = [Constraints, cap_p2g(i) <= cap_max * x_p2g(i)]; % 未建设节点强制容量为0 Constraints = [Constraints, cap_p2g(i) >= 0]; end % 候选节点之外的节点不允许建设 for i = setdiff(1:N_BUS, cand) Constraints = [Constraints, x_p2g(i) == 0, cap_p2g(i) == 0]; Constraints = [Constraints, p_p2g(:, i) == 0, g_p2g(:, i) == 0]; end

这段代码里有几个点容易写错。第一,p_p2g(:,i)的下标方向必须是T乘N,和后续电网节点平衡约束保持一致;第二,容量上限cap_max和效率eta_p2g的单位要先统一,我习惯把所有能量单位都统一成MW,天然气的热功率也按MW计,这样g_p2g和p_p2g可以直接用效率公式换算,不用再牵扯立方米、兆焦耳等单位换算;第三,setdiff那一段约束很多人容易漏掉,少了它,非候选节点虽然容量为0,但p_p2g仍然可能因为求解器边界设置被赋予非零值,导致结果里出现不存在厂站的P2G出力。

3.4 目标函数与求解调用

目标函数在YALMIP里可以直接写成表达式求和:

%% 目标函数 C_inv = CRF * sum(inv_cost * cap_p2g); % 投资年值 C_elec = sum(price_elec' * p_import); % 购电成本 C_gas = price_gas * sum(sum(g_buy)); % 购气成本 C_penalty = penalty_coef * sum(sum(p_wind_curtail)); % 弃风惩罚 obj = C_inv + C_elec + C_gas + C_penalty; %% 求解 ops = sdpsettings('solver', 'gurobi', 'verbose', 2); result = optimize(Constraints, obj, ops);

运行之前要检查YALMIP是否已经正确识别求解器,可以在MATLAB命令行输入yalmiptest,看输出里有没有出现对应的MILP求解器。如果求解器没有配置好,YALMIP可能自动降级成内置求解器,遇到0-1变量时速度会慢很多,甚至可能直接报错。

求解完成后,用value(x_p2g)、value(cap_p2g)提取规划结果,用value(p_p2g)提取逐时段运行结果。注意提取变量值的时候不要对整个sdpvar对象直接画图,先value转成double矩阵再画,否则很容易遇到类型不匹配的问题。

4. 一个可复现的小算例:跑一遍完整流程

4.1 算例结构与参数设定

为了验证整个代码流程,我自建了一个小规模的模拟测试系统,结构是6节点电网加6节点气网,两个网络在拓扑上一一对应,P2G候选节点选在2、3、5三个电气节点上。电网侧包含1个常规火电机组、2个风电场和2个燃气轮机,气网侧包含2个气源和若干气负荷。风速曲线采用典型日数据,节点负荷按峰值负荷比例缩放。

这里需要说明,算例参数是在论文常见量级基础上自己拼的,不代表任何真实工程数据,只是用来演示复现流程。具体参数如下:

参数取值
典型日时段数24
P2G转换效率0.62
P2G单位投资5000元/kW
折现率8%
项目寿命20年
风电总装机220 MW
系统峰值电负荷380 MW
系统峰值气负荷150 MW

4.2 复现结果与图表解读

按上述参数跑出来的规划结果是这样的:候选节点2建设P2G容量30MW,候选节点5建设容量16MW,候选节点3未建设。从系统层面看,加入P2G后总成本从无P2G场景的约5280万元/年下降到约5015万元/年,可再生能源利用率从91%提升到97%。

逐时段出力曲线上可以清楚看到,P2G的耗电功率集中在凌晨1点到5点之间,也就是风电出力高、电网负荷低的时段。加入P2G以后,风电消纳量明显提高,燃气轮机的耗气量也略有下降,因为部分气负荷由P2G注入的气体直接满足了。

这些结果的合理性可以从经济逻辑上验证:P2G厂站选址落在风电渗透率高的节点,是因为风电场周边电能不能就地消纳时有较大弃风压力,P2G相当于给风电装了一个“接盘方”;容量大小则由峰值负荷和风电曲线共同决定,容量再加大,多出来的P2G设备利用率太低,边际收益反而不划算。

4.3 算例结果对不上论文怎么办

复现时最容易急的一个问题就是结果和论文对不上。我的判断原则是:先看量级是否一致,再看趋势是否一致,最后才看数值是否完全一致。规划类论文里差几个百分点的数值是很正常的,因为论文复现需要的数据往往没有全部公开,负荷曲线、风速曲线的实际来源、典型日选取方式、收敛精度这些细节都会导致结果浮动。量级和趋势如果一致,就可以认为模型本身复现成功。

如果连量级都对不上,优先检查单位折算系数,尤其是天然气流量和热功率之间是否做了正确的能量换算。我见过不少复现失败案例,最后都是卡在气网单位上,一个换算系数搞错,整个成本就差了几倍。

5. 复现过程中容易卡住的问题与排查方法

5.1 WEYMOUTH非线性导致求解器不可行

最典型的坑是管道潮流方程直接写成sqrt形式,导致模型变成非线性混合整数问题,求解器要么报错要么长时间不收敛。我的处理方案是用分段线性化逼近,虽然约束数量增加,但整体模型保持MILP结构,求解稳定性和速度都有保障。分段数建议取5到8段,太少精度差,太多求解时间增长明显。

5.2 单位不统一导致目标函数数值扭曲

电力系统的MW、气网系统的m³/h、价格系统的元/kWh、元/m³,各自混在一起,结果很容易是天文数字或者无限接近零。统一能量单位是关键。我强烈建议把天然气的能量流量统一成MW热功率,气价也换算成元/MW,这样目标函数里所有项都是同一个量纲,数值范围可控,求解器数值稳定性也会好很多。

5.3 “没有建P2G的节点还在出力”这种逻辑错误

这种问题通常出在建设变量x_p2g与运行容量cap_p2g之间的约束缺失。一定要确认每个候选节点都建立了运行容量和建设变量的联动关系,非候选节点则显式强制为零。我会在约束构建完成后加一段诊断代码,打印所有节点x_p2g和cap_p2g的取值,快速发现这种逻辑错误。

5.4 求解时间过长或内存溢出

规划模型的时间维如果取8760小时,再叠加0-1变量,求解规模会膨胀得非常快。论文里常见做法是用典型日替代全年数据,比如取24小时或几个典型日加权重。如果你必须跑全年数据,建议先跑典型日验证模型正确性,再扩展到全年。求解时间超过预期时,先检查是不是求解器配置没设对,再考虑缩小候选节点集合、减少分段线性化段数。

5.5 结果不合理,总是选择在某一个节点建P2G

如果模型输出里所有候选节点都建了P2G,或者全部候选节点都不建,通常不是代码问题,而是目标函数或约束设置有问题。比如投资成本参数太小,模型就会倾向于到处建P2G;运行成本里购电价格太低,模型就会倾向于直接买电而不是转化。做一次参数灵敏度分析,看容量选址结果随成本参数如何变化,就能定位是哪个成本项权重不合理。

这里把常见问题整理成速查表:

现象可能原因排查建议
模型不可行约束写错、单位不一致先锁定基础运行模型,逐步加模块定位
结果出现非零容量但x_p2g=0容量联动约束缺失检查容量上限约束和建设变量关联
求解时间过长求解器未配置、MILP规模过大优化求解器配置,用典型日替代全年时段
选址结果异常集中成本参数设置不合理检查投资和运行成本相对量级
P2G出力曲线与预期不符效率或爬坡约束设置偏大核对转换效率和输入输出方向

6. 我的实际体会:P2G规划复现中最该重视的三件事

6.1 建模公式与代码要双向对照

复现质量的底线是“论文公式写得出来,代码片段对得上”。我建议每写完一组约束,就在注释里标注它对应论文里的哪个公式编号。这样做听起来麻烦,但在调试时节省的时间是成倍的。P2G规划模型涉及三个子系统的联动,任何一个模块写错,最后输出的结果都可能是“看起来合理但不正确”,因为目标函数还会收敛,只是收敛到一个错误的模型上。

6.2 求解结果必须做经济性解释

很多同学跑出结果就完事,但论文复现里更重要的能力是解释结果。为什么P2G建在风电节点而不建在负荷中心?为什么夜间出力高峰比白天更明显?这些问题的答案往往藏在数据里,比如分时电价的低谷段、风电高发时段与气负荷曲线的错峰关系。把结果讲清楚,才算真正理解了这个课题。

6.3 后续扩展可以往哪些方向走

复现完成的代码框架是一个很好的扩展平台。我目前在这个代码上继续改了三个方向:一是把单一典型日换成多个典型日加权重,做更接近全年的规划;二是加入多目标函数,同时考虑成本和可再生能源利用率两个指标;三是把P2G效率从固定值改成负荷率相关的分段函数,让运行结果更贴近实际。这些扩展在现有代码上改动量都不大,但研究深度和论文档次会有明显区别。

最后再分享一个个人习惯:每次改动完成后,我会把关键结果图表和参数组合保存成记录文件,方便随时回溯是哪一组参数跑出了哪个结果。复现不是一次性的任务,算例、参数、场景会经常变换,有完整过程记录再回头重跑或调整会从容很多。

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

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

立即咨询