Python para Ingenieros Civiles PDF

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ CONTENIDO 1. Introducción a Python 1.1 Breve his

Views 325 Downloads 14 File size 5MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

CONTENIDO 1. Introducción a Python 1.1 Breve historia de Python 1.2 Instalación de Python v. 3.7.x 1.3 Uso del intérprete 1.4 Ayudas

2. Variables y su referenciación 2.1 Tipos de variables 2.2 Referenciación vs. Asignación 2.3 Expresiones matemáticas 2.4 Funciones y biblioteca math

3. Entrada de datos y estructuras condicionales 3.1 Instrucciones print() e input() 3.2 Operadores booleanos e instrucciones if y else

4. Circuitos 4.1 Instrucción for 4.2 Instrucción while

5. Estructuras de datos 5.1 Arreglos 5.2 Listas 1

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

5.3 Tuplas 5.4 Matrices 5.5 Diccionarios

6. Procedimientos, funciones y archivos externos 6.1 Procedimientos y funciones 6.2 Archivos secuenciales

7. Interfaces gráficas de usuario con EasyGUI 7.1 Instalación de EasyGUI 7.2 Uso de elementos GUI con EasyGUI 7.3 Aplicación con GUI

8. Aplicaciones en ingeniería civil Aplicación 1. Avión vs. Misil Aplicación 2. Problema SI-NO Aplicación 3. Problema trigonométrico Aplicación 4. Problema de mínimos cuadrados Aplicación 5. Raíz cuadrada por el método iterativo Aplicación 6. Solución de un sistema de ecuaciones lineales por eliminación gaussiana Aplicación 7. Propiedades geométricas de una sección plana Aplicación 8. Menú de opciones para una aplicación Aplicación 9. Ensaye AASHTO Aplicación 10. Ensaye de penetración estándar SPT Aplicación 11. Granulometría de los suelos Aplicación 12. VRS vs. CBR

9. Problemas propuestos Problema 1. Cálculo de la raíz cúbica por fórmula iterativa Problema 2. Raíz cuadrada con otro método iterativo Problema 3. Sucesiones Problema 4. Logaritmo de X Problema 5. Interpolación de Lagrange Problema 6. Parábola de mínimos cuadrados

2

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

1. INTRODUCCIÓN A PYTHON 1.1 Breve historia de Python Python es un lenguaje multi-paradigma y multi-plataforma creado por Guido Van Rosum en Holanda en 1986 y que fuertemente se ha convertido en un lenguaje muy utilizado en el mundo, debido a la reutilización del código, a una sintaxis poco compleja, a la generación de diversas bibliotecas para resolver cualquier problema de científico o de ingeniería, a su uso en diversos ambientes operativos y a su implementación con diferentes paradigmas de programación reconocidos en el desarrollo de aplicaciones: estructurado, orientado a objetos, funcional, lineal.

Se recomienda visitar el blog http://python-para-impacientes.blogspot.com, el cual contiene diversos tutoriales, información fundamental para comenzar a programar, para el manejo de bibliotecas y aplicaciones de terceros, instrucciones para la instalación de utilerías e información para el aprendizaje de herramientas desarrolladas por terceros.

3

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

1.2 Instalación de Python v. 3.7.x

Se recomienda descargar la última versión para el sistema operativo Windows, haciendo clic en el botón Python 3.7.x.

4

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

1.3 Uso del intérprete Cuando se ejecuta Python 3.7.x se abre la siguiente pantalla, figura 1, que es el Shell o intérprete que se va a encargar de transformar las instrucciones escritas en el editor para procesarlas, detectar e indicar errores y mostrar la ejecución del programa (run).

Figura 1. Shell o intérprete de Python 3.7.0 Mientras se encuentra uno en el Shell, se puede interactuar con el lenguaje escribiendo directamente en el cursor (>>>) y observar los resultados mostrados. Para crear un programa usando el Python’s IDLE (Integrated Development and Learning Environment), se recurre a File-New file y se abre la ventana de edición para comenzar a escribir las instrucciones, como se observa en la figura 2.

5

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 2. IDLE La ventana que se muestra dentro del IDLE se invocó mediante Help-About IDLE, y se puede observar la información de la licencia (License), derechos de autor (Copyright), el archivo Leeme (Readme), noticias (News) y los créditos (Credits) tanto para Python, Tk y IDLE.

6

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

1.4 Ayudas Toda la información de ayuda que se requiera para el IDLE, el mismo lenguaje, etc., puede ser accesado desde Help-IDLE Help, Help-Python Docs F1, como se observa en la figura 3.

Figura 3. Invocado de la ayuda También se puede encontrar bastante documentación (en inglés) en la página de Python (www.python.org) en Documentation. Existen muy buenos libros comerciales (ver figura 4) y algunos disponibles en internet de forma gratuita, y otros impresos, recomendando los siguientes: 1. Resolución de problemas para ingenieros con Python® estructurado de Rosalía Peña de Garceta Grupo Editorial (2016) . 2. Learning Python de Fabrizio Romano de Pack Publishing (2015) 3. Python for Everybody «Exploring Data Using Python 3» de Charles Severance (2016) 4. Python 3 al descubierto de Arturo Fernández Montoro de Alfaomega (2012)

Figura 4. Material bibliográfico de referencia 7

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

2. VARIABLES Y SU REFERENCIACION 2.1 Tipos de variables En programación, una variable es un identificador (nombre) que se referencia a un lugar en la memoria RAM de la computadora para almacenar un valor; El identificador es el nombre que el programador escoge para la variable respetando las reglas del lenguaje; en Python, el nombre de la variable debe empezar con una letra, puede ser un conjunto de hasta 256 caracteres combinados de letras, números y algunos caracteres especiales que no sean usados dentro de la sintaxis del lenguaje (_ «guión bajo», por ejemplo). El identificador es sensible a mayúsculas y minúsculas (case sensitive), lo que significa que una variable identificada con mayúsculas es diferente de otra con el mismo nombre, pero escrito en minúsculas, por ejemplo, RADIO es diferente de radio y de Radio o de RaDio. El nombre seleccionado para la variable debe ser acorde al contexto de lo que almacenará y respetarse durante toda la escritura del programa. Por ejemplo, si se requiere calcular el área de un trapecio, donde se han referenciado previamente los lados del mismo, el identificador puede ser el siguiente: AreaTrapecio = (BaseMayor+BaseMenor)*Altura/2; más adelante se comentará sobre la forma de escribir las expresiones matemáticas mediante los operadores aritméticos y funciones matemáticas. Si una variable no se identifica previamente y se usa en una expresión, causará un error al interpretar el Shell de Python al programa. En el ejemplo anterior, si a Altura no se le definió un valor, el intérprete causará error al intentar cargar en memoria a AreaTrapecio. Algunas palabras reservadas no pueden ser usadas como nombre de variables, por ejemplo, lambda es una palabra reservada en Python. El valor o valores que puede almacenar una variable pueden ser de tipo numérico (number), carácter (string), lógico (booleano) o combinado. El tipo numérico puede ser entero (int) o flotante (float); sin necesidad de definir el tipo, Python lo sabe automáticamente, diferenciando int de float por el punto decimal (.) La sintaxis para referenciar una variable es: variable=expresion, donde expresión puede ser una constante, una variable, una función, cualquier conjunto de constantes, variables, funciones o expresiones combinados con los operadores propios de su tipo y siguiendo las reglas adecuadas de sintaxis (Peña, 2016). Algunos ejemplos de variables y expresiones, relacionados con el diseño de elementos de concreto reforzado, según NTC-2017: fbiprima_c=0.85*fprima_c p_min=0.7*math.sqrt(fprima_c)/fy p_bal=fbiprima_c/fy*beta1*6000/(6000+fy) p_max=0.75*p_bal FR_flx=0.90 MR=FR_flx*fbiprima_c*base*peralte**2*q*(1-0.50*q) Los operadores matemáticos y funciones los vamos a comentar más adelante. Obsérvese que en la raíz cuadrada usamos math.sqrt().

8

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

2.2 Referenciación vs. Asignación Una referenciación no es una expresión matemática; solo indica un proceso de lectura/escritura en memoria. El intérprete consulta el valor de los datos referenciados por las variables a la derecha del signo igual, realiza las operaciones indicadas en la expresión, busca el resultado en memoria, lo crea si este no estaba y hace que la variable de la izquierda del signo igual apunte hacia dicho dato (escribe en la variable la posición del dato). Si existía la variable de la izquierda la modifica. Si no existía, la crea. Si tras el proceso de referenciación de una variable, el dato al que apuntaba anteriormente queda inaccesible (ninguna otra variable lo apunta), el recolector de basura lo elimina, liberando la zona de memoria que ocupaba. (Peña, 2016) Una variable en Python es un identificador que referencia a una posición de memoria. Puesto que una posición puede estar apuntada por varios identificadores, podemos considerarlos alias, es decir, pseudónimos. La función id() proporciona la posición de memoria del objeto al que referencia la variable indicada como argumento de la función. La posición de memoria que se asigne depende de los programas en ejecución en el momento de arrancar el entorno Python y de lo que se haya realizado en Python con anterioridad. La función type() indica el tipo de la constante, variable o expresión que se quiera consultar.

Figura 4. Ejemplos de id() y type() La figura 4 muestra algunos ejemplos del uso de id() y type() ejecutados directamente en el Shell. 9

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

2.3 Expresiones matemáticas Una expresión matemática en un lenguaje de programación requiere de operadores, variables y funciones para indicar la operación de sus componentes y generar un resultado numérico que se almacenará en la memoria a través de la variable referenciada. Los operadores aritméticos como suma (a+b), resta (a-b), multiplicación (a*b), división real (a/b) y elevar a una potencia (a**b) están disponibles en todos los lenguajes, y Python no es la excepción; sin embargo, existen otros operadores de uso no cotidiano que están disponibles en el lenguaje: división entera (a//b), resto de la división entera o módulo (a%b); para modificar la jerarquía de las operaciones (también llamado precedencia, prelación o prioridad) ímplicita en el lenguaje, sólo se usan los paréntesis () como signos de agrupación. La precedencia de las operaciones numéricas se muestra en la tabla no. 1. Tabla 1. Orden de precedencia de las operaciones en Python. Precedencia Operación Resultado 1

-x

Cambio de signo

1

+x

Operador identidad (no hace nada)

2

x+y

Suma x e y

2

x-y

Resta de y a x

3

x*y

Multiplica x por y

3

x/y

División real

3

x//y

División entera

3

x%y

Resto de la división entera de x/y

4

x**y=pow(x,y)

Elevación de x a la y

5

(expresión)

Paréntesis: fuerza el orden de ejecución

Se recomienda poner solo los paréntesis necesarios en las expresiones, pero en operaciones complejas, los paréntesis aumentan legibilidad. Tanto el conjunto de los números enteros como el de los reales, (float), en matemáticas pueden ir desde -∞ a +∞. Además, mientras que para cualquier entero existe un anterior y un siguiente, entre dos reales cualesquiera existen infinitos números reales. La implementación completa del tipo float en Python depende del sistema operativo sobre el que trabaja el Shell. Generalmente está representado en 8 bytes, con un rango de valores que va desde 1.7x10 -308 a 1.7x10+308, para un sistema operativo Windows de 64 bits. En caso de presentarse un desbordamiento, el lenguaje mostrará una salida inf (infinite). La representación de un flotante en formato de notación científica sustituye el «x10 x» por «ex». Algunos ejemplos se muestran en la figura 5 ejecutados en el Shell.

10

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 5. Ejemplos de operaciones en el Shell. En una de las entradas (la séptima) puede observarse que al pedirse el resultado de pi/2, donde pi=3.141592657, y se invoca mediante la biblioteca (library) math, se presenta un error al no haberse invocado primero usando la instrucción import, misma que más adelante la estudiaremos.

11

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

2.4 Funciones y biblioteca math Una función es un objeto con un nombre reservado que permite obtener un valor numérico de uno o varios parámetros encerrados dentro de paréntesis; por ejemplo, las funciones trigonométricas seno, coseno, tangente son definidas mediante las funciones sin(), cos() y tan(), cuyo parámetro que requieren es el valor de un ángulo expresado en radianes. Para ocupar estas funciones, se requiere, primero, importarlas de la biblioteca math, pues es un archivo externo de extensión .py alojado en la carpeta de instalación de Python y estará disponible en el Shell cuando sea invocado. Su llamado o invocado se puede dar de las siguientes formas: import math, import math as m, from math import sin. La primera forma llama a la biblioteca math y pone disponible todas las funciones en memoria siempre y cuando se llamen anteponiendo math al nombre de la función, por ejemplo, math.sin(math.pi/4) regresa el flotante 0.7071067811865475. La segunda forma es similar a la anterior pero usa el alias m para anteponerse en el nombre de la función, por ejemplo, m.sin(m.pi/2)=1.0. La tercera forma pone sólo disponible en memoria a la función que se importa, por ejemplo, sin(45*180/math.pi)=0.7071067811865475, solo dará este resultado si se ha importado la biblioteca math previamente, si no mostrará un mensaje de error. Algunas funciones se muestran en la tabla no. 2. Tabla 2. Algunas funciones disponibles de la biblioteca math. Función

Ejemplo

Resultado

COMENTARIO

sqrt(a)

math.sqrt(4)

2.0

Raíz cuadrada

sin(a)

math.sin(0)

0.0

Seno del ángulo a

cos(a)

math.cos(0)

1.0

Coseno del ángulo a

tan(a)

math.tan(45*math.pi/180)

1.0

Tangente del ángulo a

pi

math.pi

3.141592653589793

π

asin(r)

math.asin(1)

1.5707963267948966

Arco seno de la relación r

acos(r)

math.acos(0)

1.5707963267948966

Arco coseno de la relación r

atan(r)

math.atan(1)

0.7853981633974483

Arco tangente de la relacion r

log(x)

math.log(1.5)

0.4054651081081644

Logaritmo base e de x

log(x,b)

math.log(1.5,2)

0.5849625007211562

Logaritmo base b de x

log10(x)

math.log10(1.5)

0.17609125905568124

Logaritmo decimal o base 10

exp(x)

math.exp(1)

2.71828182845904

Constante de Euler o número e

factorial(n)

math.factorial(5)

120

Factorial de n

ceil(f)

math.ceil(5.68)

6

Próximo entero

floor(f)

math.floor(5.68)

5

Entero anterior

hypot(x,y)

math.hypot(3,4)

5.0

Hipotenusa de x e y

Existen otras funciones disponibles sin recurrir a la biblioteca math como abs(), round(), int() que permiten efectuar operaciones sobre números para encontrar el valor absoluto, redondear a las cifras decimales que se indiquen y hallar la parte entera de un número decimal. Existen otras bibliotecas que deberán ser llamadas en el momento que se deseen usar en la escritura de un programa; algunas están colocadas en la carpeta lib que se generó al instalar Python 3.7.0. Otras bibliotecas creadas por terceros deberán descargadas e instaladas con el paquete de instalación de Python (Python Install Packing) o comando pip desde la línea de comandos. 12

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

3. ENTRADA DE DATOS Y ESTRUCTURAS CONDICIONALES 3.1 Instrucciones print () e input() Un paradigma de programación muy elemental y que permite crear programas de forma muy sencilla, sin necesidad de estructurar un diagrama de flujo complejo o elaborar un algoritmo complicado, es la programación secuencial, la cual se basa en tres bloques básicos (ver figura 6): Lectura >>> Proceso >>>Salida o esquemáticamente:

Figura 6. Proceso secuencial

Lo importante es establecer cuáles son las variables que deberán estar en el bloque de lectura de datos iniciales, cuáles en el proceso mediante nuevas variables y sus expresiones, y cuáles en el bloque de salida de resultados. La lectura de variables de entrada las realizaremos mediante la referenciación con la instrucción input(), cuya sintaxis simple es: variable=input("mensaje"); después del mensaje, formado por una cadena de texto (string), el valor se referencía a la variable al introducirlo desde el teclado; la variable referenciada es de tipo string y se deberá convertir a número, si así se necesita, mediante la función eval() o específicamente para volverlo número flotante con float(). Para mostrar los resultados calculados en el proceso mediante expresiones referenciadas a nuevas variables, se utiliza la instrucción print(), misma que se utiliza respetando la siguiente sintaxis simple: print("rótulo {:formato}".format(variable1),...). La variable1 puede ser representada con un formato mediante la función format() para ajustar su representación de salida mediante un dato tipo conjunto {} dentro de una cadena de texto. El rótulo es el texto que se asocie al resultado de la variable para que el usuario sepa que obtiene el programa. Veamos el siguiente ejemplo: para calcular las raíces de una ecuación cuadrática de la forma , se utiliza la fórmula general, cuyas expresiones matemáticas son:

En este problema, identificamos a los coeficientes A, B y C como los datos de entrada, a x1 y x2 como las variables referenciadas en el proceso mediante sus expresiones respectivas, y a las mismas para mostrar los resultados en el bloque de salida. El programa y su corrida (run) en Python 3.7.0 se muestra en la figura 7. 13

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 7. Programa y corrida para raíces de una ecuación cuadrática En el programa anterior se observa al inicio el uso de las comillas triples (""") para documentar, tanto al programador como al futuro usuario del programa. Es recomendable usar esta técnica y, además, realizar comentarios con el símbolo #. Una variante del programa con la salida formateada y comentarios, sería la que se muestra en la figura 8.

Figura 8. Programa EcuacionCuadratica.py modificado con comentarios y formato Mas adelante modificaremos este programa para que calcule las raíces reales e imaginarias (raíces complejas) a través de la evaluación del discriminante

. 14

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

En mecánica de suelos, cuando se requieren determinar las volumetrías y gravimetrías de un suelo experimentado en el laboratorio mediante sus pesos en aire, en aire con parafina y en agua con parafina de una muestra cúbica inalterada, de la cual se conoce su humedad w y su densidad de sólidos Gs así como la densidad de la parafina dp, se sigue un procedimiento de cálculo para obtener los parámetros básicos, que son: la relación de vacíos (es), la porosidad (ns) y el grado de saturación (Ss). A continuación, se presenta el modelo en Mathcad 14 para resolver este problema; elaborar el programa en Python; los resultados deberán mostrar las unidades de las variables, ver figura 9.

15

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 9. Relaciones volumétricas y gravimétricas modeladas en Mathcad

El programa se muestra en la figura 10.

Figura 10. Programa Volumetrías y Gravimetrías 16

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

La ejecución del programa se ve en la figura 11.

Figura 11. Ejecución del programa Volumetrías y Gravimetrías

Como se puede ver, en este programa se utiliza la función eval() en lugar de float() y prácticamente se obtienen resultados similares. Si no se utilizan estas funciones antes de referenciar a la variable introduciendo los datos desde el teclado mediante input(), se carga un valor textual a las variables y no se pueden realizar las operaciones matemáticas. Como ejercicio, se deberá modificar el programa anterior para que les solicite el lugar de donde se obtiene la muestra y, además, muestre los resultados de los pesos volumétricos del suelo en estado natural y en estado seco, los volúmenes de sólidos, agua y aire, con sus respectivas unidades. Realizar un programa que determine la humedad de un suelo calculado con el método del horno de convección eléctrica, en donde se solicita el peso de la cápsula (tara, en grs), el peso de la cápsula más suelo húmedo (en grs) y el peso de la cápsula más suelo seco (en grs) después de secado en el horno durante 24 horas a 60°C. La humedad del suelo se calcula con la expresión:

Ejemplo, tomado de un modelo de Mathcad 14, ver figura 12:

Figura 12. Cálculo de la humedad de un suelo 17

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

3.2 Operadores booleanos y estructuras if y else En un diagrama de flujo, dentro del bloque de procesos, hay ocasiones que se requiere tomar un camino a partir de una bifurcación, o condición matemática, misma que requiere ser evaluada mediante operadores lógicos (o booleanos, en honor de Alfred Boole). Esquemáticamente, se vería representado como se muestra en la figura 13.

Figura 13. Bloque de condición

La evaluación de la condición solo tiene dos posibles respuestas: Si (True) o No (False). El flujo del programa dependerá del valor booleano. Además, cuando se habla de operaciones lógicas, existen los operadores de comparación: igual (==), mayor que (>), menor que (=), menor o igual que (50, se determina la clasificación del suelo fino, mismo que se almacena en la variable de tipo cadena o string referenciada como Suelo.

22

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 19. Programa fuente y ejecución de la carta de Polidori (2009)

23

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

4. CIRCUITOS 4.1 Instrucción for Cuando en un programa se requiere repetir una serie de operaciones un número determinado de veces, la instrucción for es la más recomendada para realizar tal acción. Su diagrama de flujo puede representarse de la siguiente forma:

Figura 20. Bloque de circuito for

Normalmente se recurre a una variable iterativa que lleve el conteo de las repeticiones; cuando se alcance el último valor de la iteración, se continua con el flujo del programa. Esta estructura también recibe el nombre de circuito, bucle o ciclo for. Hay varias formas de realizar los circuitos, pero la forma más sencilla es utilizar una lista, que es una variable especial que más adelante utilizaremos, pero que por el momento generaremos con la función range(). Por ejemplo, la suma de los primeros n términos puede expresarse matemáticamente como: ; si utilizamos una variable auxiliar para ir acumulando la suma de los términos, llamada suma, referenciándole un valor inicial de cero y participando dentro del circuito, obtendremos un algoritmo para representar dicha sumatoria. Por ejemplo, si n=10, la suma de 1 a 10 es igual a 55. La variable suma recibe el nombre de acumulador. Si la variable se utiliza sólo para contar, como usaremos más adelante en la otra estructura repetitiva, recibe el nombre de contador. El programa y su corrida se muestra en la figura 21.

Figura 21. Programa Suma.py Puede observarse que la función range() genera una lista de 1 a 10, si se incrementa el último número en 1; la variable k es la variable iterativa y se sustituye temporalmente por los valores de la lista (de 1 a 10); el acumulador suma inicia con cero y va acumulando los valores de k. Como recomendación, cualquier sumatoria matemática puede representarse con un acumulador, un valor final 24

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

incrementado en uno y un circuito que acumule a la expresión a evaluar; en el siguiente ejemplo, pueden verse los elementos comentados arriba tanto en la expresión abreviada (sumatoria), como en su desarrollo y la representación en otras variantes, que conducen al mismo resultado, según se ve en la figura 22. Su programa y corrida se muestran en la figura 23.

Figura 22. Representaciones de la sumatoria

Figura 23. Programa y corrida de Suma.py

Los circuitos for pueden anidarse, es decir, un bucle puede estar dentro de otro u otros bucles, respetando la ejecución del más interno hacia el más externo. La siguiente expresión incorpora dos

sumatorias:

. Su programa y ejecución se muestra en la figura 11.

Figura 24. Programa y corrida de Suma2.py 25

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

4.2 Instrucción while A diferencia de for, cuando en un programa se requiere repetir una serie de operaciones donde se desconoce el número de veces, pero el control del ciclo depende de una condición, la instrucción while es la más indicada para realizar tal bucle. Su diagrama de flujo puede observarse en la figura 25.

Figura 25. Bloque de circuito while

Normalmente se recurre a una variable de control que permita valorar la condición, para que el circuito se realice mientras la condición es verdadera (True). Esta estructura también recibe el nombre de circuito while, y se debe ser muy cuidadoso en la definición de la condición (o condiciones) de la variable de control para que se pueda salir del circuito, porque se corre el riesgo de quedar en un circuito infinito o generar un desbordamiento (inf). Esta estructura es muy utilizada para repetir procesos o partes de un programa hasta que se oprima determinada tecla o se establezca cierta condición. Por ejemplo, el programa EcuacionCuadratica.py puede modificarse para que se repita hasta que se oprima una tecla diferente de "S", de la forma que se muestra en la figura 26.

Figura 26. Programa EcuacionCuadraticaWhile.py

En el programa anterior, la variable de control es tecla, es de tipo string y se introduce desde el teclado. La condición de repetición es tecla=="S" or tecla=="s". Cuando se oprima una tecla diferente, el circuito termina. En ciertos problemas de métodos numéricos, se requiere determinar la raíz de una función no polinómica, y el proceso debe repetirse hasta que se cumpla cierta condición de evaluación de la función, por ejemplo, que se aproxime a un valor cercano a cero establecido por un número muy pequeño. El método de la secante permite obtener mediante aproximaciones sucesivas a partir de la evaluación de la recta secante que intercepta dos puntos sobre la curva, acercándose a la solución 26

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

mediante un proceso iterativo. El pseudo programa en Mathcad 14 mostrado en la figura 27 permite visualizar el resultado la raíz de la función y(x)=exp(-x)-π, cuya gráfica se muestra ahí mismo.

Figura 27. Pseudo programa Secante.xmcd

El programa en Python y su corrida se muestran en la figura 28.

27

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 28. Programa MetodoSecante.py

Algunos ejemplos del uso de las dos instrucciones repetitivas se muestran en la figura 29. El primero es para calcular el factorial de un número mediante la expresión:

Figura 29. Programa fuente y corrida del factorial de un número

En este programa puede observarse el uso de la función type() para verificar el tipo de variable, el uso de f como variable para referenciar el producto de la variable iterativa i, n con un valor inicial float para servir como variable de control en el segundo circuito while() y la función eval() para evaluar el tipo de dato que se introduce desde el teclado con la instrucción input(). Así como se dijo que para una sumatoria se requiere un acumulador, para una multiplicatoria se requiere una variable que registre el producto (multiplicador) en cada vuelta del circuito, como se observa en el cálculo de la multiplicatoria de 1 a 10, ver figura 30, para su pseudo-programa en 28

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Mathcad 14 y el programa en Python.

Figura 30. Pseudo programa Mathcad y programa fuente de la multiplicatoria de un número

Para calcular las cifras decimales del número pi (π), existe una serie infinita propuesta por James Gregory y Gottfried Leibniz expresada por la siguiente sumatoria; en este ejemplo se calcula para un máximo de k = 1e6:

El programa en Python y su corrida se muestran en la figura 31.

29

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 31. Programa fuente y corrida del cálculo de 𝜋 con la fórmula de Gregory-Leibniz

5. ESTRUCTURAS DE DATOS 5.1 Arreglos En programación, un arreglo (array) es una variable que permite almacenar más de un número en una posición secuencial referenciado a un solo identificador. La posición puede ser en una dimensión, por lo que el arreglo recibe el nombre de arreglo unidimensional o vector. Si la posición se refiere a dos dimensiones, fila y columna, el arreglo es bidimensional y se conoce como matriz. En algunos lenguajes al vector se le conoce como lista y a la matriz como tabla. La posición dentro del vector o matriz se llama mediante variables enteras, que en la matemática formal se conocen como subíndices; por ejemplo, Aj es una variable con subíndice entero j que puede almacenar el número de datos que tome j, comenzando con cero (0). En pseudo programación, la variable j es una variable de rango, y no forzosamente debe ser entera; pero si se usa como subíndice de un arreglo, lo deberá ser. Por ejemplo, si Aj, para j=0,1,2,..,10 va a almacenar los valores 0, 0.25, 0.50, 1.00, ... , 2.50, se representaría matemáticamente como: Aj=0.25*j y en pseudo programación se escribiría como se observa en el extremo derecho de este párrafo. Puede verse que A almacena 11 datos numéricos tipo float, y en cada posición j, el valor depende de la expresión 0.25*j. Para llamar a un elemento de A; por ejemplo 0.75, vemos que su posición es 3, por lo tanto, A3=0.75; así, podemos llamar a cualquier elemento de A con su subíndice, siempre y cuando esté en el rango de 0 a 10. Cuando el arreglo es bidimensional, por ejemplo, una matriz rectangular de 6 filas, 11 columnas, se identificaría con una variable y se requerirían dos subíndices para indicar las filas y columnas; por ejemplo Xi,j=i/(j+1)+j/(i+1). En pseudo programación se requerírian dos variables de rango, por ejemplo, i:=0,..,5 y j:=0,...,10. La representación gráfica de una matriz, en Mathcad 14, es una superficie de contorno o una curva tridimensional como se observa en la figura 32. 30

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Un elemento de la matriz se puede llamar mediante los subíndices en el orden fila, columna separados por una coma; por ejemplo, el elemento X3,5=-0.75. Para trabajar este tipo de estructura de datos en Python, es necesario revisar las listas (list), tuplas (tuple), lista de listas (matrix) y diccionarios (dict), así como algunas funciones especiales apropiadas para el tratamiento de estas variables iterables. 5.2 Listas Una lista es una colección ordenada de objetos, similar al array dinámico empleados en otros lenguajes de programación. Puede contener diferentes tipos de objetos, es mutable y Python nos ofrece una serie de funciones y métodos integrados para realizar diferentes tipos de operaciones. (Fernández-Montoro, 2012). La sintaxis de una lista es: identificador=[elemento0, elemento1, ...]; las listas son iterables y mutables. Los valores de las listas pueden ser accedidos utilizando el valor del índice que ocupan en la misma. Algunos métodos más utilizados en el proceso de las listas son: a) append(): para añadir e insertar un elemento al final de la lista. b) insert(): inserta un elemento en la posición que indique el subíndice. c) del(): borra un elemento de la lista indicado por el subíndice. d) len(): devuelve el número de elementos de la lista. e) remove(): elimina un elemento de la lista a través de su valor. f) pop(): elimina un elemento indicado por el índice y devolviendo el elemento. g) sort(): ordena la lista y quedará modificada. h) sorted(): ordena la lista pero no la modifica. Puede usarse el argumento reverse para ordenar de mayor a menor. En el programa de la figura 33 se observa el uso de las funciones y métodos comentados.

Figura 32. Ejemplo de una matriz en Mathcad y su representación gráfica 31

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 33. Funciones y métodos de listas

El siguiente problema se deberá programar en Python: «Suponga que tenemos las coordenadas de cinco puntos en el plano x, y. Nos interesa encontrar la distancia entre los dos puntos más distantes entre sí. Los cinco puntos son: P1(-0.94, -3.22), P2(-4.02, 8.17), P3(7.07, -9.11), P4(5.49, 8.76), P5(0.20, 4.45). Determinar la distancia entre los dos puntos más alejados. Asegúrese que ha comparado todas las posibilidades (10 en total).»

32

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 34. Programa y ejecución para determinar la distancia máxima entre coordenadas

Como se observa en el programa de la figura 34, se controlan los subíndices de los vectores x e y mediante las variables i y j haciendo el recorrido de 0 a la longitud (len()) de x, en el caso de i, y de i+1 a la longitud de y, en el caso de j. La distancia entre los puntos se calcula con

La función range() crea una lista de 0 a len(x): [0,1,2,3,4,5].

33

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

5.3 Tuplas Una tupla (tuple) es una colección de objetos de diferentes tipos, usando internamente un array de objetos que almacena referencias hacia otros objetos. Las tuplas se declaran con paréntesis (), entre los cuales deben separarse por comas (,) los elementos que van a formar parte de ella. Los elementos de las tuplas son accesibles a través del índice que ocupan en la misma, igual que en un array. Este tipo de dato es inmutable, esto significa que no es posible asignar directamente un valor a través del índice. Es posible anidar tuplas dentro de tuplas. La tupla es iterable, es decir, podemos recorrer todos sus elementos con un ciclo for. Las tuplas se pueden concatenar a través del operador +; también puede utilizarse el operador * para crear una tupla donde los elementos de la original se repiten el número de veces que indique el número después del asterisco. Los principales métodos que incluyen las tuplas son index() y count(); también puede usarse la función len() sobre la variable referenciada a la tupla. La sintaxis de una tupla es: identificador=(elemento0, elemento1, ...) En la figura 35 se muestra el programa donde se observa el uso de las funciones y métodos comentados:

Figura 35. Funciones y métodos sobre tuplas

34

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

5.4 Matrices Una matriz (matrix) es un arreglo rectangular de números accedidos mediante sus subíndices referidos a filas y columnas. En Python, una matriz es una lista de listas (list of list), y el tratamiento que se debe dar durante su programación es similar al de las listas, solo teniendo cuidado de invocar correctamente la posición de un número en la matriz a través de los subíndices, usando la notación siguiente: Matriz[fila][columna]. Matriz es la variable que identifica al arreglo; fila es el subíndice que indica la posición en las filas y columna el subíndice que posiciona en las columnas. Por ejemplo, si A es una matriz cuadrada de 5 x 5 (cinco filas y cinco columnas) con los siguientes valores:

En Python, se crearía dicha matriz de la siguiente forma:

Para llamar al número 65 de la matriz, invocaríamos A[2][2], recordando que todas las listas empiezan con un número en el subíndice 0, y en el caso de una matriz, en la fila 0 y columna 0. Así, el número 12 está en A[0][0]; el elemento A[4][0] es 0 y el A[4][4] es 33. Las matrices son muy utilizadas en ingeniería, y se han desarrollado fuertemente debido a su programación en la solución de sistemas de ecuaciones lineales mediante la eliminación gaussiana; esta técnica es generadora de otros métodos y sus aplicaciones en diversas áreas de la ingeniería civil son notables. El programa está planteado para ingresar los coeficientes de un sistema de N ecuaciones lineales y puede probarse con el sistema mostrado en la figura 36-a. El programa, que se muestra en la figura 36-b, encuentra la solución de un sistema de ecuaciones lineales mediante una matriz aumentada, aplica eliminación gaussiana y sustitución hacia atrás para encontrar el vector de soluciones.

Figura 36-a. Modelo en Mathcad para solución de un sistema de ecuaciones lineales 35

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

36

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 36-b. Programa para resolver un sistema de ecuaciones lineales por eliminación gaussiana y sustitución hacia atrás

En el programa de la figura 36 se importó (from tabulate import tabulate as tab) una biblioteca externa para mostrar en forma tabulada a la matriz (tabulate), la cual deberá ser descargada e instalada en la ruta (path) de bibliotecas (library) mediante el comando pip ejecutado desde la línea de comandos, como se observa en la figura 37.

Figura 37. Instalación de la biblioteca externa tabulate desde la línea de comandos

En la ventana Path Browser podemos ver, figura 38, instalada la biblioteca externa tabulate:

Figura 38. Ventana Path Browser

37

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

5.5 Diccionarios Un diccionario es un dato especial de Python que almacena una serie de valores utilizando otros como referencia para su acceso y almacenamiento. Cada elemento de un diccionario es un par clave-valor (key-value) donde el primero debe ser único y será usado para acceder al valor que contiene. A diferencia de las tuplas y las listas, los diccionarios no cuentan con un orden específico, siendo el intérprete de Python el encargado de decidir el orden del almacenamiento. Sin embargo, un diccionario es iterable, mutable y representa una colección de objetos que pueden ser de diferentes tipos (Fernández-Montoro, 2014). Para declarar un diccionario se utilizan las llaves ({}) entre los que se encuentran los pares key-value separados por comas. La key de cada elemento aparece separada del correspondiente value por el carácter dos puntos (:). Alternativamente, podemos hacer uso de la función dict() para crear un diccionario. A diferencia de las listas y tuplas, el acceso al valor de un elemento no es por índice sino por la clave (key). Los métodos principales que nos permiten iterar sobre un diccionario son: items(), values() y keys(). El primero da acceso tanto a claves como a valores, el segundo se encarga de devolver los valores y el último, las claves del diccionario. En la figura 39 se observa el programa que usa un diccionario para buscar las funciones trigonométricas de un ángulo dado.

Figura 39. Uso de un diccionario para hallar las funciones trigonométricas de un ángulo dado

El siguiente programa, ver figura 40, toma el Zen de Python creado por Tim Peters, lo muestra en inglés de la biblioteca importada this.py y permite traducir por línea (19 líneas) o en su totalidad. Con la tecla se termina el programa.

38

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

Figura 40. Programa Zen de Python

En el programa de la figura 40 se obsdrva el uso de un diccionario mediante la variable Zen; para poder leer la línea del diccionario indicada en la variable n introducida desde el teclado mediante input(), se utiliza una lista generada por comprensión con la función list(). 39

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

6. PROCEDIMIENTOS Y ARCHIVOS EXTERNOS 6.1 Procedimientos y funciones Un procedimiento es un conjunto de instrucciones definidas al inicio de un programa y que pueden ser llamadas más de una vez durante la corrida del mismo. En la programación estructurada, los procedimientos son los elementos básicos para desarrollar programas más funcionales. Al ser llamadas o invocadas varias veces, minimizan el código, aumentan la legibilidad y fomentan la reutilización de código. A diferencia de otros lenguajes, en Python, un procedimiento no existe hasta que es invocado. Se usa la palabra reservada def para crear un procedimiento o definir una función, con la diferencia que la segunda devuelve un valor; en los siguientes dos ejemplos se usan procedimientos y funciones para entender su programación. Para calcular los coeficientes binomiales del binomio de Newton (a+b)n se usa la expresión: nCr=n!/((n-r)!r!) Así, el desarrollo de (a+b)4 es a4+4a3b+6a2b2+4ab3+b4, donde los coeficientes 1, 4, 6, 4 y 1 se forman de 4C0, 4C1, 4C2, 4C3 y 4C4. El programa, usando procedimientos y funciones, se presenta en la figura 41.

Figura 41. Coeficientes binomiales de Newton

Se observa la definición de tres procedimientos, de los cuales dos corresponden a funciones: fact() y CoefBin() ya que regresan los valores de f y coef, respectivamente, y un procedimiento: Newton(), que se invoca en el cuerpo del programa para solicitar el exponente (n) y llamar a las funciones para obtener los factoriales y los coeficientes binomiales. Como ejercicio, modificar el programa anterior para obtener los coeficientes binomiales y generar el triángulo de Pascal, como se muestra en la figura 42.

40

PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ

1,1 1,2,1 1,3,3,1 1,4,6,4,1 1,5,10,10,5,1 ....

Figura 42. Triángulo de Pascal

El siguiente programa, ver figura 43-a, realiza el cálculo del límite líquido usando la ecuación de Lambe, que establece que LL=1/2*(w1*(N1/25)0.121+w2*(N2/25)0.121), donde w1 y w2 son las humedades registradas para 5