Skip to content

Commit f55011b

Browse files
authored
Merge pull request #18 from ComputationalScienceLaboratory/EnGMF
EnGMF
2 parents 78e5c3f + d41c07a commit f55011b

File tree

1 file changed

+55
-0
lines changed
  • src/+datools/+statistical/+ensemble

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
classdef EnGMF < datools.statistical.ensemble.EnF
2+
3+
methods
4+
5+
function analysis(obj, R, y)
6+
7+
tc = obj.Model.TimeSpan(1);
8+
9+
xf = obj.Ensemble;
10+
ensN = obj.NumEnsemble;
11+
n = size(xf, 1);
12+
13+
beta = ((4/(n + 2))^(2/(n + 4)))*((ensN)^(-2/(n + 4)));
14+
15+
xfm = mean(xf, 2);
16+
Af = xf - repmat(xfm, 1, ensN);
17+
Af = sqrt(beta) * Af/sqrt(ensN - 1);
18+
19+
Hxf = obj.Observation.observeWithoutError(tc, xf);
20+
Hxfm = mean(Hxf, 2);
21+
HAf = Hxf - repmat(Hxfm, 1, ensN);
22+
HAf = sqrt(beta)*HAf/sqrt(ensN - 1);
23+
24+
dS = decomposition((HAf * HAf.') + R, 'chol');
25+
26+
xtilde = xf - (Af*HAf.')*(dS\(Hxf - y));
27+
Aa = xtilde - mean(xtilde, 2);
28+
Aa = sqrt(beta)*Aa/sqrt(ensN - 1);
29+
30+
t0 = (Hxf - y);
31+
32+
as = (-0.5 * sum(t0.*(dS \ t0), 1)).';
33+
m = max(as);
34+
w = exp(as-(m + log(sum(exp(as-m))))).';
35+
w = w/sum(w);
36+
37+
defensivefactor = 1;
38+
w = defensivefactor*w + (1 - defensivefactor)/ensN;
39+
40+
% resample
41+
xa = xf;
42+
for k = 1:ensN
43+
ind = find(rand <= cumsum(w), 1, 'first');
44+
xa(:, k) = xtilde(:, ind) + Aa*randn(ensN, 1);
45+
end
46+
47+
obj.Ensemble = xa;
48+
49+
obj.Weights = ones(ensN, 1) / ensN;
50+
51+
end
52+
53+
end
54+
55+
end

0 commit comments

Comments
 (0)