View License

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from
ensemble kalman filter

Join the 15-year community celebration.

Play games and win prizes!

» Learn more

3.0
3.0 | 4 ratings Rate this file 15 Downloads (last 30 days) File Size: 3.86 KB File ID: #31093 Version: 1.9

ensemble kalman filter

by

 

18 Apr 2011 (Updated )

This program uses the ensemble kalman filter to estimate a system's state.

| Watch this File

File Information
Description

The algorithm used in this code is referenced from the following:
S Gillijns et al "What Is the Ensemble Kalman Filter and How Well Does it Work?"
Proceedings of the 2006 American Control Conference, Minneapolis, Minnesota, USA, June 14-16, 2006, pp 4448-4453.

 

Required Products Symbolic Math Toolbox
MATLAB release MATLAB 7.7 (R2008b)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (12)
03 Jun 2016 Shanqin Wang

’subs‘ does not work with version 2014a. var_vector should be defined as cell just like
var_vector = cell([p1,1]);
In the first loop,
var_vector{j}=sprintf('x%d',j);

Convert the result of subs to double, do like this,
x_tr=double(subs(f,var_vector,x_tr))+w.*randn(p1,1);

Add 'double' to all 'subs'.

Done.

Comment only
17 Jan 2016 Daniela

Got it. This works with version R2015a:
Rewriting the code for avoiding the usage of 'syms'. You have to delete the var_vector and rewrite all lines with 'subs' in it.
e.g.:
Change x_tr=subs(f,var_vector,x_tr)+w.*randn(p1,1);
To
x_tr=A*x_tr+B*u+w.*randn(p1,1);

Therefore you need the matrizes A and B and the vector u so that x_k+1=A*x_k+B*u. In the given example it's:
A=[1 0.1;0 1];
B=[0.005; 0.1];
u=[1];

The same with h. Splitting it up so that y=C*x. Here in this example with:
C=[1 0];

Thanks,
Daniela

17 Jan 2016 Daniela

The code doesn't come to a solution with the example provided. After several hours it's still at iteration number 11. I have version R2015a and with the code fragment of Colette no error arises anymore. I also tried the original code with version R2011a, but I didn't get a solution either. Can someone suggest a solution?

Comment only
13 Dec 2015 mochamad ilham

how to ploting the graphic?

Comment only
13 Dec 2015 mochamad ilham

Hello,
when i running your program, there was an error like this (please help me to solve the error):
??? Maximum recursion limit of 500 reached. Use
set(0,'RecursionLimit',N)
to change the limit. Be aware that exceeding your available stack space
can
crash MATLAB and/or your computer.

Error in ==> sym.sym>varname2ref

Comment only
24 Sep 2015 chau aplei  
01 Nov 2013 Colette  
01 Nov 2013 Colette

Hello,

Thank you for your work on this file. It has been helpful to me as I begin learning Kalman Filter.

I am having a few issues with the code and was wondering if anyone else was too. Matlab is not my primary software, so I am wondering if it might be something simple (perhaps I need additional toolboxes). When I try to run the example, I get the following errors:

Error using sym/subs>normalize (line 206)
Entries in OLD must be scalar.

Error in sym/subs>mupadsubs (line 136)
[X2,Y2,symX,symY] = normalize(X,Y); %#ok

Error in sym/subs (line 124)
G = mupadsubs(F,X,Y);

Error in ensemblekfilter3 (line 63)
x_true=subs(f,var_vector,x_true)+w.*randn(p1,1); %compute true value of state at next
time step

It seems I have found a solution by changing the loop to be:
for j=1:p1 %create vector containing variables x1 to xn
eval(sprintf(' syms x%d', j));
temp = sprintf('x%d ',j);
var_vector = [var_vector; sym(temp)];
%var_vector=[var_vector sprintf('x%d ',j)];
end
%var_vector=strcat('[',var_vector);
%var_vector=strcat(var_vector,']');

If anyone else has experienced similar errors or has further insight into mine, it would be appreciated.

Thanks,
Colette

25 Jun 2012 Abel Galois

Thanks a lot!

Comment only
16 Jun 2011 dwight nwaigwe

Hi Albert, thanks for catching that serious typo. I just corrected it and uploaded the new version.

Comment only
06 Jun 2011 albert chiang

Thank you for your work, i have found a mistake in your recent version. In line 71, yforbar=mean(ybar,2), i think it should be yforbar=mean(yfor,2).

Comment only
16 May 2011 albert chiang

have a look at!

Comment only
Updates
19 Apr 2011 1.1

changed description

20 Apr 2011 1.2

made minor adjustments to file such as inserting comments

10 May 2011 1.3

in the first few lines of the comments, I changed y+1 to y_new and x+1 to x_new

16 Jun 2011 1.4

Corrected line 71 as Albert Chiang mentioned.

It should be y_forbar=mean(y_for,2);
not y_forbar=mean(y_bar,2);

05 Apr 2013 1.7

Cosmetic changes: consolidated comments, removed the comment num_iterations = 20 as it wasn't necessary, and i added spaces and indents. i did these edits in notepad. i still have the original file in zipped folder to be safe

08 Apr 2013 1.8

whoops, i meant to say i deleted "num_members" = 20 from comments since it implied you must supply a variable with that name.

29 Oct 2013 1.9

Renamed variables and reorganized code for clarity. The original version is the .m file and the modified one is the .txt file. I haven't tested the .txt file but it should work.

Contact us