以下是MATLAB代码实现Kalman Filter:

% 初始化
x = zeros(4,1); % 状态向量
P = eye(4); % 状态估计误差协方差矩阵
Q = eye(4); % 状态转移噪声协方差矩阵
R = 1; % 观测噪声协方差
H = [1 1 1 1]; % 观测矩阵
y = zeros(1,1000); % 观测变量
x_estimate = zeros(4,1000); % 估计的状态向量
P_estimate = zeros(4,4,1000); % 估计的状态估计误差协方差矩阵

% 生成数据
a = randn(4,1000); % 系数矩阵
v1 = randn(4,1000); % 状态转移噪声
v2 = sqrt(R)*randn(1,1000); % 观测噪声
for k=1:1000
    x = a(:,k).*x + v1(:,k); % 状态转移方程
    y(k) = H*x + v2(k); % 观测变量
    % Kalman Filter
    x_predict = a(:,k).*x_estimate(:,k); % 状态预测
    P_predict = a(:,k).*P_estimate(:,:,k)*a(:,k).' + Q; % 状态估计误差协方差矩阵预测
    K = P_predict*H.'/(H*P_predict*H.'+R); % 卡尔曼增益
    x_estimate(:,k+1) = x_predict + K*(y(k)-H*x_predict); % 状态估计
    P_estimate(:,:,k+1) = (eye(4)-K*H)*P_predict; % 状态估计误差协方差矩阵更新
end

% 绘制结果
figure;
plot(y);
hold on;
plot(H*x_estimate(:,2:end),'r');
legend('观测变量','Kalman Filter估计值');
xlabel('时间');
ylabel('值');

原文地址: https://www.cveoy.top/t/topic/nFf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录