forked from uchileFI3104B-2015B/10Tarea
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Codigos.py
135 lines (112 loc) · 4.73 KB
/
Codigos.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""
Script que realiza dos ajustes para un espectro que contiene un continuo y una
linea de absorcion. Un modelo corresponde a un perfil de Lorentz y el otro a un
perfil de Gauss. Ademas se realiza un test Kolmogorov-Smirnov a los modelos
"""
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
from scipy.optimize import (leastsq, curve_fit)
def Modelo_gauss(x, a, b, A, mu, sigma):
"""
entrega valores de la funcion del modelo gaussiano evaluada en punto
o set de puntos
"""
f = (a*x + b) - A * stats.norm(loc=mu, scale=sigma).pdf(x)
return f
def Modelo_lorentz(x, a, b, A, mu, sigma):
"""
entrega valores de la funcion del modelo lorentziano evaluada en punto
o set de puntos
"""
f = (a*x + b) - A * stats.cauchy(loc=mu, scale=sigma).pdf(x)
return f
def ordenar(x_data, y_data, funcion, p_optimo):
"""
Retorna arreglo ordenado de datos y de valores obtenidos con una funcion
modelo
"""
xmin = np.min(x_data)
xmax = np.max(x_data)
y_modelo_ordenado = np.sort(funcion(np.linspace(xmin, xmax, 200),
*p_optimo))
y_data_ordenado = np.sort(y_data)
return y_data_ordenado, y_modelo_ordenado
def prob_acumulada(y_data, y_modelo_ordenado):
"""
Crea y entrega funcion de distribucion acumulada para el modelo
"""
y_data_ordenado = np.sort(y_data)
dist_acumulada_modelo = np.array([np.sum(y_modelo_ordenado <= yy) for yy in
y_data_ordenado]) / len(y_modelo_ordenado)
return dist_acumulada_modelo
def chi_cuadrado(y_data, y_modelo):
"""
Retorna valor de chi cuadrado del modelo
"""
chi2 = np.sum((y_data - y_modelo)**2)
return chi2
# Setup
datos = np.loadtxt('espectro.dat')
longitud = datos[:, 0]
flujo = datos[:, 1]
# Parametros iniciales estimados
a, b = np.polyfit(longitud, flujo, 1)
A = 0.1e-16
mu = np.mean(longitud)
sigma = np.std(longitud)
# Busqueda de los mejores valores para los Parametros
p0 = [a, b, A, mu, sigma]
p_optimo_gauss, a_covarianza_gauss = curve_fit(Modelo_gauss, longitud, flujo,
p0)
p_optimo_lorentz, a_covarianza_lorentz = curve_fit(Modelo_lorentz, longitud,
flujo, p0)
# Valores de chi cuadrado de los modelos
chi_cuadrado_gauss = chi_cuadrado(flujo, Modelo_gauss(longitud,
*p_optimo_gauss))
chi_cuadrado_lorentz = chi_cuadrado(flujo, Modelo_lorentz(longitud,
*p_optimo_lorentz))
print '\n Parametros modelo perfil Gauss: \n'
print 'Pendiente = ' + str(p_optimo_gauss[0])
print 'constante recta = ' + str(p_optimo_gauss[1])
print 'Amplitud = ' + str(p_optimo_gauss[2])
print 'Centro (mu) =' + str(p_optimo_gauss[3])
print 'Desviacion esetandar(sigma) = ' + str(p_optimo_gauss[4])
print '\n Parametros modelo perfil Lorentz: \n '
print 'Pendiente = ' + str(p_optimo_lorentz[0])
print 'constante recta = ' + str(p_optimo_lorentz[1])
print 'Amplitud = ' + str(p_optimo_lorentz[2])
print 'Centro (mu) =' + str(p_optimo_lorentz[3])
print 'Desviacion esetandar(sigma) = ' + str(p_optimo_lorentz[4])
print ''
print 'chi cuadrado gaussiana = ' + str(chi_cuadrado_gauss)
print 'chi cuadrado lorentziana = ' + str(chi_cuadrado_lorentz)
# Test KS
y_data_ordenado = np.sort(flujo)
CDF_modelo_gauss, y_modelo_ordenado_gauss = ordenar(longitud, flujo,
Modelo_gauss,
p_optimo_gauss)
CDF_modelo_lorentz, y_modelo_ordenado_lorentz = ordenar(longitud, flujo,
Modelo_lorentz,
p_optimo_lorentz)
Dn_gauss, prob_gauss = stats.kstest(y_data_ordenado, prob_acumulada, args=(
y_modelo_ordenado_gauss,))
Dn_lorentz, prob_lorentz = stats.kstest(y_data_ordenado, prob_acumulada, args=(
y_modelo_ordenado_lorentz,))
print '\n test KS \n'
print "Dn gaussiana : ", Dn_gauss
print "Dn lorentziana : ", Dn_lorentz
print "Nivel de confianza gaussiana : ", prob_gauss
print "Nivel de confianza lorentziana: ", prob_lorentz
# Grafico
plt.plot(longitud, flujo, color='r', label='Datos observados')
plt.plot(longitud, Modelo_gauss(longitud, *p_optimo_gauss), color='b',
label='Modelo gaussiana')
plt.plot(longitud, Modelo_lorentz(longitud, *p_optimo_lorentz), color='g',
label='Modelo lorentziana')
plt.title('Espectro observado y modelos perfil de gauss y lorentz \n ')
plt.xlabel('Longitud de onda [Angstrom]')
plt.ylabel('$F_\\nu [erg\ s^{-1}Hz^{-1}cm^{-2}]$')
plt.legend(loc=4)
plt.show()