Python en Ingeniería Civil
Requisitos de finalización
Estos ejercicios son para demostrar a los alumnos el uso de Python en la resolución problemas en el ámbito de la Ingeniería Civil
2. Cálculo de Tensiones en Tensor
Este código de Python hecho por
grupo de alumnos de Ing. Civil y enviado por el Ing. Javier Duarte, permite las tensiones sobre los tensores de una estructura.
Utiliza la librería : numpy
# -*- coding: utf-8 -*-
"""
Created on Tue Oct 13 10:13:59 2020
@author: Grupo 10
"""
#IMPORT
import numpy as np
#FUNCIONES
def Invariantes_escalar(matriz1,matriz2):
sum1=0
sum2=0
for i in range(3):
sum1+=matriz1[i,i]
sum2+=matriz2[i,i]
sum1=round(sum1)
sum2=round(sum2)
lista=[]
lista.append(sum1)
lista.append(sum2)
if sum1==sum2:
return True,lista
else:
return False,lista
def Det_menor(matriz1,matriz2):
vec1=[ ((float(matriz1[1,1])*float(matriz1[2,2])) - (float(matriz1[2,1])*float(matriz1[1,2])) ), ( (float(matriz1[0,0])*float(matriz1[2,2])) - (float(matriz1[2,0])*float(matriz1[0,2])) ),((float(matriz1[0,0])*float(matriz1[1,1])) - (float(matriz1[1,0])*float(matriz1[0,1])) )]
vec2= [((float(matriz2[1,1])*float(matriz2[2,2])) - (float(matriz2[2,1])*float(matriz2[1,2])) ), ( (float(matriz2[0,0])*float(matriz2[2,2])) - (float(matriz2[2,0])*float(matriz2[0,2])) ),((float(matriz2[0,0])*float(matriz2[1,1])) - (float(matriz2[1,0])*float(matriz2[0,1])) )]
sumvec1=0
sumvec2=0
for i in vec1:
sumvec1+=i
sumvec1=round(sumvec1)
lista=[]
lista.append(sumvec1)
for i in vec2:
sumvec2+=i
sumvec2=round(sumvec2)
lista.append(sumvec2)
if sumvec1== sumvec2:
return True,lista
else:
return False,lista
def Det_mayor(matriz1,matriz2):
m1=np.linalg.det(matriz1)
m1=m1.round()
m2=np.linalg.det(matriz2)
m2=m2.round()
lista=[]
lista.append(m1)
lista.append(m2)
if m1==m2:
return True,lista
else:
return False,lista
def carga():
lista1=[0.0,0.0,0.0]
lista2=[0.0,0.0,0.0]
lista3=[0.0,0.0,0.0]
for i in range(3):
while True:
try:
a=float(input('Inserte el valor de a1{}: '.format(i+1)))
lista1[i]=a
break
except ValueError:
print('Dato erróneo. Reintente.')
for j in range(3):
while True:
try:
a=float(input('Inserte el valor de a2{}: '.format(j+1)))
lista2[j]=a
break
except ValueError:
print('Dato erróneo. Reintente.')
for k in range(3):
while True:
try:
a=float(input('Inserte el valor de a3{}: '.format(k+1)))
lista3[k]=a
break
except ValueError:
print('Dato erróneo. Reintente.')
matriz=np.array([lista1,lista2,lista3])
return matriz
#PROGRAMA
print('Diagonalización de tensor de tensiones.'.center(50,'-'))
M=np.array([[8,2,1],[2,6,1],[1,1,3]])
while True:
print('Menú de opciones:')
print('1. Cargar tensor \n2. Calcular Tensiones y Direcciones Principales \nS. Salir ')
print('(Se aclara que por defecto está cargada la matriz T de la AEP n° 2)')
opcion=input('¿Qué desea hacer? ')
if opcion=='1':
M=carga()
elif opcion=='2':
print('La MATRIZ propuesta es:')
print(M)
valores,vectores=np.linalg.eig(M)
print('Esta matriz es un Tensor de Inercia.')
print('')
#AUTOVALORES
print('Los AUTOVALORES son:')
for i in valores:
print(i.round(2))
print('Estos autovalores representan las Tensiones Principales.')
print('')
print('La matriz de autovalores queda:')
N=np.array([[float(valores[0].round(2)),float(0),float(0)],[float(0),\
float(valores[1].round(2)),float(0)],[float(0),float(0),float(valores[2].round(2))]])
print(N)
print('')
#AUTOVECTORES
print('Los AUTOVECTORES son:')
for j in range(len(valores)):
print('AUTOVALOR: {} '.format(valores[j].round(2)))
print('({};{};{})'.format(vectores[0][j].round(2),vectores[1][j].round(2),vectores[2][j].round(2)))
print('Cada autovector representa las direcciones de Tensiones Principales segun le corresponda.')
print('')
#INVARIANTES
J1,lista=(Invariantes_escalar(N,M))
if J1==True:
print('-->El INVARIANTE ESCALAR en la matriz propuesta y la matriz de autovalores son IGUALES.')
print('Invariantes Escalares:\n TENSOR DE INERCIA: {} \n MATRIZ DE AUTOVALORES: {}'.format(lista[0],lista[1]))
else:
print('-->El INVARIANTE ESCALAR en la matriz propuesta y la matriz de autovalores son DIFERENTES.')
print('Invariantes Escalares:\n TENSOR DE INERCIA: {} \n MATRIZ DE AUTOVALORES: {}'.format(lista[0],lista[1]))
print('')
J2,lista=Det_menor(N,M)
if J2==True:
print('--DETERMINANTE MENOR en la matriz propuesta y la matriz de autovalores son IGUALES.')
print('Determinante menor:\n TENSOR DE INERCIA: {} \n MATRIZ DE AUTOVALORES: {}'.format(lista[0],lista[1]))
else:
print('-->DETERMINANTE MENOR en la matriz propuesta y la matriz de autovalores son DIFERENTES.')
print('Determinante menor:\n TENSOR DE INERCIA: {} \n MATRIZ DE AUTOVALORES: {}'.format(lista[0],lista[1]))
print('')
J3,lista=Det_mayor(N,M)
if J3==True:
print('-->DETERMINANTE MAYOR en la matriz propuesta y la matriz de autovalores son IGUALES.')
print('Determinante Mayor:\n TENSOR DE INERCIA: {} \n MATRIZ DE AUTOVALORES: {}'.format(lista[0],lista[1]))
else:
print('-->El DETERMINANTE MAYOR en la matriz propuesta y la matriz de autovalores son DIFERENTES.')
print('Determinante Mayor:\n TENSOR DE INERCIA: {} \n MATRIZ DE AUTOVALORES: {}'.format(lista[0],lista[1]))
print('')
elif opcion=='s' or opcion=='S':
print('Saliendo...')
break
else:
print('Opción no válida. Reintente.')
'''
#AGREGADO
lista=list()
for i in range(3):
a=float(input('Valor para a{}:'.format(i)))
lista.append(a)
R=np.array([lista])
print(R)
print(M*R)'''# PARA MULTIPLICAR UN VECTOR X CON LA MATRIZ CARGADA ANTERIORMENTE