# Ejercicios para practicar numpy y optimización con scipy
**NUEVO PLAZO DE ENTREGA: Feb/17 a la media noche COL/PER/ECU - 1:00 a.m del 18/02 VEN**
# ADICIONES - FEB/17
## Para quienes tengan dificultad en comprender el ajuste sobre la región 2D
Pueden empezar resolviendo un problema más sencillo, de nuevo en 1 dimensión
así como en el ejemplo de la clase. En este caso, después de recortar el cuadradito
de una estrella, vamos a tomar solo los pixeles de la línea que pasa por la mitad
de la estrella, es decir tenemos un vector de valores de intensidad luminosa.
Si los grafican, deben obtener algo similar a esto:

La idea entonces es ajustar una función gaussiana común y corriente, agregando una
constante aditiva. Cuando dominen este problema (y escriban su solución para entregar)
pueden retomar el problema original a ver si lo entienden mejor.
La diferencia será
que ya no tendrán una función de una variable, si no de dos. Es decir:
* En el problema
simplificado tenemos $y=y(x)$. 'x' es nuestra variable independiente y representa las
distintas posiciones a lo largo de la linea 1D, mientras 'y', que representa las
intensidades luminosas en cada posición, es nuestra variable dependiente, los datos
a los cuales deseamos ajustar el modelo
* En el problema planteado originalmente se desea ajustar una función de 2 variables:
$z=z(x,y)$. 'x','y' son las variables independientes, y juntas representan todas las
posiciones sobre el cuadrito 2D del recorte de la estrella; deberán usar meshgrid
para obtener todas las combinaciones (fila, columna) de los pixeles en la imagen.
Por su parte, 'z', que es la variable dependiente, es el brillo de cada pixel, y
corresponde a los valores que vienen almacenados en la propia imagen. Esos valores
de 'z' son nuestros datos, a los cuales queremos ajustar el modelo de gaussiana 2D,
algo del estilo: zmodel = gauss2D(x,y)
Una vez logren ajustar una de esas gausianas 1D, la idea es repetir en varias estrellas
y sacar una estadística sobre el ancho de ellas.
## Para quienes ya dominaron el ejercicio inicial
Olvidé comentar sobre la incertidumbre, que obviamente existe siempre que tomamos
cualquier medida. En el caso de las imágenes, el conteo de fotones es un proceso que
sigue la estadística de Poisson, y si el flujo luminoso es grande (llegan muchos fotones)
esto acaba derivando en una estadística gaussiana. En ese caso podemos modelar la
incertidumbre como la raíz cuadrada del flujo observado.
Como ejercicio final, repita los ajustes realizados inicialmente, esta vez teniendo
en cuenta la incertidumbre de los datos, para ver si surge algún cambio en los resultados.
Encuentre una forma de programar sus rutinas de modo que sean fácilmente reutilizables;
con una buena implementación, este nuevo ajuste debe ser cuestión de un par de minutos
con pocos o ningún paso manual.
## Resolución espacial
En observaciones astronómicas e imágenes en general, llamamos resolución espacial
a la distancia angular minima a la que pueden estar dos fuentes puntuales de luz
y aun poder ser reconocidas como objetos individuales.
En el caso de la astronomía, este efecto tiene que ver con la dispersión de la
luz al atravezar la atmósfera, la cual hace que una estrella, que debería
en principio aparecer como una fuente puntual (pues las estrellas están muy
lejos), aparezca en cambio como una mancha. Así, si dos estrellas están
demasiado cerca sus *manchas* se superpondrán hasta el punto en que sea imposible
distinguirlas como fuentes individuales [(Ver imágenes en este link)](http://www.carlostapia.es/fisica/resolucion_criterios_practica.html)
Para modelar este efecto, típicamente consideramos la acción de la atmósfera
como la convolución de la imagen "perfecta" (como se vería desde el espacio)
con un kernel gaussiano. El ancho de esa función gaussiana 2D caracteriza
las condiciones de observación, varía con las condiciones climáticas y para
cada sitio de la Tierra.
La resolución espacial normalmente se toma como el [FWHM](https://es.wikipedia.org/wiki/Anchura_a_media_altura#:~:text=La%20Anchura%20a%20media%20altura,mitad%20de%20su%20valor%20m%C3%A1ximo.)
de la gaussiana caracteristica registrada durante una observación. Es decir,
si dos estrellas están a una distancia aparente en el cielo menor que el
FWHM del efecto atmosférico, la luz de ambas fuentes se mezclará después de
la convolución hasta el punto de impedir reconocerlas de modo individual.
Además, la atmósfera puede interactuar de maneras distintas con la luz de
distintas longitudes de onda, de manera que el ancho de la gaussiana puede
ser distinto para observaciones con diferentes filtros.
El objetivo de esta tarea es medir de forma aproximada la resolución
espacial en una noche de observación en Zapatoca, Santander (Colombia), a partir
de una foto del cielo estrellado.
## Ejercicio: Pasos
- Leer la imagen almacenada en la carpeta `data` como un array de numpy. Ese
array estará compuesto de 3 matrices, una tras otra, correspondiente a los
canales *R*,*G*,*B*
- Combinar los 3 array para generar una versión blanco y negro de la imagen,
en la cual ella consiste de una sola matriz 2D. Puede usar su intuición y prueba
y error para combinar las 3 imágenes, explicando el procedimiento elegido. Esto
será más interesante que usar un comando desconocido de una biblioteca sofisticada
que haga las cosas como una caja negra (**_queremos practicar numpy_**)
- Recorte un sector de la imagen conteniendo una estrella individual y ajuste una
gaussiana 2D simétrica a la imagen de la estrella por mínimos cuadrados, incluyendo
una constante aditiva (el cielo "vacio" brilla)
- Repita este procedimiento para varias estrellas y presente alguna estadística
sobre las medidas de la FWHM de las distintas gaussianas: histograma, media, mediana,
desviación estándar
- Repita el mismo ejercicio sobre cada una de las bandas *R*,*G*,*B* separadamente
y comente si observa diferencias en los resultados
## Instrucciones generales
- La entrega debe ser un archivo de markdown llamado `Entrega.md` incluyendo todo:
Texto con las
explicaciones, bloques de código, ecuaciones, gráficos.
- También debe haber un notebook (`Entrega.ipynb`)
con todos los códigos y resultados, por si deseo
revisar la ejecución de alguna parte del código, pero en principio el archivo de
markdown debería ser autocontenido, como su reporte final.
- No olvide identificarse y dar un contexto amigable del contexto a resolver,
así como explicar todos sus procedimientos y comentar los códigos apropiadamente
- Fraccione el código en celdas de acuerdo a la lógica de la solución
- Exploraciones complementarias al ejercicio serán muy bien recibidas
**El objetivo es que si su instructor desea correr el código pueda hacerlo,
para eso va el notebook, pero que esto no sea necesario para evaluar la tarea,
para eso va el markdown con todas las explicaciones, códigos, ejemplos y
resultados. Aprovecharemos la ventaja doble que nos ofrece markdown: 1) GitLab
va a renderizar el archivo proveyendo una visualización adecuada; 2) nos permite
combinar texto (levemente) enriquecido, formulas en latex, bloques de código e
imágenes en un solo formato con una sintaxis sencilla **