Suivi de pendule

Contents

Génération des données

L = 400; % longueur de la séquence
delta_t = 0.0002; % période d'échantillonnage
omega_0 = 2*pi*50; % pulsation réelle (50 Hz)
sigma_r = 0.5; % covariance du bruit de mesure

T = (0:L) * delta_t;
p0 = cos(omega_0*1 * T);
z = p0 + sigma_r * randn(size(T)); % simulation des mesures

Définition du modèle d'évolution et du modèle de mesure

Le modèle d'évolution est obtenu par discrétisation du modèle physique continu.

Dans un premier temps, on suppose la pulsation parfaitement connue

sigma_q = 0.01; % covariance du bruit de modèle

omega = omega_0; % pulsation modèle = pulsation réelle
F = [cos(omega*delta_t), sin(omega * delta_t)/omega;
    - omega * sin(omega * delta_t), cos(omega*delta_t)];  % évolution du système

H = [1 0]; % mesure de la position du pendule

Q = sigma_q^2 * [0 0;0 1]; % bruit de modèle
R = eye(1) * sigma_r^2; % bruit de mesure

Initialisation

On initialise à 0 avec une covariance élevée

x0 = [0; 0];
P0 = 1000*eye(2);

Filtre de Kalman

[xest, Pest] = kalman(z, F, H, Q, R, x0, P0);

Estimation et intervalle de confiance à 95%

hold on
shadedErrorBar(T, xest(1, :), 2*sqrt(squeeze(Pest(1, 1, :))))
plot(T, p0, 'r', 'linewidth', 2)
plot(T, z, '+')

Estimation avec une pulsation erronée

On construit le modèle avec une pulsation surestimée de 20%

omega = 1.2 * omega_0;
F = [cos(omega*delta_t), sin(omega * delta_t)/omega;
    - omega * sin(omega * delta_t), cos(omega*delta_t)];  % évolution du système

Filtre de Kalman

[xest, Pest, K] = kalman(z, F, H, Q, R, x0, P0);

Estimation et intervalle de confiance

Le modèle est trop loin de la réalité, le filtre est incapable de donner une bonne estimation de la position du pendule

figure
hold on
shadedErrorBar(T, xest(1, :), 2*sqrt(squeeze(Pest(1, 1, :))))
plot(T, p0, 'r', 'linewidth', 2)
plot(T, z, '+')

Pulsation érronée et fort bruit de modèle

Dans ce cas, on peut fixer un bruit de modèle de variance élevée. L'estimation est bien sûr moins bonne que dans le cas où système et modèle sont accordés

sigma_q = 10; % covariance du bruit de modèle
Q = sigma_q^2 * [0 0;0 1]; % bruit de modèle

[xest, Pest, K] = kalman(z, F, H, Q, R, x0, P0);

figure
hold on
shadedErrorBar(T, xest(1, :), 2*sqrt(squeeze(Pest(1, 1, :))))
plot(T, p0, 'r', 'linewidth', 2)
plot(T, z, '+')