资讯动态

计及多能耦合的电气热能流Matlab计算:模型、实现与调试

发布时间:2026/10/14 21:53:43 来源:尧图企业网站定制
1. 项目解读多能耦合与综合能源系统的来龙去脉先直接说结论这个项目不是简单的“电力潮流计算”或者“天然气管道计算”而是把电力网络、天然气网络、热力网络放在同一个框架里同时考虑它们之间的耦合转换关系然后统一求解稳态能流分布。标题里的“计及多能耦合”是核心“电气热能流计算”是目标Matlab是实现工具。如果你所在的方向是综合能源系统规划、运行调度或者区域能源互联网那么这个计算模块就是最底层的基础设施——所有后续的优化调度、可靠性分析、碳流计算都要先拿到一个准确的能流解。为什么“单独算”不够用了传统配电网潮流只关心电压和功率天然气网络计算只关心节点压力和流量热力管网计算只关心供热温度和流量。但在真实项目中燃气轮机发电的同时会产热电热泵消耗电能来供热电转气设备把多余电力变成天然气这些耦合环节把三个网络“绑”在了一起。某一个网络的运行状态变化会立刻传导到其他网络。例如天然气压力下降导致燃气轮机出力受限电网就可能出现功率缺额同时热网因余热供应减少需要电热泵补足又反过来增加电网负荷。这种连锁反应只有通过多能耦合计算才能完整呈现。我最早做这个题目的时候最大的误区是以为把三个独立的能流计算程序拼在一起就行结果发现根本不收敛。原因很简单耦合变量在三个程序之间相互传递但各自的求解逻辑没有统一耦合迭代的次数和初值都没处理好。后来老老实实按“统一建模交替迭代”的思路重写才算把问题解决。这个项目本质上解决的是“如何在同一个算法框架里获得电气热三种网络稳态解的数学问题”适合正在做IES规划调度论文、微能网示范项目或者想转综合能源方向的研究生和工程师参考。整套代码的定位是中等规模几十个节点的电气热耦合稳态能流计算工具具备清晰的模块划分和数据集定义方便替换成你自己的网络拓扑。下面我会从数学模型、Matlab实现、算例测试、调试经验四个维度拆解所有关键步骤和踩坑点都会写出来。2. 电气热能流计算的数学模型与关键环节2.1 电力系统潮流模型电力网络采用经典极坐标牛顿-拉夫逊法。节点类型分为三类平衡节点松弛节点、PQ节点已知有功和无功、PV节点已知有功和电压幅值。对于综合能源系统平衡节点通常选上级电网的并网点而CHP机组、燃气轮机节点可以作为PV节点或PQ节点处理具体取决于运行控制模式。节点功率方程是所有潮流算法的基础P_i U_i * sum_j U_j * (G_ij * cos(theta_ij) B_ij * sin(theta_ij)) Q_i U_i * sum_j U_j * (G_ij * sin(theta_ij) - B_ij * cos(theta_ij))其中G_ij和B_ij是节点导纳矩阵的实部和虚部theta_ij是节点电压相角差。牛顿法修正方程为雅可比矩阵J乘以电压幅值/相角修正量等于功率不平衡量。Matlab里实现这个并不难难点在于把电网的边界条件与气网、热网的耦合约束对接起来。2.2 天然气网络稳态能流模型天然气网络与电力网络有相似之处但物理机制完全不同。天然气在管道中流动由节点压力驱动管道流量与两端压力平方差和管段参数相关。稳态下常用Weymouth方程描述f_ij sign(p_i^2 - p_j^2) * C_ij * sqrt(|p_i^2 - p_j^2|)C_ij是管道综合传输系数由管径、长度、摩擦因子和气体温度决定。天然气节点需要建立流量平衡方程A * f L其中A是节点-支路关联矩阵f是支路流量向量L是节点负荷从气网取出的流量。气网中还有压缩机加压站压缩机消耗部分天然气增压其耗气量通常建模为流量的二次函数或线性比例。压缩机模型是气网收敛的难点这一点后面专门讲。天然气网络的节点类型已知压力的气源节点相当于电网平衡节点已知流量的负荷节点相当于PQ节点。迭代算法可以用牛顿法也可以用逐次代入法。我在项目里优先用牛顿法因为气网的节点方程相对简单雅可比矩阵容易推导收敛速度也快。2.3 热力系统水力-热力耦合模型热力系统比电网和气网更复杂因为它的水力工况和热力工况必须联立求解。供水管网和回水管网同时存在热源在供水侧注入高温热水用户通过换热站取热后冷却水回到回水管网再由热源重新加热。水力工况描述各管道流量分配满足节点流量连续方程和回路压力平衡方程。简单说每个节点的流入流量等于流出流量每个闭合回路的压力降之和为零。热力工况则描述温度分布主要方程包括节点温度混合方程和管道温降方程。节点混合温度方程T_out * sum(m_out) sum(m_in * T_in)即流出节点的热水温度是各流入支路热流量加权的平均温度。管道温降方程T_end T_env (T_start - T_env) * exp(-dx / ( lambda * m * c_p ))T_env是环境温度lambda是管道热损失系数m是质量流量。这两个方程构成了热力系统的核心非线性方程通常是整个收敛最慢的地方。2.4 多能耦合环节建模耦合设备是三个网络之间的桥梁项目里我重点建立了以下四类模型耦合设备输入侧输出侧数学关系燃气轮机CHP天然气电热P eta_e * F_gasH eta_h * F_gaseta_eeta_h合理范围0.7-0.9燃气锅炉天然气热H eta_b * F_gas电热泵电热H COP * P_e电转气P2G电天然气F_gas eta_p2g * P_e / HHV值得注意的是CHP的产热和产电比例并非恒定热电比 r H/P 由运行工况决定。在稳态能流计算里如果给定P那么H r * P如果给定H则P H / r。这个比例需要在每次迭代中根据机组的可行域校验否则解出来的结果可能在物理上不可行。P2G模型则需要把电功率换算成天然气体积流量HHV是天然气高位热值一般取38-40 MJ/m³eta_p2g包括电解水制氢和甲烷化的总效率目前工程上一般取50%-70%左右。算例中如果P2G出力和CHP机组同时存在系统会形成有趣的“气-电-气”双向耦合收敛难度也会显著增大。3. Matlab代码实现框架与架构设计3.1 整体模块划分写Matlab代码最忌讳的是“一个脚本写到底”尤其是这种三相耦合系统调试起来会非常痛苦。我的做法是面向对象的子函数分区这样后续换网络拓扑或改设备参数只需要替换数据文件核心求解器不动。推荐的文件结构如下IES_energy_flow/ ├── main_IES.m // 主程序入口 ├── load_data/ │ ├── data_electric.m // 电网数据 │ ├── data_gas.m // 气网数据 │ ├── data_heat.m // 热网数据 │ └── data_coupling.m // 耦合设备参数 ├── solvers/ │ ├── solve_electric.m // 电网潮流求解 │ ├── solve_gas.m // 气网能流求解 │ ├── solve_heat.m // 热网能流求解 │ └── ies_outer_iteration.m // 耦合迭代主逻辑 ├── models/ │ ├── chp_model.m // 热电联产模型 │ ├── electric_boiler.m // 电热泵/电锅炉模型 │ └── p2g_model.m // 电转气模型 └── utils/ ├── jacobian_electric.m ├── jacobian_gas.m └── build_incidence_matrix.m主程序的任务不是解题而是串联数据、初始化变量、调用迭代器、显示结果。迭代器负责交替调用三个子网络求解器并判断收敛。每个子网络求解器内部只读取自己的网络数据和耦合接口变量不直接读取其他网络的数据避免变量名冲突。3.2 数据输入与拓扑定义电网数据用节点导纳矩阵或者节点支路表。我习惯用Matlab结构体数组简单直观% 电网络支路表 % bus_from, bus_to, R(pu), X(pu), B(pu), tap, status e_branch [ 1, 2, 0.003, 0.010, 0.0006, 1.0, 1; 2, 3, 0.004, 0.012, 0.0005, 1.0, 1; ... ]; % 节点表编号类型(1平衡2PQ3PV)PgenQgenPdQdVmagVang气网数据包含节点气负荷、气源压力上限、管道参数管长、内径、粗糙度、压缩机位置和增压比。热网数据则要定义供水/回水拓扑、管道直径、阻力系数、节点负荷、换热站面积等。耦合设备参数放在单独的文件里通过一个结构体coupling来传coupling.chp.node_e、coupling.chp.node_g、coupling.chp.node_h分别表示CHP在电网、气网、热网的接入节点位置。3.3 初始化与耦合迭代流程初始化是双刃剑。太粗糙的初值容易导致气网或热网不收敛太精确的初值又失去了“通用性”。我的经验电网用平启动电压1.0相角0气网用各节点压力等于气源压力热网用所有节点温度等于设计温度然后进入迭代。迭代流程如下根据耦合设备当前状态计算电网内CHP、P2G的注入功率然后求解电网潮流得到电网节点电压和各耦合设备的实际电功率。将电网求得的CHP耗气量、P2G产气量作为气网负荷或气源注入更新气网负荷求解气网能流得到气网压力和各耦合设备实际天然气流量。将CHP余热量、燃气锅炉/电热泵产热量作为热网热源注入求解热网能流得到热网温度分布和各耦合设备实际热出力。将热网实际热出力代入耦合设备模型反算更新的CHP电功率、气耗量等与上一轮值比较。如果所有耦合量变化的最大绝对值小于阈值例如1e-5 p.u.或0.0001 kg/s则收敛否则回到步骤1继续。这个流程本质上是“高斯-赛德尔”式交替迭代。为了保证收敛可以在外层加松弛因子x_new alpha * x_computed (1 - alpha) * x_oldalpha取0.5-0.8之间具体数值需要试。如果发现迭代发散或振荡调小alpha或者改用“先气网后电网”的顺序往往能解决问题。3.4 耦合收敛判据与松弛策略收敛判据不能只看单一变量建议综合判断tol 1e-5; err max([abs(dp_chp), abs(dh_chp), abs(df_gas_to_chp), ...]); if err tol converged true; end其中dp_chp是CHP电功率变化dh_chp是其热功率变化df_gas_to_chp是气网流向CHP的流量变化。这些变量具有不同量纲直接用绝对误差会互相干扰。更好的做法是归一化各变量除以自身基值再取最大值。另外每次迭代后打印误差收敛曲线能肉眼判断是否线性收敛、振荡或者卡死在某个值。我一般用hold on画semilogy曲线非常直观。4. 核心代码实现细节与关键函数4.1 电力系统潮流求解函数电力潮流采用成熟的牛顿法我把雅可比矩阵的生成和求解封装起来。注意在计算之前要把耦合设备注入功率填入节点注入向量。function [V, theta, info] solve_electric(e_data, coupling_power) % coupling_power 是一个结构体包含电节点上CHP的电功率注入和P2G的电功率消耗 % 在构造功率不平衡量时需要把这些功率叠加到节点净注入上 n e_data.n; V e_data.V0; theta e_data.theta0; % 构建导纳矩阵Y ... for iter 1:50 [P_cal, Q_cal] cal_power(V, theta, Y); P_net e_data.Pg - e_data.Pd coupling_power.P_chp_node - coupling_power.P_p2g_node; Q_net e_data.Qg - e_data.Qd coupling_power.Q_chp_node; % 根据节点类型计算不平衡量构造雅可比 dP P_net - P_cal; dQ Q_net - Q_cal; % 雅可比矩阵 J dx J \ [dP; dQ]; % 实际求电压相角和幅值修正量 % 更新V和theta if max(abs(dx)) 1e-7 break; end end % 记录收敛状态和迭代次数 end这里有个值得注意的坑CHP一般在电流侧发电的同时会消耗或提供无功功率。如果CHP节点作为PV节点无功不需要指定但如果作为PQ节点就必须要给定Q值。实际项目中燃气轮机的无功能力有限建议把CHP节点设置为PV节点无功由雅可比自动修正这样更符合机组励磁调节特性。4.2 气网能流求解函数气网求解我采用的是节点压力作为状态变量支路流量用Weymouth方程表达。气源节点已知压力负荷节点已知流量。为了处理压缩机我采用了简化的“压缩机增压比固定”模型压缩机的耗气量并入该节点负荷。核心函数如下function [p, density, info] solve_gas(g_data, coupling_gas) % p 是节点压力向量实际上是平方值 p^2 作为状态变量 % coupling_gas 包含气网节点注入或负荷变化比如CHP耗气、P2G产气 % 建立节点-支路关联矩阵 An_branch x n_node注意方向 % 对每个节点建立流量平衡残差: % residual_i sum_j A_ij * f_j - L_i % 其中 f_j 由Weiyouth方程计算f_j C_j * sign((p_from^2 - p_to^2)) * sqrt(|p_from^2 - p_to^2|) % 对残差求偏导形成雅可比矩阵解出dp^2 for iter 1:100 f compute_weiyouth(p2, g_data.branch); residue A * f - (g_data.load - coupling_gas.extra_injection); J compute_jacobian_gas(p2, g_data); dp2 -J \ residue; p2_new p2 dp2; % 限制压力平方下限不能小于某值否则物理不成立 p2_new max(p2_new, g_data.p_min^2); if max(abs(dp2)) 1e-6 break; end p2 p2_new; end p sqrt(p2); end需要特别处理的是管道流量公式中带有方向判断即sign函数。当两个节点压力非常接近时sign函数在0附近会产生数值振荡。我的处理办法是将sign(p_i^2 - p_j^2)写为(p_i^2 - p_j^2) / max(|p_i^2 - p_j^2|, epsilon)epsilon取1e-6。这样既能保证方向又避免导数不连续。4.3 热网求解函数热网求解最复杂我拆成两步先解水力方程得到各管道的质量流量再在此基础上解热力方程得到节点温度。水力方程是线性的对于给定的阻力特性但实际上由于管道阻力与流量平方相关严格说也是非线性的。我采用了一种简化在稳态工况下各热用户的质量流量已知管道分配比例可由回路压降方程求得。对于小规模热网我直接用基尔霍夫流量定律初始假设流量分布然后用压力回路方程修正。温度求解则采用“面向节点的顺序更新法”function [Ts_supply, Ts_return, info] solve_heat(h_data, coupling_heat) % Ts_supply 是供水节点温度向量Ts_return 是回水节点温度向量 % 假设水力已解出质量流量 m_ij针对每根管道和节点混合流量 % 初始化温度 Ts h_data.T0; for iter 1:200 % 根据拓扑方向遍历管道从热源节点向外更新 % 对每个节点流入节点的热量等于各支路热流之和 % 节点温度 sum(m_in * T_in) / sum(m_in) % 对每个管道从起点温度计算终点温度考虑温降 % 更新回水温度回水节点由各个热负荷出口混合而成 end % 判定收敛两次迭代温差小于0.01度 end这里有个关键点热网是有方向的供水从热源流向负荷回水从负荷流向热源。如果网络不是树状而是环状就会出现“哪个方向是上游”的模糊。我建议在数据文件里明确指定管道方向有向图工程中也可以通过调节阀强制定向。如果坚持要处理环网那必须用节点温度非线性方程组统一求解代码复杂度会上升一个量级不建议新手一开始就挑战。4.4 耦合迭代主程序逻辑主程序的核心是外层循环直接决定整个计算是否收敛。这里把耦合接口变量单独抽象出来便于追踪。function [result] ies_outer_iteration(data, coupling_model_params) % 初始化耦合量 X initial_coupling_variables(data); for iter 1:30 % 外层最大迭代次数 % 1. 电网求解 coupling_power build_electric_from_X(X); [V, theta] solve_electric(data.electric, coupling_power); X.P_chp calc_chp_power(V, theta, coupling_model_params); % 2. 气网求解 coupling_gas build_gas_from_X(X); [p_gas] solve_gas(data.gas, coupling_gas); X.F_chp calc_chp_gas_consumption(p_gas, coupling_model_params); % 3. 热网求解 coupling_heat build_heat_from_X(X); [T_nodes] solve_heat(data.heat, coupling_heat); X.H_chp calc_chp_heat(T_nodes, coupling_model_params); % 4. 更新耦合变量带松弛 X_new update_with_relaxation(X, X_computed, alpha); err compute_error(X_new, X_old); fprintf(迭代%d, 误差%.6e\n, iter, err); if err 1e-5 break; end X_old X_new; end % 输出各个网络的完整解 result.V V; result.p_gas p_gas; result.T T_nodes; end外层迭代次数上限设30或50超过就报“不收敛”。具体数值跟网络规模有关但大多数测试系统在10-20次内就能收敛。如果超过30次还不收敛不要盲目加大上限先查初值和设备参数是否有物理错误。5. 算例测试与参数选取5.1 测试系统搭建没有现成的标准“IES算例库”我参考IEEE 33节点配电网、比利时20节点天然气网和某园区供热管网裁剪组合成一套小型测试系统。规模不要太大初始测试用6节点电网、6节点气网、8节点热网就够。这样调试方便迭代过程肉眼可见。具体参数例如电网基准功率100MW电压等级10kV线路阻抗标幺值0.005-0.02气网基准压力4MPa管道长度1-3km口径0.3m负荷流量0.01-0.05 kg/s热网供水温度设定90℃回水温度设定50℃环境温度20℃管道热损系数0.2 W/(m·K)。耦合参数CHP额定电功率20MW热电比1.2电效率0.35电热泵COP为3.5P2G功率10MW效率0.6。这些参数要在数据文件中集中管理不要分散在函数里写死。5.2 多能耦合场景设置为了验证耦合计算的有效性我设计了三个场景。场景一纯电网气网不含热网CHP只发电不供热。这时候耦合计算退化为异质网络交替迭代验证气电耦合逻辑是否正确。场景二完整电气热网络CHP热电联产热网独立循环。这个场景考察温度方程和热力循环与电、气环节的互动。场景三在场景二基础上加入P2G形成天然气反哺。重点看P2G产气量是否改变气网压力和CHP进气流量进一步影响电网出力。场景三收敛最困难因为存在正反馈循环电网需求增大→CHP出力增大→气网耗气增加→气网压力不足→CHP可能降出力→电网缺额更大。物理解释是正确的但如果迭代收敛不到真实解整个计算就会在振荡中结束。5.3 结果分析与收敛性经过测试场景一二通常8-12次外层迭代即可收敛到1e-5精度。场景三在CHP和P2G同时高比例运行时需要15-20次且松弛因子要调到0.6左右。收敛过程中常见误差曲线是前几次迭代误差快速下降然后出现平台期。此时不要急着减小阈值而应该观察平台期是否有缓慢下降。如果误差在同一个数量级来回跳说明振荡了。我遇到过的最典型的错误是CHP的热电比设得过大导致热网所需热量超过了CHP最大热出力于是热网温度始终达不到设定值气网迭代和热网迭代在数值上互相“拉扯”永远不收敛。解决办法是给CHP加一个“热出力上限”超限时甩负荷到燃气锅炉而不是强行让CHP出力。结果输出应包括每个网络的最小电压/最大压力/最大温差作为工程校核指标。例如电网友节点电压幅值应维持在0.95-1.05 p.u.气网节点压力不应低于气源压力的70%热网末端供水温度不应低于设计值10℃。这些指标是结果可用性的物理判据。6. 常见问题与调试经验实录6.1 初值敏感与收敛困难问题现象迭代刚开始就出现NaN或者状态变量直接飞到负值。原因大多是初值距离真实解太远特别是气网和热网。气网压力初值太低时Weymouth方程中sqrt里可能开出负数的平方差导致虚数。我的经验气网所有节点压力初值统一设为气源压力不要按海拔梯度递减。热网供水温度初值统一设为热源出口温度回水温度统一设为设计回水温度。这样能让雅可比矩阵初始就处于良性区域。另外电网潮流初值如果采用“平启动合理负荷”基本不会出问题。真正出问题的是耦合初值比如CHP初始电功率为0那么在电网潮流里它就是个负荷节点第一轮迭代后电网解会发生变化但如果CHP初始电功率设得过大P2G消耗电功率过小同样会失衡。我建议用额定工况的50%作为CHP初值误差不大而且有足够裕度。6.2 压缩机模型发散气网带压缩机时压缩机出口压力固定入口压力由上游决定。如果入口压力计算值低于压缩机最低允许吸入压力增压比就会超过设计极限模型发散。错误信息通常不直观Matlab会提示矩阵奇异。排查时要在气网求解器里加诊断打印实时输出压缩机入口压力和增压比。我的解决办法是压缩机建模时区分“增压模式”和“旁通模式”。当上游压力足够高时压缩机可以降低增压比甚至停机旁通只在压力不足时才启动增压。在迭代过程中根据当前压力状态动态切换模式稳态解大概率会落在单一模式内收敛性明显改善。6.3 热网温降方程处理热网温降是指数函数当管道很长且流量很小时末端温度可能降到环境温度以下这是物理上不可能的。原因是流量太小导致热损失过大实际系统会通过最小流量约束避免这种情况。在代码中应该在热网求解前检测各管道流量如果低于最小允许流量例如0.005 kg/s则报错提示而不是让计算继续。温降方程中的指数项需要避免数值溢出。当管道长度乘以热损系数很大时exp指数可能超过1e10。用exp(-a/m)计算时m很小的确会爆。处理方式是限制m的下限在程序中取max(m, m_min)其中m_min可以设置为设计流量的5%。6.4 单位统一与量纲错误这是很多人忽略的坑。电网用标幺值气网用kg/s和MPa热网用MW和摄氏度。三者混合计算时耦合设备的输入输出转换非常容易错。例如CHP气耗量需要从MW换算到kg/s换算公式为F_kg_s P_MW / (eta_e * HHV_MJ_per_kg)其中HHV如果用MJ/m³还要乘以气体密度。我在代码里专门写了一个convert_gas_power.m函数所有耦合变量都必须通过它转换不允许在主程序里直接计算。这样就保证了单位变换只在单一函数内发生调试时可以单独打印这个函数的输入输出验证。6.5 耦合迭代顺序影响外层迭代顺序不是唯一的我上面是“先电→再气→再热”。实际中如果气网薄弱气源压力低、管道细先算气网更合理因为气网会约束CHP气耗量进而影响电网注入功率。建议实现两种顺序并在主程序中用设置项控制settings.order electric-gas-heat; % 可选 gas-electric-heat 等我测试下来当电网和热网负荷率较高、气源充足时两种顺序收敛结果一致。但气源紧张时先算气网能提前发现天然气短缺避免电网友序迭代产生不现实的CHP出力。7. 延伸扩展与个人体会7.1 从稳态到动态/最优能流这套稳态能流代码稳定后很自然的扩展方向是扩展为“多能流最优潮流”。只需要把能流计算作为内层约束外层用遗传算法或内点法优化机组出力和耦合设备运行点就能做调度优化。另外一个方向是动态能流。天然气管道动态方程是偏微分方程热网更是有传输延迟真要精确仿真的话Matlab代码复杂度会成倍增加。我更推荐用Simulink仿真动态部分将稳态能流作为初值注入可以提高仿真效率。7.2 代码工程化与模块复用现在很多期刊和项目都要求代码可复现。我强烈建议把参数字段设计成结构体并写一个demo脚本自动跑通测试系统。这样审稿人或者同事能快速验证。另外Matlab的实时脚本.mlx很适合展示迭代过程配合图表能提升成果的说服力。我还会在代码里加详细的注释但不要过度。每个函数头部写清输入、输出、单位和物理公式来源比大段解释更重要。自己三个月后回来看代码能靠这些注释快速进入状态。7.3 现实工程中的价值与局限真实的综合能源系统比我们这个小测试网络要复杂得多。园区级系统可能包含上百个暖通节点跨区域的天然气管道动辄几百公里压缩机模型还分燃气驱动和电驱动。稳态能流计算虽然简化了动态过程但能为规划阶段提供初步方案为运行阶段的优化调度提供静态工作点价值仍然很大。我刚做完这个项目时的体会最大的收获不是“会算三道潮流”而是建立起一种“系统级思维”——看到设备参数时脑子里会自动推演它的电气、热力、燃气特性如何在网络中相互作用。这种能力靠跑通一个化工级的小算例是练不出来的必须在调不通、报错、反复改模型的过程中逐渐沉淀。如果你也在做类似题目遇到不收敛别急着怀疑算法先回数据检查耦合设备的量纲、边界条件和物理上限。把这些细节抠干净你的代码和模型自然会跑出符合直觉的结果。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑