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

基本matlab的最小二乘估计递推算法,生成M 序列,对参数估计值进行辨识,输出估计误差结果...

基本matlab的最小二乘估计递推算法,生成M 序列,对参数估计值进行辨识,输出估计误差结果。 程序已调通,可直接运行。

最近在搞系统辨识,发现递推最小二乘算法真香。这玩意儿能在线更新参数估计值,特别适合实时系统。咱先用M序列给系统加点刺激信号,再让算法自己边跑边调参,最后输出误差曲线一看——嚯,收敛得还挺快!

先整点M序列当输入信号

M序列这货长得像随机噪声,其实是伪随机信号,特别适合用来做系统激励。下面这段代码生成周期31的M序列:

function u = generate_m_sequence(N) reg = [1 1 1 1 1]; % 初始寄存器状态 feedback = [1 0 0 1 0]; % 本原多项式x^5+x^2+1 u = zeros(N,1); for k = 1:N u(k) = reg(end); new_bit = mod(sum(reg .* feedback),2); reg = [new_bit, reg(1:end-1)]; % 右移 end end

这里用了个5位移位寄存器,本原多项式选的是x^5+x²+1(对应feedback向量)。每次循环把寄存器的最后一位输出,同时计算反馈值更新首位。生成的u序列会在0和1之间跳变,实操时记得按系统需求做幅值缩放。

造点带噪声的测试数据

基本matlab的最小二乘估计递推算法,生成M 序列,对参数估计值进行辨识,输出估计误差结果。 程序已调通,可直接运行。

假设真实系统模型是y(k) = 1.5u(k-1) + 0.8y(k-1)。咱们给输出加点高斯噪声模拟实际情况:

N = 300; u = 2*generate_m_sequence(N) - 1; % 将M序列调整到[-1,1]范围 y = zeros(N,1); theta_true = [1.5; 0.8]; % 真实参数[beta; alpha] for k = 2:N y(k) = theta_true(1)*u(k-1) + theta_true(2)*y(k-1) + 0.5*randn(); end

注意这里用u(k-1)和y(k-1)构成输入向量,对应典型的差分方程模型。噪声方差设为0.5,这个值太大会影响辨识精度,太小不真实,根据实际情况调整。

递推最小二乘的核心战场

算法关键在实时更新参数估计和协方差矩阵:

theta_hat = zeros(2, N); % 参数估计历史 P = 100*eye(2); % 初始协方差矩阵 lambda = 0.98; % 遗忘因子 for k = 2:N-1 phi = [u(k-1); y(k-1)]; % 数据向量 K = P*phi / (lambda + phi'*P*phi); % 卡尔曼增益 theta_hat(:,k) = theta_hat(:,k-1) + K*(y(k) - phi'*theta_hat(:,k-1)); P = (P - K*phi'*P)/lambda; % 协方差更新 end

这里有几个trick:

  1. 初始协方差设大些(P=100I),让算法前期快速调整
  2. 遗忘因子λ控制历史数据权重,0.98表示稍微侧重新数据
  3. 卡尔曼增益K相当于调整参数更新的步长

看看成果咋样

画个参数估计的收敛过程:

figure; subplot(2,1,1); plot(theta_hat(1,:)); hold on; plot([1 N], [theta_true(1) theta_true(1)], 'r--'); title('beta参数估计'); subplot(2,1,2); plot(theta_hat(2,:)); hold on; plot([1 N], [theta_true(2) theta_true(2)], 'r--'); title('alpha参数估计'); % 计算最终误差 final_error = norm(theta_hat(:,end) - theta_true)

跑出来的曲线应该能看到估计值在100步左右基本收敛到真值附近。最终误差一般在0.1~0.3之间,主要受噪声影响。如果想提升精度,要么加大数据量,要么减小输入信号的幅值波动——不过这就得在激励强度和抗噪性之间做tradeoff了。

遇到过的坑

  1. 协方差矩阵P突然变成非正定矩阵?检查更新公式分母部分,必要时加个正则化项
  2. 参数估计发散?试试调小遗忘因子,或者检查数据向量φ是否正确
  3. 初始震荡太大?给P矩阵对角线加个阻尼系数,比如从1000开始

这算法在单片机上也跑得动,把矩阵运算展开成标量计算就行。下次试试加个时变参数跟踪,那才叫刺激呢!

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

相关文章:

  • 百考通:积累可落地的项目经验,为求职与职业发展打下坚实基础
  • 光伏锂电池储能功率协调控制系统仿真探索
  • 基于华为eNSP的园区网防火墙高可靠与安全策略实战
  • LLC谐振变换器变频与移相混合控制 仿真模型采用混合控制,控制策略为:当输入电压较低时,采用变频控制
  • 手把手教你用CS5523替代IT6151:MIPI转EDP信号转换芯片的完整配置指南
  • 嵌入式开发避坑指南:如何快速定位Hard_Fault_Handler错误(附内存越界排查技巧)
  • Java笔记 —— 泛型
  • ABAQUS纤维复合材料热固化仿真:子粘弹性模型与内附CAE文件
  • 三电平逆变器实战:从SVPWM调制到中点平衡的硬核玩法
  • 从‘靶场‘到‘实战‘:把Pikachu漏洞环境搬上云服务器(阿里云/腾讯云实操)
  • 基于A*算法的往返式全覆盖路径规划的改进算法及MATLAB实现代码
  • 这个十行代码的观测器 凭什么让电机控制工程师直呼真香
  • Gemini 3 Pro技术深度拆解:原生多模态与MoE架构解析
  • 深入PX4 DataValidator:看懂传感器‘信任度’confidence是如何算出来的
  • 西门子828D数控系统及PLC全功能调试流程包:涵盖车床、加工中心、攻钻机、铣床设备
  • 【第三周】论文精读:Scaling Knowledge Graph Construction through Synthetic Data Generation and Distillation
  • 服务器带外管理实战:手把手教你用IPMI远程控制Dell iDRAC(附常见问题排查)
  • 2026年Gemini 3.1 Pro技术深度拆解:推理能力翻倍与国内直访方案
  • 多模态数据标注实战指南:5大高效工具与避坑策略(附Label Studio模板)
  • 半主动悬架搞起来比想象中有意思。最近在玩天棚阻尼控制的1/4车模型,这玩意儿对车身垂向加速度的控制效果确实有点东西。咱们直接上干货,先说说模型怎么搭的
  • 免费馅饼(dp模版1的变体
  • 基于CODESYS的ModbusTCP通信实战:从配置到FPGA集成
  • Java笔记 —— 值传递与“引用传递”
  • CPEditor刷题环境配置避坑指南:解决C++14语法不兼容问题
  • 02nginx配置文件
  • java毕业设计基于springboot音乐分享交流平台project60526
  • 895. 最长上升子序列(线性dp模版题2
  • Java笔记——数据类型(为什么商业计算必须用BigDecimal?)
  • Java笔记——包装类(自动拆装箱)
  • FatMouse‘s Speed(dp模版2 最长上升子序列