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

张开发
2026/4/4 2:15:42 15 分钟阅读
从噪声数据中提取系统矩阵(对应论文式3)
控制顶刊IEEE TAC热点论文复现前V章案例复现内容包括数据驱动状态反馈控制和LQR控制可应用于具有噪声的数据和非线性系统附参考论文及详细代码注释对应到文中公式易于掌握理解需要代码最近在复现TAC上的数据驱动控制方案时发现很多论文把公式写得像天书代码却藏着掖着。今天就带大伙儿手撕两种实用控制算法——数据驱动状态反馈和LQR用真实数据非线性系统场景直接看代码怎么落地。论文拍脸[1]H. Modi et al. TAC2021场景设定假设我们只有带噪声的输入输出数据系统模型未知。目标是找到最优控制策略让小车稳定在斜坡上别问我为什么又是小车问就是控制界的Hello World。先上数据驱动状态反馈的核心代码def extract_AB(u_seq, y_seq, noise_threshold0.1): # 数据预处理滑动窗口均值滤波 y_processed moving_average(y_seq, window_size5) u_processed moving_average(u_seq, window_size3) # 构造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, rcondNone)[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_iter150): 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_size100): self.buffer deque(maxlenwindow_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:], rcondNone)[0] B np.linalg.lstsq(U[:-1], X[1:] - X[:-1] A.T, rcondNone)[0] return A, B这个骚操作能让传统LQR适应非线性系统原理是用滑动窗口内的数据动态更新局部线性模型。实测在倒立摆系统角度大于30度时依然稳如老狗。代码实战注意事项状态矩阵维度必须对齐曾经因为把速度放在位置前面导致矩阵乘法报错debug三小时噪声数据建议做白化处理别直接用原始数据LQR的Q、R矩阵别设单位阵要根据物理量纲调整比如位置误差权重通常比速度大一个量级完整代码已打包含Jupyter可视化模块需要的老铁评论区留言。下期预告如何用这种框架实现无人机抗风控制——被风吹炸过三台机的经验都在里边了。

更多文章