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.
’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,
Convert the result of subs to double, do like this,
Add 'double' to all 'subs'.
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.
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];
The same with h. Splitting it up so that y=C*x. Here in this example with:
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?
how to ploting the graphic?
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
to change the limit. Be aware that exceeding your available stack space
crash MATLAB and/or your computer.
Error in ==> sym.sym>varname2ref
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
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)];
If anyone else has experienced similar errors or has further insight into mine, it would be appreciated.
Thanks a lot!
Hi Albert, thanks for catching that serious typo. I just corrected it and uploaded the new version.
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).
have a look at!
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.
whoops, i meant to say i deleted "num_members" = 20 from comments since it implied you must supply a variable with that name.
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
Corrected line 71 as Albert Chiang mentioned.
It should be y_forbar=mean(y_for,2);
in the first few lines of the comments, I changed y+1 to y_new and x+1 to x_new
made minor adjustments to file such as inserting comments