跳转到主要内容

装几块压力表,能把漏点定位到哪条管?——压力指纹法完整推演

2026年7月10日
36 分钟阅读
曾田力
水力学
漏损定位
管网建模
装几块压力表,能把漏点定位到哪条管?——压力指纹法完整推演

漏点埋在地下,全网逐段开挖排查不现实。可只要在管网里装几块压力表,读数里就藏着漏点位置的信息——这篇文章从水力学第一性原理出发,把"从压力读数到漏点概率排名"的完整方法,在一张 6 节点教学演示网上一个数字一个数字地推到底。

口径声明:全文所有数字都出自一张 6 节点教学演示网(1 座水库 40 m 水头、6 个节点、7 根管)的合成实验,用来讲清方法机理与装表规律,不是任何实际管网的实测成绩。全程单漏点假设;测量噪声按 σ=0.02 m(±2 cm 表精度)合成。演示网虽小,却具备真实管网的关键结构——环状供水、管径差异、总管与末梢之分,方法在它上面讲清了,规模放大只是把矩阵变大,链条一步不变。

交互演示版(可现场跑 Monte-Carlo):本文的两处 live 演示——单次定位、装表阶梯 18000 次反演实验——都能在这个页面上当场点、当场重算,数字不是预存的图片。读到对应章节时打开它对照着玩,体感最好。


一、问题:漏损排查是一条漏斗,本法站在中段

供水管网漏损治理里,"哪里在漏"是最贵的一问。完整的排查链条是一条逐级收窄的漏斗,每一级用的物理量和设备都不同:

  1. 发现——有没有漏、漏多少:靠总分表流量对账、DMA(独立计量区)夜间最小流量分析,"总账"对不上就是有漏。用的是流量
  2. 定位(本法所在)——漏在哪根管:压力指纹匹配,把全网候选缩成一份 top-K 概率清单,排查范围从全网收到两三根管。用的是压力
  3. 定桩——漏在管上哪一米:听漏仪、噪声相关仪沿候选管精确定位桩号。用的是声学
  4. 修复——开挖:范围已缩到米级,开挖成本可控。

压力和流量在这条漏斗里分工明确、互不替代。把两者摆在一起看:

流量(总表对账)压力(多点模式)
回答的问题有没有漏、漏多少(发现)漏在哪根管(定位)
信息形态一个总量,无空间分布压降的空间分布,位置信息的载体
设备经济性流量计贵,只装进出口边界压力表便宜,可铺在管网内部
盲区定不了位(边界只有总量)总管类均匀降压漏损(见第七章 P0 盲区)

所以"为什么定位只用压力不用流量"的第一层答案就是分工:流量已经在第①级把"有漏"确认了,第②级要的是空间信息,而空间信息只密布在压力表上。更深一层的物理答案,留到第五章讲指纹时给。

之所以说定位是"最贵的一问",是因为它夹在两个便宜环节中间:发现只要读总表、修复只要挖开确认了的那一段,唯独"漏在全网哪根管"没有直接可读的仪表——地下管网看不见、摸不着,早年的做法要么全线开挖、要么等到路面塌陷或水费异常才被动响应,代价都极高。压力指纹法的价值就在于把这个"看不见"的中段,用一批便宜传感器 + 一套水力模型,变成一份可以照着干活的嫌疑清单。它不承诺一步到位,但能把开挖成本最高的盲目排查,压缩成沿两三根管的定向复核。

问题的数学形式:读数进,概率排名出

把定位问题写成算式,输入输出都很小:

输入:  p实测RM  (单位 m)输出:  [P1,,PN]  取 top-K\text{输入:}\; p^{\text{实测}} \in \mathbb{R}^{M}\;(\text{单位 m})\quad\Longrightarrow\quad \text{输出:}\;[P_1,\dots,P_N]\;\text{取 top-}K

其中 M 是压力表数、N 是候选漏点数(本演示网 M=3、N=7;真实问题里 N 是候选管段数)。**为什么输出是一份概率排名,而不是一个坐标?**三个原因:

  • 信息量对不上:M 个读数携带的信息有限——第七章会算清楚,去均值后只剩 M−1 维——要从中唯一确定一个连续坐标是奢望。诚实的输出是"哪几根管嫌疑最大、各多大把握"。
  • 下游用法就是排查清单:漏斗第③级拿着 top-K 清单沿管听漏,本来就按嫌疑度排队干活,概率排名正好是它要的输入格式。
  • 失手可观测:概率自带置信度。top-1 领先第二名 70 个百分点,和只领先 0.3 个百分点,是完全不同的行动依据(下文会看到后者等于掷硬币)。一个只报坐标的黑箱给不了这层信息。

方法全链只有四步:建指纹库(离线一次)→ 算残差 → 去均值 Pearson 匹配 → softmax 概率。往下逐步把每一步的数字算到底。


二、演示网与水力学最小集

演示网全参数

演示网长这样:1 座水厂(水库边界,恒定水头 40.00 m,唯一压力边界)经总管 P0 进网,P1–P6 六根管围成一个环。6 个节点 J1–J6,每个节点的用户用水 0.004 m³/s(≈ 每秒 4 升),全网合计 0.024 m³/s;节点高程全部取 0——于是水头 H = 压力表读数 p,后文两词通用。

6 节点演示网拓扑:水厂经总管 P0 进网,P1–P6 成环,J1/J3/J5 装压力表
演示网拓扑:管线粗细按管径。P4/P0 一细一粗,阻力系数相差近百倍——这正是压降空间分布不均匀的物理来源。黄三角标出的 J1/J3/J5 是三块起步压力表。

七根管的阻力系数 R(糙率 C=100 全网统一):

连接长 L (m)径 D (m)R(m/(m³/s)^1.852)
P0水厂–J1(总管)1500.30111.4
P1J1–J22500.25451.5
P2J2–J34000.202 141.8
P3J3–J42000.154 348.4
P4J4–J55000.1510 871
P5J5–J63000.201 606.4
P6J6–J11800.25325.0

水力学最小集:一根管的过路费公式

整个方法只依赖一条水力学经验公式。水在管里流动要跟管壁摩擦,能量沿程消耗,表现为水头(本网高程全 0,即压力)一路变小。一根管消耗的水头叫沿程损失 h,自来水行业用 Hazen-Williams 公式:

h=RQ1.852,R=10.667C1.852D4.871Lh = R\,Q^{1.852},\qquad R = 10.667\,C^{-1.852}\,D^{-4.871}\,L

在 SI 单位下(Q 用 m³/s、D 与 L 用 m,h 出 m),常数 10.667 才成立,R 的量纲是 m/(m³/s)^1.852。指数 1.852 是关键:流量翻倍,损失不是翻倍,而是变 21.852=3.612^{1.852}=3.61 倍——流得越快,摩擦越不成比例地贵,这是湍流的非线性。而 R 里 D 的 −4.871 次方极其敏感:管径减半,R 大约变 29 倍。

拿总管 P0 从头算一遍(L=150 m,D=0.30 m,C=100;水库 40 m;全网用水 0.024 m³/s 全部经它进网):

  • 第①步,算 R:R=10.667×1001.852×0.304.871×150=10.667×0.0001977×352.3×150=111.4R = 10.667 \times 100^{-1.852} \times 0.30^{-4.871} \times 150 = 10.667 \times 0.0001977 \times 352.3 \times 150 = \mathbf{111.4}
  • 第②步,算损失:h=111.4×0.0241.852=111.4×0.001000=0.111h = 111.4 \times 0.024^{1.852} = 111.4 \times 0.001000 = \mathbf{0.111} m
  • 第③步,起点水头减损失:HJ1=400.111=39.889H_{J1} = 40 - 0.111 = \mathbf{39.889} m

三步之外没有别的了——J1 处压力表就该读 39.889 m。感受一下非线性:用水翻倍到 0.048 m³/s,损失变 111.4×0.0481.852=0.402111.4 \times 0.048^{1.852} = 0.402 m,是 0.111 m 的 3.61 倍而不是 2 倍。这个非线性决定了整网方程组没有解析解,只能迭代。

再加一条常识就够用了——节点守恒:节点不存水,任一时刻"流进 = 流出 + 该点用户用掉"。一条公式加一条常识,就是全部水力学。


三、基线工况:13 个未知数,手算解出与仿真对账

没漏水时全网什么状态?未知数 = 6 个节点水头 + 7 根管流量 = 13 个。分三步吃掉:

第一步,总账。全网用水 0.024 m³/s 只能从水厂来,所以 QP0=6×0.004=0.024Q_{P0}=6\times 0.004=0.024 m³/s,不用解方程,进出账而已。13 个未知数干掉 1 个。

第二步,逐节点分账。环上 6 根管流量互相牵连,但守恒账能把它们全表示成一个未知数。设 P1 流量为 qq(方向 J1→J2),沿环逐节点记"进 = 出 + 自用":

节点推出
J1进 0.024,自用 0.004,走 P1 送掉 qq,余走 P6QP6=0.020qQ_{P6}=0.020-q(J1→J6)
J2qq,自用 0.004QP2=q0.004Q_{P2}=q-0.004
J3q0.004q-0.004,自用 0.004QP3=q0.008Q_{P3}=q-0.008
J4q0.008q-0.008,自用 0.004QP4=q0.012Q_{P4}=q-0.012(负数=反着流)
J60.020q0.020-q,自用 0.004QP5=0.016qQ_{P5}=0.016-q
J5收账核对:(0.016q)+(q0.012)=0.004(0.016-q)+(q-0.012)=0.004恰好=自用 0.004 ✓

最后一行 qq 自己消掉了、恒等成立——这说明 6 条守恒账里只有 5 条独立,定不出 qq,差的这条方程要靠能量来补。13 个未知数现在只剩 1 个 qq

第三步,能量闭合定 q。从 J1 到 J4 有上下两条路,但 J1 只有一个水头、J4 也只有一个水头,所以"J1 到 J4 掉了多少水头"是一个固定的数——不管水走哪条路。于是两条路的总损失必须相等:

hP1+hP2+hP3上路=hP6+hP5+hP4下路\underbrace{h_{P1}+h_{P2}+h_{P3}}_{\text{上路}}=\underbrace{h_{P6}+h_{P5}+h_{P4}}_{\text{下路}}

每个 h=RQ1.852h=R\,Q^{1.852},方程里只有 qq 一个未知数,但 1.852 次方无求根公式,只能试算逼近:

qq (m³/s)上路合计 (m)下路合计 (m)判断
0.0080.1370.694上路损失小太多 → 水还会往上路挤 → qq 应更大
0.0120.5630.101挤过头 → qq 应更小
0.0100.2970.297两路相等 ✓(精确根 0.0099975,手算取 0.010 足够)

物理图像很清晰:0.024 进 J1、自用 0.004,剩下 0.020 几乎对半分走两条路——因为两条路到汇合点的总阻力恰好相近。

流量全知道了,从水库 40 m 沿管逐段减损失(每行就是水力学最小集那三步):

求谁路径h 代入式手算 H (m)仿真值 (m)
J140 − h([email protected])111.4×0.001000 = 0.11139.88939.8885
J2J1 − h([email protected])451.5×0.000198 = 0.08939.80039.7993
J3J2 − h([email protected])2141.8×0.0000768 = 0.16439.63639.6350
J6J1 − h([email protected])325.0×0.000198 = 0.06439.82539.8242
J5J6 − h([email protected])1606.4×0.0000768 = 0.12339.70239.7008
J4J5 − h([email protected])10871×0.0000100 = 0.10939.59339.5915

手算与仿真最大差 0.002 m,全部来自展示舍入(qq 取 0.010 而非 0.0099975、每行 h 只留 3 位小数);取满精度重走这条链,六个节点四位小数逐位等于仿真值——手算和仿真解的是同一套方程,模型没有黑箱。带走一行数,三块表(J1/J3/J5)看到的基线(后文统一用仿真精确值):

基线=[39.889,  39.635,  39.701]  m\text{基线}=[\,39.889,\;39.635,\;39.701\,]\;\text{m}

漏水检测的全部游戏,就是拿新读数跟这行数相减:基线是"一切正常时压力表该读多少"的参照系,任何一次实测偏离它,都是全网状态变化留在压力场上的痕迹,而漏水正是其中最典型、也最值得追查的一种。


四、漏损建模与漏损工况:16 条方程联立

劈管开洞,漏量是解出来的

模型里的管是一条线,线上没法直接开洞,所以做个小手术(代码里叫 split_pipe):把管从中点劈成两半,劈点生成一个虚拟节点 LEAK,洞就开在它身上。以 P5(J5–J6,300 m)为例:

改造前:J6   ⁣  P5(300 m)   ⁣  J5J6    P5_B(150 m)    LEAK    P5(150 m)    J5\text{改造前:J6}\;{-\!-}\;\text{P5(300 m)}\;{-\!-}\;\text{J5}\quad\Rightarrow\quad\text{J6}\;{-}\;\text{P5\_B(150 m)}\;{-}\;\text{LEAK}\;{-}\;\text{P5(150 m)}\;{-}\;\text{J5}

劈管连带一个后果:R 与管长成正比,300 m 的 P5 原来 R=1606.4,劈成两个 150 m 后每段 R = 1606.4 ÷ 2 = 803.2。洞的参数只有两个:面积 A = 0.001 m²(孔径 ≈3.6 cm)、流量系数 Cd = 0.75。

洞往外喷多少水?托里拆利结论——孔口喷速等于从"压力水头那么高"自由落体的末速度 v=2gpv=\sqrt{2gp},流量 = 速度 × 面积 × 折减系数:

Qleak=CdA2gpLEAKQ_{\text{leak}} = C_d\,A\,\sqrt{2\,g\,p_{\text{LEAK}}}

关键在于:pLEAKp_{\text{LEAK}} 是未知数(洞开了之后那点压力多少,得解出来才知道),所以 QleakQ_{\text{leak}} 也是未知数。你给模型的只有洞的几何(A、Cd),漏多少水是它自己算出来的。

同时,因为漏量、用水量都随压力变化,仿真必须用**压力驱动(PDA)**模式:漏水压降 → 压降反过来抑制漏量和出水量 → 再影响压力,这个反馈闭环只有 PDA 能表达。需水按 Wagner 三段式:压力 ≥21 m 足额、≤3.5 m 断流、中间按 ((p3.5)/17.5)0.55((p-3.5)/17.5)^{0.55} 折减;本网压力全程 38 m 以上,折减不激活,但这条方程始终在系统里,一旦漏损把压力压穿 21 m 它就自动接管。

16 条方程联立求解

P5 开洞后,未知数变 16 个:7 个节点水头(含 HLEAKH_{\text{LEAK}})+ 8 根管流量(P5 劈成两段)+ 1 个漏量。方程恰好 16 条:7 条节点守恒 + 8 条管道能量 + 1 条漏口方程,恰好封闭。非线性来自 1.852 次方和开根号,没有解析解——仿真里用 Newton 迭代(跟基线的"试算逼近"是同一件事的机器版)。

为什么必须 16 条联立、不能一条条顺着算?漏口方程说"漏点压力越高漏得越多",守恒与能量方程说"漏得越多 → 全网流量越大 → 损失越大 → 漏点压力被压得越低"。两边互相顶牛,解是同时满足全部 16 条的那个平衡点。收敛解的关键数字:

读出什么
漏量 QleakQ_{\text{leak}}0.02063 m³/s≈ 全网正常用水 0.024 的 86%——教学上故意开的大洞,信号明显
漏点压力 HLEAKH_{\text{LEAK}}38.5529 m代回洞方程验证:19.62×38.5529=27.50\sqrt{19.62\times 38.5529}=27.50 m/s(喷速≈99 km/h),0.75×0.001×27.50=0.020630.75\times 0.001\times 27.50=\mathbf{0.02063} ✓ 漏量确实是从压力算出来的
总管流量 QP0Q_{P0}0.04463 m³/s= 0.024 + 0.02063:水厂多供出漏掉的份;总管损失从 0.111 涨到 0.352 m
P5 段流向0.00178(J5→LEAK)远路的水掉头倒流反向给洞送水(基线里本是 J6→J5)——流向不是设定的,是解出来的

16 条方程逐条代回全部闭合(能量方程 ±0.0003 m 的零头为表值舍入)。把漏后压力与基线逐节点相减,得到本章的最终产物——压降向量 Δp

J1J2J3J4J5J6
基线 (m)39.88939.79939.63539.59239.70139.824
P5 漏后 (m)39.64839.47739.03638.67938.54639.260
Δp (m)0.2400.3220.5990.9131.1540.564

规律一眼可见:离洞越近降得越多(洞在 J5–J6 之间,J5 降 1.154 m 最狠;J1 挨着水厂只降 0.240 m)。压降的这种空间分布模式,就是下一章说的"指纹"。


五、指纹库:把"每根管漏水的样子"离线存档

对 P5 干的那套动作——注漏、解方程、跟基线相减得 Δp 行——对每根候选管重复一遍,把 7 行 Δp 摞成一张矩阵,就是指纹库:

SRN×M,Sij=第 i 根管漏水时,第 j 个节点的压降 (m)S \in \mathbb{R}^{N\times M},\qquad S_{ij} = \text{第 }i\text{ 根管漏水时,第 }j\text{ 个节点的压降 (m)}

本网 N=7 候选、先把全部 6 个节点算满(装几块表 = 匹配时给矩阵遮住几列)。得到的 7×6 指纹表:

7 管 × 6 节点指纹库热力图:每格是该管漏时该节点的压降,格内标数值
指纹库 S(每格 = 该管漏时该节点压降 Δp,单位 m)。P0 行一片均匀,P3 行 J4 一格独深,P5/P6 两行地形相近——三条读表规律全在这张图里。
漏的管J1J2J3J4J5J6
P00.1230.1230.1230.1230.1230.123
P10.2430.5250.4740.4400.3020.257
P20.2390.6791.4461.3420.5170.300
P30.2340.5601.7782.5090.7570.346
P40.2330.4421.1932.2031.1470.423
P50.2400.3220.5990.9131.1540.564
P60.2430.2590.3060.3480.4200.452

读这张表读出三条规律,后面全部结论都从它长出来:

  1. 每行一个"地形":P3 漏时 J4 降 2.509 m 最狠(紧挨着),J1 只降 0.234 m——距离衰减在每行都成立,行与行地形不同,这就是可区分性的来源。
  2. 有些行长得像:P5 行与 P6 行都是"J5/J6 一侧多降、J1 一侧少降"的地形,只差幅度——第六章的平局已在这张表里埋下伏笔。
  3. P0 行是平的:总管漏水让六个节点均匀各降 0.123 m。均匀 = 没有空间模式 = 后续任何匹配都无从下手(第七章专门讲这个结构性盲区)。

指纹库有三个工程属性值得强调。其一,离线一次成本:N 根候选管 = N 次仿真,建库在漏发生前完成;在线定位时刻不跑任何水力仿真,只做向量匹配,毫秒级。其二,固定漏口不碍事:库用统一 A=0.001 m² 的教学漏口,漏口变大各监测点压降近似等比放大、空间形状不变——而匹配刻意只看形状不看幅度,所以一套库对付各种大小的漏。其三,库的质量上限 = 模型的质量:指纹是模型算的,糙率、管径与实际不符指纹就失真;演示网糙率统一 C=100 是教学设定,工程上糙率须用实测压力标定后指纹才可信。

指纹的物理:压降模式是流量重分配的"影子"

第一章从分工角度回答了"为什么只用压力",这里给物理层面的答案,质询时更硬。漏水这件事在管网里的完整因果链是:洞出现 → 管段流量重新分配(水厂多供、各管流量按阻力重新分摊、有的管甚至倒流,前一章的流量列全看到了)→ 每根管流量变了,沿程损失 h=RQ1.852h=R\,Q^{1.852} 就变了 → 各节点水头跟着变

也就是说,压降的空间模式 = 流量重分配经能量方程投影出来的"影子"。拿压力做匹配,不是放弃了流量信息,而是流量变化的空间信息已经被能量方程编码进压力场——用便宜的压力表读到了贵的流量计才能直接测的东西。反过来问:直接测流量不是更直接吗?两个现实障碍——流量计贵一个量级以上、密布不经济;而装在边界的流量计只有总量,总量只回答"漏多少",永远回答不了"漏在哪"。压力表便宜、可密布,密布才有空间分辨率。


六、匹配算法:残差 → 去均值 Pearson → softmax

现在切换到在线时刻:P5 真的漏了(我们假装不知道),三块表传回读数。

第一步:残差 r,三个减法

把读数变成残差——基线减实测:

基线 (m)实测 (m)残差 r = 基线 − 实测 (m)
J139.88939.6480.240
J339.63539.0360.599
J539.70138.5461.154

r=[0.240,  0.599,  1.154]  mr = [\,0.240,\;0.599,\;1.154\,]\;\text{m}

教学口径用零噪声"完美实测"——直接取上一章收敛解表里三块表位置的压力,相当于假设仪表完全准、模型完全对。注意 r 恰好就是指纹表里 P5 那行的 J1/J3/J5 三列——零噪声下真值行跟残差是同一个向量,这是自洽性的基本检验。接下来的问题就一句话:指纹库 7 行里,哪行长得最像 r?

▶ 这一步开始,交互演示版的"单次定位"演示最适合边读边玩:点任意管道设为漏点,右侧概率条就按下面这套算法当场重算。

第二步:为什么不能直接比,先去均值

最朴素的想法是拿 r 跟每行算夹角余弦,谁大谁像。这样做会失败:漏水让三块表全都在降(r 三个分量全正),指纹库每行也全正——所有向量都朝着"全降"这个大方向,谁跟谁的余弦都 >0.95,全体"很像",等于没比。信号处理里这叫共模分量淹没差模分量

解法是先去均值:把"大家都在降"的公共部分减掉,只留"谁比平均多降、谁比平均少降"的相对模式:

r 的均值=0.240+0.599+1.1543=0.664,r~=r0.664=[0.424,  0.066,  +0.490]r\text{ 的均值}=\frac{0.240+0.599+1.154}{3}=0.664,\qquad \tilde r = r-0.664 = [\,-0.424,\;-0.066,\;+0.490\,]

读出来就一句话:"J1 比平均少降 0.42,J5 比平均多降 0.49"——这才是漏点位置的签名,跟漏多大无关。

残差 r 与去均值残差 r̃ 的对比条形图:去均值把三个全正的值拉成一正一负的相对模式
上:原始残差 [0.240, 0.599, 1.154] 三个全正,共模淹没差异;下:减去均值 0.664 后,[−0.424, −0.066, +0.490] 一正一负,J1 少降、J5 多降的位置签名才显出来。

去均值的第二重红利是尺度不变:漏口变大,r 整体近似等比放大,去均值再归一后方向不变——所以匹配不需要预知漏口大小,一套指纹库对付各种规模的漏。代价也在这一步埋下:去均值吃掉一个自由度,M 块表只剩 M−1 维(下一章细算这笔账)。

第三步:去均值后的余弦 = Pearson 相关

指纹库每行 SiS_i 同样去均值(记 S~i\tilde S_i),跟 r~\tilde r 算夹角余弦——这个量在统计里就叫 Pearson 相关系数:

scorei=r~S~ir~S~i[1,+1]\text{score}_i = \frac{\tilde r \cdot \tilde S_i}{\lVert \tilde r\rVert\,\lVert \tilde S_i\rVert}\in[-1,+1]

分子是 m²、分母是 m×m,单位约掉、score 无量纲——量纲层面再次印证:匹配只看模式方向,不看漏多大。拿 P6 这行完整手算一遍(挑它是因为结果最出人意料):

  • ① P6 指纹(J1/J3/J5 列)= [0.243, 0.306, 0.420],均值 0.323,去均值 S~P6=[0.080,0.017,+0.097]\tilde S_{P6}=[-0.080,-0.017,+0.097]
  • ② 点积 = (0.080)(0.424)+(0.017)(0.066)+(0.097)(0.490)=0.0339+0.0011+0.0475=0.0826(-0.080)(-0.424)+(-0.017)(-0.066)+(0.097)(0.490)=0.0339+0.0011+0.0475=0.0826
  • ③ 范数 S~P6=0.0802+0.0172+0.0972=0.1267\lVert\tilde S_{P6}\rVert=\sqrt{0.080^2+0.017^2+0.097^2}=0.1267r~=0.4242+0.0662+0.4902=0.6514\lVert\tilde r\rVert=\sqrt{0.424^2+0.066^2+0.490^2}=0.6514
  • ④ score = 0.0826÷(0.1267×0.6514)0.9990.0826\div(0.1267\times 0.6514)\approx \mathbf{0.999}

注意这个 0.999:P6 根本没漏,它跟残差的相关竟然接近满分。原因是 P6 的去均值方向("J1 少降、J5 多降")跟真凶 P5 几乎同款,只差幅度——而幅度恰恰被尺度不变性抹掉了。这不是算错,是三块表视角下两根管物理上就长一样,下面 softmax 和自由度两节把这件事的后果和根源讲透。

这里值得停一下体会 Pearson 到底在比什么。它比的不是"两个向量数值接近",而是"两个向量的形状趋势一致":先各自减掉自己的平均水平,再看去掉平均后剩下的起伏是否同向同比例。这正是我们要的——漏点大小影响的是幅度、漏点位置影响的是形状,用一个天然把幅度归一化掉的相似度,等于让匹配自动只对"位置签名"敏感,对"漏多大"免疫。代价就是像 P5、P6 这样形状本就接近的两根管,Pearson 会诚实地给出接近的高分,而不会替我们编造一个并不存在的区分度。

第四步:softmax 把 7 个分数变成 7 个概率

Pi=eβscoreij=17eβscorej,β=8P_i = \frac{e^{\beta\cdot\text{score}_i}}{\sum_{j=1}^{7} e^{\beta\cdot\text{score}_j}},\qquad \beta = 8

β 是把"分数差"放大成"概率差"的显示旋钮:单调变换不改排序,只改置信度的显示对比度。本例 P5 与 P4 分差 0.23,经 e8×0.236.3e^{8\times 0.23}\approx 6.3 倍放大后呈现 46% : 7.5%;β 取 2 会显得"大家都差不多",取 20 会假装斩钉截铁。8 是演示的展示取值;工程上若要输出校准概率,β 应由历史验证数据标定。

七根管全部算完(去均值指纹、Pearson、e8scoree^{8\cdot\text{score}}、softmax 概率,一列不落;中间量保留 3 位小数):

去均值指纹 S~\tilde S (m)Pearsone8scoree^{8\cdot\text{score}}softmax 概率
P0[0, 0, 0] ← 平指纹归零~01.10.0%
P1[−0.097, +0.134, −0.037]+0.1262.70.0%
P2[−0.495, +0.712, −0.217]+0.0982.20.0%
P3[−0.689, +0.855, −0.166]+0.2155.60.1%
P4[−0.624, +0.335, +0.289]+0.772479.77.5%
P5[−0.424, −0.066, +0.490]+1.0002981.046.4%
P6[−0.080, −0.017, +0.097]+0.9992958.746.0%
Σ = 6431100%

分母 7 项全摆出来:2981.0+2958.7+479.7+5.6+2.7+2.2+1.1=64312981.0+2958.7+479.7+5.6+2.7+2.2+1.1=6431,于是 PP5=2981/6431=46.4%P_{P5}=2981/6431=46.4\%PP6=2959/6431=46.0%P_{P6}=2959/6431=46.0\%PP4=480/6431=7.5%P_{P4}=480/6431=7.5\%

七根管 softmax 概率条形图:P5、P6 并列 46% 附近,P4 独一档 7.5%,其余趴平
七管概率排名。P5 满分 1.000(真凶自比),但 P6 以 0.999 紧咬其后——两根条几乎一样高,这就是下面要讲的"平局"。P2/P3 方向拧着,直接出局。

三个读表点:P5 满分 1.000——零噪声下真值行跟残差就是同一向量,理所应当;P2/P3 直接出局——它们的签名是"J3 比平均多降",跟 r 的"J3 略少降"方向拧着,匹配真的在看模式方向;P0 的 Pearson 严格说无定义(零向量没有方向),代码分母加 1e-12 除零保护后输出浮点残渣,工程上当 0——总管漏对本方法彻底隐身。

平局怎么读:名义命中 = 掷硬币

3 表下 P5 真漏,若用全程机算(不做中间四舍五入)输出 46.3% : 46.0%[脚注 ★]。两种读法差别巨大:

  • 错误读法:"top-1 是 P5,命中了。"——拿这个去报统计口径,3 表方案的零噪声 top-1 命中率好看得很,但它掩盖了真实的决策状态。
  • 正确读法:"P5 和 P6 分不开,二选一等于掷硬币,两根管都得列入排查。"——领先幅度 0.3 个百分点(pp,两个百分数相减的绝对差)在任何噪声下都会被抹掉。

脚注(口径互证):手算口径(中间量保留 3 位小数)为 46.4% : 46.0%,全程机算口径为 46.3% : 46.0%——两者的 0.1 pp 差异仅来自中间量的舍入位数,互相印证而非矛盾。本文两个数字都保留,正是要说明"这点差异无关排序,P5/P6 就是分不开"。

把两根管的去均值指纹并排看,平局的物理一目了然:P5 [−0.424, −0.066, +0.490] 与 P6 [−0.080, −0.017, +0.097] 是同款方向、只差幅度,两方向 Pearson = 0.9991。物理原因:P5(J5–J6)和 P6(J6–J1)都挂在环的左下角,从三块表的视角看,它俩漏水激起的相对模式几乎一样,而幅度差异恰被尺度不变性抹掉。三块表物理上就分不开它俩,46:46 是诚实的输出——这正是"输出必须带置信度"的活例证:概率排名把"我不确定"如实说了出来,一个只报坐标的黑箱在这里会假装自信。为什么恰恰是三块表分不开、加哪块表能分开?这是下一章自由度的账。


七、自由度与装表阶梯:装几块、装在哪

自由度的账:M 块表,只有 M−1 维分辨空间

去均值不是免费的:M 个读数减掉公共均值后,分量之和恒等于 0——向量被压进一个 M−1 维子空间。这笔账决定了方法的信息上限:

表数 M去均值后维度 M−1几何图景
327 根管的指纹方向挤在一张 2 维平面上——必然有人挤在一起
21只剩一条数轴,每个指纹退化成一个比值("J1 和 J5 谁多降")
10一个数减自身均值恒为 0,残差成零向量——数学上恒失明,不是"更模糊"

本网 3 表 = 2 维平面要摆 7 个方向,挤出的重合不止一对。撞上的 P5/P6 就是上一章的平局。这个账同时给出破局思路:加表 = 升维,把挤在一起的方向撑开。P5、P6 的差异藏在 J6 列(指纹表:0.564 vs 0.452 m),而 J6 恰好没装表——装上,指纹从 3 维变 4 维,新维度上两根管一个 −0.075、一个 +0.096(一负一正,方向劈开),Pearson 从 0.9991 掉到 0.657,输出从 46:46 变成 P5 独占 83.4%。维度不够,算法再花哨也分不开共线的候选;这是信息论限制,不是算法缺陷。

再看一张逐工况明细,把 7 根管逐一设为真漏,零噪声下看 top-1 置信度和领先幅度(3 表 vs 6 表全装):

真漏3 表基准(J1/J3/J5)6 表全装
P014.3%(0.0 pp,失明)14.3%(0.0 pp,失明)
P132.5%(0.1 pp)85.9%(74.9 pp)
P232.9%(0.1 pp)53.1%(22.6 pp)
P332.3%(1.1 pp)44.8%(17.3 pp)
P459.4%(48.6 pp)52.5%(20.2 pp)
P546.3%(0.3 pp)83.3%(74.6 pp)
P647.0%(0.3 pp)92.6%(85.4 pp)

重要发现:3 表下打平的不止 P5/P6——上路 P1/P2/P3 也是三胞胎,彼此领先只有 0.1 pp。2 维平面挤 7 个方向,挤出的重合同时发生在两组候选身上。另外注意 6 表下 P4 的置信反而比 3 表低(52.5 < 59.4)——置信度是相对量,加表改变的是所有候选间的相对几何,个别工况的显示置信可以降,但命中能力不降。

装表阶梯:表数 6→1 的性能实验

前面所有分析都指向同一个工程问题:**装几块表够用?**回答它需要一个干净的对照实验,设计如下——指纹库用那张 7×6 表全程不变("装几块表"= 匹配时遮住几列,变量唯一,归因干净);匹配算法与前面一字不差;每个监测值叠 N(0, σ=0.02 m) 噪声(±2 cm 是常规在线压力表精度量级,不加噪声命中率会虚高);每工况 500 次独立加噪(二项波动约 ±2 pp,足以分辨档位间真差异);加表序列嵌套(J5 ⊂ J1/J5 ⊂ J1/J3/J5 ⊂ +J6 ⊂ +J2 ⊂ +J4,逐档只动一块表);统计口径 top-1 / top-3 命中率,除 P0(P0 任何表数下恒失明,混进来只会给所有档位垫一个常数损失)。

▶ 这一节的整张阶梯表,在交互演示版里可以点"现场跑"——浏览器当场对 6 档表数 × 6 个真漏工况 × 500 次加噪做完整匹配统计(共 18000 次反演),换一批随机数重跑,结果应在参考值 ±3 pp 内复现。这就是"数字不是编的"的现场证据。

主阶梯表:

表数监测点真漏 P5:top-1 及置信领先第二名噪声 top-1(除P0)噪声 top-3(除P0)
6J1–J6 全装P5 83.3%74.6 pp100.0%100%
5−J4P5 78.7%66.0 pp100.0%100%
4基准+J6P5 83.4%72.6 pp81.6%100%
3基准 J1/J3/J5P5 46.3%0.3 pp(掷硬币)70.5%100%
2J1/J5P5 16.7%0.0 pp16.7%50.3%
1J5P6 14.3%(=1/7 纯猜)0.0 pp16.7%50.0%
装表阶梯双折线:横轴表数 1→6,top-1(蓝)与 top-3(绿)命中率随表数上升,3 表处 top-3 已达 100%
装表阶梯(除 P0 口径)。绿线 top-3 在 3 表处已到 100%——三块表对"缩小到三根管排查"已经够用;蓝线 top-1 到 5 表才封顶。两线之间的落差,就是"要不要精确到一根管"的装表成本。3→2 之间的断崖清晰可见。

阶梯上的三个拐点

  1. **3 → 2 是悬崖,不是缓坡。**3 表还有 2 维可用(除 P0 top-1 70.5%,top-3 兜底 100%);2 表只剩 1 维——去均值后每个指纹退化成"J1 和 J5 谁多降"一个比值,top-1 直接塌到 16.7%(≈1/6 纯猜),top-3 都只剩 50%。往下减表不是渐进降级,是断崖失能。
  2. **1 表 = 数学上恒失明,不是"更模糊"。**一个数减自身均值恒等于 0,残差成零向量,跟任何指纹都算不出相似度——概率条永远平分 1/7。单表能做的只有"压力比平时低了"的告警,定位能力严格为零。这条给出压力监测点数的绝对下限:想参与定位,至少两块;想有实用精度,至少三块。
  3. **第 6 块表(J4)白装。**5 表和 6 表的噪声命中率一模一样(除 P0 均 100%)——J4 的信息被 J3/J5 两侧夹着,基本冗余。表不是越多越好,够拆开所有混淆对就到顶了,之后每块都是纯成本。

把三个拐点连起来读,就是装表数量的决策法则:从下限往上加,每加一块问一句"它拆开了哪对混淆"——拆得开就加,拆不开就停。本演示网的答案是 4 块(top-1 81.6%、top-3 100%);具体数值随管网变,但"边际收益递减 + 明确到顶点"的曲线形状是普适的。

值得强调的是,这条曲线本身就是装表数量论证的正确交付物。工程评审里常见的争论是"到底装 3 块还是 5 块",各执一词却谁也拿不出依据;而只要把这张阶梯跑出来,讨论立刻从"拍数字"变成"读曲线"——甲方要的是最低成本的告警,那 2 块以上都不够、必须至少 3 块托底;要的是能定位到单根管,那曲线告诉你 4 块封顶、第 5、6 块纯属浪费。把选择权连同其代价一起摆上桌,比给一个孤零零的推荐数字负责得多,也经得起质询。

第 4 块表加哪:位置 > 数量

固定 3 表基准,第 4 块表的三种加法(全部机算):

方案真漏 P5:置信 / 领先噪声 top-1(除P0)拆开了谁没拆开谁
+J683.4% / 72.6 pp81.6%P5/P6(0.3 pp → 72.6 pp)上路 P1/P2/P3 仍挤
+J245.0% / 0.3 pp88.5%上路三胞胎P5/P6 仍掷硬币
+J450.3% / 4.6 pp87.5%上路三胞胎(部分)P5/P6 基本仍混
第 4 块表位置对照条形图:+J6/+J2/+J4 三方案在"P5 置信"与"平均命中"两指标上此消彼长
第 4 块表加哪。+J6 专治 P5/P6(置信冲到 83.4%),但平均命中一般;+J2 平均命中最高(88.5%)却对 P5/P6 无能为力。同样一块表的钱,加对位置与加错位置对目标混淆对是 72.6 pp 与 4.6 pp 的天壤之别。

三个方案给出三种截然不同的性格:+J6 专治 P5/P6,但对上路三胞胎帮不上;+J2 的平均命中率反而最高(88.5%),可 P5/P6 照样掷硬币;+J4 居中两不沾。没有免费的万能第 4 块。这就把装表点位优化的正确顺序钉死了:先仿真找出易混淆管对 → 按"要拆开谁"定点位,而不是按几何均匀撒点。目标函数必须先想清楚:全网平均命中优先选 +J2,重点保护某片区(比如那里管材老化、漏损高发)选拆开该片区混淆对的点位。

附一个反直觉细节:5 表的 P5 置信 78.7% 反而低于 4 表的 83.4%——加一块对该工况没信息的表(J2)会稀释置信度的显示对比度,但不降命中(5 表 top-1 仍 100%)。置信度是相对量,别拿它单独当性能指标;决策看命中率。

P0 盲区:信息论上的必然

指纹表里 P0(总管)那行是平的:六个节点均匀各降 0.123 m。均匀降压去均值后成零向量——没有空间模式可供任何匹配算法区分。这不是算法缺陷,是信息论上的必然:总管站在水源与全网之间,它漏水等于"全网水源水头集体下移",每个节点感受完全一样,装多少块压力表都一样失明。

兜底手段回到漏斗第①级——总管漏水虽然在压力"模式"上隐身,在流量"总账"上却无处遁形:水厂供水量激增而各分区计量没有对应增长,DMA 夜间最小流量分析立刻暴露。所以完整的漏损监测方案必然是两条腿:支管/环内管漏(有空间模式)由压力指纹法定位到管,总管类均匀降压漏由流量对账兜底。两法覆盖的盲区恰好互补——这也是"压力定位 + 流量发现"作为组合拳而非二选一的根本理由。


八、边界、结论与备查

诚实边界:这套数字覆盖什么、不覆盖什么

主动声明四条边界:

  1. 教学演示网:全部数字来自 6 节点网的零噪声/加噪合成实验,展示的是方法机理和规律形状,不是实战成绩。管网参数(糙率统一 C=100 等)为教学设定。
  2. 单漏点假设:多点同漏时残差是几个指纹的叠加,单指纹匹配可能指到中间某根无辜管,需扩展组合匹配。
  3. 零模型误差假设:指纹库是模型算的,糙率/管径不准 → 指纹失真 → 排序被带偏。工程上指纹库可信的前提是管网模型经实测压力标定
  4. 需水波动未建模:实验里基线是完美已知的;实际中用户用水时刻在波动,残差里混着需水噪声——工程对策是在夜间最小流量时段测(需水最稳),并用多时刻读数平均压噪声。

方法什么时候失效,判据是信噪比。本演示的漏很大(0.02063 m³/s ≈ 全网正常用水的 86%),最大压降信号 1.15 m ≫ 噪声 σ=0.02 m,所以 3 表也有 70% 命中。漏口越小、离监测点越远,信号越弱;当指纹幅值跌到与噪声同量级,分数整体坍平、top-1 退向纯猜。这不改变方法的定位——它本来就是漏斗中段的缩小范围工具(top-K 清单 + 现场确认),不是一锤定音的仪器。

结论:四条

  1. 方法定位:压力指纹法输出 top-K 概率清单,把"全网排查"缩小到"两三根管",再由听漏仪定桩——它是排查漏斗的中段,不替代人工确认;概率里的置信度信息(领先幅度)本身就是行动依据。
  2. 装表数量:不是越多越好。本演示网上 4 块表即拆开目标混淆对(top-1 81.6%,top-3 100%),第 6 块完全白装;3→2 是悬崖,2 块以下方法失效。表数论证应给出整条边际收益曲线,而不是拍一个数。
  3. 装表位置 > 数量:同样加 1 块表,加对位置(+J6)与加错位置对目标混淆对是 72.6 pp 与 4.6 pp 的差距。正确流程 = 先仿真找易混淆管对,再按混淆对定点位。
  4. 盲区与兜底:总管类"均匀降压"漏损对压力模式法结构性免疫,必须与流量对账(DMA 夜间最小流量)互补成完整方案——压力定位、流量发现,两条腿缺一不可。

备查问答(质询预置)

Q1 · β=8 是怎么定的?换个 β 结论会变吗? β 是把"分数差"放大成"概率差"的显示旋钮,单调变换不改排序——top-1 是谁、命中率多少与 β 无关。本例 P5 与 P4 分差 0.23,经 e8×0.236.3e^{8\times 0.23}\approx 6.3 倍放大呈现 46% : 7.5%;β 取 2 会显得"大家都差不多",取 20 会假装斩钉截铁。8 是演示的展示取值;工程上若要输出校准概率,β 应由历史验证数据标定。

Q2 · 指纹库用固定 0.001 m² 漏口建库,实际漏口大小不同怎么办? 匹配用去均值 Pearson,只看压降空间形状不看幅值(尺度不变);漏口变大,各监测点压降近似等比放大,形状不变,一套库通吃。这个近似在大漏显著激活 PDA 折减区时开始失真,属已知边界。

Q3 · 为什么仿真必须 PDA(压力驱动)?漏量要不要作为输入给定? 漏损是耦合问题:漏水压降 → 压降抑制漏量和用水量 → 反过来又影响压力,直到平衡。PDA 把实际出水量写成压力的函数(Wagner 三段式),这个反馈闭环只有 PDA 能表达。漏量不是输入——你给的只有漏口几何(A、Cd),漏多少由漏点压力经孔口方程在联立求解中自己出来(0.02063 m³/s 代回洞方程逐位闭合)。

Q4 · 模型要给"初始条件"吗? 分两层。系统层面不需要:本网无水池/水塔,没有储存性状态量,描述它的是代数方程组不是微分方程,不存在"t=0 状态"。求解器层面需要但自带:Newton 迭代的出发点由软件内置(水头=高程、管流量=0.001 m³/s 等),只影响收敛快慢、不影响收敛到哪——解由方程组本身唯一确定。

Q5 · top-3 兜底 100% 是什么含义?为什么它比 top-1 更工程相关? 漏斗第③级的实际动作是"沿嫌疑管逐根听漏"。top-3 = 100% 意味着按清单前三根排查必然抓到真凶——排查工作量从 7 根封顶到 3 根。3 表方案 top-1 只有 70.5% 但 top-3 已 100%,所以"3 块表够不够"的答案取决于你接受的排查工作量:接受查三根,够;要求一击即中,上 4 块。

Q6 · 这套流程搬到更大的管网,哪些环节变、哪些不变? 不变的:四步链条(建库→残差→去均值 Pearson→softmax)、自由度账(M 块表 M−1 维)、"先找混淆对再定表位"的点位逻辑、P0 型盲区与流量对账互补的结构。变的:候选集从 7 根管变成按管段/分区划分的 N 个候选(矩阵变大);指纹库须在标定过的管网模型上重建;混淆对结构由实际拓扑决定,须重新仿真识别;噪声口径按实际表精度与需水波动标定。方法论完整迁移,数字全部重算。


一句话收束:几块压力表能把漏点定位到哪条管,答案不玄——它由一条 Hazen-Williams 公式、一次去均值 Pearson 匹配、和 M−1 维的自由度账共同决定。装几块、装在哪,不该拍脑袋,而应让上面这整条边际收益曲线来回答。全文两处 live 演示可在交互页当场重跑,每一个中间数字都摆在明面上,欢迎拿计算器抽验任何一格。