第三十四篇:多体系统的自适应控制

摘要

自适应控制是解决多体系统参数不确定性和时变特性的有效方法。本主题系统阐述自适应控制的基本原理、设计方法和在多体系统中的应用。首先介绍自适应控制的分类,包括模型参考自适应控制(MRAC)和自校正调节器(STR)两大类别。然后详细讲解模型参考自适应控制的设计方法,包括MIT规则、Lyapunov稳定性理论和Popov超稳定性理论。接着深入分析多体系统自适应控制的关键技术,如自适应逆动力学控制、自适应滑模控制和自适应神经网络控制。重点讨论参数估计方法,包括梯度下降法、最小二乘法和递推最小二乘法。最后通过数值仿真验证自适应控制策略的有效性,展示系统在处理参数不确定性和外部扰动时的自适应能力。

关键词

自适应控制,模型参考自适应,参数估计,Lyapunov稳定性,多体系统,逆动力学,神经网络,递推最小二乘


1. 自适应控制概述

1.1 自适应控制的基本概念

自适应控制是指控制器能够自动调整其参数或结构,以适应被控对象动态特性变化或不确定性的一种控制方法。对于多体系统而言,自适应控制尤为重要,因为:

参数不确定性:多体系统的质量、惯量、阻尼等参数往往难以精确测量或会随时间变化。

负载变化:机器人抓取不同物体、车辆载重变化等都会导致系统参数改变。

环境变化:温度、磨损等因素会影响系统动态特性。

模型简化误差:实际系统往往比数学模型更复杂,存在未建模动态。

1.2 自适应控制的分类

自适应控制主要分为两大类:

模型参考自适应控制(Model Reference Adaptive Control, MRAC)

  • 通过参考模型定义期望的闭环性能
  • 控制器参数根据跟踪误差自适应调整
  • 适用于性能要求明确的场合

自校正调节器(Self-Tuning Regulator, STR)

  • 在线辨识系统参数
  • 根据估计参数重新设计控制器
  • 适用于参数变化缓慢的系统

1.3 自适应控制的基本结构

典型的自适应控制系统包含两个环路:

内环(常规反馈环路)

  • 被控对象
  • 可调控制器
  • 产生控制输入

外环(自适应环路)

  • 参数估计器
  • 自适应律
  • 调整控制器参数

自适应控制系统=常规控制环路+自适应机制 \text{自适应控制系统} = \text{常规控制环路} + \text{自适应机制} 自适应控制系统=常规控制环路+自适应机制


2. 模型参考自适应控制(MRAC)

2.1 MRAC的基本原理

模型参考自适应控制通过使被控对象的输出跟踪参考模型的输出来实现自适应控制。

参考模型

参考模型定义了期望的闭环性能:

x˙m=Amxm+Bmr \dot{x}_m = A_m x_m + B_m r x˙m=Amxm+Bmr

其中,xmx_mxm为参考模型状态,rrr为参考输入,AmA_mAmBmB_mBm定义了期望的动态特性。

可调系统

被控对象与可调控制器组成可调系统:

x˙=Ax+Bu \dot{x} = A x + B u x˙=Ax+Bu

其中,控制输入为:

u=Kxx+Krr u = K_x x + K_r r u=Kxx+Krr

跟踪误差

定义跟踪误差为:

e=x−xm e = x - x_m e=xxm

目标是使e→0e \to 0e0

2.2 MIT规则

MIT规则是最早的自适应律之一,基于梯度下降法。

代价函数

J=12eTe J = \frac{1}{2} e^T e J=21eTe

参数更新

根据梯度下降法,参数更新律为:

θ˙=−Γ∂J∂θ=−ΓeT∂e∂θ \dot{\theta} = -\Gamma \frac{\partial J}{\partial \theta} = -\Gamma e^T \frac{\partial e}{\partial \theta} θ˙=ΓθJ=ΓeTθe

其中,θ\thetaθ为可调参数,Γ\GammaΓ为自适应增益。

灵敏度函数

MIT规则需要计算输出对参数的灵敏度:

∂e∂θ=∂x∂θ \frac{\partial e}{\partial \theta} = \frac{\partial x}{\partial \theta} θe=θx

对于线性系统,可以通过灵敏度滤波器获得。

2.3 基于Lyapunov稳定性的MRAC设计

MIT规则不能保证全局稳定性,基于Lyapunov理论的设计可以解决这个问题。

误差动态

将控制输入代入被控对象:

x˙=(A+BKx)x+BKrr \dot{x} = (A + BK_x)x + BK_r r x˙=(A+BKx)x+BKrr

误差动态为:

e˙=x˙−x˙m=(A+BKx)x+BKrr−Amxm−Bmr \dot{e} = \dot{x} - \dot{x}_m = (A + BK_x)x + BK_r r - A_m x_m - B_m r e˙=x˙x˙m=(A+BKx)x+BKrrAmxmBmr

匹配条件

假设存在理想参数Kx∗K_x^*KxKr∗K_r^*Kr使得:

A+BKx∗=Am,BKr∗=Bm A + BK_x^* = A_m, \quad BK_r^* = B_m A+BKx=Am,BKr=Bm

定义参数误差:

K~x=Kx−Kx∗,K~r=Kr−Kr∗ \tilde{K}_x = K_x - K_x^*, \quad \tilde{K}_r = K_r - K_r^* K~x=KxKx,K~r=KrKr

Lyapunov函数

选择Lyapunov函数:

V=eTPe+tr(K~xTΓx−1K~x)+tr(K~rTΓr−1K~r) V = e^T P e + \text{tr}(\tilde{K}_x^T \Gamma_x^{-1} \tilde{K}_x) + \text{tr}(\tilde{K}_r^T \Gamma_r^{-1} \tilde{K}_r) V=eTPe+tr(K~xTΓx1K~x)+tr(K~rTΓr1K~r)

其中,PPP满足Lyapunov方程:

AmTP+PAm=−Q A_m^T P + P A_m = -Q AmTP+PAm=Q

自适应律

通过使V˙<0\dot{V} < 0V˙<0,得到自适应律:

K˙x=−ΓxBTPexT,K˙r=−ΓrBTPerT \dot{K}_x = -\Gamma_x B^T P e x^T, \quad \dot{K}_r = -\Gamma_r B^T P e r^T K˙x=ΓxBTPexT,K˙r=ΓrBTPerT

2.4 Popov超稳定性理论

Popov超稳定性理论提供了另一种设计自适应系统的方法。

超稳定性条件

系统超稳定需要满足:

  1. 线性前向通路严格正实
  2. 非线性反馈通路满足Popov积分不等式

自适应律设计

基于Popov理论可以导出与Lyapunov方法类似的自适应律,但提供了更系统的设计框架。


3. 自校正调节器(STR)

3.1 间接自校正控制

间接自校正控制通过在线辨识系统参数,然后基于估计参数设计控制器。

参数辨识

对于离散时间系统:

y(k)=ϕT(k)θ+ϵ(k) y(k) = \phi^T(k) \theta + \epsilon(k) y(k)=ϕT(k)θ+ϵ(k)

其中:

ϕ(k)=[−y(k−1),...,−y(k−n),u(k−1),...,u(k−m)]T \phi(k) = [-y(k-1), ..., -y(k-n), u(k-1), ..., u(k-m)]^T ϕ(k)=[y(k1),...,y(kn),u(k1),...,u(km)]T

θ=[a1,...,an,b1,...,bm]T \theta = [a_1, ..., a_n, b_1, ..., b_m]^T θ=[a1,...,an,b1,...,bm]T

递推最小二乘法(RLS)

θ^(k)=θ^(k−1)+K(k)[y(k)−ϕT(k)θ^(k−1)] \hat{\theta}(k) = \hat{\theta}(k-1) + K(k)[y(k) - \phi^T(k)\hat{\theta}(k-1)] θ^(k)=θ^(k1)+K(k)[y(k)ϕT(k)θ^(k1)]

K(k)=P(k−1)ϕ(k)[λ+ϕT(k)P(k−1)ϕ(k)]−1 K(k) = P(k-1)\phi(k)[\lambda + \phi^T(k)P(k-1)\phi(k)]^{-1} K(k)=P(k1)ϕ(k)[λ+ϕT(k)P(k1)ϕ(k)]1

P(k)=1λ[P(k−1)−K(k)ϕT(k)P(k−1)] P(k) = \frac{1}{\lambda}[P(k-1) - K(k)\phi^T(k)P(k-1)] P(k)=λ1[P(k1)K(k)ϕT(k)P(k1)]

其中,λ\lambdaλ为遗忘因子(0<λ≤10 < \lambda \leq 10<λ1)。

控制器设计

根据估计参数θ^\hat{\theta}θ^设计控制器,如极点配置:

R(q−1)u(k)=T(q−1)r(k)−S(q−1)y(k) R(q^{-1})u(k) = T(q^{-1})r(k) - S(q^{-1})y(k) R(q1)u(k)=T(q1)r(k)S(q1)y(k)

3.2 直接自校正控制

直接自校正控制直接辨识控制器参数,不需要显式辨识被控对象参数。

重新参数化

将系统模型重新参数化为控制器参数形式:

y(k)=ψT(k)θc+ϵ(k) y(k) = \psi^T(k) \theta_c + \epsilon(k) y(k)=ψT(k)θc+ϵ(k)

其中θc\theta_cθc为控制器参数。

优势

  • 减少计算量
  • 避免控制器设计步骤
  • 直接优化控制性能

4. 多体系统的自适应控制方法

4.1 自适应逆动力学控制

对于多体系统,逆动力学控制是一种常用的非线性控制方法。

标准逆动力学控制

对于多体系统动力学:

M(q)q¨+C(q,q˙)q˙+G(q)=τ M(q)\ddot{q} + C(q, \dot{q})\dot{q} + G(q) = \tau M(q)q¨+C(q,q˙)q˙+G(q)=τ

逆动力学控制律为:

τ=M(q)(q¨d−Kve˙−Kpe)+C(q,q˙)q˙+G(q) \tau = M(q)(\ddot{q}_d - K_v \dot{e} - K_p e) + C(q, \dot{q})\dot{q} + G(q) τ=M(q)(q¨dKve˙Kpe)+C(q,q˙)q˙+G(q)

其中,e=q−qde = q - q_de=qqd为跟踪误差。

自适应逆动力学控制

当动力学参数不确定时,使用估计参数:

τ=M^(q)(q¨d−Kve˙−Kpe)+C^(q,q˙)q˙+G^(q) \tau = \hat{M}(q)(\ddot{q}_d - K_v \dot{e} - K_p e) + \hat{C}(q, \dot{q})\dot{q} + \hat{G}(q) τ=M^(q)(q¨dKve˙Kpe)+C^(q,q˙)q˙+G^(q)

参数自适应律:

θ^˙=−ΓYT(q,q˙,q¨r)s \dot{\hat{\theta}} = -\Gamma Y^T(q, \dot{q}, \ddot{q}_r) s θ^˙=ΓYT(q,q˙,q¨r)s

其中,q¨r=q¨d−Kve˙−Kpe\ddot{q}_r = \ddot{q}_d - K_v \dot{e} - K_p eq¨r=q¨dKve˙Kpes=e˙+Λes = \dot{e} + \Lambda es=e˙+Λe为滑动变量。

4.2 自适应滑模控制

将自适应控制与滑模控制结合,可以处理参数不确定性和外部扰动。

滑模面

s=e˙+Λe=0 s = \dot{e} + \Lambda e = 0 s=e˙+Λe=0

控制律

τ=Y(q,q˙,q˙r,q¨r)θ^−Ksgn(s) \tau = Y(q, \dot{q}, \dot{q}_r, \ddot{q}_r) \hat{\theta} - K \text{sgn}(s) τ=Y(q,q˙,q˙r,q¨r)θ^Ksgn(s)

自适应律

θ^˙=−ΓYTs \dot{\hat{\theta}} = -\Gamma Y^T s θ^˙=ΓYTs

边界层修正

为减少抖振,使用饱和函数代替符号函数:

sat(s/Φ)={s/Φ,∣s∣≤Φsgn(s),∣s∣>Φ \text{sat}(s/\Phi) = \begin{cases} s/\Phi, & |s| \leq \Phi \\ \text{sgn}(s), & |s| > \Phi \end{cases} sat(s)={s,sgn(s),sΦs>Φ

4.3 自适应神经网络控制

神经网络可以逼近多体系统的未知非线性函数。

神经网络逼近

对于未知函数f(x)f(x)f(x),使用神经网络逼近:

f^(x)=WTσ(VTx) \hat{f}(x) = W^T \sigma(V^T x) f^(x)=WTσ(VTx)

其中,WWWVVV为网络权重,σ\sigmaσ为激活函数。

自适应律

W˙=−ΓWσsT,V˙=−ΓVx(σ′Ws)T \dot{W} = -\Gamma_W \sigma s^T, \quad \dot{V} = -\Gamma_V x (\sigma' W s)^T W˙=ΓWσsT,V˙=ΓVx(σWs)T

控制律

τ=f^(x)−Ks \tau = \hat{f}(x) - K s τ=f^(x)Ks


5. 参数估计方法

5.1 梯度下降法

梯度下降法是最基本的参数估计方法。

算法

θ^(k)=θ^(k−1)−γϕ(k)[ϕT(k)θ^(k−1)−y(k)] \hat{\theta}(k) = \hat{\theta}(k-1) - \gamma \phi(k)[\phi^T(k)\hat{\theta}(k-1) - y(k)] θ^(k)=θ^(k1)γϕ(k)[ϕT(k)θ^(k1)y(k)]

其中,γ\gammaγ为学习率。

特点

  • 计算简单
  • 收敛速度较慢
  • 学习率选择困难

5.2 最小二乘法

最小二乘法通过最小化误差平方和来估计参数。

批处理最小二乘

θ^=(ΦTΦ)−1ΦTY \hat{\theta} = (\Phi^T \Phi)^{-1} \Phi^T Y θ^=(ΦTΦ)1ΦTY

其中,Φ\PhiΦ为回归矩阵,YYY为输出向量。

特点

  • 最优无偏估计(在高斯噪声下)
  • 需要存储所有数据
  • 计算量大

5.3 递推最小二乘法(RLS)

RLS是在线参数估计的标准方法。

算法

class RLS_Estimator:
    """递推最小二乘参数估计器"""
    
    def __init__(self, n_params, lambda_factor=0.99):
        """
        参数:
            n_params: 参数数量
            lambda_factor: 遗忘因子
        """
        self.n_params = n_params
        self.lambda_factor = lambda_factor
        
        # 初始化
        self.theta = np.zeros(n_params)
        self.P = np.eye(n_params) * 100  # 初始协方差
    
    def update(self, phi, y):
        """
        更新参数估计
        参数:
            phi: 回归向量
            y: 观测值
        """
        # 预测误差
        epsilon = y - phi.T @ self.theta
        
        # 增益矩阵
        denom = self.lambda_factor + phi.T @ self.P @ phi
        K = self.P @ phi / denom
        
        # 参数更新
        self.theta = self.theta + K * epsilon
        
        # 协方差更新
        self.P = (self.P - K @ phi.T @ self.P) / self.lambda_factor
        
        return self.theta, epsilon

遗忘因子

遗忘因子λ\lambdaλ控制历史数据的影响:

  • λ=1\lambda = 1λ=1:无遗忘,所有数据等权重
  • λ<1\lambda < 1λ<1:指数遗忘,新数据权重更大
  • 典型值:λ=0.95∼0.99\lambda = 0.95 \sim 0.99λ=0.950.99

6. 自适应控制的稳定性分析

6.1 稳定性定理

定理1(Lyapunov稳定性)

如果存在Lyapunov函数V(e,θ~)V(e, \tilde{\theta})V(e,θ~)满足:

  1. V(0,0)=0V(0, 0) = 0V(0,0)=0V(e,θ~)>0V(e, \tilde{\theta}) > 0V(e,θ~)>0对于(e,θ~)≠(0,0)(e, \tilde{\theta}) \neq (0, 0)(e,θ~)=(0,0)
  2. V˙≤0\dot{V} \leq 0V˙0

则系统是稳定的。如果V˙<0\dot{V} < 0V˙<0对于(e,θ~)≠(0,0)(e, \tilde{\theta}) \neq (0, 0)(e,θ~)=(0,0),则系统是渐近稳定的。

定理2(Barbalat引理)

如果f(t)f(t)f(t)一致连续且lim⁡t→∞∫0tf(τ)dτ\lim_{t \to \infty} \int_0^t f(\tau) d\taulimt0tf(τ)dτ存在且有限,则lim⁡t→∞f(t)=0\lim_{t \to \infty} f(t) = 0limtf(t)=0

6.2 鲁棒自适应控制

实际系统中存在未建模动态和外部扰动,需要鲁棒自适应控制。

σ修正

在自适应律中加入泄漏项:

θ^˙=−ΓYTs−σΓθ^ \dot{\hat{\theta}} = -\Gamma Y^T s - \sigma \Gamma \hat{\theta} θ^˙=ΓYTsσΓθ^

其中,σ\sigmaσ为小正数。

投影算子

将参数限制在已知有界集合内:

θ^˙=Proj(−ΓYTs) \dot{\hat{\theta}} = \text{Proj}(-\Gamma Y^T s) θ^˙=Proj(ΓYTs)


7. 应用案例与仿真结果

7.1 案例一:机械臂自适应轨迹跟踪

系统描述

  • 2自由度平面机械臂
  • 质量参数不确定(真实值±30%误差)

控制策略

  • 自适应逆动力学控制
  • 递推最小二乘参数估计

仿真结果

  1. 参数收敛:估计参数在5秒内收敛到真实值附近
  2. 跟踪性能:稳态跟踪误差小于0.01 rad
  3. 鲁棒性:对负载变化具有良好的适应能力

7.2 案例二:飞行器自适应姿态控制

系统描述

  • 四旋翼飞行器
  • 惯量参数不确定
  • 存在外部扰动(风扰)

控制策略

  • 模型参考自适应控制
  • 自适应滑模控制

仿真结果

  1. 参考跟踪:姿态角快速跟踪参考信号
  2. 扰动抑制:对风扰具有良好的抑制能力
  3. 参数适应:在线适应惯量变化

8. 自适应控制的发展趋势

8.1 智能自适应控制

模糊自适应控制

  • 利用模糊逻辑处理不确定性
  • 模糊规则在线调整

神经网络自适应控制

  • 深度神经网络逼近复杂非线性
  • 端到端自适应学习

8.2 多智能体自适应控制

对于多体系统组成的集群:

  • 分布式自适应律
  • 协同参数估计
  • 一致性自适应控制

8.3 自适应控制与机器学习的融合

强化学习自适应控制

  • 通过试错学习最优控制策略
  • 在线优化自适应增益

元学习自适应控制

  • 学习如何快速适应新任务
  • 少样本自适应

9. 小结

本主题系统介绍了多体系统的自适应控制理论与方法。主要内容包括:

  1. 自适应控制基础:阐述了自适应控制的基本概念、分类和系统架构,明确了MRAC和STR的适用场景。

  2. 模型参考自适应控制:详细介绍了MRAC的设计方法,包括MIT规则、Lyapunov稳定性理论和Popov超稳定性理论。

  3. 自校正调节器:讨论了间接和直接自校正控制,重点介绍了递推最小二乘参数估计方法。

  4. 多体系统自适应控制:深入分析了自适应逆动力学控制、自适应滑模控制和自适应神经网络控制等方法。

  5. 稳定性分析:介绍了自适应控制系统的稳定性定理和鲁棒自适应控制技术。

  6. 应用案例:通过机械臂和飞行器的案例,演示了自适应控制的设计流程和仿真验证方法。

自适应控制是多体系统控制的重要技术,能够有效处理参数不确定性和时变特性,在机器人、航空航天、车辆等领域具有广泛的应用前景。


参考文献

  1. Åström, K.J., Wittenmark, B. Adaptive Control. Dover Publications, 2008.

  2. Slotine, J.J., Li, W. Applied Nonlinear Control. Prentice Hall, 1991.

  3. Ioannou, P., Sun, J. Robust Adaptive Control. Dover Publications, 2012.

  4. Landau, Y.D. Adaptive Control: The Model Reference Approach. Marcel Dekker, 1979.

  5. 刘金琨. 滑模变结构控制MATLAB仿真. 清华大学出版社, 2015.


附录:Python仿真代码

# 完整的多体系统自适应控制仿真代码
# 包含:MRAC、自适应逆动力学、RLS参数估计

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import os

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# ==================== 递推最小二乘参数估计器 ====================

class RLS_Estimator:
    """递推最小二乘参数估计器"""
    
    def __init__(self, n_params, lambda_factor=0.99):
        self.n_params = n_params
        self.lambda_factor = lambda_factor
        self.theta = np.zeros(n_params)
        self.P = np.eye(n_params) * 100
    
    def update(self, phi, y):
        epsilon = y - phi.T @ self.theta
        denom = self.lambda_factor + phi.T @ self.P @ phi
        K = self.P @ phi / denom
        self.theta = self.theta + K * epsilon
        self.P = (self.P - np.outer(K, phi.T @ self.P)) / self.lambda_factor
        return self.theta, epsilon

# ==================== 模型参考自适应控制 ====================

class MRAC_Controller:
    """模型参考自适应控制器"""
    
    def __init__(self, A_m, B_m, B, Gamma):
        """
        参数:
            A_m: 参考模型系统矩阵
            B_m: 参考模型输入矩阵
            B: 被控对象输入矩阵
            Gamma: 自适应增益
        """
        self.A_m = A_m
        self.B_m = B_m
        self.B = B
        self.Gamma = Gamma
        
        # 求解Lyapunov方程
        Q = np.eye(A_m.shape[0])
        self.P = self.solve_lyapunov(A_m.T, Q)
        
        # 初始化控制器参数
        self.K_x = np.zeros((B.shape[1], A_m.shape[0]))
        self.K_r = np.zeros((B.shape[1], B_m.shape[1]))
    
    def solve_lyapunov(self, A, Q):
        """求解Lyapunov方程 A^T P + P A = -Q"""
        from scipy.linalg import solve_continuous_lyapunov
        P = solve_continuous_lyapunov(A, -Q)
        return P
    
    def control(self, x, x_m, r):
        """MRAC控制律"""
        # 跟踪误差
        e = x - x_m
        
        # 控制输入
        u = self.K_x @ x + self.K_r @ r
        
        # 参数自适应律
        self.K_x = self.K_x - self.Gamma * (self.B.T @ self.P @ e) @ x.T
        self.K_r = self.K_r - self.Gamma * (self.B.T @ self.P @ e) @ r.T
        
        return u, e

# ==================== 自适应滑模控制 ====================

class AdaptiveSMC:
    """自适应滑模控制器"""
    
    def __init__(self, n_states, n_params, Gamma, Lambda, K):
        self.n_states = n_states
        self.n_params = n_params
        self.Gamma = Gamma
        self.Lambda = Lambda
        self.K = K
        
        # 初始化参数估计
        self.theta_hat = np.zeros(n_params)
    
    def control(self, q, dq, q_d, dq_d, ddq_d, Y_func):
        """
        自适应滑模控制
        参数:
            q, dq: 当前位置和速度
            q_d, dq_d, ddq_d: 期望位置、速度、加速度
            Y_func: 回归矩阵函数
        """
        # 跟踪误差
        e = q - q_d
        de = dq - dq_d
        
        # 滑动变量
        s = de + self.Lambda @ e
        
        # 参考加速度
        ddq_r = ddq_d - self.Lambda @ de
        
        # 回归矩阵
        Y = Y_func(q, dq, ddq_r)
        
        # 控制律
        tau = Y @ self.theta_hat - self.K @ np.sign(s)
        
        # 参数自适应律
        self.theta_hat = self.theta_hat - self.Gamma @ Y.T @ s
        
        return tau, s, e

# ==================== 主程序 ====================

if __name__ == "__main__":
    print("多体系统自适应控制仿真")
    print("=" * 60)
    
    # 创建输出目录
    output_dir = r'D:\文档\多体动力学\主题034'
    os.makedirs(output_dir, exist_ok=True)
    
    # 仿真参数
    t = np.linspace(0, 20, 2000)
    dt = t[1] - t[0]
    
    # ==================== 示例1: RLS参数估计 ====================
    print("\n示例1: RLS参数估计")
    
    # 真实系统: y = 2*u1 + 3*u2 + 1*u3
    true_params = np.array([2.0, 3.0, 1.0])
    
    # RLS估计器
    rls = RLS_Estimator(n_params=3, lambda_factor=0.98)
    
    # 仿真数据
    theta_history = []
    error_history = []
    
    np.random.seed(42)
    for i, ti in enumerate(t):
        # 生成输入
        u = np.random.randn(3)
        
        # 系统输出(含噪声)
        y = true_params @ u + 0.1 * np.random.randn()
        
        # RLS更新
        theta, error = rls.update(u, y)
        
        theta_history.append(theta.copy())
        error_history.append(error)
    
    theta_history = np.array(theta_history)
    
    # 绘制RLS结果
    fig, axes = plt.subplots(2, 2, figsize=(12, 10))
    
    # 参数收敛
    axes[0, 0].plot(t, theta_history[:, 0], 'b-', label='θ1', linewidth=1.5)
    axes[0, 0].plot(t, theta_history[:, 1], 'r-', label='θ2', linewidth=1.5)
    axes[0, 0].plot(t, theta_history[:, 2], 'g-', label='θ3', linewidth=1.5)
    axes[0, 0].axhline(y=true_params[0], color='b', linestyle='--', alpha=0.5)
    axes[0, 0].axhline(y=true_params[1], color='r', linestyle='--', alpha=0.5)
    axes[0, 0].axhline(y=true_params[2], color='g', linestyle='--', alpha=0.5)
    axes[0, 0].set_xlabel('Time (s)')
    axes[0, 0].set_ylabel('Parameter Estimate')
    axes[0, 0].set_title('RLS Parameter Convergence')
    axes[0, 0].legend()
    axes[0, 0].grid(True, alpha=0.3)
    
    # 参数误差
    param_error = np.linalg.norm(theta_history - true_params, axis=1)
    axes[0, 1].semilogy(t, param_error, 'b-', linewidth=1.5)
    axes[0, 1].set_xlabel('Time (s)')
    axes[0, 1].set_ylabel('Parameter Error (log)')
    axes[0, 1].set_title('Parameter Estimation Error')
    axes[0, 1].grid(True, alpha=0.3)
    
    # 预测误差
    axes[1, 0].plot(t, error_history, 'b-', linewidth=0.8, alpha=0.7)
    axes[1, 0].set_xlabel('Time (s)')
    axes[1, 0].set_ylabel('Prediction Error')
    axes[1, 0].set_title('RLS Prediction Error')
    axes[1, 0].grid(True, alpha=0.3)
    
    # 最终参数估计
    final_theta = theta_history[-1]
    axes[1, 1].bar(['θ1', 'θ2', 'θ3'], final_theta, alpha=0.7, label='Estimated')
    axes[1, 1].bar(['θ1', 'θ2', 'θ3'], true_params, alpha=0.5, label='True')
    axes[1, 1].set_ylabel('Parameter Value')
    axes[1, 1].set_title('Final Parameter Estimates')
    axes[1, 1].legend()
    axes[1, 1].grid(True, alpha=0.3, axis='y')
    
    plt.tight_layout()
    plt.savefig(os.path.join(output_dir, 'rls_parameter_estimation.png'), dpi=150, bbox_inches='tight')
    plt.close()
    print("  ✓ RLS仿真完成")
    
    # ==================== 示例2: MRAC仿真 ====================
    print("\n示例2: MRAC控制")
    
    # 被控对象: dx = A*x + B*u
    A = np.array([[0, 1], [-2, -3]])
    B = np.array([[0], [1]])
    
    # 参考模型: dx_m = A_m*x_m + B_m*r
    A_m = np.array([[0, 1], [-4, -4]])
    B_m = np.array([[0], [4]])
    
    # MRAC控制器
    Gamma = 0.1
    mrac = MRAC_Controller(A_m, B_m, B, Gamma)
    
    # 仿真
    x = np.array([1, 0])
    x_m = np.array([0, 0])
    
    x_history = []
    x_m_history = []
    e_history = []
    u_history = []
    K_x_history = []
    
    for ti in t:
        # 参考输入(方波)
        r = np.array([1.0 if (ti % 4) < 2 else -1.0])
        
        # 参考模型
        dx_m = A_m @ x_m + B_m @ r
        x_m = x_m + dx_m * dt
        
        # MRAC控制
        u, e = mrac.control(x, x_m, r)
        
        # 被控对象
        dx = A @ x + B @ u
        x = x + dx * dt
        
        x_history.append(x.copy())
        x_m_history.append(x_m.copy())
        e_history.append(e.copy())
        u_history.append(u[0])
        K_x_history.append(mrac.K_x[0, :].copy())
    
    x_history = np.array(x_history)
    x_m_history = np.array(x_m_history)
    e_history = np.array(e_history)
    u_history = np.array(u_history)
    K_x_history = np.array(K_x_history)
    
    # 绘制MRAC结果
    fig, axes = plt.subplots(2, 2, figsize=(12, 10))
    
    # 状态跟踪
    axes[0, 0].plot(t, x_history[:, 0], 'b-', label='x1 (Plant)', linewidth=1.5)
    axes[0, 0].plot(t, x_m_history[:, 0], 'b--', label='x1 (Model)', linewidth=1.5)
    axes[0, 0].plot(t, x_history[:, 1], 'r-', label='x2 (Plant)', linewidth=1.5)
    axes[0, 0].plot(t, x_m_history[:, 1], 'r--', label='x2 (Model)', linewidth=1.5)
    axes[0, 0].set_xlabel('Time (s)')
    axes[0, 0].set_ylabel('State')
    axes[0, 0].set_title('MRAC State Tracking')
    axes[0, 0].legend()
    axes[0, 0].grid(True, alpha=0.3)
    
    # 跟踪误差
    axes[0, 1].plot(t, e_history[:, 0], 'b-', label='e1', linewidth=1.5)
    axes[0, 1].plot(t, e_history[:, 1], 'r-', label='e2', linewidth=1.5)
    axes[0, 1].set_xlabel('Time (s)')
    axes[0, 1].set_ylabel('Tracking Error')
    axes[0, 1].set_title('Tracking Error')
    axes[0, 1].legend()
    axes[0, 1].grid(True, alpha=0.3)
    
    # 控制输入
    axes[1, 0].plot(t, u_history, 'b-', linewidth=1.5)
    axes[1, 0].set_xlabel('Time (s)')
    axes[1, 0].set_ylabel('Control Input')
    axes[1, 0].set_title('MRAC Control Signal')
    axes[1, 0].grid(True, alpha=0.3)
    
    # 参数收敛
    axes[1, 1].plot(t, K_x_history[:, 0], 'b-', label='K_x1', linewidth=1.5)
    axes[1, 1].plot(t, K_x_history[:, 1], 'r-', label='K_x2', linewidth=1.5)
    axes[1, 1].set_xlabel('Time (s)')
    axes[1, 1].set_ylabel('Controller Gain')
    axes[1, 1].set_title('Adaptive Gain Convergence')
    axes[1, 1].legend()
    axes[1, 1].grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.savefig(os.path.join(output_dir, 'mrac_control.png'), dpi=150, bbox_inches='tight')
    plt.close()
    print("  ✓ MRAC仿真完成")
    
    print(f"\n仿真图已保存至: {output_dir}")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐