def HMMs(stepper="Tay2", resolution="Low", R=1): """Define the various HMMs used.""" # Use small version of L96. Has 4 non-stable Lyapunov exponents. Nx = 10 # Time sequence # Grudzien'2020 uses the below chronology with Ko=25000, BurnIn=5000. t = modelling.Chronology(dt=0.005, dto=.1, T=30, Tplot=Tplot, BurnIn=10) if resolution == "High": t.dt = 0.001 elif stepper != "Tay2": t.dt = 0.01 # Dynamical operator Dyn = {'M': Nx, 'model': steppers(stepper)} # (Random) initial condition X0 = modelling.GaussRV(mu=x0(Nx), C=0.001) # Observation operator jj = range(Nx) # obs_inds Obs = modelling.partial_Id_Obs(Nx, jj) Obs['noise'] = R return modelling.HiddenMarkovModel(Dyn, Obs, t, X0)
"""Settings from `bib.wiljes2016second`.""" import numpy as np import dapper.mods as modelling from dapper.mods.Lorenz63.sakov2012 import HMM as _HMM from dapper.mods.Lorenz63.sakov2012 import Nx HMM = _HMM.copy() HMM.tseq = modelling.Chronology(0.01, dko=12, T=4**5, BurnIn=4) jj = np.array([0]) Obs = modelling.partial_Id_Obs(Nx, jj) Obs['noise'] = 8 HMM.Obs = modelling.Operator(**Obs) #################### # Suggested tuning #################### # Reproduce benchmarks for NETF and ESRF (here EnKF-N) from left pane of Fig 1. # from dapper.mods.Lorenz63.wiljes2017 import HMM # rmse.a reported by DAPPER / PAPER: # ------------------------------------------------------------------------------ # HMM.tseq.Ko = 10**2 # xps += OptInterp() # 5.4 / N/A # xps += Var3D(xB=0.3) # 3.0 / N/A # xps += EnKF_N(N=5) # 2.68 / N/A # xps += EnKF_N(N=30,rot=True) # 2.52 / 2.5 # xps += LNETF(N=40,rot=True,infl=1.02,Rs=1.0,loc_rad='NA') # 2.61 / ~2.2 # xps += PartFilt(N=35 ,reg=1.4,NER=0.3) # 2.05 / 1.4 * # *: tuning settings not given #
# tseq = modelling.Chronology(dt=0.001,dto=0.05,T=4**3,BurnIn=6) # allows using rk2 tseq = modelling.Chronology(dt=0.005, dto=0.05, T=4**3, BurnIn=6) # requires rk4 Dyn = { 'M': LUV.M, 'model': modelling.with_rk4(LUV.dxdt, autonom=True), 'noise': 0, 'linear': LUV.dstep_dx, } X0 = modelling.GaussRV(mu=LUV.x0, C=0.01) R = 0.1 jj = np.arange(nU) Obs = modelling.partial_Id_Obs(LUV.M, jj) Obs['noise'] = R other = {'name': rel2mods(__file__) + '_full'} HMM_full = modelling.HiddenMarkovModel(Dyn, Obs, tseq, X0, LP=LUV.LPs(jj), **other) ################ # Truncated ################ # Just change dt from 005 to 05
from dapper.mods.DoublePendulum import step, x0, LP_setup, dstep_dx t = modelling.Chronology(0.01, dko=100, T=30, BurnIn=10) Dyn = { 'M': len(x0), 'model': step, 'noise': 0, 'linear': dstep_dx, } X0 = modelling.GaussRV(mu=x0, C=0.01**2) jj = [0, 2] Obs = modelling.partial_Id_Obs(len(x0), jj) Obs['noise'] = 0.1**2 HMM = modelling.HiddenMarkovModel(Dyn, Obs, t, X0, LP=LP_setup(jj)) #################### # Suggested tuning #################### # from dapper.mods.DoublePendulum.settings101 import HMM # Expct rmse.a: # HMM.tseq.dko = anything # xps += Climatology() # 5 # xps += OptInterp() # 2.5 # HMM.tseq.dko = 7 # <-- max dko for tolerable performance with Var3D # xps += Var3D(xB=0.1) # 0.81
KObs=1000, Tplot=Tplot, BurnIn=4 * Tplot) Nx = len(x0) Dyn = { 'M': Nx, 'model': step, 'linear': dstep_dx, 'noise': 0, } X0 = modelling.GaussRV(C=2, mu=x0) Obs = modelling.partial_Id_Obs(Nx, np.arange(Nx)) Obs['noise'] = 8.0 HMM = modelling.HiddenMarkovModel(Dyn, Obs, t, X0) #################### # Suggested tuning #################### # Compare with Anderson's figure 10. # Benchmarks are fairly reliable (KObs=2000): # from dapper.mods.Lorenz63.anderson2010rhf import HMM # rmse.a # xps += SL_EAKF(N=20,infl=1.01,rot=True,loc_rad=np.inf) # 0.87 # xps += EnKF_N (N=20,rot=True) # 0.87 # xps += RHF (N=50,infl=1.10) # 1.28 # xps += RHF (N=50,infl=0.95,rot=True) # 0.94 # xps += RHF (N=20,infl=0.95,rot=True) # 1.07
import numpy as np import dapper.mods as modelling from dapper.mods.Lorenz05 import Model from dapper.tools.localization import nd_Id_localization # Sakov uses K=300000, BurnIn=1000*0.05 tseq = modelling.Chronology(0.002, dto=0.05, Ko=400, Tplot=2, BurnIn=5) model = Model(b=8) Dyn = { 'M': model.M, 'model': model.step, 'noise': 0, 'object': model, } X0 = modelling.GaussRV(mu=model.x0, C=0.001) jj = np.arange(model.M) # obs_inds Obs = modelling.partial_Id_Obs(model.M, jj) Obs['noise'] = 1 Obs['localizer'] = nd_Id_localization((model.M, ), (6, )) HMM = modelling.HiddenMarkovModel(Dyn, Obs, tseq, X0)