Contenido bajo licencia Creative Commons BY-NC-ND. El contenido de este Notebook es creado por Ana Beatriz Acevedo Jaramillo y Daniela González González 2020. Este material es parte del curso Análisis de Estructuras del programa de Ingeniería Civil de la Universidad EAFIT.
Este Notebook fue desarrollado como parte del material de apoyo para realizar el análisis de cerchas planas. Debe tener en cuenta que los datos de entrada que aparecen por defecto corresponden al ejercicio explicado en el documento que acompaña a este Notebook.
Esta sección contiene los datos que debe ingresar el usuario para que el Notebook realice en ánalisis de la estructura.
import numpy as np
import pandas as pd
Nn=4 #Número de nodos
Ne=5 #Número de elementos
NGLL=5 #Número de grados de libertad libres
Con la información anterior se cálcula lo siguiente:
NGL=2*Nn #Cálculo del número de grados de libertad
NGLR=NGL-NGLL #Cálculo del número de grados de libertad restringidos
MGL=[[6,7,2,3],[2,3,4,5],[6,7,0,1],[0,1,4,5],[0,1,2,3]] #Matriz con información de los grados de libertad asociados a cada elemento
MA | ME |
---|---|
$$ |
\begin{bmatrix} A_{0}\\A_{1}\\A_{2}\\.\\A_{n}\end{bmatrix}, $$|$$ \begin{align} \\ \end{align} \begin{bmatrix} E_{0}\\E_{1}\\E_{2}\\.\\E_{n}\end{bmatrix}, $$|
MA=[[750],[750],[1000],[1000],[750]] #Matriz con las áreas de la sección transversal de cada elemento (en mm2).
ME=[[200],[200],[200],[200],[200]] #Matriz con el módulo de elasticidad de cada elemento (en GPa).
MC=[[0,0,4000,3000],[4000,3000,8000,0],[0,0,4000,0],[4000,0,8000,0],[4000,0,4000,3000]] #Matriz que almacena las coordenadas de los nodos iniciales y finales de cada elemento (en mm).
F0=[[0],[-10],[0],[0],[20]] #Matriz de fuerzas aplicadas en los grados de libertad libres (en kN).
U1=[[0],[0],[0]] #Matriz de desplazamientos en los grados de libertad restringidos (en mm).
En esta sección se procesan los datos ingresados para calcular las reacciones (fuerzas en los grados de libertad restringidos) y los desplazamientos de los grados de libertad libres.
ML=np.zeros((Ne,1)) #Matriz de almacenamiento de longitudes
for i in range(Ne):
ML[i,0]=np.sqrt((MC[i][2]-MC[i][0])**2+(MC[i][3]-MC[i][1])**2)
print(np.array(ML))
[[5000.] [5000.] [4000.] [4000.] [3000.]]
MAL=np.zeros((Ne,4,4)) #Matriz de almacenamiento de matrices de rigidez en coordenadas locales
for i in range(Ne):
MAL[i,0,0]=(MA[i][0]*ME[i][0])/(ML[i][0])
MAL[i,0,2]=-MAL[i,0,0]
MAL[i,2,0]=-MAL[i,0,0]
MAL[i,2,2]=MAL[i,0,0]
Visualización de la matriz de rigidez local de un elemento de la cercha:
Indique el número del elemento (n) para el cual desea ver la matriz de rigidez local.
n=0
df=pd.DataFrame(MAL[n])
df
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 30.0 | 0.0 | -30.0 | 0.0 |
1 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | -30.0 | 0.0 | 30.0 | 0.0 |
3 | 0.0 | 0.0 | 0.0 | 0.0 |
MAT=np.zeros((Ne,4,4)) #Matriz de almacenamiento de las matrices de transformación
for i in range(Ne):
MAT[i,0,0]=(MC[i][2]-MC[i][0])/(ML[i][0])
MAT[i,1,0]=(MC[i][3]-MC[i][1])/(ML[i][0])
MAT[i,2,2]=MAT[i,0,0]
MAT[i,3,2]=MAT[i,1,0]
Visualización de la matriz de transformación de un elemento de la cercha:
Indique el número del elemento (n) para el cual desea ver la matriz de transformación.
n=0
df=pd.DataFrame(MAT[n])
df
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.8 | 0.0 | 0.0 | 0.0 |
1 | 0.6 | 0.0 | 0.0 | 0.0 |
2 | 0.0 | 0.0 | 0.8 | 0.0 |
3 | 0.0 | 0.0 | 0.6 | 0.0 |
MAG=np.zeros((Ne,4,4)) #Matriz de almacenamiento de las matrices de rigidez en coordenadas globales
for i in range(Ne):
MAG[i]=np.dot(np.dot(MAT[i],MAL[i]),np.transpose(MAT[i]))
Visualización de la matriz de rigidez global de un elemento de la cercha:
Indique el número del elemento (n) para el cual desea ver la matriz de rigidez global.
n=0
df=pd.DataFrame(MAG[n])
df
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 19.2 | 14.4 | -19.2 | -14.4 |
1 | 14.4 | 10.8 | -14.4 | -10.8 |
2 | -19.2 | -14.4 | 19.2 | 14.4 |
3 | -14.4 | -10.8 | 14.4 | 10.8 |
KG=np.zeros((NGL,NGL)) #Matriz de rigidez global de la estructura
for i in range(Ne):
for j in range(4):
for k in range(4):
KG[int(MGL[i][k]),int(MGL[i][j])]=KG[int(MGL[i][k])][int(MGL[i][j])]+MAG[i][j][k]
df=pd.DataFrame(KG)
df
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
0 | 100.0 | 0.0 | 0.0 | 0.0 | -50.0 | 0.0 | -50.0 | 0.0 |
1 | 0.0 | 50.0 | 0.0 | -50.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 0.0 | 0.0 | 38.4 | 0.0 | -19.2 | 14.4 | -19.2 | -14.4 |
3 | 0.0 | -50.0 | 0.0 | 71.6 | 14.4 | -10.8 | -14.4 | -10.8 |
4 | -50.0 | 0.0 | -19.2 | 14.4 | 69.2 | -14.4 | 0.0 | 0.0 |
5 | 0.0 | 0.0 | 14.4 | -10.8 | -14.4 | 10.8 | 0.0 | 0.0 |
6 | -50.0 | 0.0 | -19.2 | -14.4 | 0.0 | 0.0 | 69.2 | 14.4 |
7 | 0.0 | 0.0 | -14.4 | -10.8 | 0.0 | 0.0 | 14.4 | 10.8 |
K0 = KG[0:NGLL,0:NGLL]
K1 = KG[0:NGLL,NGLL:NGL]
K2 = KG[NGLL:NGL,0:NGLL]
K3 = KG[NGLL:NGL,NGLL:NGL]
Feff=F0-np.dot(K1,U1)
U0=np.dot((np.linalg.inv(K0)),Feff) #Desplazamientos en los grados de libertad libres en mm
print(np.array(U0))
[[ 0.53333333] [-1.37407407] [ 0.53333333] [-1.17407407] [ 1.06666667]]
F1=np.dot(K2,U0)+np.dot(K3,U1) #Reacciones en kN (grados de libertad restringidos)
print(np.array(F1))
[[ 5.] [-20.] [ 5.]]
En esta sección se calcula la fuerza interna de cada elemento de la cercha.
U=np.concatenate((U0,U1)) #Matriz de desplazamientos de todos los grados de libertad
MU=np.zeros((Ne,4,1)) #Matriz de almacenamiento de vectores de desplazamiento de cada elemento
for i in range(Ne):
for j in range(4):
MU[i,j,0]=U[int(MGL[i][j])][0]
Visualización de los desplazamientos de un elemento de la cercha:
Indique el número del elemento (n) para el cual desea ver los desplazamientos.
n=0
print(np.array(MU[n]))
[[ 0. ] [ 0. ] [ 0.53333333] [-1.17407407]]
MFG=np.zeros((Ne,4,1)) #Matriz de almacenamiento de las fuerzas de cada elemento en coordenadas globales
for i in range(Ne):
MFG[i]=np.dot(MAG[i],MU[i])
Visualización de las fuerzas en coordenadas globales de un elemento de la cercha:
Indique el número del elemento (n) para el cual desea ver las fuerzas en coordenadas globales.
n=0
print(np.array(MFG[n]))
[[ 6.66666667] [ 5. ] [-6.66666667] [-5. ]]
MFL=np.zeros((Ne,4,1)) #Matriz de almacenamiento de las fuerzas de cada elemento en coordenadas locales
for i in range(Ne):
MFL[i]=np.dot(np.transpose(MAT[i]),MFG[i])
Visualización de las fuerzas en coordenadas locales de un elemento de la cercha:
Indique el número del elemento (n) para el cual desea ver las fuerzas en coordenadas locales.
n=0
print(np.array(MFL[n]))
[[ 8.33333333] [ 0. ] [-8.33333333] [ 0. ]]
FELEM=np.zeros((Ne,1)) #Matriz de almacenamiento de fuerzas internas
for i in range(Ne):
FELEM[i,0]=-MFL[i,0,0]
print(np.array(FELEM))
[[-8.33333333] [-8.33333333] [26.66666667] [26.66666667] [10. ]]