
這裡必須保證Xk-1,Xk,Xk+1都是正态分布,否則的話我們就沒法遞推了,如果Xk不是正态分布的話就沒有辦法調用我們擴充卡爾曼濾波的算法,自然就會引起誤差,因為本質上f和h是非線性函數,是以說如果是這個真實的後驗機率呢他一定不是這個正态分布,因為他是非線性函數,但是我們濾波的結果呢卻是正态分布,是以說他就是一種誤差,誤差就在這展現,是以說擴充卡爾曼濾波是一種近似,這種近似是有誤差的,誤差來源就在這
預測步和更新步泰勒展開的展開點不同,
預測步是在Xk-1plus展開
更新步是在Xkminus展開
擴充卡爾曼濾波的算法和卡爾曼濾波的算法很像,最大的不一樣就是他要求一個雅克比矩陣,第二個不一樣就是算法的2 7步,這裡是
卡爾曼是Xkminus=A*Xk-1plus,也就是說在這裡他并沒有線性化,還有第7步
卡爾曼是Xkplus=C*Xkminus,下面來算一個C幫助大家了解雅克比矩陣
以上是預測
以下是觀測
這樣呢ekf的理論就講完了,接下來是代碼
%EKF代碼
%紙上得來終覺淺,絕知此事要躬行%x(k)=sin(3x(k-1))
%y(k)=x(k)'2
%注意似然機率是多峰分布,具有強烈的非線性,當y=4時,不知道x=2還是-2
%%%生成真實信号與觀測
t=0.01:0.01:1;
n=length(t);
X=zeros(1,n);
y=zeros(1,n);
x(1)=0.1;
y(1)=0.1^2;
for i=2:n
x(i)=sin(3x(i-1));
y(i)=x(i)^2+normrnd(0,0.1);
end
plot(t,x,‘r’,t,y,‘b’,‘LineWidth’,4)
紅色代表真實的信号,藍色代表觀測
%EKF代碼
%紙上得來終覺淺,絕知此事要躬行%x(k)=sin(3x(k-1))
%y(k)=x(k)'2
%注意似然機率是多峰分布,具有強烈的非線性,當y=4時,不知道x=2還是-2
%%%生成真實信号與觀測
t=0.01:0.01:1;
n=length(t);
X=zeros(1,n);
y=zeros(1,n);
x(1)=0.1;
y(1)=0.1^2;
for i=2:n
x(i)=sin(3x(i-1));
y(i)=x(i)^2+normrnd(0,0.7);
end
%EKF
Xplus=zeros(1,n);%設定初值
Pplus=0.1;
Xplus(1)=0.1;
Q=0.1;
R=1;
for i=2:n
%預測步
A=3cos(3Xplus(i-1));
Xminus=sin(3Xplus(i-1));
Pminus=APplusA’+Q;
%更新步
C=2Xminus;
K=PminusCinv(CPminusC’+R);
Xplus(i)=Xminus+K*(y(i)-Xminus^2);
Pplus=(eye(1)-K*C)*Pminus;
end
plot(t,x,‘r’,t,Xplus,‘b’,‘LineWidth’,4)
結果是比較差的,但也算符合我們的預期,我們知道ekf對強烈的非線性問題處理的不太好,他的觀測噪聲比較大,是以效果不好,我們看一下能不能搶救一下,
Q=0.0001;以後長這樣
結果還是比較差,比剛才那個稍微好一些,而且有一種很強烈的多峰分布的一個感覺,是因為ekf直接把函數線性化了,這樣的話對強非線性問題算的就不是特别的好,如果對一些比較弱的非線性問題他有可能會得到一個比較好的結果,像我們這個例子他的觀測噪聲比較大,他的似然機率又是一個多峰分布,這樣的話就會很差,如果遇到一些強烈的非線性問題的話,擴充卡爾曼濾波需要花很多精力去調Q和R才能得到一個理想的結果,而且一般來說是比較難調的,這就是ekf自然的缺陷,他的優點就在于快,計算速度非常快,和kf差不多,需要的記憶體也比較小,世上第一個可以進行實時計算的slam程式就是用ekf寫出來的,不過呢現在slam都在用最線性優化,第九講提到了slam和相關的算法,ekf也是人類發明出來的第一個處理非線性問題的kf,對一些實時性要求過高并且非線性程度比較弱的場景中ekf也是經常被用到的,ekf到此為止,最後隻剩一個ukf(無迹卡爾曼濾波)。