Python EnKF:只要L96模型的时间步长大于0.001,集合就完全变成零

Python EnKF:只要L96模型的时间步长大于0.001,集合就完全变成零,python,Python,这是我的EnKF类,减去初始化。这里dt是时间步长,Q是我的过程噪声,N是我的系综的大小,x是系综的平均值,h是观测矩阵,fx是过渡函数,dim是系统的维数,mes是新观测值,R是测量噪声。我在一个2d旋转示例上测试了该滤波器,它工作了,使用的RMSE小于测量噪声的平方根,但现在它似乎不适用于Lorenz96模型。我错过了什么 def predict(self): for i, s in enumerate(self.sigmas): self.sigmas[i] = s

这是我的EnKF类,减去初始化。这里dt是时间步长,Q是我的过程噪声,N是我的系综的大小,x是系综的平均值,h是观测矩阵,fx是过渡函数,dim是系统的维数,mes是新观测值,R是测量噪声。我在一个2d旋转示例上测试了该滤波器,它工作了,使用的RMSE小于测量噪声的平方根,但现在它似乎不适用于Lorenz96模型。我错过了什么

def predict(self):
    for i, s in enumerate(self.sigmas):
        self.sigmas[i] = self.fx(s, self.dt)
    noise = multivariate_normal(self.c_mean, self.Q, self.N)
    self.sigmas += noise

    # update the covariance matrix
    P = 0.
    for s in self.sigmas:
        P += np.outer(s - self.x, s - self.x)
    self.P = P / (self.N - 1)

    self.prior = np.average(self.sigmas)

def update(self, mes):
    self.z = mes
    mes_sigs = np.empty((self.N, self.dim))
    for i in range(self.N):
        mes_sigs[i] = np.dot(self.h, self.sigmas[i])
    mes_mean = np.reshape(np.average(mes_sigs, axis=0), newshape=(self.dim, 1))

    # Calculate sample covariance
    P_zz = 0.
    for i in range(self.N):
        P_zz += np.outer(self.sigmas[i] - self.x, mes_sigs[i] - mes_mean.T)
    self.P = P_zz / (self.N - 1) + self.R

    # Compute Kalman gain
    A = mes_sigs - np.dot(mes_mean, np.ones((1, self.N))).T
    C = np.dot(A.T, A) / (self.N - 1)
    self.K = C * self.h.T * inv(self.h * C * self.h.T + self.R)
    # Perturbation here
    v_r = multivariate_normal(self.c_mean, self.R, size=self.N)

    # Update all of the sigmas
    for i in range(self.N):
        self.sigmas[i] += np.dot(self.K, self.z - mes_sigs[i] + v_r[i])

    #Calculate new mean and covariance
    self.x = np.mean(self.sigmas, axis=0)
    self.P -= self.K * self.P * self.K.T
    return self.x