Python para Ciencias de la Tierra

Capítulo 3: Prácticas para Mejorar tu Programa (Pt. 2)

Damian
13 min readApr 19, 2022

--

Índice del curso
<<
Capítulo 3: Mejorando tu Programa (Pt. 1)

3.5 Documentación de un programa

Documentar un programa es el procedimiento de describir las líneas de código más relevantes conforme se desarrolla. Puede contener desde la aclaración del nombre que se dé a las variables, hasta la explicación de lo que hace toda una sección. Es un texto que acompaña al código, y tiene como objetivo facilitar el entendimiento a cualquier persona que vea el programa, incluyéndote.

Comentarios

Python permite agregar comentarios mediante: 1) el símbolo numeral, y 2) el uso de tres comillas sencillas o dobles para indicar el inicio y final del texto. El primer tipo de comentario es útil para agregar una nota corta acerca de alguna variable o alguna sentencia, y puede ser sobre la misma línea. El segundo tipo de comentario es útil para dar un texto explicativo sobre un bloque o una sección del programa. Pero son más utilizados para documentar una función, pues en este caso se tiene una ventaja importante que veremos más adelante en esta sesión.

Ejemplo 3.2 Un método numérico de interpolación

Una función de interpolación es aquélla que pasa a través de coordenadas dadas como datos. Existen diversos métodos para hacer una interpolación, pero uno de los más importantes y fundamentales en métodos numéricos consiste en utilizar un polinomio que pase a través de los datos dados (Nakamura, 1992).

Uno de los métodos para obtener un polinomio interpolante es la interpolación de Lagrange.

Sea una serie de N + 1 pares de datos de la forma (x, f(x)), la fórmula de interpolación de Lagrange de orden N desde i=0 hasta i=N para obtener el polinomio interpolante g(x) es:

A pesar de lo complicada que puede ser, su estructura es relativamente sencilla. Observa cómo el factor x cuyo subíndice es el que tiene f(x) se suprime en cada cociente. Si bien a mano puede ser un problema calcular el polinomio cuando N crece, en computadora no es muy complicada programarla. Se necesitan dos ciclos for, uno para efectuar la suma i, y otro para realizar la multiplicación j, sólo cuando i != j. El código sería básicamente como el que se muestra a continuación:

N = len(data)    #data es la serie de pares coordenados de valores
g = 0 #g es la función interpolante a conocer
x = X #X es el valor a interpolar
for i in range(N):
f= f[i] #f es cada uno de los términos f(xi)
for j in range(N):
if i != j:
f = f*(x-x[j])/(x[i]-x[j]) #producto con el cociente
g = g + f #suma de los productos

Los comentarios permiten saber lo que es cada variable y qué se realiza en algunas líneas, considerando que quien lo lee tiene el contexto sobre la interpolación de Lagrange.

Podemos ahora utilizarla para interpolar un valor a partir de una serie de datos dados.

Sean las densidades del sodio para tres temperaturas (Nakamura, 1992):

Tabla 3.1 Densidad del sodio en función de la temperatura

Determinar la densidad para la temperatura T = 153 °C y T = 251 °C.

La función de interpolación de Lagrange con los datos dados es como sigue, donde T es la variable independiente:

Ahora hacemos uso del anterior código haciendo las modificaciones necesarias:

#Se guardan los datos en listas, para poder usar sus índices.
T = [94, 205, 371]
rho = [929, 902, 860]
#Se define N por el tamaño de una de las listas.
N = len(T)
g = 0
#Se introduce por el usuario el dato de T a interpolar.
dato = input('Ingresa la temperatura a interpolar:\n')
try:
x = int(dato)
except:
print('Introduce un valor numérico entero.')
#El ciclo for exterior se encargará de sumar los términos
for i in range(N):
f = rho[i]
#El ciclo for anidado se encarga de realizar el producto
for j in range(N):
if i != j:
f = f*(x-T[j])/(T[i]-T[j])
g = g + f
g = round(g,2)
print('La densidad asociada a la temperatura',x,'°C es',g,'kg/cm^3')

De ejecutar este código e ingresar los valores solicitados, obtienes los siguientes resultados:

Para T = 153 °C, la densidad es 914.76 kg/cm³
Para T = 251 °C, la densidad es 890.56 kg/cm³

Si el usuario no tiene el contexto suficiente de la interpolación de Lagrange, es probable que no pueda utilizarlo, por ello se recomienda agregar comentarios delimitados por comillas para agregar más texto explicativo. De hecho, lo conveniente es hacer una función para esta interpolación, y comentarla.

Los comentarios delimitados por comillas deben estar dentro de la función inmediatamente después de su definición, como se ve en la imagen inferior. Procura indicar en rasgos generales lo que hace la función, describe el tipo de dato que admite así como el que regresa, e indica qué es cada uno de estos parámetros. También puedes incluir información de quien hizo el algoritmo.

Figura 3.15 Vista del código de una función correctamente comentada y su uso en el mismo programa. La función opcionalmente puede incluir comentarios de línea con numeral.

Fin del ejemplo 3.2

Edición de ecuaciones

Una celda en jupyter habilitada como markdown permite además de agregar texto en un mejor formato visual, agregar ecuaciones. Si estás familiarizado con LaTeX, por ejemplo, estarás contento de saber que estas celdas aceptan los comandos propios de TeX para la edición de ecuaciones.

TeX es un sistema tipográfico que permite crear documentos de texto mediante el uso de comandos y etiquetas. Entre sus características más preciadas, está el poder crear fórmulas matemáticas con buena calidad visual y sin mucha dificultad. LaTeX es el software de edición de texto basado en TeX más utilizado.

Dentro de una celda markdown se habilita la edición de ecuaciones con la sintaxis $ecuación con etiquetado TeX$. Por ejemplo, para crear una fracción, digamos, el cálculo de la densidad:

$\rho = \frac{m}{V}$

Al dar enter, la celda muestra una ecuación (Figura 3.16) sin rastros de los comandos usados. Las diagonales son necesarias para indicar el tipo de letra (como rho) u operación (como la fracción) a utilizar.

Figura 3.16 Arriba. Vista de los comandos en la celda markdown. Abajo. Vista de la ecuación al ‘ejecutar’ la celda con el código de la ecuación.

También puedes darle mayor tamaño con el uso de los numerales que dan formato de títulos. Si quieres que la ecuación esté centrada, lo puedes hacer usando doble símbolo de peso: $$ecuación centrada$$

Figura 3.17 Comparación del tamaño de la fórmula al darle formato de título.

Estos ejemplos sólo son una pequeña prueba de la edición de ecuaciones, y explicar al menos la mitad de las capacidades que ofrece TeX en Jupyter está fuera de los objetivos del curso. Sin embargo, en ejemplos más avanzados del curso utilizaremos más ecuaciones, por lo que poco a poco podrás adquirir habilidades básicas para su edición. Pero si deseas adentrarte más al tema, al final de la sesión dejo un par de enlaces para que explores más sobre LaTeX.

Ejemplo 3.3 Documentar en un cuaderno de jupyter el ejemplo 3.2

En el ejemplo anterior sobre la interpolación de Lagrange se describe una ecuación que resulta complicada de introducir como comentario dentro del código. Pero las celdas markdown permiten agregar ecuaciones, así como texto e imágenes que permitan dar un mayor contexto al programa. Puedes utilizar estas capacidades de jupyter pero sin perder de vista que estás documentando un programa, y no escribiendo un artículo.

Así, podemos escribir el título del programa y un par de párrafos sobre lo que se hará en él, como se muestra en la siguiente imagen. Las etiquetas a utilizar son <br> para el salto de línea, # para dar tamaño a una ecuación, $ para escribir una ecuación. Nota que la edición de ecuaciones y expresiones matemáticas se puede utilizar entre líneas.

Figura 3.18 Vista de una celda markdown con texto y ecuaciones antes de su ‘ejecución’.

Es posible insertar una tabla mediante código html, sin embargo por comodidad y porque permite mostrar un mayor estilo, se puede insertar a partir de una imagen previa.

Debes tener seleccionado una celda habilitada como markdown. Selecciona en la barra de menús Edit > Insert image > Seleccionar archivo > Mostrar todos los archivos. Se abre tu explorador de archivos para que te ubiques en la imagen que quieres agregar, en este caso es la imagen Tabla_sodio.jpg, la cual puedes descargar aquí. La imagen se centra en automático.

Los valores de la tabla se sustituyen en la fórmula de Lagrange, tal como se muestra en la siguiente imagen.

Figura 3.19 En la celda superior se muestra la inserción de una imagen. En la celda inferior la sustitución de los valores de la tabla en la fórmula.

Por último, basta con agregar el código que ya se ha hecho en el ejemplo 3.2. El programa queda completo como se ve en la Figura 3.20.

Figura 3.20 Vista completa de un programa documentado con estilo propio de Python y edición avanzada de markdown en Jupyter.

Fin del ejemplo 3.3

3.6 Tiempo de Ejecución

Una forma de medir la eficiencia de nuestro algoritmo es midiendo el tiempo de ejecución que toma en hacer una tarea de principio a fin. Es una práctica útil para estimar la cantidad de tiempo que podría tomar un proceso que requiera posteriormente de 10, 100 o 1000 veces más datos.

La biblioteca interna de python ofrece una paquetería a importar que permite medir el tiempo de ejecución de un programa: time. Su función time() registra el tiempo en que se ejecuta esa línea, por lo que es suficiente crear una marca de tiempo al inicio y al final, y obtener su diferencia para conocer el tiempo en segundos que tardó en ejecutarse el programa.

Ejemplo 3.4 Obtención del tiempo de ejecución de un algoritmo.

Es bien sabido que pi es un número irracional transcendente. Durante siglos se trató de encontrar su valor exacto sin éxito, por obvias razones. Sin embargo actualmente el desarrollo decimal de pi tiene una importante utilidad más allá de las matemáticas, pues se utiliza para probar el rendimiento de súper computadoras. Se les asigna una tarea ardua para calcular, pero cuyo resultado se conozca muy bien, y qué mejor tarea que el cálculo de las cifras decimales de pi.

Claro, es entendible que no tengas una súper computadora, pero usaremos el cálculo de las cifras de pi para probar el tiempo de ejecución con un par de series de potencias para su aproximación.

Dentro de las muchas contribuciones que hizo Leibniz, una de ellas es el haber desarrollado una serie de potencias para el cálculo de pi (Figura 3.21). Y como ésta hay otras series para aproximarse a pi.

La Figura 3.21 muestra dos series de potencias. La función time() de la paquetería time se utiliza como marcador al inicio y al final de la celda para conocer el tiempo de ejecución. Ambos algoritmos suman 50 millones de términos para aproximarse a 7 cifras exactas de pi. La serie que tiene la raíz cuadrada tomó alrededor del 15 % más tiempo para calcular esos términos, sin embargo es más precisa pues se acerca más a la octava cifra, que es 5. Estas observaciones te permiten elegir entre uno u otro algoritmo de acuerdo a tus necesidades. Nota también que el tiempo de ejecución de un equipo a otro puede cambiar, y también depende también de la carga de trabajo que tenga tu computadora al tener más software abierto.

Figura 3.21 Dos fórmulas de series de potencias para calcular cifras de pi. Ambos algoritmos sumaron 50,000,000 de términos para aproximarse a 7 cifras exactas, la octava cifra es aproximada, y debe ser 5. Se aprecia el tiempo que tomó a cada uno de los códigos bajo condiciones similares.

3.7 El Comando más importante de Python

Siempre que te encuentres con alguna duda sobre qué métodos u operaciones puedes hacer sobre un objeto en Python es importante saber a dónde acudir. El primer lugar al que todos acudimos es al buscador de nuestra preferencia. Basta con escribir una estructura como hacer X cosa con Y objeto en Python para que surjan cientos de opciones potencialmente útiles en un instante.

Pero existe una forma más adecuada de pedir ayuda sobre algún objeto. ¿Cuál es? el comando help(). Así es, Python ofrece ayuda mediante esta función, en la cual puedes meter un objeto como parámetro para saber qué métodos y operaciones hay disponibles para ese objeto.

¿Por qué es el más importante? Porque qué puede ser más importante que un comando que te ofrezca ayuda cuando más la necesitas. Mejor aún, help te responde de acuerdo con la versión de Python o de la paquetería que estés utilizando. Puede que en algún foro de internet te encuentres con una posible solución, pero en ese foro se haga referencia a otra versión del lenguaje, por lo que no te será satisfactoria. Situación que no sucede con el comando help. Básicamente toda la documentación oficial está a tu alcance con este comando.

Al ejecutar la función help() sin parámetros, se despliega un cuadro para escribir lo que queremos saber. Por ejemplo, podemos tener la lista de palabras reservadas al escribir keywords, o recibir una lista de temas de lo que queramos saber, como se muestra en la imagen inferior.

Figura 3.22 Uso del comando help(), el cual nos puede dar la lista de todas las palabras reservadas, así como una lista de temas en los que queramos aprender más sobre Python. Te puedes salir de la ayuda interactiva escribiendo quit.

Pero su mayor valor es que al introducir un objeto o una función como parámetro, nos dice todos los métodos que podemos aplicar en él, describiendo cada uno de esos métodos.

lista = [1, 2, 3]
help(lista)

Al ejecutar estas líneas, se despliega toda una documentación sobre lo que se puede hacer con una lista. Pero puede ser muy abrumador ver tanta información para un objeto, por lo que hay otra función que sólo te enlista los métodos que puedes utilizar: la función dir().

dir(lista)

Ahora verás una lista de métodos. Puedes elegir alguno de ellos para acudir a la función help y saber qué hace. Por ejemplo, quieres recordar qué hace el método sort, sólo inclúyelo dentro del parámetro.

help(lista.sort)

Ejecuta la línea, y se muestra una descripción de lo que hace ese método.

También puedes aprender qué hace una función.

help(open)

Con esta línea se muestra toda la documentación sobre lo que hace esa función. Conforme navegues más por la función help, notarás que algunas funciones tienen un par de líneas, mientras que otras tienen hojas de documentación, como open. Es un caso similar para los métodos.

Por último, una maravilla es que la documentación bien escrita dentro de cualquier función que hagas también puede ser vista con la función help. ¿Recuerdas la función documentada interpolacion_Lagrange? Pues esa documentación está al alcance de un help:

Figura 3.23 Vista de la documentación de la función hecha por el programador. Python identifica que tiene una documentación interna, y la muestra con la función help.

Por último, puede que te preguntes cuáles son las funciones internas de Python, esas funciones que no pertenecen a ninguna librería. Pues bien, la tabla 3.2 muestra todas ellas, para que las inspecciones con help.

Tabla 3.2 Funciones internas de python

Puedes descargar el cuaderno hecho en esta sesión dando clic aquí.

Ejercicios

3.2 - Un algoritmo mucho más eficiente para obtener las cifras de pi es el algoritmo de Brent-Salamin (1975), basado en algoritmos previos obtenidos por Gauss y Legendre más de un siglo antes.*

El método inicia con una serie valores iniciales:

Estos parámetros son iterados de acuerdo con las siguientes ecuaciones:

Para cada iteración, tres de estos parámetros son sustituidos en la siguiente ecuación para aproximarse a pi:

Realiza tres iteraciones (sí, sólo tres) para obtener una mejor aproximación que la obtenida por medio de las series de potencias. Calcula el tiempo de ejecución. Si son muy pocas cifras decimales impresas, utiliza la función round para ‘redondear’ a 10 cifras o más. Esto agregará valores decimales.

3.3 - El archivo temperatura_titicaca.csv tiene el registro de la temperatura que tuvo el lago Titicaca, ubicado en los límites de Perú y Bolivia, del 1 al 23 de enero de 2022, sin embargo no cuenta con todos los días.**

a) Mediante la interpolación de Lagrange obtener las temperaturas de los días restantes entre este intervalo, y generar un nuevo archivo insertando los días y temperaturas faltantes. Documenta el cuaderno según lo consideres adecuado.

b) La lista de los días faltantes y sus temperaturas medidas son las siguientes:

Crea un nuevo archivo llamado error_temperaturas_lago.csv donde haya dos columnas nuevas para la tabla superior: una con la temperatura estimada por interpolación, y otra con el error relativo basado en la siguiente expresión:

3.4 - Haz un programa donde documentes el siguiente texto sobre la obtención de la altura máxima posible de una montaña para un planeta dado (Herrera, 2001). El caso que se da es el de la Tierra. Prográmalo para obtener la altura máxima de una montaña en éste y en Mercurio, Venus y Marte. Agrega a la documentación texto adicional que consideres adecuado.**

“Las dimensiones críticas de un agregado de materia sobre un planeta, es decir, aquéllas en las que un objeto se mantiene en una forma dada sin colapsarse, dependen principalmente de su densidad y su Carga de Ruptura CR, ambas propiedades intrínsecas del material. La CR es la fuerza máxima que soporta un material antes de colapsarse.

Suponiendo que una montaña tiene forma cónica, su presión estará dada por:

Para encontrar la altura máxima posible que puede soportar una montaña, la presión se iguala a la CR del material:

Y despejando la altura máxima:

Considerando la densidad del granito, el material más común en la superficie de la corteza terrestre, de 2,700 kg/m³, su carga de ruptura de 100,000 N y una aceleración gravitacional promedio de 9.80665 m/s², la altura máxima posible de una montaña en la Tierra es de 11.33 km.”

Obtener las alturas máximas posibles de una montaña de granito en Mercurio (g = 3.7 m/s²), Venus (g = 8.87 m/s²) y Marte (3.721 m/s²) redondeadas a 3 cifras significativas.

--

--

Damian

Anything I want and is related to data. Learning to become a Data Professional.