4. 单测点位移速率计算与阈值初判
任务对象与计算口径
本节只处理一个测点的位移时间序列。输入为经过时间对齐与异常清洗后的序列 D = {(t_i, d_i)},其中 t_i 为统一时间基准下的时刻(单位 s),d_i 为累计位移(单位 mm,约定沿坡向向下为正)。输出为逐时刻的位移速率 v_i(mm/h)与预警状态序列 s_i。
速率采用中心差分,避免单侧差分带来的相位滞后:
v_i = (d_{i+1} - d_{i-1}) / (t_{i+1} - t_{i-1}) * 3600 (mm/h)
端点 i=0 与 i=n-1 使用单侧差分。阈值初判采用三档:v < 2 mm/h 为正常(NORMAL),2 ≤ v < 5 mm/h 为关注(WATCH),v ≥ 5 mm/h 为预警(ALARM)。阈值属于示例设定,实际工程应按边坡等级与监测设计取值。
逐时刻计算与状态判定
下面给出可直接运行的实现。示例数据为教学构造的 10 个时刻、采样间隔 600 s(10 min)的累计位移序列,用于演示计算路径与状态序列生成,不代表任何真实边坡实测结果。
import numpy as np
# 示例输入:统一时间基准下的时刻(s)与累计位移(mm)
t = np.array([0, 600, 1200, 1800, 2400, 3000, 3600, 4200, 4800, 5400], dtype=float)
d = np.array([0.0, 0.3, 0.7, 1.2, 1.9, 2.9, 4.4, 6.6, 9.5, 13.1], dtype=float)
WATCH_TH = 2.0 # mm/h
ALARM_TH = 5.0 # mm/h
def displacement_rate(t, d):
n = len(d)
v = np.zeros(n)
v[0] = (d[1] - d[0]) / (t[1] - t[0])
v[-1] = (d[-1] - d[-2]) / (t[-1] - t[-2])
for i in range(1, n - 1):
v[i] = (d[i + 1] - d[i - 1]) / (t[i + 1] - t[i - 1])
return v * 3600.0 # 换算为 mm/h
def classify(v, watch_th, alarm_th):
if v >= alarm_th:
return "ALARM"
if v >= watch_th:
return "WATCH"
return "NORMAL"
v = displacement_rate(t, d)
states = [classify(x, WATCH_TH, ALARM_TH) for x in v]
for ti, di, vi, si in zip(t, d, v, states):
print(f"t={ti:6.0f}s d={di:6.2f}mm v={vi:6.3f}mm/h state={si}")
按上述示例数据,中心差分得到的速率序列呈递增趋势:前段约 1.8 mm/h 处于正常区,中段越过 2 mm/h 进入关注区,末段超过 5 mm/h 进入预警区。端点单侧差分因区间较短,数值会略偏离相邻中心差分值,这是端点处理的正常现象,判读时应以中心差分结果为主。
速率—阈值—状态的关系
下图把本节的核心逻辑压缩为一张参数关系与状态映射图:左侧是位移序列经差分得到速率,右侧是速率落入三个阈值区间后映射出的状态,底部标出端点单侧差分的特殊处理位置。
结果判读与验证要点
- 速率符号:按“坡向向下为正”约定,正速率表示向坡外变形;若数据源采用相反约定,需在计算前统一取反,否则状态判定会整体错位。
- 端点值:首末时刻的速率由单侧差分得到,区间短、噪声敏感,建议在状态序列中标注为“端点参考值”,不单独作为升级预警的依据。
- 阈值边界:判定使用
≥闭区间,恰好等于 2 或 5 mm/h 时归入更高一档,避免边界值在实现间产生歧义。 - 验证方法:可用线性匀速序列
d = k·t做自检,此时所有中心差分速率应恒等于k×3600,端点单侧差分也应一致;若出现偏差,说明时间单位或差分索引有误。 - 状态序列用途:本节输出的是逐时刻状态,尚未做持续时长、连续超限次数等持续性判据,这些属于后续预警规则的内容,不应在本节提前引入。
若采样间隔不均匀,中心差分公式仍然成立,因为分母使用的是实际时间差
t_{i+1} − t_{i−1};但端点单侧差分在间隔差异较大时误差更明显,建议对端点单独标注置信度。