估值分析作业二

转自:https://blog.csdn.net/gangdanerya/article/details/105105611

问题:

要求:使用扩展卡尔曼滤波(EKF)的方法解决

 

卡尔曼滤波器只适用于线性系统模型,然而实际中的系统往往都是非线性模型。所以必须对卡尔曼滤波器进行修改。

EKF基于线性化系统的思想,将系统函数的非线性函数作一阶Taylor展开,得到线性化系统方程。扩展的卡尔曼滤波器算法就是适用于非线性系统的卡尔曼滤波器。它与经典的线性卡尔曼滤波器很相似,算法步骤和结构都相同。不同在于系统模型和矩阵A和H。.

 

 

 

代码:

N = 300;  %连续计算N个时刻

Q = 10;   %过程方差

R = 1;          %测量方差

v=sqrt(Q)*randn(1,N); %过程标准差

n=sqrt(R)*randn(1,N);     %测量标准差

P =eye(1);

 

x=zeros(1,N);%真实值

Xresult=zeros(1,N); %最优估计值

 

x(1,1)=0;

Xresult (1,1)=x(1,1);

z=zeros(1,N);           %状态测量值

z(1)=x(1,1)^2/20+v(1);

z1=zeros(1,N);        %测量值的估计

z1 (1,1)=z(1);

 

for k = 2 : N

    %模拟系统

    x(:,k) = 0.5 * x(:,k-1) + (25 * x(:,k-1) / (1 + x(:,k-1).^2)) + 8 * cos(1.2*k) + v(k-1); 

    z(k) = x(:,k).^2 / 20 + n(k);

    %EKF开始

    Xmid= 0.5* Xresult (:,k-1)+ 25* Xresult (:,k-1)/(1+ Xresult (:,k-1).^2) + 8 * cos(1.2*k);

    %预测值的估计

    z1= Xmid.^2/20; 

    %雅克比矩阵

    F = 0.5 + 25 * (1- Xresult.^2)/((1+ Xresult.^2).^2);

    H = Xmid /10;

    PP=F*P*F'+Q;   %过程方差预测

    Kk=PP*H'*inv(H*PP*H'+R);  %inv返回逆矩阵

    Xresult (k)= Xmid +Kk*(z(k)- z1); %修正值

    P=PP-Kk*H*PP;       %EKF方差

end

%画图

   t = 1 : N;

   figure;

   plot(t,x(1,t),'c',t, Xresult (1,t),'b');

   legend('真实值','EKF估计值');

 

 

运行结果:

当N=30时:

 

 

 

当N=300时:

 

 

 

观测最后算法运行得到的结果,发现当时间规模较小的时候,EKF的估计值和真实值相差较小,而当时间规模较大时,通过EKF拟合而来的曲线则与真实值偏差较大。

 

posted @ 2020-05-11 20:03  SjYu  阅读(149)  评论(0编辑  收藏  举报