The observation model

To define the relationship between the Lorenz-63 simulation model and observations of this system, we need to define an observation model. When the observation model can be described using a standard probability distribution, we only need to create a Univariate subclass that returns a SciPy distribution for the given state vectors \(\mathbf{x_t}\).

For simplicity, we assume that \(x(t)\), \(y(t)\), and \(z(t)\) can be directly observed, and that the observation error is distributed normally with zero mean and standard deviation \(\sigma = 1.5\):

class ObsLorenz63(Univariate):
    def distribution(self, ctx, snapshot):
        expect = snapshot.state_vec[self.unit]
        return scipy.stats.norm(loc=expect, scale=1.5)

Note

pypfilt support multiple observation models. Each observation model is associated with a unique identifier (an “observation unit”) that is used to identify the observations related to this model. Here, we use the observation unit (self.unit) to identify the field in the state vector that is being observed (see the highlighted line, above). This allows us to use three instances of the ObsLorenz63 class to observe \(x(t)\), \(y(t)\), and \(z(t)\).

We could define an observation model specifically for \(x(t)\) (which is named 'x' in the state vector) by replacing the highlighted line above with:

expect = snapshot.state_vec['x']