基本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^5x^21 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^5x²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初始协方差设大些P100I让算法前期快速调整遗忘因子λ控制历史数据权重0.98表示稍微侧重新数据卡尔曼增益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了。遇到过的坑协方差矩阵P突然变成非正定矩阵检查更新公式分母部分必要时加个正则化项参数估计发散试试调小遗忘因子或者检查数据向量φ是否正确初始震荡太大给P矩阵对角线加个阻尼系数比如从1000开始这算法在单片机上也跑得动把矩阵运算展开成标量计算就行。下次试试加个时变参数跟踪那才叫刺激呢