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) <Impreso>. 2. Learning Python de Fabrizio Romano de Pack Publishing (2015) <Gratuito y PDF> 3. Python for Everybody «Exploring Data Using Python 3» de Charles Severance (2016) <Gratuito y PDF> 4. Python 3 al descubierto de Arturo Fernández Montoro de Alfaomega (2012) <Impreso> 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 (<), mayor o igual que (>=), menor o igual que (<=), no es igual o diferente (!=); estos operadores tienen la misma jeraquía, se evalúan de izquierda a derecha y son binarios por que requieren de dos valores para realizar la comparación; existe un operador unitario que es la negación o not(). Si se requiere componer operaciones lógicas entre más de dos operaciones binarias, se utilizan los operadores and (conjunción) y or (disyunción); estos operadores, y otros complementarios, existen a nivel de bits, pero no los utilizaremos en nuestra programación. Si D≥0, tenemos soluciones reales, si no, soluciones complejas de la forma R±Zj, donde j2=1; para usar expresiones complejas, se requiere importar la biblioteca cmath antes de usarla en las expresiones. Para evaluar la condición, se requiere de la instrucción if, cuya sintaxis es: if condicion: operaciones1 #si condicion es True else: operaciones2 #si condicion es False En esta estructura, se requiere la identación o sangría para el bloque de operaciones1 debajo de la instrucción if y de los dos puntos (:) para identificar el bloque y ejecutar operaciones1 si la condición es True. La instrucción else: es opcional, pero se recomienda colocar si se quiere controlar mejor el flujo del programa para ejecutar el bloque de operaciones2; al igual que la instrucción if, se requieren los dos puntos (:) y la identación (sangría). En algunos casos no será necesario utilizar la instrucción else:, como veremos en algunos ejemplo más adelante. En el ejemplo de la solución de la ecuación cuadrática, el valor de la discriminante conduce a las soluciones reales o complejas: . Modificaremos el programa EcuacionCuadratica.py usando matemática compleja para que muestre los resultados con el imaginario j; esta variable reservada sustituye a i2=-1 de la matemática compleja tradicional, observando en la figura 14 el código fuente y su ejecución. 18 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 14. Programa fuente y ejecución de la fórmula general para ecuaciones cuadráticas La ecuación de tercer grado a3x3+a2x2+a1x+a0=0 puede resolverse con las ecuaciones deducidas por Tartaglia y dadas a conocer por Cardano, que se resumen como el método de TartagliaCardano; la secuencia de operaciones requiere de conocer los coeficientes a0, a1, a2 y a3 como datos de entrada; los resultados de x1, x2 y x3 requieren de la evaluación y comparación de un conjunto de expresiones, como se muestra en el documento «Ecuaciones de tercer grado» de Wikilibros. Clic aquí para acceder a la información. El programa TartagliaCardano.py , ver figura 15, presenta las soluciones a la ecuación cúbica efectuando las pruebas recomendadas en el documento. La corrida del programa para las siguientes ecuaciones se muestra en la figura 16: a) 54x3-81x2-18x+40=0 b) x3-3x2+3x-1=0 c) (x2-5)(2x+1/3)=0 d) (π+x)(π-x)(3x-π)=0 19 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ e) 4x3-5x2+10x-19=0 Figura 15. Programa para solucionar ecuaciones cúbicas por las fórmulas de Tartaglia-Cardano 20 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 16. Ejecución del programa TartagliaCardano.py 21 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ En el tema de clasificación de suelos y específicamente en los límites de consistencia o de Atterberg de Mecánica de Suelos, cuando se requiere clasificar un suelo fino, se necesita localizar una región en la carta de plasticidad de Casagrande (1948) para conocer la naturaleza del suelo a partir del límite líquido (LL) y el índice plástico (IP). En 1977, Howard definió la línea U (IP=0.9LL8) y ASTM adoptó la nueva carta de plasticidad con la norma ASTM D-2487 (figura 17); Polidori (2009) redefinió la carta de plasticidad, aunque no la ha adoptado aún ASTM (figura 18). Figura 17. Carta de plasticidad modificada de Howard Figura 18. Carta de plasticidad modificada por Polidori A continuación, se muestra (figura 19) el programa en Python y su ejecución para clasificar el suelo fino usando Polidori; a partir de la lectura de las variables LL e IP, y calculando las ecuaciones de las rectas de la línea U (IP_U), línea 0.5C (IP_5C), línea C (IP_C) y la línea punteada (IC_puntos=0.55LL-11) así como LL>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 <F> 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<=N1<25 y 25<N2<=3; la corrida del programa se muestra en la figura 43b. 41 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 43-b. Programa para calcular el límite líquido por el método de Lambe Una fortaleza del uso de funciones en un programa es que se pueden incluir y usar en otros programas a manera de bibliotecas importadas externamente y planificadas adecuadamente, como se observa en la figura 44. Figura 44. Ejemplo del uso de import 6.2 Archivos secuenciales Un archivo externo permite almacenar información textual que puede ser llamada con ciertas funciones para alimentar de datos a un programa, liberando memoria interna mientras el programa se ejecuta. También se puede guardar información desde la ejecución del programa al archivo externo. Son varios los formatos que acepta Python para el proceso de archivos o ficheros de almacenamiento externo: CSV, XML, JSON, YAML, entre otros. Los archivos de formato CSV (valores separados por comas «comma-separated values») son archivos de texto fácilmente generables con un editor de texto, con MS Office (Word, Excel), FreeOffice o TextMaker, con la condición de separar con comas los valores a almacenar. Las operaciones básicas, como apertura, creación, lectura y escritura de datos están incorporadas en la biblioteca estándar. La función open() permite abrir un archivo de texto (extension .txt) para leer (read), escribir (write), añadir (append) o leer/escribir (read/write), dependiendo del carácter indicado en su sintaxis: open("fichero.txt", "r/w/a/+") También puede referenciarse a una variable de la siguiente manera: variable=open("fichero.txt", "r/w/a/+") Después de usar el fichero, siempre deberá cerrarse (close) el mismo. Los siguientes datos se almacenaron en un archivo de texto externo, ver figura 45, en formato CSV que corresponde a los coeficientes de momentos para el diseño de losas perimetralmente apoyadas para el caso monolítco, como lo indican las normas técnicas complementarias para el diseño de 42 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ elementos de concreto reforzado (NTC-2017); el nombre del archivo es CoefMom.txt. Figura 45. Archivo de texto en formato CSV Se diseñó un programa que controla, mediante la instrucción with, la lectura read() del archivo de texto CoefMom.txt asignado a un alias como f, y las operaciones necesarias para la conversión de datos textuales a valores, definido en un procedimiento llamado archivo(), como se observa en la figura 46. Figura 46. Programa para lectura de un archivo externo 43 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ A continuación, ver figuras 47 a y b, se muestra un programa para calcular la estimación puntual georeferenciada a partir de observaciones históricas existentes de una variable de estudio utilizando el método IDW (Inverse Distance Weight). En este programa se usa un archivo de texto (DatosSueloTeh.txt) para almacenar las coordenadas X, Y, Z y las variables de estudio, Q y W, para leer e ir añadiendo datos conforme se van generando nuevas observaciones georeferenciadas. La estimación se hace conociendo las coordenadas de un punto para las variables de referencia Q y W. Figura 47-a. Programa AASHTO 44 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 47-b. Programa IDW 45 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ La corrida del programa presenta inicialmente un menú: 0. Ejecutar IDW, 1. Añadir datos, 2. Salir. La opción 0 ejecuta el método IDW con los datos almacenados en el archivo de texto, mismos que son leídos con read(); la opción 1 graba nuevos datos en el archivo de texto usando write() hacia un archivo abierto con la opción append (a). La opción 2 finaliza el programa, incluso saliendo del intérprete mediante la instrucción quit(). La figura 48 muestra la ejecución del programa IDW. Figura 48. Ejecución del programa IDW El efecto de la opción 1 se muestra en el archivo de texto de la figura 49. Figura 49. Archivo de texto con información añadida 46 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 7. INTERFASES GRAFICAS DE USUARIO (GUI) CON EASYGUI 7.1 Instalación de EasyGUI Una interfase gráfica de usuario (GUI) es un ambiente visual que permite la interacción con el programa mediante objetos o elementos clásicos del ambiente Windows como cajas de texto, botones, casillas de verificación, barras de desplazamiento, etc. En Python se pueden utilizar diferentes modos de programación visual usando bibliotecas especializadas, como TKinter o EASYGUI; esta última es fácil de programar y de muy fácil uso. Para instalar EASYGUI se recurre a pip de la siguiente forma desde la barra de comandos: >pip install EASYGUI Una vez instalada la biblioteca, se llama desde el programa mediante import. 7.2 Elementos GUI de EASYGUI EasyGUI permite utilizar fácilmente elementos de interfase gráfica para interactuar con el usuario de un programa, mediante ventanas con objetos pre-establecidos, ya sea para leer datos de las variables de entrada así como para mostrar resultados de las variables de salida. Esta biblioteca externa debe ser instalada previamente en Python, usando pip, de forma que el comando escrito desde el símbolo del sistema realice la instalación de EasyGUI en la carpeta correspondiente de bibliotecas (lib). El comando es: pip install easygui. Una vez instalada, se invoca desde un programa mediante la instrucción import de la siguiente forma: import easygui as eg recomendando asignar un alias (eg) para usarlo como método de llamado de las ventanas. Es importante señalar que los elementos a mostrar en una ventana de EasyGUI a través de variables, deberán ser de tipo cadena (texto o string), por lo que todo número que se desee mostrar como resultado deberá ser convertido mediante str() a cadena; así mismo, la lectura de variables que involucren datos numéricos, deberán ser convertidos a éstos mediante eval(), pues las variables sólo reconocen valores de cadena. Veamos ejemplos para el uso de los diferentes elementos de salida de EasyGUI. a) msgbox(). Se usa para mostrar los resultados de un proceso mediante una(s) variable(s) de salida convertidas a texto. Ver figura 50. Su sintaxis es: eg.msgbox(msg="Texto",title="Titulo",ok_button="OK",image=archivo.gif); el archivo de imagen .gif o .png deberá estar guardado en la misma carpeta del archivo.py correspondiente al programa y es opcional. Figura 50. Resultado de msgbox() Un ejemplo para mostrar el radio y área de un círculo de 30 u con una imagen .gif se observa en la 47 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ figura 51. Figura 51. Programa y ejecución de un msgbox() b) boolbox() / ynbox() / ccbox(): Se usan para mostrar un texto de resultado (ver figura 52) con la opción de dos botones: Si (1) y No (0) equivalentes a True y False, respectivamente; su sintaxis es parecida entre ambas: variable=eg.boolbox(msg="Texto",title="Titulo",choices=("Si","No"),imagen=archivo.gif) variable=eg.ynbox(msg="Texto",title="Titulo",choices=("Si","No"),imagen=archivo.gif) variable=eg.ccbox(msg="Texto",title="Titulo",choices=("Si","No"),imagen=archivo.gif) Figura 52. Resultado de boolbox() El valor de la variable opcion es 1 si se oprime el botón Si c) buttonbox(): Se usa para mostrar varios botones para seleccionar una opción al oprimir el que se 48 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ escoja, como se muestra en la figura 53. Su sintaxis es: eg.buttonbox(msg="Texto",title="Titulo",choices=("Opcion1","Opcion2",...,"OpcionN",image=archivo.gif) Figura 53. Resultado de buttonbox() La variable opción tomará el valor textual del botón oprimido, como se ve en la figura 54. Figura 54. Resultado de oprimir el botón Producto d) indexbox(): Similar a buttonbox() pero regresa el valor del índice, según el botón oprimido, empezando de cero (0), de acuerdo a la posición de choices=() como se observa en la figura 55. Figura 55. Resultado de buttonbox() La variable opcion es igual a 2 si se oprime el botón Producto, según se ve en la figura 56. Figura 56. Resultado de oprimir el botón Producto 49 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Las ventanas de EasyGUI que se usan para introducir datos son las siguientes: a) enterbox(): Se usa para referenciar una cadena de texto a una variable; si se introduce un número en la caja de texto, deberá convertirse en número con eval() para poderse operar matemáticamente. Ver figura 57. Su sintaxis es: variable=eg.enterbox(msg="Texto",title="Titulo",default="Valor",strip=True/False,image=archivo.gif) Figura 57. Resultado de enterbox() b) integerbox(): Se usa para ingresar un número entero a través de una caja de texto; pueden definirse los valores máximo y mínimo. Ver figura 58. Su sintaxis es: var=eg.integerbox(msg="Texto",title="Titulo",default=valor,lowerbound=min,upperbound=max,image=archivo.gif) 50 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 58. Resultado de integerbox() c) multenterbox(): Se usa para ingresar varios datos a través de múltiples cajas de texto que están relacionadas a una lista de textos, como se ve en la figura 58. Su sintaxis es: variables=eg.multenterbox(msg="Texto",title="Titulo",fields=lista,values=valores) variables es una lista que contiene los valores definidos en values o que se ingresen en las cajas de texto. Figura 59. Resultado de multenterbox() 51 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ d) codebox() y textbox(): Se usan para ingresar texto en varias líneas, a manera de editor de texto. Son prácticas para mostrar el texto que se almacena en un archivo externo de texto (.txt), como se observa en la figura 60. Figura 60. Resultado de textbox() 52 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 7.3 Aplicación con GUI El siguiente segmento de programa (figura 61) utiliza EASYGUI para capturar los datos de los retenidos de un suelo para el cálculo de la tabla y curva granulométrica. Para generar la ventana de captura de los datos se utiliza multenterbox(), como se muestra a continuación: Figura 61. Codificación de multenterbox() La corrida del programa mostrando la interfase de usuario seleccionada se muestra en la figura 62. Figura 62. Resultado de multenterbox() 53 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Para generar la ventana de salida de los resultados se utiliza msgbox(), como se observa en la figura 63. Figura 63. Codificación y resultado de msgbox() 54 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ La curva granulométrica se realiza usando la biblioteca matplotlib y se presenta su código y su resultado en la figura 64. Figura 64. Codificación y gráfica granulométrica con matplotlib 55 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 8. APLICACIONES EN INGENIERÍA CIVIL Aplicación 1. Programa Avión vs. Misil Suponga que se quiere derribar un avión mediante un proyectil dirigido justamente en el instante en el que está inclinado, en relación a nuestra posición, como se indica en la figura 65. Figura 65. Trayectorias del avión y misil Para derribarlo, es preciso conocer la altura h del avión, su velocidad va y el ángulo a. El ángulo de tiro está dado por la expresión: en donde vm es la velocidad del proyectil. Como la función arco coseno no existe cuando el cociente es mayor que 1, esto significará que el objetivo es demasiado rápido para alcanzarlo. Más aún, lo alcanzaremos solo si disparamos en el intervalo angular entre 20° y 70°. El instante de intercepción está dado por: Si te es superior a 10 segundos, ya no podremos alcanzar al avión por falta de combustible en nuestro proyectil. Escriba un programa que nos indique si debemos, o no, hacer el intento de disparar el proyectil. En el caso de poder lograrlo deberá imprimir la leyenda “DISPARE CON UN ANGULO DE:”, así como el valor del ángulo; de lo contrario, deberá imprimir: “NO DISPARE -IMPOSIBLE ALCANZARLO-“. Suponga que la velocidad del proyectil es de 1800 ft/seg. Corra el programa para los datos mostrado en la tabla 3; el programa se muestra en la figura 66. Tabla 3. Datos para el programa Avión vs. Misil va a h 2000 0° 1000 600 30° 1400 1200 30° 5000 2000 40° 3500 1800 45° 2000 56 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 66. Programa y ejecución de Avión vs. Misil 57 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 2. Programa SI-NO La figura 67 muestra, gráficamente, el área acotada por las desigualdades: y<3 x+y>1 y<2x+1 y>x2 Figura 67. Área acotada Escriba un programa que pueda leer las coordenadas de un punto y decidir si está dentro del área sombreada. La respuesta de la computadora deberá ser, simplemente SI o NO. El programa se muestra en la figura 68 para la versión con más código y en la figura 69 con menos código al usar operadores lógicos. Primera versión: Figura 68. Programa extendido SINO.py 58 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Segunda versión: Figura 69. Programa reducido SINO.py Aplicación 3. Problema trigonométrico Suponga conocidos los valores de un ángulo y dos lados de un triángulo. Concretamente suponga conocidos los valores a, b y ϴ de la figura 70, y como incógnita el valor de c. Hay varias alternativas para resolver este problema: puede no tener solución, tener solución única o bien, tener dos soluciones. Figura 70. Esquema del problema trigonométrico Estas alternativas pueden determinarse como siguen: 1. Con el ángulo ϴ y el lado a podemos formar un triángulo rectángulo. Los lados h e y pueden calcularse mediante las relaciones: 2. Si b es menor que h, no habrá solución. 3. Si b es igual a h, la solución es única, es decir, el triángulo es rectángulo y el tercer lado es igual a y. 4. Si b es mayor que h, x puede calcularse con la relación: Hay dos posibilidades adicionales: a) Si x es menor que y, las dos soluciones posibles son: y + x y y-x b) Si x es mayor que y, hay una sola solución: y+x Escriba un programa que calcule el tercer lado para los siguientes casos mostrados en la tabla 4. El programa 59 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ se muestra en la figura 71 y su corrida en la figura 72. Tabla 4. Datos para el programa del problema trigonométrico. ANGULO LADO LADO TERCER LADO ϴ a b 30° 2 0.5 «No hay solución» 30° 2 1.5 2.85, 0.61 30° 2 3.0 4.56 25° 4 0.85 «No hay solución» 15° 30 20 47.41, 10.55 Figura 71. Programa para el problema trigonométrico 60 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 72. Ejecución del programa del problema trigonométrico Aplicación 4. Problema de mínimos cuadrados Supongamos que se tiene una serie de N observaciones experimentales, que representan las cantidades de fertilizante utilizado por hectárea, y los rendimientos respectivos en términos de kilos de algodón. Para ejemplificar considérese la tabla 5. Tabla 5. Datos para el problema de mínimos cuadrados Observaciones Fertilizante Rendimientos (kg/Ha) de algodón (kg/Ha) 1 100 0.60 2 200 0.95 3 300 1.42 4 175 0.87 5 250 1.20 6 150 0.75 Simbolicemos con la variable independiente X al monto de fertilizantes empleados por hectárea, y con la variable dependiente Y al rendimiento de algodón por hectárea. Queremos ajustar esas observaciones a un modelo 61 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ lineal del tipo: Para llevar a cabo este procedimiento es necesario calcular los elementos siguientes: 1. El promedio de las observaciones de la variable independiente X: 2. El promedio de las observaciones de la variable dependiente Y: 3. La suma de cuadrados corregida: 4. La suma de productos cruzados corregida: 5. El estimador de mínimos cuadrados para b: 62 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 6. La estimación de a: Para la tabla mostrada, los resultados deben ser a=0.01814 y b=0.00485. El programa y su corrida se muestran en la figura 73. Figura 73. Programa y corrida para mínimos cuadrados En este ejercicio se utilizaron dos listas, Fert y Rend para almacenar los datos en arreglos. 63 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 5. Raíz cuadrada por el método iterativo Un método para encontrar una raíz cuadrada es la fórmula iterativa: en la que Si es la estimación de X en la i-ésima iteración. Una alternativa para cerciorarse si hay o no un cambio en la cuarta cifra decimal es escribir la ecuación en la forma: Cuando habremos encontrado la solución de acuerdo a nuestro criterio. El programa y su corrida se muestran en la figura 74. Figura 74. Programa y corrida para la raíz cuadrada por el método iterativo 64 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 6. Solución de un sistema de ecuaciones lineales por eliminación gaussiana Un sistema de ecuaciones de la forma: puede expresarse mediante una ecuación matricial Ax=b, es decir: para formar una matriz aumentada expresada como: que se resolverá mediante eliminación gaussiana a partir de: para convertirla en una matriz triangular de la siguiente forma: y finalmente aplicar sustitución hacia atrás a partir de la expresión: 65 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ El programa para resolver el problema anterior se muestra en la figura 75. Figura 75. Programa para solucionar un sistema de ecuaciones lineales con eliminación gaussiana Al ejecutar este programa, se resuelve el sistema mostrado en la matriz aumentada A, cuya corrida es mostrada en la figura 76. Figura 76. Corrida del programa para ecuaciones lineales simultáneas 66 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Para correr para cualquier sistema de ecuaciones, deberán convertirse las líneas de N y A en comentarios (#) y desactivar las comillas triples desde A=[] hasta A.append(fila). Aplicación 7. Propiedades geométricas de una sección plana Para una sección plana cerrada S definida por coordenadas (X, Y), sus propiedades geométricas pueden ser encontradas con las siguientes expresiones matemáticas: a) Perímetro: c) Área: d) Momentos de área: e) Coordenadas del centro de gravedad: f) Momentos de inercia: g) Radios de giro: 67 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Una sección W tiene las coordenadas y perfil de la figura 77. Figura 77. Coordenadas y perfil W generado 68 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Las propiedades geométricas calculadas con Mathcad se muestran en la figura 78. Figura 78. Propiedades geométricas calculadas con Mathcad Elaborar un programa en Python que determine las propiedades geométricas de una sección plana cerrada mediante la lectura de las coordenadas de los puntos. El programa se muestra en la figura 79. En la figura 80 se muestran los datos de las coordenadas solicitadas al correr el programa y en la figura 81 se observan las propiedades geométricas calculadas y el perfil W graficado con matplotlib. 69 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 79. Programa para el cálculo de la propiedades geométricas de una sección plana 70 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 80. Coordenadas solicitadas 71 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 81. Propiedades geométricas calculadas y el perfil W graficado con matplotlib 72 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 8. Menú de opciones para una aplicación Cuando se requiere crear una sencilla aplicación que resuelva varios problemas relacionados a un tema, es recomendable colocar un menú de opciones para que el flujo del programa se lleve de acuerdo a la opción seleccionada. El siguiente programa muestra las opciones para resolver algunos problemas relacionados con Mecánica de Suelos y los datos obtenidos en los ensayes del laboratorio, por ejemplo, los datos del muestreo, la humedad natural del suelo, la densidad de sólidos, los parámetros de las volumetrías y gravimetrías de una muestra inalterada, los límites de consistencia o de Atterberg, la granulometría del suelo, la permeabilidad, la resistencia al esfuerzo cortante a partir del ensaye de compresión simple inconfinada, ensaye triaxial, la consolidación unidimensional de los suelos y un conversor de unidades Latitud-Longitud a UTM. En este programa se presentan dos maneras de llamar a los programas: mediante procedimientos y funciones declarados dentro del programa principal y mediante importación (import) de aplicaciones ya existentes almacenadas en archivos de programa con la extensión .py. Algunas opciones no ejecutan ningún programa, solo muestran un mensaje relacionado a la opción. El programa se observa en la figura 82. 73 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 82. Programa para un menú de opciones Cuando se ejecuta el programa, se muestra el menú de opciones para seleccionar la opción que se desee procesar. Por ejemplo, la primera opción para introducir los datos del sitio de la obra. Una vez capturados los datos, se regresa al menú de opciones. La ejecución del programa se observa en la figura 83. 74 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 83. Ejecución del programa del menú de opciones Para obtener la humedad del suelo, se selecciona la opción 2 para ejecutar un procedimiento que solicita los datos del ensaye en el laboratorio para obtener la cantidad de agua del suelo, como se ve en la figura 84. Figura 84. Datos y resultado de la opción 2 para calcular la humedad En la opción 11 se ejecuta un programa para realizar las conversiones de coordenadas geográficas expresadas en Latitud y Longitud con ángulos sexagesimales a coordenadas UTM (X, Y, Z), utilizando el elipsoide WSG84. El programa y su corrida se muestran en las figuras 85y 86, respectivamente, con interfase gráfica creada con EasyGUI. 75 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 85. Programa para convertir Lat-Long a UTM 76 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 86. Corrida del programa para convertir Lat-Long a UTM 77 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 9. Ensaye AASHTO Se llama compactación al proceso de densificar el suelo mediante la reducción de vacíos de aire mediante la incorporación de una cantidad óptima de agua. Proctor comprobó que la incorporación gradual de agua al suelo mejoraba el proceso de compactación al obtener pesos volumétricos húmedos crecientes hasta llegar un punto donde no se lograba el incremento, debido a la saturación del suelo. Proctor observó que el agua tenía la función de lubricar las partículas para lograr un mejor acomodo de las mismas y, al mismo tiempo, influir en la reducción de sus vacíos, hasta llegar a un punto donde se lograba la saturación del suelo, es decir, el llenado de agua en todos los vacíos, lo que impedía la compresibilidad del material. Al graficar los pesos volumétricos secos contra la humedad, observó un gráfico casi parabólico en donde su máximo representaba el peso volumétrico seco máximo (PVSM) en el eje de las ordenadas y la humedad óptima (Wo) en el eje de las abscisas. Existen dos formas de lograr la compactación de los suelos: a) el modelo dinámico, en el cual la compactación se logra mediante el desplazamiento de un pisón de masa constante y distancia de desplazamiento aplicado a un suelo colocado en un molde estándar para aplicar determinado número de golpes del pisón en un número establecido de capas, y b) el modelo estático, en donde la compactación se logra mediante la aplicación de una carga estándar de forma muy lenta a un suelo colocado dentro de un molde estandarizado. En ambos modelos se determinan el PVSM y Wo. Al primer modelo se le conoce como «compactación Proctor» y al segundo como «compactación Porter». En el primer modelo aparece otro concepto importante conocido como Energía de Compactación y que se expresa como: Ec = Ng*Nc*Wp*Hc/Vm donde Ng es el número de golpes, Nc el número de capas, Wp el peso del pisón, Hc la altura de caídad y Vm el volumen del molde; las unidades asociadas son kgf-cm/cm3. En las normas SCT se tienen los ensayes AASHTO T99 y AASHTO T180 para obtener el PVSM y la Wo, en donde se manejan dos tipos: el estándar (T99) y el modificado (T180); para el primer caso se usa un molde de 10.16 cm de diámetro y 11.64 cm de altura, pisón de 2.49 kg f y desplazamiento de 30.5 cm, 25 golpes en 3 capas. Para el segundo caso se usa un molde de 15.24 cm de diámetro y 11.64 cm de altura, pisón de 4.54 kg f y desplazamiento de 45.72 cm, 56 golpes y 5 capas. Algunas energías de compactación calculadas para diferentes modalidades de ensayes se muestran en la tabla 6. Tabla 6. Energía de compactación para distintos datos. Diámetro Altura Peso pisón Desplaz. No. golpes No. capas Volumen Energía cm3 kgf-cm/cm3 cm cm kgf cm 10.16 11.64 2.49 30.50 25 3 944 6.034 10.16 11.64 2.49 30.50 30 3 944 7.241 15.24 11.64 4.54 45.72 56 3 2124 17.50 15.24 11.64 4.54 45.72 56 5 2124 27.36 10.16 11.64 2.49 30.50 12 3 944 2.896 15.24 11.64 4.54 45.72 75 5 2144 36.305 Los ensayos AASHTO aplicados para el diseño de pavimentos permiten obtener el valor de soporte California (CBR). En el caso del ensaye Porter, también se presentan dos casos: a) el estándar, aplicado a materiales para control de calidad, y b) el modificado, aplicado a materiales de terracerías para el diseño de pavimentos y obtención del valor relativo de soporte (VRS) y la expansión (Exp) del material. La aplicación de la carga se realiza a una velocidad lenta de tal forma que se aplique una carga máxima de 27 Ton durante un tiempo de 5 seg mediante una prensa hidráulica de 30 Ton; se mantiene la carga durante un minuto y se descarga en el siguiente minuto. La presión aplicada corresponde a 140.6 kg/cm2. 78 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Para el caso dinámico, se requiere obtener una curva de compactación similar a la de la gráfica de la figura 87. Figura 87. Curva de compactación para hallar PVSM y humedad óptima Se recomienda ejecutar el ensaye AASHTO para obtener por lo menos cuatro (4) puntos con sus respectivas humedades para obtener el peso volumétrico húmedo (PVH) y deducir el peso volumétrico seco (PVS) a partir de la expresión: PVSi = PVHi / (1+wi) Se muestran en la figura 88 los resultados de un ensaye AASHTO T99 para obtener la curva de compactación, y la deducción del PVSM y Wo generados con Mathcad. 79 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 88. Curva de compactación generada con Mathcad La corrida del programa en Python es mostrada en la figura 89. 80 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 89. Corrida del programa AASHTO 81 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 90. Curva de compactación generada con matplotlib En la gráfica de la figura 90, se requiere realizar el ajuste de los puntos a una función parábolica que permita mostrar su punto máximo, cuyas coordenadas definen al PVSM y a la Wo ajustados. Así mismo, se requieren trazar las rectas sugeridas por la normativa SCT para ubicar la ordenada máxima y la abscisa de dicho máximo. Dicho ajuste puede realizarse con el método de mínimos cuadrados para una función cuadrática que establece lo mostrado en la figura 91. Figura 91. Ecuaciones para ajustar a una parábola de mínimos cuadrados 82 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Para los datos de la corrida del programa, el ajuste, modelado en Mathcad, sería de la forma mostrada en la figura 92. Figura 92. Ajuste de la parábola de mínimos cuadrados El programa en Python propuesto es el mostrado en la figura 93. 83 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 84 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 85 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 93. Programa AASHTO 86 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 10. Ensaye de penetración estándar SPT La prueba de penetración estándar (SPT) podemos resumirla en lo siguiente: “consiste en hincar el penetrómetro 45 cm con la masa de 64 kg, dejada caer desde 75 cm de altura; durante el hincado se cuenta el número de golpes que corresponden a cada uno de los tres avances de 15 cm. La resistencia a la penetración estándar se define como el número de golpes, N , para penetrar los últimos 20 cm (de 15 cm a 45 cm). En la operación del martinete debe vigilarse que su altura de caída sea constante y que el cable de manila tenga un máximo de dos vueltas en la cabeza de gato. Una vez terminada una prueba se procede a perforar el tramo muestreado, hasta alcanzar la profundidad a la que se realizará la siguiente prueba; el diámetro de perforación más recomendable es de 10 cm. Las muestras deben conservarse en frascos o en bolsas herméticas que mantengan constante el contenido de agua. La información de campo debe recopilarse en un registro”. El programa se muestra en la figura 94, su corrida en la figura 95 y su gráfico en la figura 96. 87 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 88 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 94. Programa SPT 89 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 90 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 95. Corrida del programa AASHTO Figura 96. Gráfico del esfuerzo cortante no drenado generado con matplotlib 91 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 11. Granulometría de los suelos La granulometría de un suelo puede resumirse de la siguiente forma: “El ensaye granulométrico de un suelo permite determinar estadísticamente los tamaños de partículas que se presentan en el mismo mediante el tamizado o cribado por una sucesión de mallas estandarizadas ASTM; se obtienen la tabla y la curva granulométrica; la primera presenta los resultados de la granulometría gruesa ensayada en seco en el laboratorio, así como los resultados de la granulometría fina realizada en vía húmeda para lavar los finos (partículas menores a 0.075 mm), secar el material retenido y efectuar el tamizado en seco. La granulometría gruesa se realiza cribando el suelo por las mallas 3 in (75 mm), 2 in (50 mm), 1 1/2 in (37.5 mm), 1 in (25 mm), 3/4 in (19 mm), 3/8 in (9.5 mm) y No. 4 (4.75 mm); la granulometría fina se efectúa tamizando una fracción del material que pasa la malla no. 4 en las mallas No. 10 (2.00 mm), No. 20 (0.85 mm), No. 40 (0.425 mm), No. 60 (0.20 mm), No. 100 (0.15 mm) y No. 200 (0.075 mm). La curva granulométrica se realiza graficando el porcentaje que pasa (PQP -%-) en escala aritmética en el eje de las ordenadas contra el tamaño de la malla (en mm) en escala logarítmica en el eje de las abscisas”. El programa se muestra en la figura 97, la ventana GUI de captura de datos en la figura 98, los resultados de la tabla granulométrica en una ventana GUI se observan en la figura 99 y la curva granulométrica en la figura 100. 92 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 97. Programa para el análisis granulométrico de un suelo 93 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 98. Ventana GUI para captura de los datos de entrada 94 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 99. Resultados en una ventana GUI del análisis granulométrico Figura 100. Curva granulométrica 95 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Aplicación 12. VRS vs. CBR Estos parámetros, que representan la resistencia al esfuerzo cortante confinado del suelo, se obtienen mediante dos ensayos de compactación estandarizados y se utilizan para verificar la resistencia del material de las capas del pavimento como control de calidad y para diseñar los espesores de un pavimento a partir de la resistencia del terreno natural (terracerías). El primero, VRS o valor relativo de soporte, se obtiene mediante el ensaye estático Porter al compactar a una muestra de suelo que pase completamente la malla de 25 mm (1 in) mediante presión estática de 127 kg/cm2 durante 5 minutos y una descarga al siguiente minuto; previamente se propuso una humedad cercana a la óptima y se acomodó la muestra de suelo en el molde Porter con veinticinco varillazos con la varilla punta de bala de 5/8 in; lograda la presión de compactación, se lleva el molde a la prensa de 5 Ton para aplicarle carga a una velocidad de 1.27 mm/min, registrar los tiempos (0, 0.5, 1, 2, 3, 4, 6, 8, 10 min) y sus respectivas penetraciones (0, 0.61, 1.27, 2.54, 3.82, 5.08, 7.62, 10.16, 12.54 mm) para obtener el VRS igual a la carga de penetración de 2.54 mm entre la carga estándar de 1360 kgf. El segundo, CBR o relación de soporte California, se obtiene mediante el ensaye dinámico AASHTO T180 al compactar con un pisón de 4.50 kgf, caída de 30.5 cm con 56 golpes repartidos en 5 capas dentro de molde modificado AASHTO; al variar la humedad y obtener el peso volumétrico seco máximo (PVSM) con su respectiva humedad óptima, se lleva a la prensa hidráulica de 5 Ton y se somete a los tiempos y deformaciones indicados en la prueba Porter. El CBR se obtiene al tomar el mínimo de las cargas a las penetraciones de 2.54 mm y 5.08 mm, respectivamente, divididas entre las cargas estándar 1360 kgf y 2054 kgf. En ambos casos, si la curva carga-penetración presentara una doble curvatura, deberá realizarse un ajuste al tomar la recta que pase por el punto de inflexión y prolongándola al eje X para tomar un nuevo origen y calcular las respectivas cargas de penetración comentadas en los párrafos anteriores. Figura 101. Ajuste para el VRS o CBR El programa Python que permite calcular ambos parámetros se muestra en la figura 102 y la corrida del programa en la figura 103. 96 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 102. Programa VRS vs. CBR 97 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 103. Corrida del programa VRS vs. CBR 98 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ Figura 104. Curva Carga vs. Penetración y resultado del CBR Usando la opción 2, se obtendrá el VRS de acuerdo a lo comentado anteriormente; la opción 3 mostrará ambos parámetros calculados y la opción 0 terminará la ejecución del programa. En el programa se utilizaron subprogramas creado con def y las bibliotecas sys, math y matplotlib. Esta última es externa y debe existir en las carpetas de Python para poder invocarse. 99 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 9. PROBLEMAS PROPUESTOS 1. Cálculo de la raíz cúbica con una fórmula iterativa La raíz cúbica del número X puede calcularse mediante la fórmula iterativa Este procedimiento puede iniciarse dando a Si el valor 1. Escriba un programa de computadora para obtener raíces cúbicas de esta manera. Para propósitos informativos, imprímase el valor de S en cada iteración. Termine el proceso una vez que la diferencia entre dos iteraciones sucesivas sea menor de 0.01%. La fórmula es cierta tanto para valores positivos como negativos de X. Su programa debe incluir ambas posibilidades. Utilícelo para X=235 y X=-91.6 2. Raíz cuadrada con otro método iterativo Otra manera de formular el método para resolver la raíz cuadrada de un número es el siguiente. Para calcular la raíz cuadrada de un número B selecciónese cualquier número r1 y con ellos calcúlese h1 tal que A continuación, encuéntrese el promedio entre r1 y h1 y desígnese con r2: El siguiente h2 es igual a: El proceso puede generalizarse mediante las expresiones: y Ambas sucesiones se aproximan a la raíz cuadrada de B. Para detener el proceso, utilizamos el criterio |ri-hi|<e para un e predeterminado. Utilice el programa para calcular las raíces cuadradas de 4590 y 32323, para un valor inicial r1=1 y e=0.000001. 100 PROGRAMACIÓN PYTHON PARA INGENIEROS CIVILES ING. EDUARDO LÓPEZ SÁNCHEZ 3. Sucesiones Las sucesiones convergen al mismo límite llamado «media geométrica-aritmética». Escriba un programa para leer a y b, verifique si a≤b (de lo contrario, intercambie sus valores), y calcule la secuencia hasta que: Utilícelo para los valores a=2, b=7 y e=0.00001. 4. Logaritmo de X La función log10(X) puede representarse, para valores de X en el intervalo 0<X≤2, mediante la siguiente serie infinita: Prepare un programa que lea el valor de X, calcule la serie, e imprima el resultado después de 3, 5, 10, 50, 100 y 1000 términos. Además, utilice la función math.log10(X) y compárela con el resultado de la serie. Corra el programa para el valor X=1.8. Al programar, tome en cuenta que X deberá estar, siempre, dentro del intervalo mencionado. 5. Interpolación de Lagrange Se utiliza está técnica para encontrar un valor dentro de un conjunto de datos agrupados en dos listas X e Y para estimar un valor 𝑌𝑖𝑛𝑡 para un valor dado de 𝑋𝑖𝑛𝑡 . La expresión que calcula a 𝑌𝑖𝑛𝑡 es: 𝑛 𝑛 𝑋𝑖 − 𝑋𝑖𝑛𝑡 𝑌𝑖𝑛𝑡 = ∑ 𝑌𝑖 ∏ 𝑋𝑖 − 𝑋𝑗 𝑖=1 𝑗=1 con 𝑖 ≠ 𝑗 para 𝑖, 𝑗 = 1,2, … , 𝑛 6. Parábola de mínimos cuadrados Para un conjunto de n datos X e Y, la ecuación 𝑦 = 𝑎0 + 𝑎1 𝑥 + 𝑎𝑥 𝑥 2 se determina hallando los coeficientes 𝑎𝑖 , 𝑖 = 0,1,2 mediante la solución del sistema de ecuaciones lineales siguiente; el programa obtenido puede implementarse en la Aplicación 9. Programa AASHTO. 101