@@ -0,0 +1,1380 @@
+# -*- coding: utf-8 -*-%0A%22%22%22%0AAjuste lineal%0A%22%22%22%0Adef ajustelineal(x,y,errores):%0A    %22%22%22%0A    Ajusta los datos con una recta lineal en el sentido de max verosimilitud%0A    errores es un array con las desviaciones est%C3%A1ndar de los valores y%0A    x es un array con los valores independientes (sin error)%0A    y es un array con los datos medidos que se desea ajustar%0A    ---%0A    Devuelve: slope,intercept,r2,chi2,pcov%0A    pcov es la matriz de covarianza de slope e intercept%0A%09slope = slope +- sqrt(pcov%5B0,0%5D)%0A%09intercept = intercept +- sqrt(pcov%5B1,1%5D)%0A    %22%22%22%0A    import numpy as np%0A    # Supongo mediciones no correlacionadas --%3E V prop. Id.%0A    # El ajuste es lineal en x, pero puede ser lineal en theta%0A    N = len(x)%0A    A = np.ones((N,2))%0A    A%5B:,1%5D = x%0A    Vi = np.diag(1/errores**2)%0A    %0A    pcov = np.linalg.inv( np.dot(np.transpose(A),np.dot(Vi,A)))%0A    theta = np.dot(np.dot(pcov, np.transpose(A)),np.dot(Vi,y))%0A    slope = theta%5B1%5D%0A    intercept = theta%5B0%5D%0A    %0A    # Coeficiente R2%0A    fit = theta%5B0%5D+theta%5B1%5D*x%0A    r2 = 1 - sum((y-fit)**2)/sum((y-np.mean(y))**2)%0A    # Coeficiente Chi2%0A    chi2 = np.dot(np.transpose(y-fit),np.dot(Vi,y-fit))/(N-2)%0A    return slope,intercept,r2,chi2,pcov%0A%22%22%22%0Aplt.figure(1)%0Aplt.clf()%0Aplt.grid()%0Aplt.errorbar(x,y,fmt='o',yerr=errores)%0A%0Az = np.linspace(x%5B0%5D,x%5B-1%5D,1000)%0Aplt.plot(z,theta%5B0%5D+theta%5B1%5D*z,'r')%0Aprint(%22R%5E2 =%22,r2)%0Aprint(%22Chi%5E2 =%22,chi2)%0A%22%22%22%0A

Ajuste lineal c/ errores pesados. Devuelve r2 y chi2