Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1
2) Calcular χ2 para una grilla de parámetros a y b, empezando por los rangos
Para calcular χ2 para cada valor en esta grilla deberán usar sólo operaciones vectoriales.
No se permiten ciclos for/while en esta tarea. Recuerden que para esto pueden usar
np.meshgrid o agregar dimensiones vacías a los arreglos, por ejemplo. Recuerden usar
distintos tamaños para los rangos en a y b para poder distinguirlos fácilmente cuando
vayan revisando su código.
Empezamos por definir los rangos en a y b:
[30]: a = np.linspace(7, 8, 100)
b = np.linspace(0.5, 1.2, 90)
Como se puede comprobar a partir de los tamaños, las tres dimensiones corresponden a b, a, y la
predicción de yi para cada par (a,b) (hay 50 datos en datos.txt). La grilla de χ2 es entonces
[33]: j = np.argmin(chi2.reshape(-1))
print(f'El mínimo de chi2 es {chi2.min():.2f} y ocurre en j={j}')
2
[34]: ((90, 100), (90, 100))
a_best = 7.61
b_best = 0.89
4) Calcular los parámetros a y b de mayor probabilidad siguiendo el cálculo matri-
cial desarrollado, incluyendo la matriz de covarianza. Imprimir ambos resultados.
¿Coinciden los dos procedimientos? ¿Qué ventajas ofrece el segundo método?
y
5) Calcular la matriz de covarianza ΣΘ , e imprimir la incerteza en cada uno de los
parámetros a y b.
Siguiendo el enunciado, definimos las matrices Y y M :
[37]: Y = y
M = np.vstack([np.ones(x.size), x]).T
Y.shape, M.shape
La matriz de covarianza es
[38]: C = y_err**2 * np.eye(y.size)
C.shape
[40]: True
3
[41]: Sigma_Theta = np.linalg.inv(np.dot(M.T, np.dot(Cinv, M)))
Sigma_Theta
y la matriz de parámetros, Θ, es
[16]: Theta = np.dot(Sigma_Theta, np.dot(M.T, np.dot(Cinv, Y)))
Theta
Por lo tanto, los parámetros que maximizan la probabilidad, y sus incertezas, son
[17]: a_mat, b_mat = Theta
a_err, b_err = np.diag(Sigma_Theta)**0.5
print(f'a = {a_mat:.2f} +/- {a_err:.2f}')
print(f'b = {b_mat:.2f} +/- {b_err:.2f}')
[18]: 39.938483095552314
a = 7.46 | b = 0.94
Agregaremos estos valores a los gráficos pedidos en las últimas dos preguntas como referencia.
[19]: a_true = 7.46
b_true = 0.94
4
[20]: fig, ax = plt.subplots()
extent = (a[0], a[-1], b[0], b[-1])
im = ax.imshow(chi2, extent=extent, origin='lower', aspect='auto',
cmap='binary_r', vmax=chi2.min()+20)
plt.colorbar(im, label='$\chi^2$')
# contornos con los niveles pedidos
ax.contour(chi2, levels=chi2.min()+(2.28,5.99),
extent=extent, colors='w')
# valor obtenido a mano
ax.plot(abest, bbest, 'wo', mec='C0', mew=2, ms=10, label='Manual')
# valor obtenido con matrices
ax.plot(a_mat, b_mat, 'C4x', mew=3, ms=8, label='Matricial')
# valor real
ax.plot(a_true, b_true, 'C3+', ms=12, mew=3, label='Real')
ax.legend()
ax.set_xlabel('$a$', fontsize=15)
ax.set_ylabel('$b$', fontsize=15)
Como esperaríamos, los valores reales de a y b están dentro del contorno que contiene el 95% de la
probabilidad obtenida con el desarrollo matricial.
7) Graficar nuevamente los datos entregados en datos.txt, esta vez agregando los
modelos encontrados con ambos procedimientos, identificándolos con una leyenda.
5
[21]: def prediccion(x, a, b):
return a + b*x