我想估计变量x,可以从传感器获得可观察变量y。这两个变量具有近似线性关系,即y = k * x + b,但k和b很难得到,所以我使用两个卡尔曼滤波器,一个用于状态(x)估计,另一个用于参数(k,b) )估计,实际上结合了双卡尔曼滤波器。 Python中的一般方案和代码如下,
##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])
结果也是如下:
setting of initial state much away from true value
预测状态似乎随真实值而变化,但预测值与真实值之间仍存在较大差距。
我认为双卡尔曼滤波器并不真正跟踪x的真实值,问题是什么?任何提供建议的人都将非常感激。
答案 0 :(得分:1)
卡尔曼滤波器的部分功能在于它开发并传播状态中误差之间的相关性。通过将问题分成两个过滤器,您可以阻止任何过滤器发现它不知道有错误,因为它没有建模。在您描述的特定情况中,其中:
y=k*x + b
与k& b两个都不知道你应该制作x,k& b单个卡尔曼滤波器的状态。随着时间的变化,对变化的x进行了足够的观察(即,来自不同x值的y测量),由于协方差矩阵中携带的x,k和b状态的相关性,滤波器可以观察到k和b。将'x'过滤器与'k'和'b'过滤器分开后,它可以永久保持偏移,就像在结果中一样。