首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用'ss‘在MATLAB中实现卡尔曼滤波

用'ss‘在MATLAB中实现卡尔曼滤波
EN

Stack Overflow用户
提问于 2014-09-11 07:58:10
回答 1查看 2.4K关注 0票数 1

我试图实现一个卡尔曼滤波器,用于估计振荡器的状态'x‘(位移和速度)。代码在下面,应该很容易遵循。

代码语言:javascript
复制
clear; clc; close all;
% io = csvread('sim.csv');
% u = io(:, 1);
% y = io(:, 2);
% clear io;

% Estimation of state of a single degree-of-freedom oscillator using
%   the Kalman filter
% x[n + 1] = A x[n] + B u[n] + w[n]
% y[n] = C x[n] + D u[n] + v[n]

% Here, x[n] is 2 x 1, u[n] is 1 x 1
% A is 2 x 2, B is 2 x 1, C is 1 x 2, D is 1 x 1

%% Code begins here
N = 1000;
u = randn(N, 1); % Synthetic input
y = randn(N, 1); % Synthetic output

%% Definitions
dt = 0.005;    % Time step in seconds
T = 1.50;     % Oscillator period
zeta = 0.05;   % Damping ratio

sv0 = max(abs(u)) * dt;
sd0 = sv0 * dt;
Q = [sd0 ^ 2 0.0; 0.0 sv0 ^ 2]; % Prediction error covariance matrix
smeas = 0.001 * max(abs(u));
R = smeas ^ 2;                  % Measurement error (co)variance scalar

wn = 2. * pi / Ts;

c = 2.0 * zeta * wn;
k = wn ^ 2;

A = [0. 1.; -k -c];
Ad = expm(A * dt);
Bd = A \ (Ad - eye(2));
Bd = Bd(:, 2);
C = [-k -c];
D = -1.0;

%% State-space model and Kalman filter
sys = ss(Ad, Bd, C, D, dt, 'inputname', 'u', 'outputname', 'y');
[kest,L,P] = kalman(sys, Q, R, []);

这是我的问题。我得到的错误是:‘在"kalman(SYS,QN,RN,NN,.)“命令中,QN必须是最多1行的实数方阵。

我认为QN =q= const,应该是2x2,但它要求一个标量。也许我不明白在MATLAB的“kalman”帮助描述中Q和QN之间的区别。有什么见解吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-30 01:29:59

MATLAB假设过程噪声只是一个随机变量,而不是像Q这样的两个随机变量。

因此,您必须将G和H矩阵添加到您的系统中,如下所示:

代码语言:javascript
复制
G = eye(2);
H = [0,0];
sys = ss(Ad, [Bd, G], C, [D, H], dt, 'inputname', 'u', 'outputname', 'y');

作为提醒,使用MATLAB的语法:

代码语言:javascript
复制
x*=Ax+Bu+Gw

y=Cx+Du+Hw+v
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25782135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档