Matlab:从卡尔曼滤波器进行状态估计后,如何模拟模型

Matlab:从卡尔曼滤波器进行状态估计后,如何模拟模型,matlab,matrix,plot,kalman-filter,Matlab,Matrix,Plot,Kalman Filter,我试图为以下一维AR模型实现卡尔曼滤波的基本方程: x(t) = a_1x(t-1) + a_2x(t-2) + w(t) y(t) = Cx(t) + v(t); KF状态空间模型: x(t+1) = Ax(t) + w(t) y(t) = Cx(t) + v(t) w(t) = N(0,Q) v(t) = N(0,R) 在哪里 问题:我想通过一个绘图来查看估计状态xnew与实际状态x的接近程度。但是,函数innovation\u update返回的xnew是一个2by2矩阵!

我试图为以下一维AR模型实现卡尔曼滤波的基本方程:

x(t) = a_1x(t-1) + a_2x(t-2) + w(t)  

y(t) = Cx(t) + v(t);
KF状态空间模型:

x(t+1) = Ax(t) + w(t)

y(t) = Cx(t) + v(t)

w(t) = N(0,Q)

v(t) = N(0,R)
在哪里

问题:我想通过一个绘图来查看估计状态
xnew
与实际状态
x
的接近程度。但是,函数
innovation\u update
返回的
xnew
是一个2by2矩阵!如何用估计值模拟时间序列?

您不需要将
x
初始化为任何值,只需将初始状态
x(:,1)
设置为“系统模拟”循环即可填充其余部分。哎呀,我看你已经这么做了

稍后,在从嘈杂的观测值推断状态的循环中,您可以添加以下行:

[xnew, P] = innovation_update(xpred, Ppred, nu, S, C);
yhat(i) = C*xnew; % Observed value at time step i, assuming inferred state xnew
最后,您应该绘制
yhat
y
进行比较


如果您想为估计的不确定性添加误差条,那么您还应该存储
Phat(i)=sqrt(C*p*C')
并调用
errorbar(yhat,Phat)
而不是
plot(yhat)

输入
x=[rand(order,1)zero(order,T-1)]
也是一个2数组,因此,如果您不理解为什么是2x2,那么您可能不会理解为什么输出是2x2。我的建议是首先理解您的输入。@TryHard:x不是2乘2数组。我又检查了一遍,它给了我2乘100的矩阵,其中第一列的第一和第二个元素是随机数。你说得对,我的错。除非我再次出错,否则它实际上初始化为一个2x1向量,即
rand(order,1)
。数组的其余部分是零,用于为演化状态预先分配空间。执行rand(order,1)表示只有第一列第一行和第二行的元素具有初始化为它们的随机值。剩下的是零。谢谢你的回复。(1) 我将初始A矩阵的第二行更正为10。(2) 答案不起作用,因为函数innovation_update返回的xnew是2乘2。但是,yhat应该是T向量的1。因此,在包含对
innovation\u update
的调用的循环之前有一个错误,您应该将
yhat
初始化为1xT向量。在循环内部,我们只是写入
i
-th元素
xnew
应该是2x1向量。我初始化了yhat。我不知道为什么xnew会变成2by2而不是2乘1。所有这些麻烦都是由xnew造成的。请检查代码,特别是函数predict,因为xpred=A*x0,我得到的是2乘2,而不是2乘1。现在知道我的错误了。我的印象是,既然状态是隐藏的,我如何知道它的平均值,以便将其传递给过滤器。我认为x0=mean(x,2),所以xpred现在是2乘1。如果系统中没有太多噪音,现在一切正常
y
yhat
将彼此接近-尝试增加
sigma_2_v
和/或
sigma_2_w
并查看
y
yhat
是否出现分歧。还可以查看
Phat
是否随着噪声协方差的增加而增加(它应该增加)。
[xnew, P] = innovation_update(xpred, Ppred, nu, S, C);
yhat(i) = C*xnew; % Observed value at time step i, assuming inferred state xnew