§1  系统辨识

ARX 模型 · 时延估计 · AIC 阶次选择 · 归一化空间辨识
水箱液位控制实验 · 数据文件 6_517_1.txt(1944点)
1. 数据与信号链
○ 背景

实验数据来自真实水箱,采样周期 1s,共 1944 点。信号链如下:

信号物理量范围归一化
输出 $y$水位传感器电压1.0 ~ 4.634 V$(y - 1.0) / 3.634 \to [0,1]$
输入 $u$泵驱动电流4 ~ 20 mA$(u - 4.0) / 16.0 \to [0,1]$
设定值 SP目标水位1.0 ~ 4.634 V同 $y$
为什么要归一化
辨识数据的原始单位是 % 和 V,量纲不同。在归一化空间辨识,$B$ 系数的物理含义是"单位归一化控制量对归一化输出的稳态增益",数值在合理范围(0.01~0.1),不会因量纲差异导致数值病态。
2. ARX 模型结构
★ 核心

ARX(AutoRegressive with eXogenous input)模型:

$$ A(q^{-1})\, y_t = B(q^{-1})\, u_{t-k} + e_t \tag{1.1}$$ $$ A(q^{-1}) = 1 + a_1 q^{-1} + \cdots + a_{n_a} q^{-n_a}, \quad B(q^{-1}) = b_0 + b_1 q^{-1} + \cdots + b_{n_b} q^{-n_b}$$
  • $k$:纯时延(整数采样步),水箱系统约 24 步 = 24s
  • $n_a$:AR 阶次,决定系统极点数量
  • $n_b$:MA 阶次,本实验 $n_b=0$(只有 $b_0$)

展开后的仿真方程($n_a=1, n_b=0$):

$$ y(t) = -a_1\, y(t-1) + b_0\, u(t-k) \tag{1.2}$$
符号约定(重要!)
$A = [1, a_1]$ 中 $a_1 < 0$(如 $a_1 = -0.9846$),则极点在 $+0.9846$(稳定)。
仿真方程里系数是 $-a_1 = +0.9846$(正号)。
辨识出的 $a_1$ 是负值,仿真时取负号变正号,两者不要混淆。
3. 时延估计
○ 方法

对辨识数据中的多段阶跃激励,用"稳定性检验 + 局部噪声阈值"方法检测响应起点:

阶跃时刻检测到的 $k$状态
t = 9726✅ 有效
t = 174421✅ 有效
其余 4 段未稳定,跳过

有效段均值 $k = 23.5$,取整 $\boxed{k = 24}$ 步。

4. AIC 阶次选择
★ 核心

固定 $k=24$,搜索 $n_a \in [1,4]$,$n_b \in [0,3]$,用 AIC 准则选最优阶次:

$$ \text{AIC} = N \ln(\hat\sigma_e^2) + 2(n_a + n_b + 1) \tag{1.3}$$
$n_b=0$$n_b=1$$n_b=2$
$n_a=1$−21452−21442−21429
$n_a=2$−21664−21652−21640
$n_a=4$ ★−21843−21829−21822

AIC 最优:$n_a=4, n_b=0$。但 GPC 实验选用 $n_a=1$(更简单,便于调试)。

为什么不用 AIC 最优的 na=4
na=4 精度最高,但 GPC 的丢番图递推复杂度随 $n_a$ 增加,C++ 实现更难调试。na=1 的 RMSE=0.0164V,na=4 的 RMSE=0.0068V,差距约 2.4 倍,但对控制器来说 RLS 在线更新可以弥补模型误差。
5. 最小二乘辨识
★ 核心

构建回归矩阵 $\Phi$ 和输出向量 $Y$:

$$ \varphi(t) = [-y(t-1),\, u(t-k)]^T \quad (n_a=1, n_b=0) \tag{1.4}$$ $$ Y = \Phi\,\theta + e, \quad \hat\theta = (\Phi^T\Phi)^{-1}\Phi^T Y \tag{1.5}$$

注意 $\varphi(t)$ 的第一项是 $-y(t-1)$(负号),所以辨识出的 $\theta_0 = a_1 > 0$,而 $A = [1, -\theta_0]$,即 $A[1] < 0$。

代码对应(identify_arx.py)
def build_regression(y, u, na, nb, k):
    for j in range(na):
        Phi[i, j] = -y[t-1-j]   # 负号!
    for j in range(nb+1):
        Phi[i, na+j] = u[t-k-j]

A = np.concatenate([[1], theta[:na]])  # A[1] = theta[0] < 0
      
6. 归一化空间重辨识
★ 核心(踩坑修复)

第一次实验直接用原始物理量辨识的系数,导致控制量持续饱和。根本原因:

$$ \frac{dy_\text{norm}}{du_\text{norm}} = \frac{dy}{du} \cdot \frac{U_\text{range}}{Y_\text{range}} \tag{1.6}$$

原始空间的 $b_0$ 乘以 $U_\text{range}/Y_\text{range} = 16/3.634 \approx 4.4$ 才是归一化空间的 $b_0$。必须在归一化空间重新跑最小二乘。

辨识空间$a_1$$b_0$稳态增益 $K_{ss}$到达 3V 需要 $u$
原始物理量−0.98460.00550.35728.6 mA ❌ 超限
归一化空间−0.98460.024361.5779.6 mA ✅
稳态增益计算
$n_a=1$ 时:$K_{ss} = b_0 / (1 + a_1)$(注意 $a_1 < 0$,分母 $= 1 - |a_1|$)
7. 辨识结果汇总
参数说明
$n_a$1一阶系统,单极点
$n_b$0无 MA 项
$k$24纯时延 24 步 = 24s
$a_1$−0.984555极点在 +0.9846,时间常数 $\tau \approx 64$ 步
$b_0$0.024361归一化空间,稳态增益 $K_{ss} = 1.577$
验证 RMSE0.0164 V用辨识数据后半段验证

仿真方程(偏差量,归一化空间):

$$ y(t) = 0.984555\, y(t-1) + 0.024361\, u(t-24) \tag{1.7}$$
8. 踩坑:符号约定一致性
⚠ 易错点

辨识、仿真、RLS 三处的符号约定必须一致,否则参数漂移或控制失效:

位置方程形式$a_1$ 的符号
辨识(build_regression)$\varphi = [-y(t-1), u(t-k)]$,$y = \theta_0 \cdot (-y(t-1)) + \theta_1 \cdot u$$\theta_0 = |a_1| > 0$,$A[1] = -\theta_0 < 0$
仿真(ARX 模型)$y(t) = -A[1] \cdot y(t-1) + B[0] \cdot u(t-k)$$-A[1] = +0.9846 > 0$
RLS 更新$\varphi = [y(t-1), u(t-k)]$,$\hat y = \theta_0 \cdot y(t-1) + \theta_1 \cdot u$$\theta_0 = -A[1] = +0.9846 > 0$
结论
RLS 里存的 rls_a1 = 0.984555(正值),对应仿真方程里 $y(t) = \text{rls\_a1} \cdot y(t-1) + \text{rls\_b0} \cdot u(t-k)$。
CARIMA 构造时:$A = [1, -\text{rls\_a1}]$,$A\_\text{tilde} = [1,\ -\text{rls\_a1}-1,\ \text{rls\_a1}]$。