Python en 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