Fm = Fmat(m, -1, 1, tseq.dt) def step(x, t, dt): assert dt == tseq.dt return x @ Fm.T f = {'m': m, 'model': step, 'jacob': Fm, 'noise': 0} # In the animation, it can sometimes/somewhat occur # that the truth is outside 3*sigma !!! # Yet this is not so implausible because sinusoidal_sample() # yields (multivariate) uniform (random numbers) -- not Gaussian. wnum = 25 X0 = RV(func=lambda N: sqrt(5) / 10 * sinusoidal_sample(m, wnum, N)) def yplot(y): lh = plt.plot(jj, y, 'g*', MarkerSize=8)[0] plt.pause(0.8) return lh h = partial_direct_obs_setup(m, jj) h['noise'] = 0.01 h['plot'] = yplot other = {'name': os.path.relpath(__file__, 'mods/')} setup = TwinSetup(f, h, tseq, X0, **other)
################### Noise setup ################### # Instead of sampling model noise from sinusoidal_sample(), # we will replicate it below by a covariance matrix approach. # But, for strict equivalence, one would have to use # uniform (i.e. not Gaussian) random numbers. wnumQ = 25 sample_filename = 'data/samples/LA_Q_wnum' + str(wnumQ) + '.npz' try: # Load pre-generated L = np.load(sample_filename)['Left'] except FileNotFoundError: # First-time use print('Generating a sample from which to initialize experiments.') NQ = 20000 # Must have NQ > (2*wnumQ+1) A = sinusoidal_sample(m,wnumQ,NQ) A = 1/10 * anom(A)[0] / sqrt(NQ) Q = A.T @ A U,s,_ = tsvd(Q) L = U*sqrt(s) np.savez(sample_filename, Left=L) X0 = GaussRV(C=CovMat(sqrt(5)*L,'Left')) ################### Forward model ################### damp = 0.98; Fm = Fmat(m,-1,1,tseq.dt) def step(x,t,dt): assert dt == tseq.dt return x @ Fm.T
Fm = Fmat(Nx,c=-1,dx=1,dt=tseq.dt) def step(x,t,dt): assert dt == tseq.dt return x @ Fm.T Dyn = { 'M' : Nx, 'model': step, 'jacob': Fm, 'noise': 0 } # In the animation, it can sometimes/somewhat occur # that the truth is outside 3*sigma !!! # Yet this is not so implausible because sinusoidal_sample() # yields (multivariate) uniform (random numbers) -- not Gaussian. wnum = 25 X0 = RV(M=Nx, func = lambda N: sqrt(5)/10 * sinusoidal_sample(Nx,wnum,N)) Obs = partial_direct_Obs(Nx,jj) Obs['noise'] = 0.01 HMM = HiddenMarkovModel(Dyn,Obs,tseq,X0,LP=LPs(jj)) #################### # Suggested tuning #################### # config = EnKF('PertObs',N=100,infl=1.02)
################### Noise setup ################### # Instead of sampling model noise from sinusoidal_sample(), # we will replicate it below by a covariance matrix approach. # But, for strict equivalence, one would have to use # uniform (i.e. not Gaussian) random numbers. wnumQ = 25 sample_filename = 'data/samples/LA_Q_wnum' + str(wnumQ) + '.npz' try: # Load pre-generated L = np.load(sample_filename)['Left'] except FileNotFoundError: # First-time use print('Generating a sample from which to initialize experiments.') NQ = 20000 # Must have NQ > (2*wnumQ+1) A = sinusoidal_sample(Nx, wnumQ, NQ) A = 1 / 10 * center(A)[0] / sqrt(NQ) Q = A.T @ A U, s, _ = tsvd(Q) L = U * sqrt(s) np.savez(sample_filename, Left=L) X0 = GaussRV(C=CovMat(sqrt(5) * L, 'Left')) ################### Forward model ################### damp = 0.98 Fm = Fmat(Nx, -1, 1, tseq.dt) def step(x, t, dt): assert dt == tseq.dt