4. 辅机排烟温度异常检测的滑动统计实现
为什么排烟温度不能只用一个固定阈值
发电柴油机的排烟温度本身随负荷变化很大:50% 负荷时可能在 320 ℃ 左右,90% 负荷时可能升到 400 ℃ 以上。若直接设一个固定上限(例如 420 ℃),低负荷时几乎不会报警,高负荷时又容易频繁误报。更合理的做法是让阈值随负荷自适应,而滑动统计正是实现这种自适应的轻量手段。
本节以某船 3 号发电柴油机为对象,采集 6 个缸的排烟温度与机组负荷率,采样周期 1 s。核心思路是:对每个缸的排烟温度计算滑动均值 μ_t 与滑动标准差 σ_t,用 μ_t + k·σ_t 作为自适应上限,并与固定阈值方案对比误报次数。
滑动统计的实现细节
滑动窗口长度 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-1 点)不判异常,避免 σ 未建立时的虚假告警。
- 对比时两方案必须使用同一段数据、同一 hold 值,否则误报次数不可比。
- 自适应方案在负荷爬升段应明显少于固定阈值;若差异不明显,检查 k 是否过大或 N 是否过长。
- 真实故障段两方案都应触发;若自适应方案漏报,说明 k 偏大或 σ 被异常点自身抬高,可改用中位数绝对偏差(MAD)替代标准差。