电-气综合能源系统(IEGS)的可靠性评估,很多从电力系统转过来的同学容易踩一个坑:天然气管网用稳态模型一算就完事。但实际管道的“管存效应”——也就是滞留在管道里的那部分天然气,在供气中断时能顶几个小时甚至更久——恰恰是系统真实可靠性的最大变量。我最近把一套考虑气流动力学的IEGS可靠性评估仿真代码完整跑通了,从偏微分方程离散、序贯蒙特卡洛抽样,到指标统计和结果分析,整个流程都重新捋了一遍,这里专门整理一篇实操向的拆解,把建模思路、代码框架和踩过的坑都写出来,希望能给正在做综合能源可靠性方向的同行省点时间。
1. 为什么可靠性评估必须给天然气网“加上时间轴”
1.1 稳态模型的先天局限
传统的电-气综合能源系统可靠性评估,最常见做法是把天然气网当成一个稳态系统来算。什么叫稳态?就是认为管道里的压力和流量在任意时刻都满足代数平衡方程,节点流入多少、流出多少瞬间匹配,天然气管网和电网一样“即时响应”。这种方法实现简单,数据需求小,在规划阶段的粗略分析里确实够用。
但问题是,天然气和电力在物理属性上完全不同。电力几乎以光速传播,电网里任何一处扰动都会在毫秒到秒级波及全网;而天然气在管道里的流动速度通常只有每秒几米到十几米,压力波传播速度也就是声速量级。一个气源点停供,下游节点的压力变化可能要几分钟甚至几十分钟后才体现出来。你用一个代数方程去描述一个本身带惯性和延迟的物理过程,结果必然有偏差。
具体到可靠性指标上的偏差,我以前做过一个对比:某个负荷节点附近一台燃气机组,上游气源故障时,稳态模型直接判定该机组无法供气,进而按失负荷处理;但考虑气流动力学后,管道里的管存还能支撑机组满负荷运行将近两个半小时,这段时间电网侧完全可以从容调整其他机组出力。一个是误判失负荷,一个是根本不失负荷,结论完全不同。
1.2 管存效应:藏在管道里的隐形储气库
管存,简单说就是管道里实际停留的天然气质量。长输管道的口径普遍在几百到上千毫米,一段几百公里的管线,滞留的气体量相当可观,相当于一个不具备注采速率限制的天然储气库。它的物理本质是气体的可压缩性:当上游来气少于下游用气时,管道内的压力会逐渐下降,压力下降的过程里,原来储存在管道里的那部分气体就被“挤”出来补充下游,这个释放过程是连续、缓慢、有一定上限的。
这种特性的工程价值在于,它天然给燃气机组提供了“缓冲时间”。供气中断并不是瞬间把燃气机组掐死,而是管道压力逐渐衰减,直到低于机组的最小进气压力后才真正无法运行。因此,考虑管存动态的可靠性评估,更能反映系统真实的韧性水平,也为运行人员争取了宝贵的处理时间窗口。
1.3 这个仿真代码要解决的问题
这套代码的目标是回答一个核心问题:在计及天然气管网动态特性的前提下,电-气综合能源系统在元件随机故障下,到底能不能保证负荷供应?能保证到什么样的程度?对应的可靠性指标值是多少?
与传统评估工具相比,它的差异化能力有三个:
- 天然气管网不再是一个瞬时平衡方程,而是一组带时间递推的差分方程,能模拟从分钟级到小时级的压力/流量演化过程。
- 可靠性评估采用序贯蒙特卡洛模拟,故障样本在时间轴上是连续的,管存的充放过程可以在不同故障场景之间自然衔接。
- 指标统计上不仅统计缺电时间、缺供电量,还能输出管存最低点的分布、压力越限概率等过程型指标,为分析系统薄弱环节提供更多视角。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心建模:气流动力学怎么落到工程计算里
2.1 管道动态方程的取舍与离散
天然气管道的一维流动,理论上要用一组偏微分方程描述。常见的完整形式包括连续性方程、动量方程和能量方程,再加上气体状态方程。但工程仿真里很少把这组方程全量求解,因为计算量太大,而且可靠性评估并不需要那么精细的压力波刻画,只需要准确描述宏观的流量-压力演化过程。因此我采用了等温、水平管道的假设,忽略动能项,把方程组简化为:
连续性方程:
∂ρ/∂t + ∂(ρv)/∂x = 0
动量方程简化形式:
∂p/∂x = - λ ρ v|v| / (2D) - ρ ∂v/∂t
其中ρ是气体密度,v是流速,p是压力,D是管内径,λ是水力摩阻系数。右边最后一项是惯性项,在慢动态可靠性仿真中可以保留也可以忽略,我建议保留,因为压力波传播的相位特性对管存的充放速率有影响。
空间离散上,我用隐式中心差分。每个管道被划分为若干段,每个分段节点上维护一个压力和流量状态。离散后的方程组变成关于节点压力的常微分方程组,再用隐式欧拉在时间上递推。隐式欧拉的好处是无条件稳定,允许采用较大的时间步长,这在长周期可靠性仿真中非常关键,计算效率和工程实施上都明显优于显式格式。
2.2 压缩机与边界条件处理
天然气网里有气源、压缩机站、储气库、负荷节点。压缩机是系统中少数能主动增压的元件,在可靠性评估中必须单独建模。常用的处理办法是把压缩机当作一个分段模型,给定入口压力和出口压力之间的升压比,或者给功率提升量与流量之间的关系。我采用的是变出口压力模型,即压缩机根据下游压力需求调整出口压力,运行功率由耗气量或外部电源提供,具体耦合方式用一组分段线性关系来近似。
压缩机在可靠性模型里同时是脆弱点。一台失效的压缩机可能导致下游整段管网的压力跌落。因此在代码里,压缩机与管道、气源一样都参与蒙特卡洛抽样,出现故障时会触发额外的压力越限判断。
边界条件方面,气源节点给定压力,负荷节点(即燃气机组和燃气负荷)给定流量或流量的函数,储气库节点给定可在一定上下限间调整的流量。初始条件通过先求解一个稳态工况来提供,这一点到后面实操部分还会重点提醒。
2.3 电-气耦合环节的建模细节
电-气耦合的主要环节是燃气机组。燃气机组既是从电网向天然气管网取能的大用户,又是电网侧的可调度电源。在天然气网里,它体现为一个流量负荷,流量大小与其有功出力近似成正比;在电网里,它体现为一个出力可调的发电单元,出力范围受天然气可用性和自身爬坡约束双重制约。
另一个耦合环节是电驱动压缩机。这部分容易被忽略,但在可靠性评估里非常重要。一旦电网出现大面积停电,电驱动压缩机停转,直接影响天然气管网输气能力,形成“电网故障—压缩机失压—燃气机组停运—电网供电能力进一步下降”的恶性循环。这个连锁故障路径,稳态天然气模型完全体现不出来,只有带动态特性才能刻画。
燃气机组的天然气-出力特性,我用分段线性函数近似:考虑最小技术出力对应的基础耗气量和增量耗气率。这部分数据如果现场拿不到,可以根据常用机型额定参数反推,注意在代码里留有参数调节接口,方便后续替换成实测数据。
3. 可靠性评估框架:序贯蒙特卡洛的完整实现路径
3.1 抽样层:元件故障时序怎么生成
可靠性评估最核心的是元件随机停运建模。常用的有两种:非序贯抽样和序贯抽样。非序贯抽样只对每个元件抽取一个0/1状态,适合评估静态可靠性;但这里必须用序贯蒙特卡洛,因为管存效应天然是时间关联的——前一小时的管存状态会影响后一小时的结果。
我的实现方式是:对每个元件建立两状态马尔可夫模型,用平均无故障时间和平均修复时间计算转移概率,再逐小时生成运行/故障状态序列。元件类型包括输电线路、变压器、燃气机组、气源、管道、压缩机。生成的状态序列按小时存储成矩阵,后续仿真时直接按行读取。
这里有个关键技巧:不要在小步长内反复抽样。可靠性评估外循环步长是小时级,但天然气动态内循环可能是分钟级甚至秒级。如果内循环也用随机状态切换,计算量会急剧膨胀。正确做法是:元件状态按小时边界更新,同一小时内保持恒定;天然气动态以更小步长递推,只把元件的开/停作为确定性边界条件。
3.2 仿真层:动态天然气网与电力网的逐时段匹配
每个小时的仿真步骤可以拆成三步:
- 第一步,根据该小时元件状态,确定哪些气源、管道、压缩机、燃气机组可用。
- 第二步,求解电力系统,得到各燃气机组的有功出力和电驱动压缩机功率。这一步我用直流潮流,迭代修正网损。
- 第三步,将燃气机组的出力转换为天然气流量需求,作为天然气网动态仿真的边界条件,用有限差分推进到下一个小时节点,更新各节点压力和管存状态。
这里需要特别注意天然气动态仿真的步长。小时级的外循环太粗,直接拿1小时当天然气仿真的递推步长会出现数值振荡。我把每个小时内部再细分3到6步,即天然气仿真步长取10到20分钟。这样既保证数值稳定,又不会让计算时间失控。
电力网和天然气网的迭代顺序上,我采用“电网先行、气网校验”的交替迭代法。电网先按不考虑气网约束的方式安排出力,再把燃气机组需求传给气网;气网校验各节点压力是否越限。如果某个燃气机组所在节点压力低于下限,就削减该机组出力,重新回到电网侧调整,直到两边都满足约束。这个过程通常迭代三五次就能收敛。
伪代码框架大致是:
python复制for hour in range(total_hours):
state = system_state[hour] # 元件故障状态
while True:
power_solution = solve_power_network(state)
gas_demand = gas_demand_from_generators(power_solution)
gas_feasible, pressure = solve_gas_dynamics(gas_demand, state)
if gas_feasible:
break
else:
curtail_gas_generators(pressure)
3.3 指标统计与收敛判据
可靠性指标我统计了三大类:
- 负荷侧指标:失负荷概率(LOLE)、期望缺供电量(EENS)
- 系统侧指标:切负荷次数、平均切负荷持续时间
- 天然气网过程指标:节点压力越限概率、管存低于安全阈值的时长占比
序贯蒙特卡洛的收敛判据,我采用EENS的变异系数,也就是标准偏差除以均值。当变异系数小于2%时认为收敛。实际跑下来,常见规模下需要数千到上万年的模拟。听起来很长,但因为单年仿真内部步长优化,运行时间还能接受。
4. 实操中的大坑与排查实录
4.1 有限差分不收敛:CFL条件不是建议是红线
我最早写天然气动态仿真时,为了跑得快,把时间步长拉到半小时,结果压力曲线在故障场景下直接发散,节点压力出现负值这种离谱结果。后来逐步排查发现,是离散格式的稳定条件没满足。
显式格式要求时间步长与空间步长的比值满足CFL条件,即Δt < Δx / (c + v),其中c是压力波传播速度,接近当地声速。天然气管道里c约300到400米每秒,假设管道划成10公里一段,Δt最多只能取20多秒。半小时的步长完全不可行。
解决办法有两个:一是改用隐式格式,隐式欧拉对Δt没有硬性稳定限制;二是保持显式格式但缩小步长。考虑到可靠性仿真规模大,我最终选用了隐式格式,把天然气仿真步长设置在10到20分钟,兼顾稳定和速度。
4.2 管存初值乱给,仿真前3小时全是假的
另一个坑在初始条件。管道内初始压力分布如果直接取额定压力,而不是先解一次稳态工况,那么仿真开始后管道会在前几个小时内剧烈调整压力分布,管存总量发生大幅度变化,导致天然气网侧的可用供气能力被严重高估或低估,整个可靠性指标也失真。
解决办法很简单:在所有故障仿真开始之前,先跑一次无故障的稳态求解,用稳态解里的节点压力分布作为动态仿真的初始条件。这个步骤看起来不起眼,但直接决定了仿真前几个小时的可靠性结果是否可信。我建议把稳态求解器的配置做成可复用模块,后续不同负荷水平下都能快速生成对应初始工况。
4.3 蒙特卡洛收敛太慢:方差削减的三个实用招
序贯蒙特卡洛最怕的就是收敛慢。同样一个系统,我最初直接跑,EENS变异系数要降到2%需要非常大的年数。后来我陆续加了三个方差削减手段:
- 一是控制变量法,把相同故障场景下用稳态模型算出的结果作为控制变量,动态结果与之保持正相关,显著降低方差。
- 二是重要抽样,把故障概率运行状态向重负荷时段偏移,迫使仿真更多地访问低裕度时段。
- 三是公共随机数,比较不同方案时使用同一个故障序列,让对比更干净。
三招合起来,收敛所需样本量差不多降了一个数量级,效果非常明显。如果你在跑蒙特卡洛时发现收敛曲线一直抖,强烈建议优先检查自己有没有用控制变量和公共随机数,这两个是投入产出比最高的手段。
4.4 压缩机失效与电网交互的隐蔽故障
这套模型里,电驱动压缩机引入了回馈耦合:电网故障导致压缩机停运,进而使得燃气机组供气压力不足。起初我在测试时漏掉了这个耦合环节,只把压缩机当成普通的天然气侧元件处理,结果漏掉了一整类连锁故障场景。后来在分析压力越限事件时发现,相当一部分越限事件的触发点是电网侧线路故障,而不是气源或管道故障。这才回头把电驱动压缩机的用电负荷接入电网模型,修正后仿真结果更符合实际物理直觉。
这个案例提醒我,在IEGS可靠性评估里,耦合环节往往比单一子系统内部的元件更容易成为系统级薄弱点,建模时不能怕麻烦。电驱动压缩机的功率可以通过升压比和流量反推,注意在电网侧把它作为一个固定或可调节负荷加入潮流计算。
4.5 常见问题速查表
| 症状 | 可能原因 | 解决措施 |
|---|---|---|
| 压力出现负值、流量振荡发散 | 时间步长过大,不满足CFL条件 | 改用隐式格式,或缩小时间步长 |
| 仿真初期压力剧烈波动 | 初始管存与实际工况不匹配 | 先跑稳态初值计算 |
| EENS变异系数降不下去 | 抽样方法效率低 | 加入控制变量、重要抽样、公共随机数 |
| 燃气机组出力频繁被削减 | 未计及电驱动压缩机回馈耦合 | 把压缩机用电负荷纳入电网模型 |
| 同一场景多次仿真结果差异大 | 缺少公共随机数 | 固定随机种子,使用公共故障序列 |
| 天然气动态求解耗时过长 | 内循环步长过细 | 调整内循环步长为10-20分钟,使用隐式离散 |
5. 运行结果怎么看:从数据到工程决策
5.1 一组典型场景的对比结果
我在某算例系统上分别用稳态天然气模型和动态天然气模型做了对比。算例系统的规模不大,3个气源、2条长输管道、4台燃气机组、若干电负荷节点。稳态模型算出的EENS约1200兆瓦时/年,动态模型算出的EENS约860兆瓦时/年,下降了接近三成。差异主要来自天然气管道管存对燃气机组的短时支撑,以及天然气系统故障后系统仍有时间进行调整。
LOLE指标差异更明显。稳态模型预测年失负荷期望小时数约8小时,动态模型下降到5小时左右。这类指标层面的差异,对系统规划中“是否需要额外配置储气库”这类投资决策有直接导向性。如果用了稳态模型,可能倾向于增设储气设施;考虑管存后,这部分投资的必要性就会减弱,资金可以转向其他薄弱环节。
| 模型类型 | LOLE(小时/年) | EENS(兆瓦时/年) | 天然气侧压力越限事件(次/年) |
|---|---|---|---|
| 稳态天然气模型 | 8.2 | 1200 | 无法统计 |
| 动态天然气模型 | 5.3 | 860 | 14 |
5.2 管存效应的边际价值量化
我还做了一组灵敏度分析:逐步改变管道末端最低允许压力,观察管存可用容量对EENS的影响。结果很有意思,管存并不是简单“越多越好”。当管道长度从50公里增长到200公里时,管存的边际价值先快速上升后趋于饱和,因为燃气机组在故障场景下的极限支撑时间已经超过了运行人员调整电网策略所需的时间。
另一个发现是管存的时空分布不均。同一套管存总量,如果分布在下游压力较高的管段,对支撑燃气机组出力的效果好得多;如果集中在偏远气源侧,实际工程价值就打折扣。这个结论直接验证了“管存位置比管存总量更重要”的工程直觉。
5.3 这套流程还能怎么扩展
写完之后,我觉得这套框架还有几个现成的扩展方向:
- 加入储气库与液化天然气站模型,把管存动态和外部储气资源统一考虑;
- 耦合热力管网,从电-气两系统扩展到电-气-热多能互补系统;
- 转为运行优化方向,在可靠性评估的框架里嵌入日前调度模型,评估不同调度策略对可靠性的影响;
- 如果系统规模较大,再引入网络简化与等值技术,比如把电气网做戴维南等值、天然气网做管道等值。
这些扩展基本都是在我现有代码的接口上增加新的元件类型和约束,不需要推翻重来,这也是当初把建模和求解分开设计带来的好处。
6. 几点个人体会
在把这套代码完整跑通之前,我一直对“管存到底能顶多久”这个数字半信半疑。直到自己亲手在故障场景里看到管道压力一寸寸下降、燃气机组出力一步步被压低,才真正理解了动态模型的价值。它带来的不仅是更接近实际的可靠性指标,更是一套“故障发生后系统还有多长时间可用”的时间地图,这对运行调度和规划决策的价值,远大于一个静态数字。
如果你正在做综合能源方向,我的建议是:先用稳态模型把整体框架跑起来,再逐步把动态模型加进去,每加一层就做一次与稳态结果的对比验证。这样不容易被数值问题困住,也能清楚看到每一步建模精细化带来的真实收益。最后再分享一个小技巧:天然气管存的初始值和对故障后的短时支撑能力,是这类评估中影响结果最大的两个因素,调试时优先检查这两个地方,往往能快速定位大多数“结果不合理”的问题。
