J'essaie d'écrire un algorithme qui estime et suit une ligne droite: y [k] = b1 * x [k] + b2 [k]. Dans le système physique réel avec lequel je travaille, je peux seulement mesurer y [k], et pour le contrôler, l'entrée est x [k] (j'entre x [k] et j'attends un y [k] spécifique). Le problème est que la relation de y [k] et x [k] n'est pas constante: la pente b1 est constante pour toute itération k, mais pas la constante b2 [k]. Une autre chose que j'ai supposé était que: deltab2 [k] = b2 [k] -b2 [k-1], et c'est constant pour chaque itération.Kalman Le filtre d'une ligne droite ne converge pas
J'ai essayé d'utiliser le filtre de Kalman, avec le vecteur d'état = (x [k], b2 [k], Delatb2 [k]), et la mesure = y [k]. Cela n'a pas fonctionné - le gain de kalman est devenu pratiquement nul et la matrice de covariance d'erreur n'a pas convergé. J'ai compris que la question de la convergence concerne l'observabilité du système. Cependant j'ai un peu de mal à rendre mon modèle observable. Comment puis-je faire fonctionner mon algorithme?
% note - y[k] is beta here, x[k] is v.
A=[1 0 -1/b1;0 1 1;0 0 1];
H=[b1 1 0];
% varb2 = b2[k] variance
% varb2' = b2[k-1] variance
% varbeta = measurement noise variance
% covbbt = b2[k], b2[k-1] covariance - assumed to b2 0
Qk=varb2*[1/b1^2 -1/b1 -1/b1;-1/b1 1 1; -1/b1 1 1]+covbbt*[0 0 1/b1; 0 0 -1; 1/b1 -1 -2]+varb2t*[0 0 0; 0 0 0; 0 0 1]+varbeta*[1 0 0; 0 0 0; 0 0 0];
Rk=varbeta;
P=Qk;
x=[5,handles.b(2),0].'; %Assuming the initial drift is 0
% b1 is assumed to be 200, b2[k=1] assumed to be -400
%% the algorithm
v=5;
while(get(handles.UseK,'Value'))
%get covariances
x_est=A*x
P_est=A*P*A.'+Qk
sample_vector = handles.s_in1.startForeground();
I = mean(sample_vector(:,2));% average of the 200 samples
Q = mean(sample_vector(:,1));% average of the 200 samples
beta=unwrap(atan2(I,Q)); % measurment of beta
K=P*H.'*inv(H*P*H.'+Rk) %kalman gain
x=x_est+K*(beta-H*x_est)
P=P_est-K*H*P_est
vo=v;
v=x(1);
outputSingleScan(handles.s_output1,v);
end
Votre modèle de processus ne correspond pas à votre description. Votre code estime le 'x [k]' de votre description, mais dans votre description, il semble que 'x [k]' est donné. Si 'x [k]' est vraiment dans votre état, alors 'H' n'évalue pas' mx + b'. L'évaluation de 'x [2] * x [1] + x [3]' ne serait pas une opération de matrice linéaire. –
Je vais le préciser - x [k] n'est pas donné. Je veux estimer le x [k] correct pour que ça me permette le y [k] voulu. H évalue bêta [k] = b1 * v [k] + b2 [k], quand v et b2 sont deux éléments de mon vecteur d'état. – Shaked