第3章:故障检测基础——残差生成、阈值设定与决策逻辑

各位同学,欢迎来到故障检测的核心环节。

说实话,故障检测这件事,说难不难,说简单也不简单。我见过太多项目,算法写得花里胡哨,结果一到现场就误报不断。为什么?因为最基础的残差生成和阈值设定没搞明白。

今天我们就来把这几个硬骨头啃下来。

3.1 残差生成——故障检测的“眼睛”

残差是什么?说白了,就是模型预测值和实际测量值之间的差值。

你想想看,如果系统健康运行,模型预测应该和实际测量差不多。一旦出现故障,这个差值就会变大。残差就是用来捕捉这个“不对劲”的信号。

核心思想:残差 = 实际输出 - 模型预测输出

健康时,残差 ≈ 0;故障时,残差 ≠ 0

我在项目中遇到过这样一个案例:一个电机驱动系统,刚开始用简单的残差检测,效果还行。但后来发现,负载波动也会引起残差变化,和故障信号混在一起。嗯,这里要注意——残差生成的关键在于模型精度。

3.1.1 基于解析模型的残差生成

这是最经典的方法。你需要一个数学模型来描述系统行为。

// 举个简单的例子:一阶系统
// 模型:y(k+1) = a*y(k) + b*u(k)
// 残差:r(k) = y_meas(k) - y_model(k)

double generate_residual(double y_meas, double u, double y_prev) {
    double y_model = 0.95 * y_prev + 0.05 * u;  // 模型参数
    double residual = y_meas - y_model;
    return residual;
}

我个人习惯用ARX模型(自回归带外生输入模型)来做残差生成。为什么?因为它结构简单,参数辨识方便,而且对线性系统效果很好。

3.1.2 基于观测器的残差生成

当系统有噪声时,直接比较模型输出和测量值会出问题。这时候就需要观测器了。

我记得有一次做飞行器故障诊断,传感器噪声特别大。直接用解析模型残差,误报率高达30%。后来换成卡尔曼滤波器做残差生成,误报率降到了5%以下。

我的经验:观测器残差对噪声有天然的抑制能力。如果你面对的是高噪声环境,优先考虑观测器方法。

3.2 阈值设定——别让故障检测变成“狼来了”

阈值设定是故障检测中最容易被忽视,但也是最容易出问题的一环。

阈值设得太小,系统天天误报,操作员会麻木。阈值设得太大,故障都发生了还没报警,那要你检测系统干嘛?

3.2.1 固定阈值法

最简单粗暴的方法。根据历史数据或经验,设定一个固定值。

// 固定阈值示例
double threshold_fixed = 0.5;

if (abs(residual) > threshold_fixed) {
    // 报警
    fault_flag = 1;
} else {
    fault_flag = 0;
}

我曾经在一个化工项目中用过固定阈值。刚开始觉得挺省事,结果发现不同工况下残差幅值差异很大。白天生产负荷高,残差波动大;晚上负荷低,残差很小。固定阈值根本没法用。

避坑指南:固定阈值只适用于工况稳定、噪声特性已知的系统。如果你的系统工况变化大,千万别用固定阈值。

3.2.2 自适应阈值法

既然固定阈值不行,那就让阈值跟着工况变。

自适应阈值的基本思路是:根据系统当前的工作点、噪声水平,动态调整阈值。

方法 原理 适用场景
基于统计的阈值 用残差的均值和方差计算阈值 噪声服从高斯分布的系统
基于模糊逻辑的阈值 用模糊规则调整阈值 工况变化大、非线性系统
基于机器学习的阈值 用历史数据训练阈值模型 数据充足、复杂系统
// 自适应阈值示例(基于滑动窗口统计)
double compute_adaptive_threshold(double residual, double[] window) {
    double mean = compute_mean(window);
    double std = compute_std(window);
    double threshold = mean + 3 * std;  // 3-sigma原则
    return threshold;
}

我个人比较推荐基于统计的自适应阈值。为什么?因为它有理论支撑,而且实现起来不复杂。你想想看,3-sigma原则在工程中用了多少年,可靠性是有保证的。

3.3 决策逻辑——从残差到故障判断

残差算出来了,阈值也设好了,接下来就是做决策。

但这里有个坑:单次残差超阈值,不一定就是故障。可能是噪声尖峰,可能是传感器毛刺。怎么区分?

3.3.1 瞬时决策

最简单:残差超过阈值就报警。

优点:响应快。缺点:容易误报。

我记得有一次做电机故障检测,用了瞬时决策。结果电机启动瞬间的电流冲击导致残差超阈值,系统疯狂报警。操作员差点把控制柜砸了。

3.3.2 持续性决策

连续N个采样点都超阈值,才判定为故障。

// 持续性决策示例
int consecutive_count = 0;
int threshold_count = 3;  // 连续3次超阈值才报警

if (abs(residual) > threshold) {
    consecutive_count++;
    if (consecutive_count >= threshold_count) {
        fault_flag = 1;
    }
} else {
    consecutive_count = 0;  // 一旦不超阈值,计数器清零
    fault_flag = 0;
}

这个方法我用了很多年,效果不错。它能有效过滤掉噪声尖峰和瞬态干扰。

3.3.3 累积和(CUSUM)决策

如果你需要检测微小但持续的故障,CUSUM是个好选择。

CUSUM的核心思想是:把残差累积起来,看累积量是否超过阈值。微小故障单次看不出来,但累积起来就很明显。

CUSUM决策逻辑:

S(k) = max(0, S(k-1) + r(k) - d)

其中d是允许的偏移量,S(k)是累积统计量

当S(k) > h时,判定为故障(h是决策阈值)

我曾经用CUSUM检测轴承早期磨损。刚开始磨损很轻微,残差变化只有0.01左右,瞬时决策根本检测不到。但CUSUM累积了100个采样点后,累积量明显上升,提前2周预警了故障。

3.4 知识体系总览

说了这么多,我们来画个图,把整个故障检测的流程串起来。

故障检测基础:残差生成 → 阈值设定 → 决策逻辑 系统输入/输出数据 残差生成 解析模型法 | 观测器法 r(k) = y_meas(k) - y_model(k) 阈值设定 固定阈值 | 自适应阈值 统计法 | 模糊法 | 机器学习法 决策逻辑 瞬时决策 | 持续性决策 | CUSUM 输出:故障标志位 关键要点 • 残差是故障的“影子” • 阈值决定灵敏度 • 决策逻辑决定可靠性 • 三者缺一不可 • 误报 vs 漏报的权衡 • 自适应优于固定 • 持续性决策更稳健 • CUSUM适合微小故障

3.5 实战中的避坑指南

最后,分享几个我踩过的坑,希望能帮大家少走弯路。

我曾经犯过的错误:

  • 直接用固定阈值,没考虑工况变化,结果误报率高达40%
  • 残差生成时忽略了传感器延迟,导致故障检测滞后严重
  • 决策逻辑只用瞬时判断,被噪声尖峰搞得焦头烂额

我的建议:

  • 先做数据预处理,滤波、去噪、归一化,别让脏数据毁了你的检测
  • 阈值设定要留有余量,别追求极致灵敏度
  • 决策逻辑至少用持续性判断,别用瞬时决策
  • 实际部署前,一定要用历史数据做离线测试

好了,故障检测的基础就讲到这里。记住:残差生成是眼睛,阈值设定是尺子,决策逻辑是大脑。三者配合好了,你的故障检测系统才能真正可靠。


公众号:蓝海资料掘金营,微信deep3321