Реализация фильтра Калмана в MATLAB с использованием 'ss'
Я пытаюсь реализовать фильтр Калмана для оценки состояния "х" (смещение и скорость) генератора. Код приведен ниже и должен быть прост в использовании.
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 и должен быть 2 x 2, но он запрашивает скаляр. Возможно, я не понимаю разницу между Q и QN в справочном описании MATLAB'kalman'. Есть идеи?
Благодарю.
1 ответ
MATLAB предполагает, что шум процесса - это только одна стохастическая переменная, а не две, как Q представляет.
Таким образом, вы должны добавить матрицы G и H к вашей системе следующим образом:
G = eye(2);
H = [0,0];
sys = ss(Ad, [Bd, G], C, [D, H], dt, 'inputname', 'u', 'outputname', 'y');
Как напоминание, используя синтаксис MATLAB:
x*=Ax+Bu+Gw
y=Cx+Du+Hw+v