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