Python en Ingeniería Civil
4. Geometría de masas
Para introducir el conceto de Geometría de las Masa dejamos una Presentación ppt
También hay un video Explicativo sobre el uso del Código
Ver Presentación
Solución:
from cmath import pi
import math
def menu():
opcion = input("\nMenu:\na) Cargar Datos.\nb) Area del conjunto.\nc) Posicion del baricentro de la seccion.\nd) Momentos de segundo orden (Jx-Jy-Jxy).\ne) Momentos principales de inercia (Jmax-Jmin).\nS o s) Salir.\n...")
return (opcion.lower()) ##Para que retorne todo en minuscula
def A_Cj(dt): #dt = datos *A_Cj = Areas del conjunto
d_g = {}
Ar = (dt[1][0])*(dt[1][1])
At = (((dt[2][0])*(dt[2][1]))/2)
Ac = (-1*(dt[4][0])*(dt[4][1])) #-1 porque es un hueco
As = round(((math.pi)*((dt[3][0])**2)/2),3)
Atotal = (round((Ar + At + Ac + As),2))
d_g[1] = [Ar] #1 = Rectangulo
d_g[2] = [At] #2 = Triangulo
d_g[3] = [As] #3 = Semicirculo
d_g[4] = [Ac] #4 = Cuadrado7
d_g[5] = [Atotal] #5 = Area total
return d_g
def Pos_b_sec(d_calc,dt): #Posicion del baricentro de la seccion
##Rectangulo
Xgr = (round((dt[1][0]/2),3)*(d_calc[1][0]))/(d_calc[5][0])
Ygr = (round(((dt[1][1]/2)+(dt[2][1])),3)*(d_calc[1][0]))/(d_calc[5][0])
d_calc[1].append([Xgr,Ygr])
##Triangulo
Xgt = (round((dt[2][0]*(2/3)),3)*(d_calc[2][0]))/(d_calc[5][0])
Ygt = (((dt[2][1]*(2/3)))*(d_calc[2][0]))/(d_calc[5][0])
d_calc[2].append([Xgt,Ygt])
##Semicirculo
Xgs = (round((((4/3)*(dt[3][0]))/math.pi)+(dt[2][0]),3)*(d_calc[3][0]))/(d_calc[5][0])
Ygs = (((dt[3][0]) + (dt[2][1]))*(d_calc[3][0]))/(d_calc[5][0])
d_calc[3].append([Xgs,Ygs])
##Cuadrado
Xgc = (round((dt[1][0]/2),3)*(d_calc[4][0]))/(d_calc[5][0])
Ygc = (((dt[2][1])+3.50)*(d_calc[4][0]))/(d_calc[5][0])
d_calc[4].append([Xgc,Ygc])
##Posicion del baricentro de la seccion
XG = Xgr+Xgt+Xgs+Xgc
YG = Ygr+Ygt+Ygs+Ygc
d_calc[5].append([XG,YG])
print("Posicion del baricentro de la seccion".center(100))
print("XG = {}".format(XG))
print("YG = {}".format(YG))
return True
def m_s_o_p(datos, result): #Momentos de segundo orden propios
form = [[1/12,1/36,1/128,-1/12],[1/12,1/36,1/145.77,-1/12],[0,-1/72,0,0]]
for i in range(3): #1v = Jx, 2v = Jy, 3v Jxy
for e in range(4):
if (i==0):
if (e==2):
jx = ((math.pi)*((2*(datos[e+1][0]))**4))*form[i][e]
result[e+1] = [jx]
else:
jx = (datos[e+1][0]*((datos[e+1][1])**3))*form[i][e]
result[e+1] = [jx]
elif (i==1):
if (e==2):
jy = ((2*(datos[e+1][0]))**4)*form[i][e]
result[e+1].append(jy)
else:
jy = (datos[e+1][1]*((datos[e+1][0])**3))*form[i][e]
result[e+1].append(jy)
else:
if (e==1):
jxy = (((datos[e+1][0])**2)*((datos[e+1][1])**2))*form[i][e]
result[e+1].append(jxy)
else:
result[e+1].append(0.0)
def dbp(calc,dt,result): #Distancia entre ejes baricentricos paralelos
XGr = (dt[1][0]/2)-((calc[5][1])[0])
YGr = (dt[1][1]/2)+(dt[2][1])-((calc[5][1])[1])
result[1].append(XGr)
result[1].append(YGr)
XGt = (dt[2][0]*(2/3))-((calc[5][1])[0])
YGt = (dt[2][1]*(2/3))-((calc[5][1])[1])
result[2].append(XGt)
result[2].append(YGt)
XGs = ((((4/3)*(dt[3][0]))/math.pi)+(dt[2][0]))-((calc[5][1])[0])
YGs = ((dt[3][0]) + (dt[2][1]))-((calc[5][1])[1])
result[3].append(XGs)
result[3].append(YGs)
XGc = (dt[1][0]/2)-((calc[5][1])[0])
YGc = ((dt[2][1])+3.50)-((calc[5][1])[1])
result[4].append(XGc)
result[4].append(YGc)
def m_s_o(calc, datos): #momentos de segundo orden
m_s_o_p_r = {} #momentos de segundo orden propios
d_b_p = {1:[],2:[],3:[],4:[]} #Distancia entre ejes baricentricos pararelos
m_s_o_b = {1:[],2:[],3:[],4:[],5:[]}
m_s_o_p(datos,m_s_o_p_r)
dbp(calc,datos,d_b_p)
Jxt = 0
Jyt = 0
Jxyt = 0
for i in range(4):
jx = (m_s_o_p_r[i+1][0])+((calc[i+1][0])*((d_b_p[i+1][1])**2))
Jxt+=jx
m_s_o_b[i+1].append(jx)
jy = (m_s_o_p_r[i+1][1])+((calc[i+1][0])*((d_b_p[i+1][0])**2))
Jyt+=jy
m_s_o_b[i+1].append(jy)
jxy = (m_s_o_p_r[i+1][2])+((calc[i+1][0])*(d_b_p[i+1][0])*(d_b_p[i+1][1]))
Jxyt+=jxy
m_s_o_b[i+1].append(jxy)
m_s_o_b[5].append(Jxt)
m_s_o_b[5].append(Jyt)
m_s_o_b[5].append(Jxyt)
return m_s_o_b
def Jm(m_b_p): #Momentos principales de inercia
Jxym = math.sqrt(((((m_b_p[5][0])-(m_b_p[5][1]))/2)**2)+((m_b_p[5][2])**2))
Jmax = (((m_b_p[5][0])+(m_b_p[5][1]))/2)+Jxym
Jmin = (((m_b_p[5][0])+(m_b_p[5][1]))/2)-Jxym
Alfa = (0.5*(math.atan(((2*m_b_p[5][2])/(m_b_p[5][1])-(m_b_p[5][0])))))
print("Momentos principales de inercia".center(100))
print("* Jxymax = {}".format(Jxym))
print("* Jmax = {}".format(Jmax))
print("* Jmin = {}".format(Jmin))
print("* α = {}".format(Alfa))
def main():
b1 = True
ba, bb, bc, bd= False, False, False, False
while (b1):
op = menu()
if op=='a':
print("\nIngrese los datos requeridos\n")
Datos={1: [],2:[],3:[],4:[],5:[]} ##Datos Geometricos
nombres=["Rectangulo","Triangulo","Semicirculo","Cuadrado","Total"] ##Datos Geometricos
for i in Datos:
b_d = True #Bandera de datos
while(b_d):
try:
if (i==1 or i==2 or i==4):
base = float(input("* Base del {}: ".format(nombres[i-1])))
if (base>0):
Datos[i].append(base)
altura = float(input("* Altura del {}: ".format(nombres[i-1])))
if (altura>0):
Datos[i].append(altura)
b_d = False
else:
print("\n¡ERROR! Reingrese...\n")
else:
print("\n¡ERROR! Reingrese...\n")
elif (i==3):
radio = float(input("* Radio del {}: ".format(nombres[i-1])))
if (radio>0):
Datos[i].append(radio)
b_d=False
else:
print("\n¡ERROR! Reingrese...\n")
else:
b_d = False
except ValueError:
print("\n¡ERROR! Reingresar...\n")
print("\n")
print("DATOS INGRESADOS EXITOSAMENTE".center(100))
for i in Datos:
print("* {}---->{}".format(nombres[i-1],Datos[i]))
ba = True
elif op=='b':
if (ba==True):
Calc_g = A_Cj(Datos)
print("AREAS".center(100))
for i in Calc_g:
print("* {} ----> {}".format(i,Calc_g[i]))
bb = True
else:
print("\n¡NO SE CARGARON LOS DATOS!\n")
elif op=='c':
if (ba==True and bb==True):
bc=Pos_b_sec(Calc_g,Datos)
else:
print("\n¡ACCESO DENEGADO!")
elif op=='d':
if (ba==True and bb==True and bc==True):
m_b = m_s_o(Calc_g,Datos) #Momentos baricentro
bd = True
print("Momentos de segundo orden".center(100))
for i in range(1,6):
print("\n{}".format(nombres[i-1]))
print("Jx = {}".format(m_b[i][0]))
print("Jy = {}".format(m_b[i][1]))
print("Jxy = {}".format(m_b[i][2]))
else:
print("\n¡ACCESO DENEGADO!")
elif op=='e':
if (ba==True and bb==True and bc==True and bd==True):
Jm(m_b)
else:
print("\n¡ACCESO DENEGADO!")
elif op=='s':
print("\n¡FINALIZANDO PROGRAMA!\n")
b1=False
else:
print("\n¡OPCION NO VALIDA!\n")
main()