fjh009003 发表于 2006-4-28 15:13

[讨论]卡尔曼滤波算法

大家好:
请到:http://forum.vibunion.com/forum/viewthread.php?tid=3037
此帖中,生成的图形与所提过的算法不太符合,我用的是matlab7.0得到图形

fjh009003 发表于 2006-4-28 15:18

回复:(fjh009003)[讨论]卡尔曼滤波算法

我不知道错在什么地方了,请各位指点!!!!!

fjh009003 发表于 2006-4-28 15:23

回复:(fjh009003)[讨论]卡尔曼滤波算法

下面是帖子中给出的图形:


算法如下:
clear
N=200;
w(1)=0;
w=randn(1,N)
x(1)=0;
a=1;
for k=2:N;
x(k)=a*x(k-1)+w(k-1);
end


V=randn(1,N);
q1=std(V);
Rvv=q1.^2;
q2=std(x);
Rxx=q2.^2;
q3=std(w);
Rww=q3.^2;
c=0.2;
Y=c*x+V;

p(1)=0;
s(1)=0;
for t=2:N;
p1(t)=a.^2*p(t-1)+Rww;
b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));
p(t)=p1(t)-c*b(t)*p1(t);
end

t=1:N;
plot(t,s,'r',t,Y,'g',t,x,'b');
模拟的过程为:
(A Simple Example)

这里我们结合第二第三节,举一个非常简单的例子来说明卡尔曼滤波器的工作过程。所举的例子是进一步描述第二节的例子,而且还会配以程序模拟结果。

根据第二节的描述,把房间看成一个系统,然后对这个系统建模。当然,我们见的模型不需要非常地精确。我们所知道的这个房间的温度是跟前一时刻的温度相同的,所以A=1。没有控制量,所以U(k)=0。因此得出:
X(k|k-1)=X(k-1|k-1) ……….. (6)
式子(2)可以改成:
P(k|k-1)=P(k-1|k-1) +Q ……… (7)

因为测量的值是温度计的,跟温度直接对应,所以H=1。式子3,4,5可以改成以下:
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-X(k|k-1)) ……… (8)
Kg(k)= P(k|k-1) / (P(k|k-1) + R) ……… (9)
P(k|k)=(1-Kg(k))P(k|k-1) ……… (10)

现在我们模拟一组测量值作为输入。假设房间的真实温度为25度,我模拟了200个测量值,这些测量值的平均值为25度,但是加入了标准偏差为几度的高斯白噪声(在图中为蓝线)。

为了令卡尔曼滤波器开始工作,我们需要告诉卡尔曼两个零时刻的初始值,是X(0|0)和P(0|0)。他们的值不用太在意,随便给一个就可以了,因为随着卡尔曼的工作,X会逐渐的收敛。但是对于P,一般不要取0,因为这样可能会令卡尔曼完全相信你给定的X(0|0)是系统最优的,从而使算法不能收敛。我选了 X(0|0)=1度,P(0|0)=10。

该系统的真实温度为25度,图中用黑线表示。图中红线是卡尔曼滤波器输出的最优化结果(该结果在算法中设置了Q=1e-6,R=1e-1)。

simon21 发表于 2006-4-28 15:27

回复:(fjh009003)[讨论]卡尔曼滤波算法

这个帖子下边的程序不是和上面原理部分的图对应的
数据不一样

fjh009003 发表于 2006-4-28 15:27

老是感觉这个算法和所给图形不符!向各位大虾请教!!!!

fjh009003 发表于 2006-4-28 15:30

回复:(simon21)回复:(fjh009003)[讨论]卡尔曼滤...

我没明白你的话的意思,你是说,数据、程序和所给的图形不一样吧!

fjh009003 发表于 2006-4-28 15:34

如果要的到一样的图形,这个程序应该怎样去改,我对matlab不是很熟。

weichunping 发表于 2007-11-16 19:59

这样改合适不

clear
N=200;
w(1)=0;
w=randn(1,N);
x(1)=25;%模拟恒定温度为25°
a=1;
for k=2:N;
x(k)=a*x(k-1);%因为假定温度是恒定的 ,所以模拟的数据,不应该有噪声
end


V=randn(1,N);
q1=std(V);
Rvv=q1.^2;
q2=std(x);
Rxx=q2.^2;
q3=std(w);
%Rww=q3.^2;不考虑

c=1;
Y=c*x+V;

p(1)=10;%改为非零的正数就可以,不能为零
s(1)=1;%设定初值
for t=2:N;
%p1(t)=a.^2*p(t-1)+Rww;
%b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);
b(t)=c*p(t-1)/(c.^2*p(t-1)+Rvv);
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));
%p(t)=p1(t)-c*b(t)*p1(t);
p(t)=p(t-1)-c*b(t)*p(t-1);
end

t=1:N;
plot(t,s,'r',t,Y,'g',t,x,'b');
这样得到的图形,与结果差不多
页: [1]
查看完整版本: [讨论]卡尔曼滤波算法