由于SV模型中波动是潜在变量,所以计算精确似然函数很困难。因此用卡尔曼滤波将SV模型先转变成线性状态空间形式,在用极大似然法求参数。给出卡尔曼滤波的matlab程序:
- function[zx,zy]=xyKalmanFliter(A,H,Rw,Rv,Rw_c,Rv_c,x0,p0,y)
- len = length( y ); %获取采样点数
- r = size(A,1); %获取系统矩阵A的行数
- I= eye( r(1) ); %生成单位矩阵
- P1 = zeros( r(1),r(1) ); %初始化协方差阵
- %初始化节点位置,协方差阵
- X = x0;
- P = p0;
- len1 = size( H*X ,1);
- for s=1:1:len
- z1 = A*X+ Rw; % X(k) = A*X(k) + Rw(k) 协方差 Rw_c
- zx(1:r(1),s) = z1(1:r(1)) ;
- z2 = H*X + Rv; % Z(k) = H*X(k) + Rv(k) 协方差 Rv_c
- zy(1:len1,s) = z2(1:len1 );
-
- P1 = A*P*A' + Rw_c; % P(k|k-1) = A*P(k-1|k-1)*A' + Q
- K = P1*H'*inv( H*P1*H' + Rv_c ); % kg(k) = P(k|k-1)*H' / (H*P(k|k-1)*H' + R)
- X = A*X + K*( zy(1:len1,s) - H*A*X );
- % x(k|k) = x(k|k-1) + kg(k)*(z(k)-H*s(k|k-1))
- P = ( I - K*H ) * P1; % P(k|k) = (I-kg(k)*H)*P(k|k-1)
- end
- return
复制代码