|
| 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