递推最小二乘法matlab
时间: 2024-12-27 14:18:17 浏览: 11
### 递推最小二乘法 MATLAB 实现教程
#### 理论基础
递推最小二乘(Recursive Least Squares, RLS)算法是一种用于在线估计线性系统的参数的方法。该方法能够在每次接收到新的观测数据时更新参数估计值,而不需要重新计算整个历史数据集上的解。这种方法对于实时应用非常有用。
为了提高对新数据的响应能力,通常会引入指数遗忘因子 λ (0 < λ ≤ 1),使得较早的数据逐渐失去影响力[^1]。
#### 初始化设置
在开始之前,需要定义一些初始条件:
- **θ**: 参数向量的初值。
- **P**: 协方差矩阵的初值,一般设为较大数值以表示不确定性。
- **λ**: 指数遗忘因子,默认取接近于1的值如0.98到0.99之间。
- **φ(t)**: 输入信号构成的状态矢量,在每一时刻t由当前及过去的输入组成。
```matlab
% 初始设定
theta = zeros(n, 1); % n 是待估参数的数量
P = eye(n) * 1e6; % 大协方差矩阵意味着高不确定度
lambda = 0.99;
phi_t = ... % 根据具体应用场景构建状态矢量
```
#### 更新规则
每当获得一组新的测量 y(k) 及对应的 φ(k) 后,按照如下公式迭代更新 θ 和 P:
\[ K_k = \frac{P_{k-1}\varphi_k}{\lambda + \varphi_k^T P_{k-1} \varphi_k } \]
\[ e_k = y_k - \varphi_k^T \hat{\theta}_{k-1} \]
\[ \hat{\theta}_k=\hat{\theta}_{k-1}+K_ke_k \]
\[ P_k=(I-K_k\varphi_k^T )P_{k-1}/\lambda \]
其中 \(K_k\) 称作增益向量;\(e_k\) 表示预测误差;上述操作实现了从 k−1 步到第 k 步的平滑过渡[^4]。
#### 完整代码实例
下面给出一段完整的MATLAB代码片段来说明这一过程的应用场景——假设我们正在尝试拟合一个一阶惯性环节 G(s)=b/(s+a):
```matlab
function rls_example()
clc; clear all;
%% System Definition and Simulation Data Generation %%
a_true = 2; b_true = 3; % True system parameters
tspan = linspace(0, 10*pi, 500)';
u = sin(tspan);
sys = tf(b_true,[1/a_true 1]);
[y,t,x] = lsim(sys,u,tspan);
noise = randn(size(y))*.1; % Add some measurement noises
yn = y + noise;
%% Recursive Least Square Estimation with Exponential Forgetting Factor %%
lambda = 0.99;
theta_hat = [rand(); rand()]; % Initial guess of the parameter vector
Phi = @(u,y)[-y ; u];
P = diag([1e6, 1e6]);
estimated_parameters = [];
for i=1:length(u)
phi_i = Phi(u(i),yn(i));
K = P*phi_i / (lambda + phi_i'*P*phi_i);
error = yn(i)-phi_i' * theta_hat;
theta_hat = theta_hat + K*error;
P = (eye(length(theta_hat))-K*phi_i')*P/lambda;
estimated_parameters(:,i) = theta_hat;
end
figure();
subplot(2,1,1);
plot(tspan,a_true*ones(size(tspan)), 'r', ...
tspan,estimated_parameters(1,:),'g');
title('Estimate of "a" over time');
legend({'True Value','Estimated'});
subplot(2,1,2);
plot(tspan,b_true*ones(size(tspan)), 'r',...
tspan,estimated_parameters(2,:), 'g');
title('Estimate of "b" over time');
xlabel('Time')
end
```
这段程序展示了如何利用RLS算法逐步逼近真实的一阶惯性环节中的两个未知系数 `a` 和 `b` 的值,并绘制出了随时间变化的趋势图。
阅读全文