学Simulink——基于Simulink的自适应控制算法仿真建模示例(增强版)

目录

手把手教你学Simulink

一、引言:当系统“善变”且“未知”——为什么需要自适应控制?

二、被控对象:二阶伺服系统(含未知时变增益)

1. 数学模型

三、方案一:模型参考自适应控制(MRAC)

A. 参考模型设计

B. 控制律结构(直接 MRAC)

C. 自适应律(Lyapunov 设计)

四、方案二:自校正控制(STC)——间接自适应

A. 思想:先辨识参数,再设计控制器

B. RLS 辨识算法

五、MATLAB 算法验证(MRAC 示例)

六、Simulink 建模仿真(MRAC 方案)

模型架构

步骤详解

1. 参考模型

2. 被控对象(手动搭建,便于注入时变 b)

3. 自适应律子系统

4. 控制律生成

七、Simulink 实现自校正控制(STC)

关键模块:RLS 参数辨识

控制器重构

八、仿真结果对比

九、工程实践要点

1. 防止参数漂移

2. 持久激励(PE)

3. 速度估计

十、扩展方向

1. 多变量自适应控制

2. 神经网络自适应

3. 鲁棒自适应

十一、总结

核心价值:

附录:所需工具箱


——基于Simulink的自适应控制算法仿真建模示例(增强版)


一、引言:当系统“善变”且“未知”——为什么需要自适应控制?

在真实工业场景中,控制系统常面临:

  • 参数漂移(如电机绕组电阻随温升增加30%)
  • 结构变化(如无人机载荷投放后质量突变)
  • 完全未知模型(如新型执行器无先验参数)
自适应控制(Adaptive Control)通过在线学习实时调整,使控制器能:在无精确模型下稳定系统自动补偿参数变化保持高性能跟踪
🎯 本文目标:手把手教你使用 MATLAB + Simulink 完成:建立二阶伺服系统(含时变未知增益)设计模型参考自适应控制(MRAC)与自校正控制(STC)两种方案在 Simulink 中实现参数辨识 + 控制器重构
最终实现:即使系统增益在 [0.8, 3.0] 范围内任意跳变,仍能实现 <1% 跟踪误差、无超调响应

二、被控对象:二阶伺服系统(含未知时变增益)

1. 数学模型

[
\ddot{y}(t) + a_1 \dot{y}(t) + a_2 y(t) = b u(t)
]

其中:

  • ( a_1 = 2 ), ( a_2 = 5 ):已知(可通过阶跃响应粗略估计)
  • ( b > 0 ):未知且时变(例如:( b = 1.0 \rightarrow 2.5 \rightarrow 0.8 ))
⚠️ 挑战:传统 PID 需整定 ( K_p, K_i, K_d ) 依赖 ( b ),而自适应控制无需!

三、方案一:模型参考自适应控制(MRAC)

A. 参考模型设计

选择理想二阶动态:

[
\ddot{y}_m + 2 \zeta \omega_n \dot{y}_m + \omega_n^2 y_m = \omega_n^2 r
]

设 ( \zeta = 0.7 ), ( \omega_n = 4 ) → 无超调、快速响应

传递函数:
[
M(s) = \frac{Y_m(s)}{R(s)} = \frac{16}{s^2 + 5.6 s + 16}
]

B. 控制律结构(直接 MRAC)

采用状态反馈形式(需估计速度):

[
u(t) = \theta_1(t) r(t) - \theta_2(t) y(t) - \theta_3(t) \dot{y}(t)
]

💡 若速度不可测,可用微分器观测器估计(见后文扩展)

C. 自适应律(Lyapunov 设计)

定义误差:( e = y - y_m )

参数更新律:

[
\begin{aligned}
\dot{\theta}_1 &= -\gamma_1 e r \
\dot{\theta}_2 &= \gamma_2 e y \
\dot{\theta}_3 &= \gamma_3 e \dot{y}
\end{aligned}
]

其中 ( \gamma_i > 0 ) 为自适应增益。


四、方案二:自校正控制(STC)——间接自适应

A. 思想:先辨识参数,再设计控制器

  1. 在线辨识:用递推最小二乘(RLS)估计 ( \hat{b} )
  2. 控制器重构:设计极点配置控制器 ( u = \frac{1}{\hat{b}} (u_{\text{des}}) )

B. RLS 辨识算法

系统离散化(采样周期 ( T_s = 0.01 , \text{s} )):

[
y(k) = -a_1' y(k-1) - a_2' y(k-2) + b' u(k-1)
]

回归向量:( \phi(k) = [-y(k-1), -y(k-2), u(k-1)]^T )
参数向量:( \theta = [a_1', a_2', b']^T )

RLS 更新:

[
\begin{aligned}
K(k) &= \frac{P(k-1)\phi(k)}{\lambda + \phi^T(k) P(k-1) \phi(k)} \
\hat{\theta}(k) &= \hat{\theta}(k-1) + K(k) [y(k) - \phi^T(k) \hat{\theta}(k-1)] \
P(k) &= \frac{1}{\lambda} [P(k-1) - K(k) \phi^T(k) P(k-1)]
\end{aligned}
]

其中 ( \lambda = 0.98 \sim 1.0 ) 为遗忘因子。


五、MATLAB 算法验证(MRAC 示例)

% 系统参数 a1 = 2; a2 = 5; b_true = @(t) 1.0 + (t>3)*1.5 + (t>6)*(-1.7); % 1.0 -> 2.5 -> 0.8 % 参考模型 num_m = 16; den_m = [1, 5.6, 16]; sys_m = tf(num_m, den_m); % 自适应参数 gamma = [20, 20, 20]; % [γ1, γ2, γ3] theta = [0; 0; 0]; % [θ1; θ2; θ3] % 仿真 Ts = 0.001; T = 10; t = 0:Ts:T; r = ones(size(t)); % 阶跃 % 初始化 x = [0; 0]; % [y; y_dot] xm = [0; 0]; e_hist = zeros(size(t)); theta_hist = zeros(3, length(t)); for k = 1:length(t)-1 % 参考模型状态更新 dxm = [xm(2); -5.6*xm(2) - 16*xm(1) + 16*r(k)]; xm = xm + dxm * Ts; ym = xm(1); % 控制输入 u = theta(1)*r(k) - theta(2)*x(1) - theta(3)*x(2); % 被控对象(含时变b) b_k = b_true(t(k)); dx = [x(2); -a1*x(2) - a2*x(1) + b_k*u]; x = x + dx * Ts; y = x(1); % 误差 e = y - ym; e_hist(k) = e; % 自适应律 dtheta = [-gamma(1)*e*r(k); ... gamma(2)*e*x(1); ... gamma(3)*e*x(2)]; theta = theta + dtheta * Ts; theta_hist(:,k) = theta; end % 绘图 figure; subplot(2,1,1); plot(t, x(1,:), 'b', t, xm(1,:), 'r--'); legend('y','y_m'); title('MRAC 跟踪性能'); subplot(2,1,2); plot(t, theta_hist'); legend('\theta_1','\theta_2','\theta_3'); title('参数自适应'); 
结果:即使 b 两次跳变,系统始终跟踪 y_m,参数自动调整!

模型架构

[Step: r] ────────────────→ [× θ1] ───┐ ▼ [Reference Model] → y_m → [−] → e → [Adaptation Law] → θ1,θ2,θ3 ▲ │ [Plant] ← u ← [Sum: θ1*r − θ2*y − θ3*ẏ] ← y, ẏ ←──────────┘ 

步骤详解

1. 参考模型
  • Transfer Fcn:Numerator=[16], Denominator=[1, 5.6, 16]
2. 被控对象(手动搭建,便于注入时变 b)
  • 两个 Integrator:输出 y 和 ẏ
  • Sum:计算 ÿ = -a1ẏ - a2y + b*u
  • bStep 模块实现跳变(t=3s:1→2.5;t=6s:2.5→0.8)
3. 自适应律子系统

创建子系统 “MRAC Adaptation”:

  • 输入:e, r, y, ẏ
  • 内部:
    • 三个 Product + Gain(γi)-γ1*e*r, γ2*e*y, γ3*e*ẏ
    • 三个 Integrator(初始值=0)→ θ1, θ2, θ3
  • 输出:θ1, θ2, θ3
4. 控制律生成
  • Gain 模块:θ1 × r
  • Gain 模块:θ2 × y
  • Gain 模块:θ3 × ẏ
  • Sum:u = θ1r - θ2y - θ3*ẏ
🔧 技巧:用 Derivative 模块估计 ẏ(加低通滤波防噪声)或用 State-Space 模块直接输出状态

关键模块:RLS 参数辨识

使用 Recursive Least Squares Estimator 模块(System Identification Toolbox):

  1. 输入信号
    • Regression vector: [-y(k-1), -y(k-2), u(k-1)]
    • Output: y(k)
  2. 配置
    • Number of parameters: 3
    • Forgetting factor: 0.98
    • Initial estimate: [2, 5, 1]
  3. 输出θ_hat = [a1_est, a2_est, b_est]

控制器重构

  • 提取 b_est
  • 设计极点配置控制器:
    [
    u = \frac{1}{b_{\text{est}}} \left( -a_1^{\text{des}} y - a_2^{\text{des}} \int y + r_{\text{ff}} \right)
    ]
  • 在 Simulink 中用 Gain(1/b_est) 实现

八、仿真结果对比

场景MRACSTC
参数收敛速度快(<0.5 s)中(~1 s)
计算负担低(3个积分器)高(矩阵运算)
对噪声敏感性高(RLS 放大噪声)
实现复杂度简单复杂
适用场景已知结构,未知增益完全未知模型
推荐:若系统结构已知(如电机、机械臂),MRAC 更实用;若模型完全未知,用 STC

九、工程实践要点

1. 防止参数漂移

添加 σ-修正(sigma-modification):

dtheta = ... - sigma * theta; % sigma = 0.01 

2. 持久激励(PE)

  • 输入 r(t) 需包含足够频率成分
  • 避免:长时间恒定值
  • 建议:叠加小幅随机信号或斜坡

3. 速度估计

若 ẏ 不可测:

  • 低通微分器:( \hat{\dot{y}} = \frac{s}{\tau s + 1} y )
  • 或设计 状态观测器

十、扩展方向

1. 多变量自适应控制

  • 用于 MIMO 系统(如飞行器、机器人)
  • 使用向量李雅普诺夫函数

2. 神经网络自适应

  • 用 NN 逼近未知非线性函数
  • 结合 MRAC 形成 NN-MRAC

3. 鲁棒自适应

  • 加入滑模项抑制未建模动态
  • 形成 鲁棒 MRAC

十一、总结

本文完成了 基于 Simulink 的自适应控制仿真,实现了:

掌握 MRAC 与 STC 两种主流自适应架构
构建参数在线辨识与控制器自整定闭环
在 Simulink 中验证对大幅参数跳变的强鲁棒性
提供工程落地的关键技巧(防漂移、PE、速度估计)

核心价值:

  • 自适应控制是智能控制的基石
  • MRAC 结构简单、效果显著,适合工业部署
  • Simulink 让“边控制边学习”变得可视化、可调试
🌱🧠⚙️ 记住
控制的最高境界,不是征服已知,而是拥抱未知。自适应控制赋予机器以“感知变化、自我进化”的能力——这不仅是技术的突破,更是迈向真正智能的关键一步

附录:所需工具箱

工具箱用途
MATLAB算法验证
Simulink仿真平台
System Identification Toolbox(仅 STC 需要)RLS 模块
No special toolbox for MRAC仅需基本模块
💡 教学建议:先展示固定增益下 PID 控制效果;改变 b,观察 PID 失效;引入 MRAC,实时调整参数;对比 MRAC 与 STC 的优劣;讨论:如何将自适应控制用于你的项目?

Read more

前端 | 一篇搞懂CSS盒模型核心:padding、margin、border与box-sizing、border-radius

一篇搞懂CSS盒模型核心:padding、margin、border与box-sizing、border-radius 写CSS布局时,很多人会被“盒子”里的padding、margin、border绕晕——明明设置了相同的宽度,加个padding就变形;调整margin又莫名影响相邻元素;border的宽度到底算不算总宽度?其实只要把“盒子”的逻辑拆透,这些问题都能迎刃而解。今天就用最直白的方式,把这些核心概念讲清楚,让你看完就能直接用。 先分清三个“间隔”:padding、margin、border的核心区别 CSS里的每个元素,都像一个“快递盒子”——内容是盒子里的物品,而padding、margin、border,就是盒子本身和周围的不同间隔。三者的核心区别,本质是“位置不同、作用对象不同、是否占盒模型空间不同”,用一句话总结:border是盒子的“壳”,padding是壳和内容的“内填充”,margin是盒子和其他盒子的“外距离”。 1. border:盒子的“

By Ne0inhk
基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

✨ 更新日志 * ✔️ 2026/3/3,2.0 版本,前端导航栏改为侧边栏系统,视频流采用websocket框架延迟更低, YOLO26/YOLO11/YOLOv8 视频流更稳定,在之前的系统增加 LLM 大模型智能分析,是科研必备,支持 YOLO26/11/v8 分类模型、目标检测、分割、obb、关键点检测任务,还支持双模型联合检测与识别,如人脸表情识别、人脸识别等一些识别任务需要检测模型与分类模型共同完成,在人脸表情识别中,单独使用检测模型去识别人脸表情也不是不可以,但有一个问题数据集如果全是头部照片的话,当模型预测的照片是全身照片时,模型识别准确率就没有这么高了, 那么这时候可以用检测模型识别人脸,把人脸信息输入到表情分类模型进行分类即可,反正这是一个通用的系统,更换自己模型即可,大家懂得都懂的,更多功能看下文即可。 摘要 在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”

By Ne0inhk

Rembg WebUI响应式设计:多设备适配方案

Rembg WebUI响应式设计:多设备适配方案 1. 智能万能抠图 - Rembg 在图像处理与内容创作日益普及的今天,自动去背景技术已成为设计师、电商运营、AI开发者不可或缺的工具。传统手动抠图效率低、成本高,而基于深度学习的智能抠图方案正逐步成为主流。其中,Rembg 凭借其开源、高精度和通用性强的特点,迅速在开发者社区中脱颖而出。 Rembg 的核心是 U²-Net(U-square Net) 模型,一种专为显著性目标检测设计的嵌套 U-Net 架构。该模型通过双层嵌套残差模块,在不依赖大量标注数据的前提下,实现对图像主体的精准识别与边缘提取。无论是人像发丝、宠物毛发,还是复杂轮廓的商品,Rembg 都能生成高质量的透明 PNG 图像,满足工业级应用需求。 更重要的是,Rembg 支持本地部署、无需联网验证权限,并可集成 ONNX 推理引擎进行 CPU 优化,极大提升了服务的稳定性与可移植性。

By Ne0inhk

前端人拿不到offer,九成是不知道这个新风向

今年大部分互联网公司面试的题目已经开始小部分八股文,大部分场景题了,公司需要的不仅是知识扎实,而且招进来就能上手项目的面试者… 2026最新高频场景题 * 1. 请求失败会弹出一个toast,如何保证批量请求失败,只弹出一个toast * 2. 如何减少项目里面if-else * 3. babel-runtime 作用是啥 * 4. 如何实现预览PDF文件 * 5. 如何在划词选择的文本上添加右键菜单(划词:鼠标滑动选择一组字符,对组字符进行操作) * 6. 富文本里面,是如何做到划词的(鼠标滑动选择一组字符,对组字符进行操作)? * 7. 如何做好前端监控方案 * 8. 如何标准化处理线上用户反馈的问题 * 9. px如何转为rem * 10. 浏览器有同源策略,但是为何 cdn 请求资源的时候不会有 跨域限制 * 11. cookie可以实现不同域共享吗 * 12. axios是否可以取消请求 * 13. 前端如何实现折叠面板效果? * 14. dom里面,如何判定a元素是否是b元素的子元 * 15. 判断一个对象是否为空,包含了其原型链上是否有自

By Ne0inhk