1. 一阶惯性系统时间常数辨识

问题设定与数据来源

一阶惯性系统的阶跃响应为 y(t) = K·(1 − e^(−t/T)),其中 K 为稳态增益,T 为时间常数。辨识任务是从采样序列 (t_i, y_i) 中反推 K 与 T。本例构造一组教学示例数据:设真实参数 K = 2.0、T = 1.5 s,采样周期 0.1 s,采样 60 点,并叠加标准差 0.03 的零均值高斯噪声(示例数据,非实测)。

两种方法的核心差异在于:两点法只取响应曲线上 63.2% 与 28.3%(或 86.5%)两个特征点,计算量极小但对噪声敏感;最小二乘拟合利用全部采样点,通过线性化把非线性问题转为线性回归,抗噪性更好。下面先给出可运行的实现,再对比精度。

最小二乘拟合的实现

对 y = K − K·e^(−t/T) 做变量替换:令 a = K,b = −K/T,则 y = a + b·e^(−t/T) 仍含未知 T。更稳妥的做法是固定 T 做一维搜索:对每个候选 T,令 x_i = 1 − e^(−t_i/T),模型变为 y_i = K·x_i,此时 K 的最小二乘解为闭式 K = Σ(x_i·y_i) / Σ(x_i²),残差平方和 SSE(T) = Σ(y_i − K·x_i)²。在 T 的搜索区间上取 SSE 最小者即为估计值。这样避免了非线性迭代,且结果可复现。

import numpy as np

rng = np.random.default_rng(7)
K_true, T_true = 2.0, 1.5
t = np.arange(0, 6.0, 0.1)
y_clean = K_true * (1 - np.exp(-t / T_true))
y = y_clean + rng.normal(0, 0.03, t.size)

def ls_fit(t, y, T_grid):
    best = None
    for T in T_grid:
        x = 1 - np.exp(-t / T)
        K = np.sum(x * y) / np.sum(x * x)
        sse = np.sum((y - K * x) ** 2)
        if best is None or sse < best[2]:
            best = (K, T, sse)
    return best

T_grid = np.linspace(0.2, 5.0, 4801)
K_ls, T_ls, sse_ls = ls_fit(t, y, T_grid)
print(f"LS:  K={K_ls:.4f}  T={T_ls:.4f}  SSE={sse_ls:.5f}")

示例运行预期输出约为 K≈1.99、T≈1.52(具体数值取决于随机种子,属示例结果)。搜索步长 0.001 s 已足够,若需更高精度可在最优点附近二次细化。

两点法的实现与误差来源

两点法利用一阶响应的固定比例点:t 时刻响应达到稳态值的 63.2% 时 t = T;达到 28.3% 时 t = 0.333T;达到 86.5% 时 t = 2T。工程上常用 28.3% 与 63.2% 两点:T = 1.5·(t_63.2 − t_28.3)。稳态值 K 取末段均值。噪声会直接平移特征点位置,因此需要先做轻度平滑或对穿越点做线性插值。

def two_point(t, y):
    K_est = np.mean(y[-10:])              # 末段均值作稳态值
    y_n = y / K_est
    def cross(level):
        idx = np.where(y_n >= level)[0][0]
        t0, t1 = t[idx-1], t[idx]
        y0, y1 = y_n[idx-1], y_n[idx]
        return t0 + (level - y0) * (t1 - t0) / (y1 - y0)
    t63 = cross(0.632)
    t28 = cross(0.283)
    T_est = 1.5 * (t63 - t28)
    return K_est, T_est

K_tp, T_tp = two_point(t, y)
print(f"2P:  K={K_tp:.4f}  T={T_tp:.4f}")

示例中两点法通常给出 T 偏差在 0.05~0.15 s 量级,明显大于最小二乘。原因有二:一是稳态值用末段均值估计,噪声直接进入 K;二是两个穿越点各带插值误差,且被放大 1.5 倍。

两种方法的精度对比

为量化比较,用同一噪声模型重复 200 次蒙特卡洛(示例仿真,非实测),统计两种方法对 T 的偏差与标准差:

方法T 均值 (s)T 偏差 (s)T 标准差 (s)K 偏差
最小二乘≈1.50≈0.00≈0.02≈0.005
两点法≈1.53≈+0.03≈0.09≈0.02

结论:含噪声时最小二乘的 T 标准差约为两点法的 1/4,且几乎无系统偏差;两点法在无噪声或极低噪声下与最小二乘接近,适合现场快速估算。若数据含明显稳态漂移,应先扣除基线再辨识。

阶跃响应特征点与两种辨识路径 t / s y K 63.2% → t = T 28.3% → t = 0.333T Δt 两点法 T = 1.5 · (t₆₃.₂ − t₂₈.₃) K = 末段均值 最小二乘 x = 1 − e^(−t/T) K = Σxy / Σx²,搜索 T 使 SSE 最小 含噪采样点

结果判读与选用建议

  • 看残差:最小二乘拟合后应检查残差是否围绕零随机分布;若残差呈单调趋势,说明模型阶次或稳态值设定有误。
  • 看特征点一致性:用辨识出的 T 反算 63.2% 时刻,应与实测穿越点接近;偏差大说明噪声或采样过粗。
  • 选用原则:离线数据处理优先最小二乘;现场仪表整定、数据点极少时用两点法快速估算,再用最小二乘复核。
采样周期建议不大于 T/10,否则两点法插值误差显著增大;本例 T=1.5 s、采样 0.1 s,满足该条件。