Onde:
Note que
Considerando o exemplo da energia radiada por um corpo negro:
Neste exemplo, definiremos a temperatura
Onde:
De forma prática, matrizes de covariâncias podem ser decompostas
Um exemplo:
x = np.arange(-np.pi, np.pi, 0.01)
xb_seno = np.sin(x)
sigma = 0.5
ruido = np.random.randn(*x.shape) * sigma
xb = xb_seno + ruido
# Posições
obs_pos = np.array([-2.2, -2.1, -2.0, -1.8, 0.9, 1, 2, 3])
# Valores medidos
obs_vals = np.array([-2.2, -1.8, 0.9, 0, 1, 2, 3, 4])
# Função peso IO
L=0.5
sigma_b=0.5
sigma_o=0.1
def weight_io(x_grid, obs_x, obs_val, xb, L=L, sigma_b=sigma_b, sigma_o=sigma_o):
def cov(a, b): return sigma_b**2 * np.exp(-((a - b)**2)/(2*L**2))
n = len(x_grid)
p = len(obs_x)
B_Ht = np.array([[cov(xi, xj) for xj in obs_x] for xi in x_grid])
HBHt = np.array([[cov(xi, xj) for xi in obs_x] for xj in obs_x])
R = np.eye(p) * sigma_o**2
K = B_Ht @ np.linalg.inv(HBHt + R)
Hxb = np.interp(obs_x, x_grid, xb)
return xb + K @ (obs_val - Hxb)
# Cálculo da Análise - embutido na função anterior e dada por xb + K @ (obs_val - Hxb)
# Chamada da função peso (retorna o valor da análise)
xa = weight_io(x, obs_x, obs_val, xb)
lon = np.linspace(-np.pi, np.pi, 10)
lat = np.linspace(-np.pi, np.pi, 10)
X, Y = np.meshgrid(lon, lat)
xb_seno = np.sin(X)
sigma = 0.5
ruido = np.random.randn(*X.shape) * sigma
xb_2d = xb_seno + ruido
# Posições
obs_x = np.array([-2.2, -2.1, -2.0, -1.8, 0.9, 1.0, 2.0, 3.0])
obs_y = np.array([ -1, 0.5, -0.5, 2, -2.8, 1.0, 0.0, 0.5])
# Valores medidos
obs_val = np.array([-1.0, -1.5, -2.0, -1.0, 1.0, 0.0, 0.5, 0.0])
# Função peso IO
L=0.5
sigma_b=0.5
sigma_o=0.1
def weight_io_2d(X, Y, obs_x, obs_y, obs_val, xb, L=L, sigma_b=sigma_b, sigma_o=sigma_o):
obs_pos = np.vstack((obs_x, obs_y)).T
grid_pos = np.vstack((X.ravel(), Y.ravel())).T
def cov(p1, p2): return sigma_b**2 * np.exp(-np.sum((p1 - p2)**2)/(2*L**2))
B = np.array([[cov(p1, p2) for p2 in obs_pos] for p1 in obs_pos])
Hx = np.array([[cov(p1, p2) for p2 in obs_pos] for p1 in grid_pos])
R = np.eye(len(obs_x))*sigma_o**2
K = Hx @ np.linalg.inv(B + R)
Hxb = np.interp(obs_x, np.linspace(0, 2*np.pi, X.shape[1]), xb.mean(axis=0))
ana = xb.ravel() + K @ (obs_val - Hxb)
return ana.reshape(X.shape)
# Cálculo da Análise - embutido na função anterior e dada por xb + K @ (obs_val - Hxb)
# Chamada da função peso (retorna o valor da análise)
xa = weight_io_2d(X, Y, obs_x, obs_y, obs_val, xb_2d)
Notebook com Atividade Prática 5
https://cfbastarz.github.io/met563-3/
https://github.com/cfbastarz/MET563-3
carlos.bastarz@inpe.br
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style
Scoped style