Vigas Python
Vigas Python
Vigas Python
import numpy as np
import matplotlib.pyplot as plt
%matplotlib nbagg
class VigaB:
'''Definimos un tramo de viga.
E: Módulo de elasticidad
I: Inercia de la sección transversal
L: Longitud del tramo'''
class Carga:
'''Clase Carga'''
def Tipo(self):
if self.tipo == 0:
print("Carga puntual")
elif self.tipo == 1:
print('Carga distribuida')
elif self.tipo == 2:
print('Momento concentrado')
else:
print('No definido')
class CargaPuntual(Carga):
'''Clase carga puntual'''
def __str__(self):
return 'Carga puntual\n Valor= ' + str(self.P) + 'N' \
+ '\n Posición, x= ' + str(self.a) + 'm'
class CargaDistribuida(Carga):
'''Clase carga distribuida'''
def __str__(self):
return 'Carga distribuida\n Valor= ' + str(self.q) + 'N/m' \
', ' + '\n Inicio=
' + str(
self.a) + 'm' + '\n Longitud= ' + str(self.l) + 'm'
class MomentoConcentrado(Carga):
'''Clase momento concentrado'''
def __str__(self):
return 'Momento concentrado\n Valor= ' + str(self.M) + 'Nm' \
+ '\n Posición, x= ' + str(self.a) + 'm'
E = 20e9 # Pa
I = 3.6e-3 # m4
Tramo = [VigaB(E, I, 6), VigaB(E, I, 8)]
#Rigidez C
C = np.amax(KG) * 1e4
# En general
for i in range(b):
gdlRest.append(2 * i)
# Extremo izquierdo
if apoyoIzq == 0: # empotramiento
gdlRest.insert(1, 1)
elif apoyoIzq == 1: # restricción al giro
gdlRest[0] = 1
elif apoyoIzq == 3: # voladizo
del gdlRest[0]
else: # apoyo de segundo grado
pass
# Extremo derecho
if apoyoDer == 0: # empotramiento
gdlRest.append(2 * b)
gdlRest.append(2 * b + 1)
elif apoyoDer == 1: # restricción al giro
gdlRest.append(2 * b + 1)
elif apoyoDer == 2: # apoyo de segundo género
gdlRest.append(2 * b)
else: # voladizo
pass
#Ensamble del vector Qf para todos los gdl, incluidos los restringidos
Qf = np.zeros((2*(b+1),1))
for i in range(b):
Qf[2*i:2*i+4,:] += QF[i]
# Desplazamientos nodales
d = -np.linalg.inv(S) @ Qf
# Reacciones
r = d[gdlRest]
R = -C * r
Cortantes = []
for i in range(b): # para cada tramo
# Momento total
Cortantes.append(Q0 + Q1)
Flectores = []
for i in range(b): # para cada tramo
# Momento total
Flectores.append(M0 + M1)
# colocarTextosQ()
# Divisores de tramos
vertical = 0
for i in range(b - 1):
vertical += Tramo[i].L
plt.axvline(vertical, color='black')
plt.show()
# Graf. principal
plt.figure(2)
plt.plot(X, DMF)
plt.title('Diagrama de momento flector', fontsize=16)
plt.xlabel('x [m]')
plt.ylabel('Momento flector [kNm]')
plt.gca().invert_yaxis() # invierte el eje y
plt.axhline(linewidth=3)
plt.xlim(0, Ltotal)
plt.grid()
colocarTextosF()
# Divisores de tramos
vertical = 0
for i in range(b - 1):
vertical += Tramo[i].L
plt.axvline(vertical, color='black')
plt.show()