4. 辅机排烟温度异常检测的滑动统计实现

为什么排烟温度不能只用一个固定阈值

发电柴油机的排烟温度本身随负荷变化很大:50% 负荷时可能在 320 ℃ 左右,90% 负荷时可能升到 400 ℃ 以上。若直接设一个固定上限(例如 420 ℃),低负荷时几乎不会报警,高负荷时又容易频繁误报。更合理的做法是让阈值随负荷自适应,而滑动统计正是实现这种自适应的轻量手段。

本节以某船 3 号发电柴油机为对象,采集 6 个缸的排烟温度与机组负荷率,采样周期 1 s。核心思路是:对每个缸的排烟温度计算滑动均值 μ_t 与滑动标准差 σ_t,用 μ_t + k·σ_t 作为自适应上限,并与固定阈值方案对比误报次数。

滑动统计计算链(单缸) 排烟温度 T_t 1 s 采样 滑动窗口 W N = 120 点 μ_t 与 σ_t 窗口内统计量 自适应上限 U_t = μ_t + k·σ_t 负荷率 L_t 用于分层校验 异常判据 T_t > U_t 且持续 ≥ 3 个采样点 → 触发预警 固定阈值 vs 自适应阈值(负荷波动场景) t ℃ 实际排烟温度 固定阈值 420 ℃ 自适应上限 μ+kσ 固定阈值误报区 真实异常(喷油器故障) 判读要点 • 负荷爬升段:固定阈值被正常温升穿越 → 误报 • 自适应上限随 μ 上移,正常温升不触发 • 真实异常点同时越过两条阈值线 → 均能检出 • k 取 3 时兼顾灵敏度与抗误报 • 需配合负荷分层,避免低负荷段 σ 过小导致过敏

滑动统计的实现细节

滑动窗口长度 N 决定统计量的平滑程度。N 太小,μ 和 σ 抖动大,阈值不稳;N 太大,对负荷突变的跟随变慢。对 1 s 采样的排烟温度,取 N = 120(约 2 min)是常见折中:既能覆盖一次负荷调整的过渡过程,又不至于把缓慢漂移完全抹平。

标准差采用总体标准差(除以 N),因为窗口内样本被视为当前工况的完整描述。为避免窗口初期样本不足导致 σ 失真,前 N 个点只计算均值、不判异常,称为预热期。

import numpy as np

def sliding_stats(temp, N=120):
    """返回滑动均值与滑动标准差序列,前 N-1 点为 NaN。"""
    t = np.asarray(temp, dtype=float)
    mu = np.full_like(t, np.nan)
    sd = np.full_like(t, np.nan)
    for i in range(N - 1, len(t)):
        w = t[i - N + 1:i + 1]
        mu[i] = w.mean()
        sd[i] = w.std(ddof=0)
    return mu, sd

def detect_adaptive(temp, N=120, k=3.0, hold=3):
    """自适应阈值异常检测,返回布尔告警序列。"""
    mu, sd = sliding_stats(temp, N)
    upper = mu + k * sd
    raw = temp > upper
    alarm = np.zeros_like(raw, dtype=bool)
    run = 0
    for i in range(len(raw)):
        if np.isnan(upper[i]):
            run = 0
            continue
        run = run + 1 if raw[i] else 0
        alarm[i] = run >= hold
    return alarm, mu, sd, upper

def detect_fixed(temp, limit=420.0, hold=3):
    """固定阈值异常检测,用于对比。"""
    raw = temp > limit
    alarm = np.zeros_like(raw, dtype=bool)
    run = 0
    for i, v in enumerate(raw):
        run = run + 1 if v else 0
        alarm[i] = run >= hold
    return alarm

两个检测器共用 hold=3 的持续判据,保证对比公平:只有连续 3 个采样点越限才计为一次告警,滤掉单点毛刺。

负荷波动场景下的对比验证

构造一段 30 min 的示例数据:前 10 min 负荷 55%,中间 10 min 负荷从 55% 爬升到 90%,最后 10 min 维持 90% 并在第 25 min 注入一次喷油器故障导致的单缸温升(约 +25 ℃)。以下为教学示例参数,用于说明方法差异,非实测结果。

方案阈值形式负荷爬升段告警真实故障段告警误报次数
固定阈值420 ℃多次触发(正常温升穿越)触发约 5~8 次
自适应阈值μ + 3σ基本不触发触发0~1 次

固定阈值在负荷爬升段的误报来自“正常温升被当成异常”;自适应阈值因为上限随 μ 同步上移,能吸收这部分温升。但要注意:若负荷长期稳定在低值,σ 会很小,此时 μ + 3σ 可能过于贴近均值,对正常的小幅波动也敏感。工程上可加一个下限保护,例如 U_t = max(μ_t + k·σ_t, μ_t + 8),避免 σ 塌缩导致过敏。

滑动窗口长度 N 与持续判据 hold 是两个独立参数:N 控制统计量的时间尺度,hold 控制告警的确认强度。调参时应先固定 hold=3,再在 60~180 点之间试 N,观察负荷爬升段与真实故障段的告警分离度。
滑动统计假设窗口内工况近似平稳。若负荷在窗口内剧烈变化,μ 和 σ 会被“混合工况”污染,阈值失真。对频繁变负荷的机组,应改用按负荷分层的滑动统计,或缩短窗口并配合负荷变化率门控。

结果判读与落地检查

  • 预热期(前 N-1 点)不判异常,避免 σ 未建立时的虚假告警。
  • 对比时两方案必须使用同一段数据、同一 hold 值,否则误报次数不可比。
  • 自适应方案在负荷爬升段应明显少于固定阈值;若差异不明显,检查 k 是否过大或 N 是否过长。
  • 真实故障段两方案都应触发;若自适应方案漏报,说明 k 偏大或 σ 被异常点自身抬高,可改用中位数绝对偏差(MAD)替代标准差。