代码¶
评估实现 — 频率偏移 → 刚度损失 → 分级
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}\) 的微分关系) - 频率上升(可能因温度等环境因素)不视为损伤
- 置信度随严重程度递增——重度损伤的判断比轻度更可靠