3. 参数自适应控制:参数估计方法(最小二乘法、梯度法)、自校正调节器

各位同学,欢迎来到参数自适应控制这一章。

说实话,自适应控制这个领域,我最早接触的时候也觉得挺玄乎的。什么叫“自适应”?说白了,就是让控制器自己学会怎么控制一个“变来变去”的系统。你想想看,一个机器人手臂,今天空载,明天抓个重物,后天可能还要拧螺丝。它的动力学参数一直在变。你要是用一套固定的PID参数去控,那肯定不行。

那怎么办呢?核心思路就是:一边估计系统的参数,一边调整控制器的参数。这就是参数自适应控制干的事。

这一章,我们就聚焦在参数估计上。这是整个自适应控制的“眼睛”和“耳朵”。你参数估计不准,后面的控制全是白搭。我在项目里吃过这个亏,后面会跟大家细说。

3.1 参数估计为什么这么重要?

我们先理清一个逻辑。

传统的控制,比如PID,是“输出反馈”。我看到输出偏差了,我就去调。但自适应控制不一样,它是“模型反馈”。我脑子里先建立一个系统的数学模型,然后实时更新这个模型里的参数。控制器再根据这个最新的模型去计算控制量。

所以,参数估计就是那个“更新模型”的环节。

举个例子。你控制一个直流电机,它的模型可以简化为:

y(k) = -a1 * y(k-1) + b0 * u(k-1)

这里的 a1 和 b0 就是我们需要估计的参数。如果电机负载变了,b0 这个增益系数就会变。参数估计算法要做的,就是根据你测到的电压 u 和转速 y,把最新的 a1 和 b0 给算出来。

核心思想: 参数估计 = 用历史数据 + 当前数据,去拟合一个最可能的模型参数。

3.2 最小二乘法:最经典的方法

最小二乘法,英文叫 Least Squares,简称 LS。这是参数估计里的“老大哥”。

它的思路特别朴素:让模型预测的误差平方和最小

你想想看,我有个模型,预测出来的输出是 ŷ(k),实际测到的输出是 y(k)。那误差就是 e(k) = y(k) - ŷ(k)。最小二乘法就是要找一组参数,让所有时间点上 e(k)² 的总和最小。

数学上,它有一个解析解。对于线性回归问题:

θ = (ΦᵀΦ)⁻¹ Φᵀ Y

其中 θ 是参数向量,Φ 是数据矩阵,Y 是输出向量。

这个公式看着简单,但实际用起来有坑。

我曾经踩过的坑: 矩阵 ΦᵀΦ 可能不可逆!

有一次我在调试一个六轴机械臂的负载辨识,数据采集了半天,一算发现矩阵奇异。为什么?因为激励不够。你给的控制信号太“温柔”了,系统没有充分被激发,数据里信息量不足。所以,做实验时一定要加足够的激励信号,比如PRBS(伪随机二进制序列)。

另外,标准最小二乘法是批处理的。你得攒够一批数据,然后一次性算。这在实时控制里不现实。所以有了它的变种——递推最小二乘法(RLS)

RLS 的公式长这样:

K(k) = P(k-1) * φ(k) / (λ + φᵀ(k) * P(k-1) * φ(k))
θ̂(k) = θ̂(k-1) + K(k) * [y(k) - φᵀ(k) * θ̂(k-1)]
P(k) = [I - K(k) * φᵀ(k)] * P(k-1) / λ

这里 λ 是遗忘因子。λ 越小,算法对老数据“遗忘”得越快,适合跟踪快速变化的参数。我个人习惯把 λ 设在 0.95 到 0.99 之间。太小的 λ 会让估计值抖动得很厉害。

3.3 梯度法:简单粗暴但有效

梯度法,也叫最速下降法。它不像最小二乘法那样追求一步到位,而是沿着误差下降最快的方向,一步一步调整参数

它的更新公式特别直观:

θ(k+1) = θ(k) - γ * ∂J/∂θ

其中 γ 是学习率,J 是损失函数(比如误差的平方)。

你想想看,这就像你蒙着眼睛下山。你每走一步,就感觉一下哪边坡度最陡,就往那边迈一步。梯度法就是这个道理。

它的优点是计算量小,实时性好。缺点嘛,就是收敛慢,而且容易陷入局部最优。

我的建议: 如果系统参数变化不快,或者你对实时性要求极高,梯度法是个不错的选择。我在做移动机器人轮子打滑检测时,就用梯度法在线估计轮胎的摩擦系数,效果还不错。

但要注意学习率 γ 的选择。γ 太大,参数会震荡甚至发散;γ 太小,收敛太慢。我一般会先离线仿真调一个合适的 γ,再上机测试。

3.4 自校正调节器:把估计和控制串起来

好了,参数估计的方法有了,怎么用呢?这就引出了自校正调节器(Self-Tuning Regulator, STR)

STR 的结构其实很简单,就两步:

  1. 在线估计:用 RLS 或梯度法,实时估计系统参数。
  2. 控制器设计:把估计出来的参数代入控制器设计公式,算出新的控制增益。

说白了,就是“估计一步,控制一步”。

我画了一张图,帮你理解这个闭环逻辑:

自校正调节器(STR)结构图 控制器 被控对象 参数估计器 r(k) u(k) y(k) y(k) u(k) θ̂(k)

你看这个图,参数估计器实时接收 u(k) 和 y(k),算出 θ̂(k),然后送给控制器。控制器根据最新的 θ̂(k) 重新计算控制律,输出 u(k) 去驱动被控对象。这就形成了一个完整的自适应闭环。

STR 的好处是,它把估计和控制分开了。你可以自由选择估计方法(RLS、梯度法)和控制器设计方法(极点配置、LQR 等)。灵活性很高。

实际项目经验: 我在做无人机悬停控制时,就用过 STR。无人机在空中,重心会随着电池消耗而变化。我用 RLS 在线估计了模型的阻尼系数和增益,然后动态调整了 PID 参数。效果比固定参数的 PID 好很多,抗风能力提升了至少 30%。

3.5 三种方法的对比

我把这三种方法的特点整理成了一个表格,方便你对比:

方法 计算量 收敛速度 适用场景 注意事项
最小二乘法(批处理) 快(一次求解) 离线辨识、数据后处理 矩阵可能奇异,需充分激励
递推最小二乘法(RLS) 较快 在线实时估计,参数慢变 遗忘因子 λ 需仔细调参
梯度法 实时性要求极高,参数快变 学习率 γ 需仔细调参,可能局部最优

3.6 一个简单的代码示例

最后,我写一段伪代码,展示 RLS 在 STR 中的基本流程。嗯,这里我用的是 Python 风格的伪代码,方便你理解逻辑。

# 初始化
theta = [0, 0]  # 参数向量 [a1, b0]
P = 1000 * I     # 协方差矩阵,初始值大一点
lambda_ = 0.98   # 遗忘因子

# 主循环
for k in range(1, N):
    # 1. 采集数据
    y_k = read_sensor()          # 当前输出
    u_k_1 = control_signal[k-1]  # 上一时刻控制量
    
    # 2. 构造回归向量
    phi = [-y_k_1, u_k_1]        # 注意:y_k_1 是上一时刻输出
    
    # 3. 计算预测误差
    y_hat = phi[0]*theta[0] + phi[1]*theta[1]
    e = y_k - y_hat
    
    # 4. 更新增益 K
    K = P * phi / (lambda_ + phi.T * P * phi)
    
    # 5. 更新参数估计
    theta = theta + K * e
    
    # 6. 更新协方差矩阵 P
    P = (I - K * phi.T) * P / lambda_
    
    # 7. 用新参数设计控制器(例如极点配置)
    # 这里省略具体控制器设计公式
    u_k = controller_design(theta, r_k, y_k)
    
    # 8. 输出控制量
    output_control(u_k)

一个小技巧: 初始化 P 矩阵时,给一个大的对角值(比如 1000*I),这样算法一开始会快速收敛。等参数稳定后,P 矩阵会自然变小,估计也就平稳了。

好了,这一章的内容就到这里。参数估计是自适应控制的基石,最小二乘法和梯度法各有千秋。STR 则把估计和控制完美地结合在了一起。下一章我们会深入具体的控制器设计方法,比如极点配置和 LQR,到时候再结合 STR 一起讲。

记住,理论再漂亮,不上机跑一跑都是纸上谈兵。我建议你找个简单的仿真模型,比如一阶系统,把 RLS 和梯度法都实现一遍,看看它们在不同条件下的表现。相信我,亲手调一次参数,比看十遍书都管用。


专注资料整理