import matplotlib
from scipy import misc
from scipy import stats
from scipy import special
import pylab as plt
import numpy as np

%matplotlib inline

font = {'weight' : 'bold',
        'size'   : 16}

matplotlib.rc('font', **font)

from IPython.display import display
from IPython.display import HTML
import IPython.core.display as di


###########PUNTO 1###############
incerteza=0.01 #1%
datos=np.array([0.53,0.46,0.53,0.58,0.60])   # tiempo en segundos
n=5 #numero de datos

hsum=[]

for i in range(len(datos)):
    hsum.append((sum(datos)-datos[i])**2)
    
desSTD=(np.sqrt(sum(hsum)/(n-1)))/np.sqrt(n) #Desv estandar

aux = stats.t.interval(1-incerteza,5-1,loc=0,scale=1)
valor_t = aux[1] # corrección de t-student

error=valor_t*desSTD/np.sqrt(datos.size) #Error estandar t-student

errorSTD1=desSTD/np.sqrt(datos.size) #Error estandar #sigma

errorSTD3=3*desSTD/np.sqrt(datos.size) #Error estandar #3 sigma


print 'Tiempo =' ,sum(datos)/5
print 'Desviacion estandar = %.2f' %desSTD
print 'Error estandar (sigma) = %.2f ' %errorSTD1
print 'Error estandar (3sigma) = %.2f' %errorSTD3
print 'Error estandar (t-student) =%.2f' %error

"""
Explanation: t-student y aceleración de la gravedad
A partir de las 30 medidas del tiempo que demora caer un objeto de una altura (medida con su respectiva incertidumbre) hacer lo siguiente:
1. Con 5 medidas determinar el tiempo y su error estándar. Para sigma, tres sigma y t-student (alfa=1%).
2. Hacer el análogo a 5 experimentos de 5 medidas cada uno. Determinar el promedio de cada experimento. A los 5 datos de los promedios, suponiendo una distribución normal determinar el promedio y el error estándar para 3sigma.
3. Con las 30 medidas determinar el tiempo y su error estándar. Reportar con 3sigma.
4. Determinar usando propagación de errores (recuerde que la medida de la altura tiene error) la aceleración de la gravedad. Reporte tres valores correspondientes al tiempo con 5 medidas(t-stduent), con 5 experimentos (3sgima), y con 30 medidas (3sgima).
End of explanation
"""


###########PUNTO 2###############

#5 listas
datos1=np.array([0.53,0.62,0.60,0.40,0.45])
datos2=np.array([0.45,0.51,0.49,0.47,0.59])
datos3=np.array([0.46,0.51,0.38,0.56,0.55])
datos4=np.array([0.59,0.62,0.58,0.56,0.62])
datos5=np.array([0.53,0.57,0.60,0.55,0.56])

#promedios de las 5 listas
datosdef=[0.52,0.50,0.49,0.59,0.56]

prom=sum(datosdef)/5 #datos promedio
 
Hsum=[]

for i in range(len(datosdef)):
    Hsum.append((sum(datosdef)-datosdef[i])**2)
    
desSTDp2=(np.sqrt(sum(Hsum)/(4)))/np.sqrt(5) #Desv estandar
errorSTD3p2=3*desSTDp2/np.sqrt(datos.size) #Error estandar #3 sigma

print 'Tiempo = %.2f' %prom
print 'Error estandar (3sigma) = %.2f' %errorSTD3p2


"""
Explanation: Análisis
La franja de t-estudent contiene a las otras franjas de error que se estimaron, al tomar este valor de error estandar tan elevado se esta tomando una probabilidad del 100% de que cualquier valor medido se va a encontrar dentro del rango propuesto.
End of explanation
"""


##############PUNTO 3###################
datosT=([0.53,0.62,0.60,0.40,0.45,0.45,0.51,0.49,0.47,0.59,0.46,0.51,0.38,0.56,0.55,0.59,0.62,0.58,0.56,0.62,\
       0.53,0.57,0.60,0.55,0.56,0.56,0.63,0.65,0.45,0.48,0.49])

promT=sum(datosT)/30 #tiempo promedio
n=30 #numero de datos

HsumT=[]

for i in range(len(datosT)):
    HsumT.append((sum(datosT)-datosT[i])**2)
    
desSTDp3=(np.sqrt(sum(HsumT)/(n-1)))/np.sqrt(n) #Desv estandar
errorSTD3p3=3*desSTDp3/np.sqrt(datos.size) #Error estandar #3 sigma

print 'Tiempo = %.2f' %promT
print 'Error estandar (3sigma) = %.2f' %errorSTD3p3

"""
Explanation: Análisis
El error estandar con 3-sigma medido en el punto anterior es un poco mayor que el de este punto, se debe a que los 5 valores estudiados en este caso contienen informacion de los otros 25, y al evaluar el promedio de los promedios se esta disminuyendo la desviacion estandar.
End of explanation
"""


##############PUNTO 4###################

##################GRAVEDAD T-ESTUDENT##################
G1=2*(195)/(0.54)**2
sigH=0.1

sigG1=np.sqrt(((2/0.54**2)*(error))**2+(4*(195/0.54**3)*(0.01))**2)
print 'Aceleracion gravitacional caso 1: %d ± %d cm/s**2'%(G1, sigG1)
##################GRAVEDAD 5 EXPERIMENTOS (3*SIGMA)################
G2=2*(195)/(0.53)**2

sigG2=np.sqrt(((2/0.53**2)*(errorSTD3p2))**2+(4*(195/0.53**3)*(0.01))**2)
print 'Aceleracion gravitacional caso 2: %d ± %d cm/s**2 '%(G2, sigG2)
#################GRAVEDAD 30 DATOS (3*SIGMA)#######################
G3=2*(195)/(0.55)**2

sigG3=np.sqrt(((2/0.55**2)*(errorSTD3p3))**2+(4*(195/0.55**3)*(0.01))**2)
print 'Aceleracion gravitacional caso 3: %d ± %d cm/s**2'%(G3, sigG3)

"""
Explanation: Análisis
La consecuencia del sigma inicial (1.08) que establece una desviacion grande debida a la dispersión de los datos, es que amplifica de manera considerable el rango de valores que debería contener con 3-sigma.
End of explanation
"""


