卡尔曼滤波状态观测器设计Matlab程序

% 定义系统的状态空间模型
A = [0.8, 0.2; -0.2, 0.5];
B = [1; 0.5];
C = [1, 0];
D = 0;
sys = ss(A, B, C, D);

% 定义观测噪声协方差和状态噪声协方差
RN = 0.1;  % 观测噪声协方差
QN = 0.01; % 状态噪声协方差

% 设计卡尔曼滤波器
[K, P, E] = kalman(sys, QN, RN); 

% 生成含有未知扰动的状态观测数据
T = 100; % 时间步数
x0 = [0; 0]; % 初始状态
u = randn(1, T); % 随机控制输入
w = sqrt(QN) * randn(2, T); % 状态噪声
v = sqrt(RN) * randn(1, T); % 观测噪声
x = zeros(2, T); % 真实状态
y = zeros(1, T); % 观测值
for k = 1:T
    x(:,k+1) = A * x(:,k) + B * u(k) + w(:,k);
    y(:,k) = C * x(:,k) + D * u(k) + v(:,k);
end

% 初始化状态估计
x_est = zeros(2, T+1); % 估计状态
P_est = zeros(2, 2, T+1); % 估计状态协方差
x_est(:,1) = x0;
P_est(:,1) = P;

% 使用卡尔曼滤波器进行状态估计
for k = 1:T
    % 预测步骤
    x_pred = A * x_est(:,k) + B * u(k);
    P_pred = A * P_est(:,:,k) * A' + QN;
    
    % 更新步骤
    Kk = P_pred * C' / (C * P_pred * C' + RN);
    x_est(:,k+1) = x_pred + Kk * (y(:,k) - C * x_pred);
    P_est(:,:,k+1) = (eye(2) - Kk * C) * P_pred;
end

% 绘制结果
t = 0:T;
figure;
plot(t, x(1,:), 'b-', t, x_est(1,:), 'r--');
xlabel('时间');
ylabel('状态1');
legend('真实状态', '估计状态');
title('状态1估计结果');

figure;
plot(t, x(2,:), 'b-', t, x_est(2,:), 'r--');
xlabel('时间');
ylabel('状态2');
legend('真实状态', '估计状态');
title('状态2估计结果');
figure;
plot(t(1:T), y, 'b-', t, x_est(1,:), 'r--');
xlabel('时间');
ylabel('观测值与状态1估计');
legend('观测值', '状态1估计');
title('观测值与状态1估计结果');

% 计算估计误差
est_error = x - x_est;

% 绘制估计误差
figure;
plot(t, est_error(1,:), 'b-', t, est_error(2,:), 'r--');
xlabel('时间');
ylabel('估计误差');
legend('状态1估计误差', '状态2估计误差');
title('状态估计误差');


 

 


 


 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真的是小恐龙吗?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值