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