4. 峰值强度自动识别与人工复核规则

峰值识别的对象与判据

偏应力-轴向应变曲线上的“峰值”在数学上并不唯一:它可能是全局最大值,也可能是第一个显著局部极大值。工程上取峰值强度时,通常要求该点之后偏应力出现可观测的下降(软化),或至少进入稳定平台。因此自动搜索不能只调用一次 argmax,而应同时输出峰值点、峰值前单调段终点、峰值后下降幅度三个量,供人工复核判断该点是否为真实峰值。

本节采用“平滑曲线 + 局部极值候选 + 显著性筛选”的算法:先在平滑后的偏应力序列上找所有局部极大值,再按“峰值突出度”和“峰值后回落比”两个指标筛选。突出度定义为候选峰与其两侧较低谷值的最小高差;回落比定义为峰值后指定应变窗口内偏应力下降量与峰值之比。两者同时超过阈值才判为有效峰值。

偏应力-轴向应变曲线峰值识别与复核判据 轴向应变 ε₁ (%) 偏应力 q (kPa) 峰值 q_peak ε_peak 峰值前单调上升段 回落窗口 Δε 突出度 h 复核判据 ① 突出度 h / q_peak ≥ 3% ② 回落比 Δq / q_peak ≥ 5% 双峰:取首个满足判据的峰 平台:取平台起点为峰值 持续硬化:无峰值 取试验终止点并标注 人工复核:检查噪声毛刺 与平滑窗口是否掩盖真峰

自动搜索算法实现

以下 Python 实现接收平滑后的偏应力数组 q 与轴向应变数组 eps,返回峰值强度、对应应变及复核标记。算法不依赖外部库,仅用标准库完成局部极值搜索与判据计算,便于嵌入试验数据处理脚本。

def find_peak(eps, q, prominence_ratio=0.03, drop_ratio=0.05, drop_window=0.02):
    """
    eps, q: 等长序列,q 为平滑后偏应力(kPa),eps 为轴向应变(小数)
    prominence_ratio: 突出度阈值(相对峰值)
    drop_ratio: 峰值后回落比阈值
    drop_window: 回落观察窗口(应变增量)
    返回: dict(peak_q, peak_eps, status, candidates)
    """
    n = len(q)
    # 1. 找所有局部极大值(含端点平台处理)
    candidates = []
    for i in range(1, n - 1):
        if q[i] >= q[i-1] and q[i] >= q[i+1]:
            # 向左找谷值
            left = i
            while left > 0 and q[left-1] <= q[left]:
                left -= 1
            # 向右找谷值
            right = i
            while right < n - 1 and q[right+1] <= q[right]:
                right += 1
            h = q[i] - max(q[left], q[right])
            candidates.append((i, q[i], h))

    if not candidates:
        return {"peak_q": q[-1], "peak_eps": eps[-1],
                "status": "持续硬化-无局部峰", "candidates": []}

    # 2. 按突出度筛选
    valid = []
    for i, qi, h in candidates:
        if h / qi < prominence_ratio:
            continue
        # 峰值后回落比
        j = i
        while j < n - 1 and eps[j] - eps[i] < drop_window:
            j += 1
        q_after = min(q[i:j+1]) if j > i else qi
        drop = (qi - q_after) / qi
        valid.append({"idx": i, "q": qi, "eps": eps[i],
                      "prom": h/qi, "drop": drop,
                      "ok": drop >= drop_ratio})

    # 3. 判定状态
    accepted = [c for c in valid if c["ok"]]
    if accepted:
        p = accepted[0]  # 首个满足判据的峰
        status = "有效峰值" if len(accepted) == 1 else "双峰-取首峰"
        return {"peak_q": p["q"], "peak_eps": p["eps"],
                "status": status, "candidates": valid}
    else:
        # 有局部峰但回落不足 -> 平台
        p = max(valid, key=lambda c: c["q"])
        return {"peak_q": p["q"], "peak_eps": p["eps"],
                "status": "平台-回落不足", "candidates": valid}

调用示例:假设某组数据 eps 从 0 到 0.15、q 在 0.08 应变处达到 420 kPa 后回落至 380 kPa,则 prom 与 drop 均超阈值,返回 status="有效峰值",peak_q=420,peak_eps=0.08。若曲线在 400 kPa 附近形成宽平台、回落仅 2%,则返回 status="平台-回落不足",提示人工确认平台起点。

人工复核规则与输出

自动结果必须经过复核才能作为强度参数。复核按以下顺序执行,任一条件触发即标记为“需人工确认”:

  • 双峰:候选峰多于一个且均满足判据。取首个满足判据的峰,但需检查第二峰是否由试样端部摩擦或局部剪切带引起;若第二峰高于首峰 10% 以上,应复核首峰是否为真实峰值。
  • 平台:局部峰存在但回落比不足 5%。此时峰值取平台起点(偏应力首次达到平台均值 98% 的应变点),而非平台中点。
  • 持续硬化:全程无局部极大值。峰值取试验终止点,并在报告中注明“未出现峰值,取终止点强度”。
  • 噪声毛刺:若峰值点前后 0.5% 应变内偏应力波动超过峰值 2%,说明平滑不足,需回到去噪环节调整窗口后重算。

最终输出应包含:peak_q(峰值偏应力,kPa)、peak_eps(对应轴向应变,%)、status(有效峰值/双峰/平台/持续硬化)、prom 与 drop 两个判据值,以及复核人签字栏。这样峰值强度不再是单一数字,而是带判据和状态的可追溯结果。

建议将 prominence_ratio 设为 0.03、drop_ratio 设为 0.05 作为默认值;对软黏土等低刚度材料可适当降低突出度阈值至 0.02,但回落比不宜低于 0.03,否则平台与峰值的区分会失效。