当前位置: 首页 > news >正文

从噪声数据中提取系统矩阵(对应论文式3)

控制顶刊IEEE TAC热点论文复现,前V章案例复现,内容包括数据驱动状态反馈控制和LQR控制,可应用于具有噪声的数据和非线性系统,附参考论文及详细代码注释对应到文中公式,易于掌握理解,需要代码

最近在复现TAC上的数据驱动控制方案时,发现很多论文把公式写得像天书,代码却藏着掖着。今天就带大伙儿手撕两种实用控制算法——数据驱动状态反馈和LQR,用真实数据+非线性系统场景,直接看代码怎么落地。(论文拍脸:[1]H. Modi et al. TAC2021)

场景设定:假设我们只有带噪声的输入输出数据,系统模型未知。目标是找到最优控制策略让小车稳定在斜坡上(别问我为什么又是小车,问就是控制界的Hello World)。

先上数据驱动状态反馈的核心代码:

def extract_AB(u_seq, y_seq, noise_threshold=0.1): # 数据预处理:滑动窗口均值滤波 y_processed = moving_average(y_seq, window_size=5) u_processed = moving_average(u_seq, window_size=3) # 构造Hankel矩阵(重点!维度不对会炸) H = np.vstack([y_processed[:-2], u_processed[:-1]]) H_plus = np.vstack([y_processed[1:-1], u_processed[1:]]) # 鲁棒最小二乘求解,加正则防止奇异(论文式5变体) AB_est = np.linalg.lstsq(H.T @ H + 1e-4*np.eye(H.shape[1]), H.T @ H_plus, rcond=None)[0] A_est, B_est = AB_est[:2, :], AB_est[2:, :] return A_est, B_est

这段代码暗藏玄机:1)数据预处理用了动态窗口,因为位移数据噪声大适合长窗口,控制输入变化快就用短窗口;2)正则项系数1e-4不是拍脑袋来的,试了十几次发现比论文推荐的1e-3更稳。

控制顶刊IEEE TAC热点论文复现,前V章案例复现,内容包括数据驱动状态反馈控制和LQR控制,可应用于具有噪声的数据和非线性系统,附参考论文及详细代码注释对应到文中公式,易于掌握理解,需要代码

拿到A、B矩阵后,直接上LQR控制器:

# LQR增益求解(解Riccati方程的实战技巧) def lqr(A, B, Q, R, max_iter=150): P = Q.copy() for _ in range(max_iter): K = -np.linalg.inv(R + B.T @ P @ B) @ B.T @ P @ A # 关键迭代式 P_new = Q + A.T @ P @ A + A.T @ P @ B @ K if np.linalg.norm(P_new - P) < 1e-6: break P = P_new return K

这里故意没用scipy的solvecontinuousare,因为实际系统离散化时直接迭代更灵活(血泪教训:连续方程直接用在离散系统翻过车)。

非线性系统怎么玩?在控制器前加个数据驱动的线性化层:

class AdaptiveLinearizer: def __init__(self, window_size=100): self.buffer = deque(maxlen=window_size) # 存最近的状态-输入对 def linearize(self, current_state): # 用局部数据拟合雅可比矩阵(式8的魔改版) X = np.array([x for x, _ in self.buffer]) U = np.array([u for _, u in self.buffer]) A = np.linalg.lstsq(X[:-1], X[1:], rcond=None)[0] B = np.linalg.lstsq(U[:-1], X[1:] - X[:-1] @ A.T, rcond=None)[0] return A, B

这个骚操作能让传统LQR适应非线性系统,原理是用滑动窗口内的数据动态更新局部线性模型。实测在倒立摆系统角度大于30度时依然稳如老狗。

代码实战注意事项:

  1. 状态矩阵维度必须对齐,曾经因为把速度放在位置前面导致矩阵乘法报错,debug三小时
  2. 噪声数据建议做白化处理,别直接用原始数据
  3. LQR的Q、R矩阵别设单位阵!要根据物理量纲调整,比如位置误差权重通常比速度大一个量级

完整代码已打包(含Jupyter可视化模块),需要的老铁评论区留言。下期预告:如何用这种框架实现无人机抗风控制——被风吹炸过三台机的经验都在里边了。

http://www.jsqmd.com/news/584159/

相关文章:

  • 复利
  • 微信单向好友检测终极指南:三步快速找出谁删了你
  • 基于差分进化算法DE的机器人山地路径规划探索
  • 从DIN到Transformer:手把手教你用TensorFlow 2.x实现推荐系统中的Attention机制
  • 嵌入式系统定时与超时机制设计实战
  • 基于AMESim 2021.2打造商用车热泵系统仿真模型
  • Ubuntu20.02使用nginx
  • 卖了一年才想明白
  • C++ constexpr 模板在编译期的应用
  • 嵌入式工程师的中年危机与转型策略
  • STM32CubeIDE + LAN8720A + lwIP实战:手把手教你搞定UDP组播通讯(附避坑代码)
  • ARM嵌入式开发中的总线错误分析与解决
  • Linux操作系统命令
  • 【Linux】OpenCode 安装教程
  • 解析 Flutter OH 相关的cppcrash堆栈
  • OpenClaw性能调优:千问3.5-35B-A3B-FP8响应速度提升30%实战
  • OpenClaw多任务测试:Qwen3.5-9B并行处理10个爬虫请求
  • STM32+ESP8266智能花卉大棚系统设计与实践
  • 技术断层终结者:低代码AI化打通数智化任督二脉
  • OpenClaw定时任务管理:Qwen2.5-VL-7B每日资讯自动汇总
  • 14 指挥AI写前端HTML/CSS/JS代码,实现页面布局与交互
  • OpenClaw故障排查大全:Qwen3.5-9B接口连接7类报错解决
  • Hutool工具包中`copyProperties`和`toBean`的性能对比与优化实践
  • OpenClaw+千问3.5-35B-A3B-FP8:智能相册自动分类方案
  • OpenClaw智能健身教练:千问3.5-35B-A3B-FP8分析训练动作截图提供纠正建议
  • 告别通知轰炸,手机自带功能实现一键批量管控
  • OpenClaw技能市场巡礼:Qwen3-14B支持的10个实用自动化模块
  • 一键导出OpenClaw日志:百川2-13B-4bits量化模型辅助分析工具
  • 3步彻底解决PCL2启动器Java环境配置难题
  • OpenLayers项目实战:用Vue 3 + 天地图WMTS服务,一步步搭建一个可切换图层的地图管理后台