4. 质量不确定的鲁棒自适应
任务定义
飞行器在飞行过程中因燃料消耗或载荷变化导致质量不确定,但已知质量界限:m ∈ [m_min, m_max]。设飞行器纵向动力学为:
m·a = u + d(t)
其中a为加速度,u为控制输入,d(t)为有界扰动(|d(t)| ≤ D)。目标:设计鲁棒自适应控制器,使实际加速度a(t)跟踪期望轨迹a_ref(t),且跟踪误差一致最终有界。
控制器设计
定义跟踪误差e = a − a_ref。取控制律:
u = m̂·a_ref − k·e − v
其中m̂为质量估计值,k > 0为反馈增益,v为鲁棒补偿项。代入动力学得误差方程:
m·ė = −k·e + (m − m̂)·a_ref + d(t) − v
采用投影自适应律保证m̂ ∈ [m_min, m_max]:
m̂̇ = γ·a_ref·e − γ·a_ref·e·Proj(m̂)
其中γ > 0为自适应增益,投影算子Proj(m̂)在m̂到达边界时抑制参数漂移。鲁棒项取:
v = D·sign(e) + ρ·sign(e)
其中ρ = |a_ref|·(m_max − m_min)为质量不确定上界补偿。该设计保证V = ½m·e² + ½γ⁻¹·m̃²(m̃ = m̂ − m)满足V̇ ≤ −k·e²,从而跟踪误差渐近收敛。
Python仿真实现
import numpy as np
import matplotlib.pyplot as plt
# 系统参数
m_true = 8.0 # 真实质量(kg)
m_min, m_max = 5.0, 12.0
D = 0.5 # 扰动上界
k = 3.0 # 反馈增益
gamma = 2.0 # 自适应增益
# 期望轨迹
def a_ref(t):
return 2.0 * np.sin(0.5 * t)
# 仿真参数
dt = 0.001
T = 10.0
n_steps = int(T / dt)
t_arr = np.linspace(0, T, n_steps)
# 状态初始化
a = 0.0
m_hat = (m_min + m_max) / 2
e_arr = []
m_hat_arr = []
a_arr = []
# 投影算子
def project(m_hat, update):
if m_hat <= m_min and update < 0:
return 0.0
if m_hat >= m_max and update > 0:
return 0.0
return update
# 仿真主循环
for t in t_arr:
ref = a_ref(t)
e = a - ref
ref_dot = 1.0 * np.cos(0.5 * t) # a_ref的导数
# 控制律
rho = abs(ref_dot) * (m_max - m_min)
v = D * np.sign(e) + rho * np.sign(e)
u = m_hat * ref_dot - k * e - v
# 扰动(有界)
d = D * np.sin(3.0 * t)
# 动力学更新
a_dot = (u + d) / m_true
a += a_dot * dt
# 自适应律(带投影)
update = gamma * ref_dot * e
m_hat += project(m_hat, update) * dt
# 记录数据
e_arr.append(e)
m_hat_arr.append(m_hat)
a_arr.append(a)
# 绘制结果
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(t_arr, a_arr, label='实际加速度')
plt.plot(t_arr, [a_ref(t) for t in t_arr], '--', label='期望加速度')
plt.ylabel('加速度 (m/s²)')
plt.legend()
plt.grid(True)
plt.subplot(2, 1, 2)
plt.plot(t_arr, e_arr, label='跟踪误差')
plt.plot(t_arr, m_hat_arr, label='质量估计')
plt.axhline(m_true, color='r', linestyle=':', label='真实质量')
plt.xlabel('时间 (s)')
plt.ylabel('误差 / 质量')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig('robust_adaptive_result.png', dpi=100)
plt.show()
运行与验证
依赖:Python 3 + NumPy + Matplotlib。
运行方式:将代码保存为robust_adaptive.py,执行python robust_adaptive.py。
判定标准:
- 仿真结束后,跟踪误差
e(t)收敛至零附近(稳态幅值小于0.1 m/s²); - 质量估计
m̂(t)始终保持在[5, 12]区间内,不越界; - 控制输入
u有界且无高频抖振(可通过在代码中增加u_arr记录观察)。
满足以上三点即判定鲁棒自适应控制器设计有效。