2016-03-18 1 views
1

Je veux estimer une variable x, et la variable observable y peut être obtenue à partir de capteurs. Ces deux variables ont une relation approximativement linéaire, ie, y = k * x + b, mais k et b sont difficiles à obtenir, donc j'utilise deux filtres de kalman, un pour l'estimation d'état (x), un autre pour le paramètre (k, b) estimation, qui combine réellement le filtre kalman double. Le schéma général et le code en Python est comme suit,estimation d'état par Dual Kalman Filter

the general scheme

##Python code 
#initialize state estimator 
kf = KalmanFilter(dim_x=1,dim_z=1) 
kf.x = numpy.array([x0])    # initial state 
kf.F = numpy.array([1.])    # state transition matrix 
kf.Q = 1000       # state noise variance, 
kf.R = 1        # measurement noise variance 

#initialize parameter estimator 
dkf = KalmanFilter(dim_x=2,dim_z=1) 
dkf.x = numpy.array([[-0.01,-0.1]]).T # initial state 
dkf.F = numpy.array([[1,0], 
        [0,1]])   # state transition matrix 
dkf.Q = numpy.array([[1,0], 
        [0,1]]) 
dkf.R = 100       # measurement noise variance 

measurements = [] 
resultsDKF = []           #dual kalman filter state estimation result 
ERRDKF = []            #estimation error 

for i in xrange(N): # N samples 
    #### parameter estimator 
    dkf.H = numpy.array([[kf.x,1]]) # measurement function 
    y = Y[i] 
    dkf.update(y,dkf.R,dkf.H)   
    dkf.predict() 

    #### state estimator 
    kf.H = numpy.array([dkf.x[0]]) 
    z = Y[i]-dkf.x[1] # Y[i]-b 
    kf.update(z,kf.R,kf.H)  
    kf.predict() 

    #### save data 
    measurements.append(Y[i]) 
    resultsDKF.append (kf.x) 
    ERRDKF.append(measurements[-1]-resultsDKF[-1]) 

les résultats sont également suivis:

setting of initial state much away from true value

Il semble que l'état prédit varie avec la valeur réelle, mais il y a toujours un grand écart entre la valeur prédite et la valeur vraie.

Je pense que le filtre dual kalman ne suit pas vraiment les vraies valeurs de x, quel est le problème? Toute personne qui offre des conseils sera très appréciée.

+0

quelqu'un peut-il aider? – Qiang1991

Répondre

1

Une partie de la puissance du filtre de Kalman est qu'il développe et propage des corrélations entre les erreurs dans les états. En séparant le problème en deux filtres, vous empêchez l'un ou l'autre des filtres de déterminer qu'il existe une erreur qu'il ne connaît pas, car il n'est pas modélisé. Dans le cas particulier que vous avez décrit, où:

y=k*x + b 

avec k b & à la fois, vous devez faire inconnue x, k & états b d'un seul filtre de Kalman. Au fil du temps, avec suffisamment d'observations d'un x variable (c'est-à-dire y des mesures de différentes valeurs x), le filtre peut observer k et b en raison de la corrélation dans les états x, k et b portés dans la matrice de covariance. Avec le filtre 'x' séparé du filtre 'k' et 'b', il peut rester déporté pour toujours, comme dans votre résultat.

+0

Merci beaucoup pour vos conseils. Mais si je fais les états x, k et b d'un seul filtre de Kalman, comment dois-je écrire la fonction de mesure dans la forme KF standard quand k et x sont supposés se multiplier, puis plus b pour obtenir y? Une autre question est que, le double filtre de Kalman a été créé pour résoudre le problème de l'estimation de l'état et des paramètres et rapporté à réussi dans de nombreuses applications, où il ne semble pas de décalage d'erreur pour toujours. Pourriez-vous expliquer cela en détails? Je vous remercie. – Qiang1991

+0

@ Qiang1991 - En relisant cela, je ne suis pas d'accord avec ma propre réponse. La constante b est séparable - mais le produit x * k est dans chaque observation. Je ne pense pas qu'ils peuvent être séparés dans un filtre de Kalman simple ou double. –

+0

Comme vous le dites, le filtre dual kalman a été exclu en raison d'une erreur qui n'est pas modélisée. Alors, comment pensez-vous que si j'ajoute un terme croisé entre deux filtres pour présenter leur erreur mutuelle, par exemple, prendre en compte le dkf.R dans le calcul de df.R. Avez-vous des conseils pour cette méthode? Merci. – Qiang1991