跳转至

代码

评估实现 — 频率偏移 → 刚度损失 → 分级

void tiny_damage_assess(const tiny_sysid_result_t *cur, tiny_damage_assess_t *out)
{
    memset(out, 0, sizeof(*out));
    if (!g_has_baseline || !cur || cur->n_modes < 1) return;

    int nm = min(cur->n_modes, g_baseline.n_modes);

    // ── 频率偏移 → 刚度损失 ──
    float sum = 0;
    int nv = 0;
    for (int m = 0; m < nm; m++) {
        float fb = g_baseline.frequencies[m];
        float fd = 100.0f * (cur->frequencies[m] - fb) / fb;
        if (fabsf(fd) < 0.1f) continue;  // 跳过无变化模态

        float dk = -2.0f * fd;   // Δk/k ≈ -2·Δf/f
        if (dk < 0) dk = 0;      // 频率上升不表示损伤
        sum += dk;
        nv++;
    }

    float loss = (nv > 0) ? (sum / nv) : 0;
    if (loss < 0) loss = 0;
    out->stiff_loss = loss;

    // ── 分级 ──
    if      (loss < 5.0f)   { out->level = DMG_NONE;     out->confidence = 0.3f; }
    else if (loss < 20.0f)  { out->level = DMG_MILD;     out->confidence = 0.6f; }
    else if (loss < 50.0f)  { out->level = DMG_MODERATE; out->confidence = 0.8f; }
    else                    { out->level = DMG_SEVERE;   out->confidence = 0.9f; }
}

关键逻辑

  • -2 · Δf/f 近似估计刚度损失(来自 \(f \propto \sqrt{k/m}\) 的微分关系)
  • 频率上升(可能因温度等环境因素)不视为损伤
  • 置信度随严重程度递增——重度损伤的判断比轻度更可靠