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.
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];
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?
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.
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.
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.