sys=@(k, xkm1, uk) xkm1/2 + 25*xkm1/(1+xkm1^2) + 8*cos(1.2*k) + uk;
obs = @(k, xk,vk) xk(1) + vk;
p_sys_noise = @(u) normpdf(u, 0, sigma_u);
gen_sys_noise = @(u) normrnd(0, sigma_u);
p_obs_noise = @(v) normpdf(v, 0, sigma_v);
gen_obs_noise = @(v) normrnd(0, sigma_v);
gen_x0 = @(x) [89.4;93.75;90;94.38;98.75;94.38;96.25;94.38;96.25;100;95;96.25;95;95;98.75;98.125;97.5;98.75;100;100;91.875;93.75;93.125;96.25;98.125;98.125;99.375;100;100;100;93.75;92.5;96.25;95.625;99.375;97.5;100;99.375;99.375;100;95.625;95.625;97.5;97.5;98.75;99.375;99.375;91.25;98.125;100]+ones(50,1)*normrnd(0, sqrt(10));
p_yk_given_xk = @(k, yk, xk) p_obs_noise((yk - obs(k, xk, zeros(1, nv)))');
x = zeros(nx,T); y = zeros(ny,T);
u = zeros(nu,T); v = zeros(nv,T);
xh0 = [89.4;93.75;90;94.38;98.75;94.38;96.25;94.38;96.25;100;95;96.25;95;95;98.75;98.125;97.5;98.75;100;100;91.875;93.75;93.125;96.25;98.125;98.125;99.375;100;100;100;93.75;92.5;96.25;95.625;99.375;97.5;100;99.375;99.375;100;95.625;95.625;97.5;97.5;98.75;99.375;99.375;91.25;98.125;100];
v(:,1) = gen_obs_noise(sigma_v);
y(:,1) = obs(1, xh0, v(:,1));
u(:,k) = 0.1*gen_sys_noise();
v(:,k) = gen_obs_noise();
x(:,k) = sys(k, x(:,k-1), u(:,k));
y(:,k) = obs(k, x(:,k), v(:,k));
fprintf('Finish simulate system \n')
xh = zeros(nx, T); xh(:,1) = xh0;
xh_ukf = zeros(nx, T); xh_ukf(:,1) = xh0;
yh = zeros(ny, T); yh(:,1) = obs(1, xh0, zeros(1, nv));
pf.particles = zeros(nx, pf.Ns, T);
pf.p_yk_given_xk = p_yk_given_xk;
pf.gen_sys_noise = gen_sys_noise;
fprintf('Iteration = %d/%d\n',k,T);
[xh(:,k), pf] = particle_filter(sys, y(:,k), pf, 'systematic_resampling');
yh(:,k) = obs(k, xh(:,k), zeros(1, nv));
err = (xh - x).*(xh - x);
RMSE_pf = sqrt(sum(err,2)/T);
err = (xh_ukf - x).*(xh_ukf - x);
RMSE_ukf = sqrt(sum(err,2)/T);
[xx,yy] = meshgrid(xi,yi);
xhmode = zeros(size(xh));
den(:,i) = ksdensity(pf.particles(1,:,i), yi,'kernel','epanechnikov');
[~, idx] = max(den(:,i));
plot3(repmat(xi(i),length(yi),1), yi', den(:,i));
title('Evolution of the state density','FontSize',14)
title('Evolution of the state density','FontSize',14)
h1 = plot(1:T,squeeze(pf.particles(2,:,:)),'y');
h2 = plot(1:T,x(1,:),'b','LineWidth',1);
h3 = plot(1:T,xh(1,:),'r','LineWidth',1);
h4 = plot(1:T,y(1,:),'g.','LineWidth',1);
legend([h2 h3 h1(1)],'state','mean of estimated state','particle paths');
title('State vs estimated state by the particle filter vs particle paths','FontSize',14);
plot(1:T,y,'b', 1:T,yh,'r');
legend('observation','filtered observation');
title('Observation vs filtered observation by the particle filter','FontSize',14);