4. 回灌试验流量稳定性检验与恒定流量时段筛选

为什么恒定流量假设需要“检验”而不是“假定”

稳定流求参公式(如 Dupuit、Thiem 型公式)要求回灌流量 Q 在整个计算时段内为常数。实际回灌记录中,Q 会因泵况波动、管路切换、阀门微调、水位反馈控制等原因持续小幅抖动,也可能出现台阶式调整。若直接把整段记录当作恒定流量,平均流量会被非稳定段“污染”,导致渗透系数、井损系数等参数出现系统性偏差。因此需要一套可量化的判据,从原始流量序列中筛出真正满足恒定流量假设的时间窗口。

本例采用两级判据:滑动标准差刻画窗口内的绝对波动幅度,相对偏差刻画每个采样点相对窗口均值的偏离程度。两者结合可同时排除“整体缓慢漂移”和“个别尖峰”两类非恒定情形。

判据定义与参数选择

设流量序列为 Qi(i=1…N),采样间隔 Δt。对以 i 为中心的滑动窗口 W(长度 L 个采样点):

  • 窗口均值:Q̄i = (1/L)·Σ Qj,j∈W
  • 滑动标准差:si = sqrt( (1/(L−1))·Σ (Qj−Q̄i)² )
  • 相对偏差:δj = |Qj−Q̄i| / Q̄i × 100%

恒定流量判据(示例阈值,需按现场精度调整):si ≤ smax(如 0.5 m³/h)且窗口内所有 δj ≤ δmax(如 5%)。连续满足判据且长度不小于 Lmin(如 30 min)的区段即为候选恒定流量时段。

阈值不是普适常数:流量计精度 1%、目标求参精度 5% 时,δmax 取 3%~5% 较合理;smax 应结合典型 Q 量级设定,约为 Q̄ 的 1%~2%。
流量序列 → 滑动统计 → 判据筛选 → 恒定流量时段 ① 原始回灌流量 Q(t) Q t 台阶调整 尖峰 小幅抖动 ② 滑动标准差 s(t) 与相对偏差 δ(t) s / δ 阈值 超限 超限 ③ 恒定流量时段筛选结果 窗口A 通过 窗口B 通过 窗口C 剔除 窗口D 剔除 窗口E 通过 判据筛选 通过窗口合并 → 输出恒定流量时段及平均流量 Q̄,供稳定流求参使用

实现:滑动统计与窗口筛选

下面给出可直接运行的 Python 实现。输入为两列数据:时间(分钟)与流量(m³/h),采样间隔 1 min。代码完成滑动标准差、相对偏差计算,并按判据合并连续通过窗口,输出恒定流量时段与平均流量。

import numpy as np
import pandas as pd

# ---------- 示例数据(教学假设,非实测) ----------
np.random.seed(7)
t = np.arange(0, 240, 1)                      # 0~239 min
Q = 20.0 + np.random.normal(0, 0.15, len(t))  # 基准 20 m³/h,小幅抖动
Q[80:100] += 2.5                              # 台阶抬升
Q[150] += 4.0                                 # 单点尖峰
df = pd.DataFrame({"t_min": t, "Q": Q})

# ---------- 参数 ----------
L = 15            # 滑动窗口长度(采样点数,15 min)
s_max = 0.5       # 滑动标准差阈值 m³/h
delta_max = 5.0   # 相对偏差阈值 %
L_min = 30        # 最短恒定流量时段(min)

# ---------- 滑动统计 ----------
Qv = df["Q"].values
n = len(Qv)
s_arr = np.full(n, np.nan)
delta_max_arr = np.full(n, np.nan)

for i in range(n):
    lo = max(0, i - L // 2)
    hi = min(n, i + L // 2 + 1)
    win = Qv[lo:hi]
    if len(win) < 3:
        continue
    qbar = win.mean()
    s_arr[i] = win.std(ddof=1)
    delta_max_arr[i] = np.max(np.abs(win - qbar)) / qbar * 100

df["s"] = s_arr
df["delta_max"] = delta_max_arr

# ---------- 判据 ----------
df["pass"] = (df["s"] <= s_max) & (df["delta_max"] <= delta_max)

# ---------- 合并连续通过窗口 ----------
segments = []
start = None
for i, ok in enumerate(df["pass"].values):
    if ok and start is None:
        start = i
    elif not ok and start is not None:
        segments.append((start, i - 1))
        start = None
if start is not None:
    segments.append((start, n - 1))

# ---------- 长度过滤并输出 ----------
results = []
for a, b in segments:
    dur = df["t_min"].iloc[b] - df["t_min"].iloc[a] + 1
    if dur >= L_min:
        q_mean = df["Q"].iloc[a:b+1].mean()
        results.append({
            "start_min": int(df["t_min"].iloc[a]),
            "end_min": int(df["t_min"].iloc[b]),
            "duration_min": int(dur),
            "Q_mean": round(q_mean, 3),
            "s_mean": round(df["s"].iloc[a:b+1].mean(), 3)
        })

print(pd.DataFrame(results).to_string(index=False))

示例数据下预期输出(教学示例,非实测):窗口 A 约 0~79 min、窗口 B 约 100~149 min、窗口 E 约 151~239 min 通过;80~99 min 台阶段与 150 min 尖峰附近被剔除。各窗口平均流量应接近 20 m³/h,台阶段因 Q 抬升被排除。

结果判读与常见问题

现象可能原因处理建议
通过窗口过短或为零阈值过严;流量计噪声大先检查流量计精度,再按 Q̄ 的 1%~2% 放宽 s_max
台阶段被误判为通过窗口长度 L 过大,台阶被平滑减小 L 至台阶持续时间的 1/2 以下
尖峰未被剔除δ 判据只取窗口最大偏差,尖峰落在窗口边缘改用逐点 δ 判据,或对 Q 先做 3σ 剔除
多个窗口平均流量差异大存在未识别的缓慢漂移对通过窗口做趋势检验(Mann-Kendall),必要时分段求参
滑动窗口在序列首尾存在边界效应:首尾各 L/2 个点的统计量基于不足 L 个样本,可靠性下降。若恒定流量时段靠近记录端点,应结合原始曲线人工复核,或改用单侧扩展窗口。

筛选完成后,将各通过时段的起止时间、平均流量与滑动标准差记录为求参输入清单。后续稳定流求参应优先选用持续时间最长、s 最小的时段;若多个时段平均流量差异超过 δmax,说明回灌状态发生了实质变化,应分别求参并比较结果的一致性。