アンセンテッドカルマンフィルタ(UKF)

clear; close all;
f = @(x) [x(:,1).*cos(x(:,2)), x(:,1).*sin(x(:,2))];
F = @(x) [cos(x(2)), -x(1)*sin(x(2));
          sin(x(2)),  x(1)*cos(x(2))];
n = 2;
mu = [10, pi/2];
sigma = [50 1;
        1 0.025];
N = 500;
x = mvnrnd(mu,sigma,N);
y = f(x);
ylin = ones(N,1)*f(mu) + (F(mu)*(x-ones(N,1)*mu)')';

kappa  = 3-n;
L = chol(sigma);
X  =[mu;
     ones(n,1)*mu+sqrt(n+kappa)*L;
     ones(n,1)*mu-sqrt(n+kappa)*L];

Ym = f(X);
w0 = kappa/(n+kappa);
wi = 1/(2*(n+kappa));
mean_yUT = sum([w0*Ym(1,:); ...
               wi*Ym(2:end,:)]);

Ymc = bsxfun(@minus, Ym, mean_yUT);
Ymc = [sqrt(w0)*Ymc(1,:);
       sqrt(wi)*Ymc(2:end,:)];
cov_yUT = Ymc'*Ymc;

uni = [cos(linspace(0,2*pi,100)'),sin(linspace(0,2*pi,100)')];

plot_dist = @(m,c,style_m,style_c) ...
             plot(m(1),m(2),style_m, ...
              m(1)+uni*sqrtm(c)*[2;0], ...
              m(2)+uni*sqrtm(c)*[0;2], ...
              style_c);

figure(1);
clf;
plot(x(:,1),x(:,2),'+',X(:,1),X(:,2),'ro');
hold on;
plot_dist(mu,sigma,'ro','r-');
title('入力xの分布とシグマポイント');

figure(2);
clf;
plot(y(:,1),y(:,2),'+');
hold on;
plot_dist(mean(y),cov(y),'ro','r-');
title('出力yの分布');

figure(3);
clf;
plot(y(:,1),y(:,2),'+',ylin(:,1),ylin(:,2),'d');
hold on;
plot_dist(mean(y),cov(y),'ko','k');
plot_dist(mean(ylin),cov(ylin),'r*','r-');
title('出力yの分布(線形近似)')

figure(4);
clf;
plot(y(:,1),y(:,2),'+');
hold on;
plot_dist(mean(y),cov(y),'ko','k:');
plot_dist(mean_yUT, cov_yUT, 'r*', 'r-');
title('出力yの分布(U変換)');

big;