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)的区段即为候选恒定流量时段。
实现:滑动统计与窗口筛选
下面给出可直接运行的 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),必要时分段求参 |
筛选完成后,将各通过时段的起止时间、平均流量与滑动标准差记录为求参输入清单。后续稳定流求参应优先选用持续时间最长、s 最小的时段;若多个时段平均流量差异超过 δmax,说明回灌状态发生了实质变化,应分别求参并比较结果的一致性。