ARTICLE DETAIL

资讯详情

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

计及P2G厂站的电气综合能源系统规划:Matlab复现与调试指南

计及P2G厂站的电气综合能源系统规划:Matlab复现与调试指南 最近完整复现了一篇关于计及P2G厂站的电气综合能源系统规划硕士论文并用Matlab把整套规划模型跑通了。整个过程坦白说不轻松从场景生成到气网非线性约束处理每一步都有值得复盘的地方。这篇总结我会把复现过程中的建模思路、Matlab代码框架、求解器配置、常见报错和调试技巧一次讲清楚给正在做综合能源系统规划相关课题的同学直接抄作业。1. 项目背景与论文复现动机1.1 电-气综合能源系统的基本背景先说大背景。现在的能源系统早就不是电网单打独斗的局面电力系统和天然气系统的耦合越来越深。最典型的现象就是燃气轮机发电占比持续提升新能源大规模并网以后风电、光伏的波动性让电网对灵活调节资源的需求变得非常大。这时候研究电和气的耦合不光是电网用气发电这一个方向还要考虑反过来把富余电力转化成天然气储存起来这就是P2G全称Power to Gas也叫电转气。P2G厂站的核心作用可以拆成两个层面。第一个层面是消纳新能源在风电光伏大发而负荷无法消纳的时段与其弃掉这些电力不如通过电解水制氢氢气再和二氧化碳经过甲烷化反应合成天然气注入气网或直接储存第二个层面是提供灵活性P2G输出的天然气既可以作为气网气源的一部分也可以供给燃气机组在峰时发电这就让原先电网到气网的单向耦合变成了双向互济格局。论文复现这件事核心价值在于把这样一个工程问题完整转成数学模型再用Matlab求解验证。复现一篇硕士论文不是简单地运行一遍别人写好的代码而是把从假设条件、目标函数、约束方程到算例分析这个过程重新走一遍。做完之后你对综合能源系统规划的认知深度完全是另一个层级。1.2 复现目标的拆解动手之前先把论文题目拆开来看清楚要做什么。题目里的“计及P2G厂站”说明规划方案要显式考虑P2G的容量决策和运行策略不能把它当作一个固定效率的常量来处理“电-气综合能源系统”意味着建模范围同时包含电网、气网和耦合设备核心难点是处理两个网络之间的能量流交换“规划研究”说明这个问题的落脚点是投资决策要回答在哪里建P2G、建多大容量、网架管道是否需要扩建这样的问题“Matlab代码实现”则要求最终能用代码跑出与论文接近的结果并且代码要能在不同算例之间复用。把目标拆清楚再动手复现过程就不会迷失方向。我见过很多同学一上来就找算例数据、抄参数模型还没搭起来就开始调求解器这种流程基本都会走弯路。规划类问题一定先把数学模型写清楚再谈代码实现。模型只有三张纸代码可以一千行但三张纸没写好一千行代码就是一千行垃圾。2. 系统建模与关键方法2.1 P2G厂站建模P2G模型是整个复现工作的起点。P2G厂站的物理过程分两步先电解水制氢氢再和二氧化碳甲烷化合成天然气。这两个环节的效率分别大约是70%到80%和70%到80%串联之后总效率一般在0.5到0.6之间。写进规划模型时通常用一个综合转换效率η_P2G简化处理。P2G的输入是电功率P_P2G(t)输出是天然气流量G_P2G(t)两者的关系可以写成G_P2G(t) η_P2G × P_P2G(t) × k_unit这里k_unit是电功率与天然气流量之间的单位换算系数不同论文里给的形式不完全一样有的直接给“1MWh电对应多少m³天然气”有的给的是折算到天然气高热值的结果。复现的时候一定要盯着这个换算关系看否则结果差一个数量级是非常常见的错误。P2G还需要三组边界约束。第一组是输入电功率上限P_P2G(t)不能超过P2G额定容量也就是候选厂站的规划容量第二组是输出气体注入上限P2G输出的天然气不能超过气网允许接入的流量限值这和气网节点压力、管道容量都有关系第三组是爬坡约束P2G的运行功率在相邻时段不能发生剧烈跳变这对应电解槽的响应特性。这些边界条件看起来简单但漏掉任何一个都会让规划结果失真。2.2 电网建模电网部分用直流潮流模型就足够了。规划问题关注的是长期投资决策和小时级运行平衡不需要逐节点考虑电压无功直流潮流既能刻画线路潮流约束又足够简单到能和气网模型耦合求解。节点功率平衡方程的形式大致是P_Gi(t) P_Wi(t) - P_P2Gi(t) - P_Li(t) ΣB_ij(θ_i(t) - θ_j(t))其中P_Gi是常规机组出力P_Wi是新能源出力P_P2Gi是P2G消耗的电功率P_Li是电负荷B_ij是节点导纳矩阵的虚部θ是相角。P2G在电网模型里出现在等式左侧的负号位置因为它对电网来说就是一个电负荷这个位置摆错会让电网平衡彻底崩掉。新能源出力建模是电网这部分最容易出问题的地方。不能用同一组全天风光曲线重复模拟365天那等于假设每天都一样根本没有刻画不确定性。正确做法是基于历史数据聚类出几个典型场景每个场景有一个概率权重规划模型里每个场景都要满足系统运行约束。典型场景数量和求解规模直接相关后面我会详细讲怎么选。线路潮流约束也要加上直流潮流下线路潮流是相角差的线性函数约束形式为线路潮流绝对值小于等于传输容量上限。这个约束在规划模型中的作用是限制P2G接入后电网局部断面是否越限直接决定P2G建设位置是否可行。2.3 气网建模气网部分比电网麻烦得多因为管道流量和节点气压的关系是强非线性的。最经典的是Weymouth方程形式如下F_mn C_mn × sign(π_m - π_n) × sqrt(|π_m - π_n|)其中F_mn是管道流量π是节点气压的平方C_mn是由管道长度、管径、粗糙度决定的管道常数。这里的sign函数表示气流方向由高气压侧流向低气压侧。规划问题里处理这个方程有两种主流思路。第一种是分段线性化把非线性气流方程拆成若干线性区间再用混合整数线性规划求解。这种做法的优点是求解稳定、速度快缺点是需要手工设计分段节点和引入额外变量模型规模会增加。第二种是保留非线性形式用内点法直接求解带非线性约束的优化问题。这样模型规模紧凑但初值选择敏感迭代过程容易发散。我复现时两种路线都试过。对20个气网节点规模以内的案例分段线性化加Gurobi求解是最稳的几乎不存在不收敛的问题。内点法在算小系统时可以跑通但一旦气网节点增加到30个以上连续求解失败的概率会明显上升。如果你不是专门研究非线性优化算法建议直接走线性化路线。气网节点平衡方程要考虑四部分气源注入、P2G注入、燃气机组耗气、气负荷。方程可以写成G_source G_P2G - G_GT - G_load 0这里G_GT是燃气机组的耗气量它由燃气轮机的电出力和效率共同决定也就是电网和气网耦合的关键变量。燃气轮机的发电效率一般较高比如取0.35到0.45之间耗气量计算式为电出力除以效率和天然气高热值的乘积。2.4 规划模型的目标函数规划问题的目标函数一般是总成本最小化包含三块投资成本、运行成本、碳排放成本。表达式为min C C_inv × AF C_op C_CO2投资成本C_inv主要是P2G厂站建设费用必要时还包括线路和管道扩建费用不能直接把一次性投资写进目标函数要折算成年值。等年值系数AF的计算公式是AF r × (1r)^N / ((1r)^N - 1)其中r是贴现率N是规划周期年限比如取8%20年。很多论文复现结果差得离谱就是因为在投资成本折算这一步出了问题要么忘记折现要么把折现率代错。运行成本包括购气费用、燃气机组燃料费用、新能源运维费用、弃风弃光惩罚。碳排放成本可以在目标函数里加一项碳价乘以系统总排放量也可以作为约束碳排放上限来写取决于论文设定的减排政策情景。目标函数加上前面的电网、气网、P2G边界约束再加上系统安全约束就构成了完整的规划模型。模型的时间尺度是小时级典型日场景数量是S个每个场景下都有一套运行变量而投资变量在各个场景间共享。这种“投资决策共享、运行决策分场景”的结构是综合能源系统规划模型的标准范式。3. 基于Matlab的架构设计与工具选型3.1 整体代码框架我把Matlab实现拆成五个模块数据配置模块、典型场景生成模块、优化模型定义模块、求解器调用模块、结果分析与绘图模块。五个模块分开写配合项目级的规划目标保证改动一个仿真工况不会牵连无关代码。数据配置模块集中设置节点数据、线路数据、负荷数据、风光历史数据、成本参数和算例拓扑。强烈建议所有参数都放在一个脚本或配置结构体里不要散落在各个函数中。否则改一个贴现率要翻七八个文件这种低级错误会浪费大量调试时间。场景生成模块的核心是k-means聚类把365天的风速光照数据按24点曲线聚类成几个典型日。重点是要把风速、光照、负荷放在同一个特征向量里一起聚类保留它们之间的相关性。不要把风速单独聚类、光照单独聚类、负荷单独聚类那样的话典型日组合起来并不反映实际的相关性规划结果会失真。优化模型定义模块是整个代码的核心负责定义决策变量、目标函数和全部约束条件。这个模块我会在下一节详细展开。求解器调用模块有两条路线可选。第一条是纯用Matlab内置优化工具箱线性规划用linprog混合整数线性规划用intlinprog。优点是零配置零成本缺点是内置求解器对大规模MILP问题效率明显偏低气网线性化之后变量动辄几万个intlinprog可能要跑一两个小时并且不一定收敛。第二条是YALMIP加Gurobi或CPLEX这是学术界复现规划类论文的主流配置求解速度快一个数量级但需要额外安装和许可证配置。结果分析输出规划方案、P2G安装位置和容量、典型场景下的运行曲线、系统总成本和各项成本占比。然后做一组对比实验例如不装P2G与安装P2G看系统总成本和新能源消纳率的差异。这组对比是整个论文复现的灵魂没有对比就没有结论。3.2 求解工具配置YALMIP是Matlab环境下最流行的优化建模工具它能让你把优化问题写成接近数学表达式的形式然后自动转换成求解器能吃的标准格式。配置的步骤很简单% 添加YALMIP路径并设置求解器 addpath(D:\tools\yalmip); addpath(D:\tools\gurobi952\matlab); % Gurobi官方Matlab接口 ops sdpsettings(solver, gurobi, verbose, 2);第一次配置Gurobi时需要运行它的许可证安装脚本填好License文件路径然后在Matlab里运行gurobi_setup验证安装。我建议求解时直接把verbose打开虽然输出信息多但能实时看到求解进度和下界上界差距对前期调试模型非常关键。模型调通后再把verbose关掉输出干净的结果。3.3 决策变量定义与维数管理变量定义是整个Matlab实现里最容易出错的地方。我把变量分成两类投资变量和运行变量。投资变量包括是否建设P2G的0-1变量、是否扩建线路或管道的0-1变量、P2G额定容量连续变量。运行变量包括每个典型日每个时段下的P2G输入电功率、输出气流量、机组出力、节点相角、节点气压、新能源出力和切负荷量。一个典型的变量定义片段如下%% 使用YALMIP定义优化变量 % 投资变量 x_P2G binvar(1, nc, full); % 是否建设P2Gnc为候选厂站数 cap_P2G sdpvar(1, nc, full); % 建设容量 % 运行变量 p_p2g sdpvar(T, ns, nc, full); % T个时段、ns个典型日的P2G电功率 g_p2g sdpvar(T, ns, nc, full); % 对应输出气流量 theta sdpvar(T, ns, nb, full); % 电网相角 pi_node sdpvar(T, ns, ng, full); % 气网节点气压平方变量维数必须严格对应。T是每个典型日的小时数这里是24ns是典型场景个数nb是电网节点数ng是气网节点数。运行时最容易犯的错是求解之后提取结果时索引写错导致拿到的变量是空值。我的习惯是定义一个维度参数结构体把节点数、场景数、时段数全部集中管理任何一处用到这些数字都从参数结构体取值。4. 核心功能实现与关键环节详解4.1 典型场景生成代码实操场景聚类模块的代码不复杂但参数选择要讲究。以下是一段可以运行的聚类核心代码%% 典型场景聚类 % wind_hist每行是一天24点风速solar_hist每行是一天24点光照 data [wind_hist, solar_hist, load_hist]; % 365行72列 % 归一化防止量纲影响聚类结果 data_norm (data - mean(data)) ./ std(data); % kmeans聚类 [idx, C] kmeans(data_norm, ns, Replicates, 20); % 计算每个场景概率 prob_s accumarray(idx, 1, [ns, 1]) / 365; % C中心点还原为典型日曲线 typical_days C .* std(data) mean(data);归一化这步很关键。风速单位m/s、光照单位W/m²、负荷单位MW三个量纲差异巨大直接做kmeans时负荷会主导聚类结果风光的季节特征被淹没。归一化之后三类数据权重相当聚类出来的典型日才有物理意义。聚类数ns的选择直接影响后面优化模型的规模。ns取3到5是比较折中的范围。3个典型日基本能代表冬、夏、春秋三季特征5个以上虽然刻画更精细但混合整数规划里的二进制变量和连续变量都成倍增加求解时间可能从几分钟涨到几小时。我复现时取ns4既保留了季节差异又在可接受的求解时间内完成全部计算。4.2 约束构造与非线性处理约束构造部分最能体现功力和耐心。电网节点平衡、气网节点平衡、线路潮流限值、管道流量约束、P2G运行边界每一项都要逐一写进YALMIP。电网平衡约束的写法示例%% 电网节点功率平衡约束 for s 1:ns for t 1:T for i 1:nb % 节点注入 常规机组 风电 - P2G消耗 - 负荷 % 直流潮流 B矩阵 × 相角差 deviation P_G(t,s,i) P_W(t,s,i) - p_p2g_sum(t,s,i) - P_L(t,s,i) ... - sum(B_matrix(i,:) .* (theta(t,s,:) - theta(t,s,i))); Constraints [Constraints, deviation 0]; end end end注意这里的p_p2g_sum表示某节点上所有候选P2G厂站功率之和。在YALMIP里写循环约束如果规模较大运行会比较慢可以用矩阵运算和repmat把约束向量化速度提升明显。初学者先用循环把模型调通再去优化速度不迟。Weymouth方程的分段线性化是气网建模最重头的环节。基本思路是把管道流量F表示为气压平方差Δπ的分段线性函数。用一个大M法加二进制变量可以严格实现但变量数量会膨胀。工程上常用SOS2约束简化YALMIP对SOS2有原生支持%% Weymouth方程分段线性化示例 d_pi pi_m - pi_n; % 气压平方差 d_pi_abs abs(d_pi); % 取绝对值再线性化 % 定义分段断点 bp linspace(0, d_pi_max, 8); % 在断点上计算Weymouth流量 flow_bp C_mn * sqrt(bp); % 用SOS2约束做分段线性插值 lambda sdpvar(8, 1); % SOS2权重变量 Constraints [Constraints, d_pi_abs lambda * bp, ... F_mn lambda * flow_bp, ... involves(lambda, sos2)];SOS2的意思是最多两个相邻权重非零这是分段线性插值的标准写法。分段数8个在精度和规模之间比较平衡。如果只做4段管道流量的拟合误差可能达到10%以上对规划结果影响明显做到12段精度倒是上去了但每组变量多了一倍整体求解压力变大。4.3 求解调用与结果后处理模型构建完成后求解调用其实很简单麻烦的是提取结果并做合理性校验。求解代码如下%% 求解规划模型 sol optimize(Constraints, Objective, ops); if sol.problem 0 % 求解成功 cap_P2G_value value(cap_P2G); p_p2g_value value(p_p2g); total_cost value(Objective); else % 求解失败输出YALMIP错误信息 sol.info end结果合理性校验我总结了三条。第一检查各个成本项的数值量级。比如总投资成本在数亿元量级年运行成本在数千万元量级如果出现几千元或者几千亿这种离谱数字一定是单位换算出了问题。第二检查P2G容量是否达到上限。如果某个候选节点的P2G容量刚好等于约束上限需要确认这是边界最优解还是约束设错了。第三检查典型日下P2G出力曲线是否合理。P2G应该在风电大发和电价低谷时段出力高如果曲线完全背道而驰大概率是模型中弃风惩罚项写反了或者漏了。5. 常见问题与排查技巧实录5.1 求解器报出infeasible可行性问题是复现过程中最常遇到的拦路虎。YALMIP或Gurobi报infeasible意思是最优解不存在也就是说约束条件相互矛盾。常见的矛盾来源有几个一是气源上限设置太小气网节点平衡根本无法满足二是电网某个节点连接关系写错导致某时段该点负荷加上P2G消耗超过可注入功率三是天然气单位混用有的地方用m³有的地方用kg换算系数一错约束就冲突。排查可行性问题我有一套固定流程。先把所有投资变量固定为一个可行值不做容量优化先看运行问题是否能解。如果固定之后依然无解说明运行约束有问题如果固定后有解说明是投资变量取值域设置不当。然后采用二分法定位把约束一条条注释掉找出让模型从无解变有解的那条约束。这个过程枯燥但有效。5.2 规划结果全是零建设如果求解成功但P2G建设容量全部为0这属于逻辑问题而不是数值问题。最常见的两个原因第一目标函数里没写弃风弃光惩罚或者碳成本被设成了0。P2G在纯经济模型里就是一个增加投资的设备没有惩罚项就体现不出价值优化结果自然选择不建设。第二P2G效率设置过低或投资成本过高导致建P2G的收益打不平成本。还有一种容易被忽略的情况是P2G输出的天然气没有对应的气网消纳通道。比如气网节点气体平衡约束里P2G产生的气体没有作为正项写入或者P2G的气体注入上限设成了0。检查约束表达式时用纸笔把每个节点的进出一项项写出来核对这比盯着代码干看有效率得多。5.3 气压结果越界气压越界多数出现在负荷高峰时段。原因是气网管道容量不足而P2G恰恰在风电大发时段向气网注入大量天然气导致局部气压超出允许上限。处理思路有三个方向第一允许P2G配置储气装置不完全要求在产气时段内全部注入气网产出的气可以先存起来等气网有接受能力时再注入第二增加候选管道扩容变量让模型在投资阶段决定是否扩建气网输送瓶颈第三调整P2G候选厂站位置避开气网薄弱节点把P2G放在气源附近或管道承载能力强的节点。5.4 求解时间过长规划模型规模大、二进制变量多求解变慢是必然的。优化的方向如下表所示调整手段具体做法效果减少典型日数量ns从6降到4运行变量减少约1/3减少候选厂站通过预分析筛掉明显不合适的节点二进制变量直接减少容量连续化P2G容量作为连续变量而非离散档位去掉大量二进制辅助变量收敛准则放宽设置MIPGap为1%或2%求解时间大幅缩短且结果可接受我复现时采用最后一种最多因为只要Gap控制在2%以内规划方案的可信度没大问题但求解时间可能从一小时降到十分钟。5.5 场景聚类结果不理想kmeans聚类每次运行结果都可能不同因为初始中心点是随机的。如果聚类结果里出现两个典型日非常相似而另一个典型日过于极端说明聚类数或初始值选择有问题。解决方法是加大Replicates数量比如设成50让算法多次尝试不同的初始中心选误差平方和最小的结果。另外如果数据里包含极端工况比如台风天或者连续阴雨天聚类时这类天数会形成孤点典型日可能无法代表系统正常运行的规律。这种情况下可以考虑增加一个极端场景单独建模处理。6. 复现心得与后续扩展建议6.1 三个最容易被忽视的问题复现过程中被低估的三个点我分别说一下。第一是电力网络和气网的时间常数差异。电网的动态过程是秒级气网管道传输则需要小时级规划模型里两者共用小时级时间尺度是合理的但论文写作时必须把这个假设说清楚否则审稿人会质疑模型可靠性。第二是P2G产气和管道传输之间的时间延迟。规划模型里通常忽略管道延迟效应这在投资决策层面可以接受但如果有人想把这个模型扩展到运行调度层面忽略延迟会导致结果过度乐观。第三是规划模型和运行策略的边界。规划问题不需要把机组组合、爬坡策略做得过于精细把运行策略的复杂度控制住不然整数变量爆炸求解器直接扛不住。6.2 从复现到举一反三跑通这篇论文后能扩展的方向很多。第一是加入储能装置P2G本身就是一种能量转换加储存的载体和电池储能、储气罐放在一起做联合规划对比会更丰富。第二是引入多目标优化除了成本最小化还可以考虑新能源消纳率最大化、碳排放最少化用加权或帕累托前沿的方法展开分析。第三是把模型扩展到多区域电-气互联网络涉及区域间管道输送和联络线潮流规划问题的复杂度更高但研究价值也更大。6.3 复现论文的通用方法论最后说点通用的经验。复现任何一篇规划类论文流程都是一样的先读摘要和结论弄清楚论文做了什么决策、出了什么方案再读系统模型章节把目标函数和约束条件逐个摘出来写成标准数学形式然后看算例设置和参数表把案例分析的数据完整录入最后才是搭代码、调求解器、对结果。跳过前几步直接上手写代码后期返工概率极高。算例数据的录入一定要先做连通性校验。用Matlab画一下电网单线图检查节点连接是否和论文一致气网也要检查管道连接矩阵是否对称。数据对不齐的情况下计算结果和论文对不上你会误以为是模型写错了其实只是数据抄漏了一个管道或一条线路。这种坑我踩过很浪费时间。我个人在实际操作中最大的体会是电-气耦合规划的价值不在于多装了一个P2G设备本身而在于用经济优化模型回答了一个系统工程问题当电网消纳不了富余电力时应该通过什么样的投资路径把电转化成气让整个系统的灵活性和经济性达到最佳平衡。这类模型在Matlab里落地的关键在于单位统一、约束边界清晰、求解器配置得当把这三点做好调试时间能缩短一大半。希望这篇总结能帮你少走弯路。后面有机会我会针对具体算例把整套代码结构和计算结果整理出来分享到时可以对着算例逐步跑通。
返回列表