Skip to content

Ensemble Kalman Filter

cuthbert.enkf.ensemble_kalman_filter

Implements the high-level Ensemble Kalman Filter (EnKF).

See Algorithm 10.2, Sanz-Alonso et al., Inverse Problems and Data Assimilation. Based in part on the CD-Dynamax implementation.

EnKFState

Bases: NamedTuple

Ensemble Kalman filter state.

key instance-attribute

ensemble instance-attribute

model_inputs instance-attribute

log_normalizing_constant instance-attribute

n_particles property

Number of particles.

mean property

Ensemble mean.

chol_cov property

Generalised Cholesky factor of the ensemble sample covariance.

build_filter(init_sample, get_dynamics, get_observations, n_particles, inflation=0.0, perturbed_obs=True)

Builds an Ensemble Kalman Filter object.

Parameters:

Name Type Description Default
init_sample InitSample

Function to sample from the initial distribution from key and model inputs.

required
get_dynamics GetEnKFDynamics

Function to get dynamics function (x_t, key) -> x_{t+1} ~ p(x_{t+1} | x_t) from model inputs.

required
get_observations GetEnKFObservations

Function to get observation function, chol_R, and y from model inputs.

required
n_particles int

Number of particles.

required
inflation float

Multiplicative inflation factor for ensemble deviations.

0.0
perturbed_obs bool

If True, use perturbed observations (stochastic EnKF).

True

Returns:

Type Description
Filter

Filter object for the EnKF.

Raises:

Type Description
ValueError

If n_particles is less than 2.

Source code in cuthbert/enkf/ensemble_kalman_filter.py
def build_filter(
    init_sample: InitSample,
    get_dynamics: GetEnKFDynamics,
    get_observations: GetEnKFObservations,
    n_particles: int,
    inflation: float = 0.0,
    perturbed_obs: bool = True,
) -> Filter:
    """Builds an Ensemble Kalman Filter object.

    Args:
        init_sample: Function to sample from the initial distribution from key and model inputs.
        get_dynamics: Function to get dynamics function (x_t, key) -> x_{t+1} ~ p(x_{t+1} | x_t) from model inputs.
        get_observations: Function to get observation function, chol_R, and y from model inputs.
        n_particles: Number of particles.
        inflation: Multiplicative inflation factor for ensemble deviations.
        perturbed_obs: If True, use perturbed observations (stochastic EnKF).

    Returns:
        Filter object for the EnKF.

    Raises:
        ValueError: If ``n_particles`` is less than 2.
    """
    if n_particles < 2:
        raise ValueError("n_particles must be at least 2 for EnKF.")

    return Filter(
        init_prepare=partial(
            init_prepare,
            init_sample=init_sample,
            n_particles=n_particles,
        ),
        filter_prepare=partial(
            filter_prepare,
            init_sample=init_sample,
            n_particles=n_particles,
        ),
        filter_combine=partial(
            filter_combine,
            get_dynamics=get_dynamics,
            get_observations=get_observations,
            inflation=inflation,
            perturbed_obs=perturbed_obs,
        ),
        associative=False,
    )