Enunciado del Problema:
Análisis de la estructura:
Enumeración y determinación del numero de nodos y elementos en la armadura:
Solución del Problema en Phyton
import numpy as np
import math as ma
import pandas as pd
# Matriz de rigidez de cada elemento en el sistema global
def Keg(theta, E, A, L):
c = [Link](theta)
s = [Link](theta)
# Matriz de transformación de coordenadas
T = [Link]([[c, s, 0, 0],
[-s, c, 0, 0],
[0, 0, c, s],
[0, 0, -s, c]])
# Matriz de rigidez local
kel = (E * A / L) * [Link]([[1, 0, -1, 0],
[0, 0, 0, 0],
[-1, 0, 1, 0],
[0, 0, 0, 0]])
# Matriz de rigidez global
keg = [Link]([Link](T), [Link](kel, T))
return keg, T
# Datos del problema y matriz de rigidez global del sistema
E = 2000000000000 # módulo de elasticidad [Pa]
A = 0.080 # area transversal [m^2]
Lon = [Link]([5, 5, 5, 5, 5,5, 5, 5, 5, 5,5, 5, 5, 7.07, 7.07,5,7.07, 7.07,5,7.07, 7.07,5,7.07, 7.07,5,7.07, 7.07,5,7.07,
7.07,5,5, 7.07,7.07,5, 7.07,7.07,5, 7.07,7.07,5, 7.07,7.07,5, 7.07,7.07,5, 7.07,7.07, 5, 5, 5,5, 5, 5, 5, 5,5, 5, 5,5,5]) #
longitud de cada elemento [m]
theta_e = [Link]([0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0,90 * [Link] / 180.0, 135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] /
180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] / 180.0,90 * [Link] / 180.0,135 * [Link] / 180.0,135 * [Link] /
Solución del Problema en Phyton
180.0,90 * [Link] / 180.0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0,0 ]) # angulo de cada elemento con el eje x [rad] 90 * [Link] /
180.0
nodos_totales = len(Lon) + 1 # Número total de nodos en la armadura
grados_libertad_totales = 2 * nodos_totales # Número total de grados de libertad en la armadura
K_global = [Link]((grados_libertad_totales, grados_libertad_totales)) # Matriz de rigidez global del sistema
# Ensamble de la matriz de rigidez global
for i in range(len(Lon)):
L = Lon[i]
theta = theta_e[i]
keg, _ = Keg(theta, E, A, L)
# Ensamble de la matriz de rigidez global
indices_globales = [2 * i, 2 * i + 1, 2 * (i + 1), 2 * (i + 1) + 1] # Índices globales de los grados de libertad del elemento
K_global[np.ix_(indices_globales, indices_globales)]
keg1,T = Keg(theta_e[2],E,A,Lon[2])
print("keg=",keg1,"T=",T)
keg= [[ 3.2e+10 0.0e+00 -3.2e+10 0.0e+00]
[ 0.0e+00 0.0e+00 0.0e+00 0.0e+00]
[-3.2e+10 0.0e+00 3.2e+10 0.0e+00]
[ 0.0e+00 0.0e+00 0.0e+00 0.0e+00]] T= [[ 1. 0. 0. 0.]
[-0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. -0. 1.]]
# datos de la malla
nel = 62 # número de elementos
nnel = 2 # número de nodos por elemento
ndof = 2 # número de grados de libertad por nodo
nnod = 33 # número de nodos en el sistema
sdof = nnod*ndof # numero total grados de libertad en el sistema
# matriz de incidencia
nodos = [Link]((nel,nnel),dtype=int)
# nodo 1 --- [elemento,primer nodo del elemento] = nodo del sistema
nodos[0,0]=1 #elemento 1
nodos[1,0]=2 #elemento 2
nodos[2,0]=3 #elemento 3
nodos[3,0]=4 #elemento 4
Solución del Problema en Phyton
nodos[4,0]=5 #elemento 5
nodos[5,0]=6 #elemento 6
nodos[6,0]=7 #elemento 7
nodos[7,0]=8 #elemento 8
nodos[8,0]=9 #elemento 9
nodos[9,0]=10 #elemento 10
nodos[10,0]=11 #elemento 11
nodos[11,0]=12 #elemento 12
nodos[12,0]=1 #elemento 13
nodos[13,0]=2 #elemento 14
nodos[14,0]=2 #elemento 15
nodos[15,0]=3 #elemento 16
nodos[16,0]=4 #elemento 17
nodos[17,0]=4 #elemento 18
nodos[18,0]=5 #elemento 19
nodos[19,0]=6 #elemento 20
nodos[20,0]=6 #elemento 21
nodos[21,0]=7 #elemento 22
nodos[22,0]=8 #elemento 23
nodos[23,0]=8 #elemento 24
nodos[24,0]=9 #elemento 25
nodos[25,0]=10 #elemento 26
nodos[26,0]=10 #elemento 27
nodos[27,0]=11 #elemento 28
nodos[28,0]=12 #elemento 29
nodos[29,0]=12 #elemento 30
nodos[30,0]=13 #elemento 31
nodos[31,0]=14 #elemento 32
nodos[32,0]=14 #elemento 33
nodos[33,0]=15 #elemento 34
nodos[34,0]=15 #elemento 35
nodos[35,0]=15 #elemento 36
nodos[36,0]=16 #elemento 37
nodos[37,0]=16 #elemento 38
nodos[38,0]=16 #elemento 39
nodos[39,0]=17 #elemento 40
nodos[40,0]=17 #elemento 41
nodos[41,0]=17 #elemento 42
nodos[42,0]=18 #elemento 43
Solución del Problema en Phyton
nodos[43,0]=18 #elemento 44
nodos[44,0]=18 #elemento 45
nodos[45,0]=19 #elemento 46
nodos[46,0]=19 #elemento 47
nodos[47,0]=19 #elemento 48
nodos[48,0]=20 #elemento 49
nodos[49,0]=20 #elemento 50
nodos[50,0]=21 #elemento 51
nodos[51,0]=22 #elemento 52
nodos[52,0]=23 #elemento 53
nodos[53,0]=24 #elemento 54
nodos[54,0]=25 #elemento 55
nodos[55,0]=26 #elemento 56
nodos[56,0]=27 #elemento 57
nodos[57,0]=28 #elemento 58
nodos[58,0]=29 #elemento 59
nodos[59,0]=30 #elemento 60
nodos[60,0]=31 #elemento 61
nodos[61,0]=32 #elemento 62
# nodo 2 --- [elemento,segundo nodo del elemento] = nodo del sistema
nodos[0,1]=2 #elemento 1
nodos[1,1]=3 #elemento 2
nodos[2,1]=4 #elemento 3
nodos[3,1]=5 #elemento 4
nodos[4,1]=6 #elemento 5
nodos[5,1]=7 #elemento 6
nodos[6,1]=8 #elemento 7
nodos[7,1]=9 #elemento 8
nodos[8,1]=10 #elemento 9
nodos[9,1]=11 #elemento 10
nodos[10,1]=12 #elemento 11
nodos[11,1]=13 #elemento 12
nodos[12,1]=14 #elemento 13
nodos[13,1]=14 #elemento 14
nodos[14,1]=15 #elemento 15
nodos[15,1]=15 #elemento 16
nodos[16,1]=15 #elemento 17
Solución del Problema en Phyton
nodos[17,1]=16 #elemento 18
nodos[18,1]=16 #elemento 19
nodos[19,1]=16 #elemento 20
nodos[20,1]=17 #elemento 21
nodos[21,1]=17 #elemento 22
nodos[22,1]=17 #elemento 23
nodos[23,1]=18 #elemento 24
nodos[24,1]=18 #elemento 25
nodos[25,1]=18 #elemento 26
nodos[26,1]=19 #elemento 27
nodos[27,1]=19 #elemento 28
nodos[28,1]=19 #elemento 29
nodos[29,1]=20 #elemento 30
nodos[30,1]=20 #elemento 31
nodos[31,1]=21 #elemento 32
nodos[32,1]=22 #elemento 33
nodos[33,1]=22 #elemento 34
nodos[34,1]=23 #elemento 35
nodos[35,1]=24 #elemento 36
nodos[36,1]=24 #elemento 37
nodos[37,1]=25 #elemento 38
nodos[38,1]=26 #elemento 39
nodos[39,1]=26 #elemento 40
nodos[40,1]=27 #elemento 41
nodos[41,1]=28 #elemento 42
nodos[42,1]=28 #elemento 43
nodos[43,1]=29 #elemento 44
nodos[44,1]=30 #elemento 45
nodos[45,1]=30 #elemento 46
nodos[46,1]=31 #elemento 47
nodos[47,1]=32 #elemento 48
nodos[48,1]=32 #elemento 49
nodos[49,1]=33 #elemento 50
nodos[50,1]=22 #elemento 51
nodos[51,1]=23 #elemento 52
nodos[52,1]=24 #elemento 53
nodos[53,1]=25 #elemento 54
nodos[54,1]=26 #elemento 55
nodos[55,1]=27 #elemento 56
Solución del Problema en Phyton
nodos[56,1]=28 #elemento 57
nodos[57,1]=29 #elemento 58
nodos[58,1]=30 #elemento 59
nodos[59,1]=31 #elemento 60
nodos[60,1]=32 #elemento 61
nodos[61,1]=33 #elemento 62
print("Matriz de incidencia nodal = ",nodos)
[ 5 6]
[ 6 7]
[ 7 8]
[ 8 9]
[ 9 10]
[10 11]
[11 12]
[12 13]
[ 1 14]
[ 2 14]
[ 2 15]
[ 3 15]
[ 4 15]
[ 4 16]
[ 5 16]
[ 6 16]
[ 6 17]
[ 7 17]
[ 8 17]
[ 8 18]
[ 9 18]
[10 18]
[10 19]
[11 19]
[12 19]
[12 20]
[13 20]
[14 21]
[14 22]
[15 22]
[15 23]
[15 24]
Solución del Problema en Phyton
[16 24]
[16 25]
[16 26]
[17 26]
[17 27]
[17 28]
[18 28]
[18 29]
[18 30]
[19 30]
[19 31]
[19 32]
[20 32]
[20 33]
[21 22]
[22 23]
[23 24]
[24 25]
[25 26]
[26 27]
[27 28]
[28 29]
[29 30]
[30 31]
[31 32]
[32 33]]
# Matriz de rigidez global del sistema
k = [Link]((sdof,sdof,nel)) # inicializa matriz con ceros
for e in range(nel):
# matriz de rigidez global para cada elemento
keg,T = Keg(theta_e[e],E,A,Lon[e])
# matriz de grados de libertad para cada elemento
nod_el = nodos[e,:] # nodos de cada elemento
dof1 = nod_el[0]*2-2 # grado de libertad 1
dof2 = nod_el[0]*2-1 # grado de libertad 2
dof3 = nod_el[1]*2-2 # grado de libertad 3
Solución del Problema en Phyton
dof4 = nod_el[1]*2-1 # grado de libertad 4
dof_el = [Link]([dof1,dof2,dof3,dof4],dtype=np.int32) # grados de libertad del elemento en el sistema global
for i in range(dof_el.shape[0]):
for j in range(dof_el.shape[0]):
k[dof_el[i],dof_el[j],e] = keg[i,j]
# Resultado de matriz global
K = [Link](k,axis=2) # superposición de las matrices de cada elemento
print(K)
#print([Link](K,columns=["u1","v1,","u2","v2","u3,","v3","u4","v4"])) # agregar los lrados de libertad que hacen
falta y descomentar esta línea para imprimir la matriz en forma de tabla
[[ 3.20000000e+10 1.95943488e-06 -3.20000000e+10 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
[ 1.95943488e-06 3.20000000e+10 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
[-3.20000000e+10 0.00000000e+00 8.66308345e+10 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
...
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 5.46308345e+10
1.60000000e+10 -1.60000000e+10]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.60000000e+10
1.60000000e+10 -1.60000000e+10]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -1.60000000e+10
-1.60000000e+10 4.80000000e+10]]
# Aplicar restricciones, aplicar fuerzas y determinar los desplazamientos
# definir los grados de libertan restringidos
dof_nr =
[Link]([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65]) # Grados de libertad NO restringidos
dof_r = [Link]([0,1,24,25]) # Grados de libertad restringidos
# restingir matriz
Kr = [Link](K,dof_r,axis=0) # elimina filas restrigidas
Kr = [Link](Kr,dof_r,axis=1) # elimina columnas restringidas
# vector de fuerzas nodales equivalentes
F = [Link](sdof) # inicializa el vector de fuerzas con ceros
Solución del Problema en Phyton
#peso ejercudi por la placa de condreto en el puente para distribuir el peso de los vehiculos uniformemente
"cargas aplicadas en los nodos 1,2,3,4,5,6,7,8,9,10,11,12,13"
F[1] = -6300 -2000
F[3] = -6300 -4000
F[5] = -6300
F[7] = -6300 -1000
F[9] = -6300 -900
F[11] =-6300
F[13] =-6300
F[15] = -6300 -350
F[17] = -6300 -2600
F[19] = -6300 -200
F[21] = -6300 -180
F[23] = -6300 -350
F[25] = -6300
Fr = F[dof_nr] # vector de fuerzas restrigido
# solucional el sistema de ecuaciones lineares
Ur = [Link](Kr,Fr)
# Vector de deformaciones
U = [Link](sdof) # inicializa el vector de deformaciones con ceros
U[dof_nr] = Ur
# Determinar nodales totales incluyendo las reacciones en los apoyos
Ft = [Link](K,U)
Ft[dof_r] = Ft[dof_r] + F[dof_r]
print(Ft,U)
[ 1.32109467e+04 -7.10000000e+03 0.00000000e+00 -9.72800000e+03
7.77516141e+01 -5.06059144e+03 0.00000000e+00 -7.16800000e+03
-1.73786450e+02 -7.05454967e+03 0.00000000e+00 -6.27200000e+03
7.35404952e+00 -6.30000000e+03 -2.32830644e-10 -6.65000000e+03
1.16415322e-10 -8.90000000e+03 -8.00355338e-11 -6.50000000e+03
5.82076609e-11 -6.48000000e+03 3.12500000e-02 -6.65003125e+03
Solución del Problema en Phyton
-7.15169375e+04 -3.87925000e+03 -1.02400000e+03 0.00000000e+00
4.09600000e+03 -4.09600000e+03 5.12000000e+03 1.53600000e+03
-1.31072000e+05 1.31072000e+05 0.00000000e+00 0.00000000e+00
-7.16800000e+03 -1.02400000e+03 1.02404216e+03 -2.33537500e+03
-1.02400000e+03 0.00000000e+00 2.04800000e+03 2.04800000e+03
0.00000000e+00 0.00000000e+00 1.43360000e+04 2.04800000e+03
1.02400000e+03 5.12000000e+02 -5.06880000e+04 -3.35360000e+04
2.62144000e+05 0.00000000e+00 -5.24288000e+05 0.00000000e+00
2.62144000e+05 2.62144000e+05 -5.48809210e+04 5.48809210e+04
2.04800000e+03 -2.04800000e+03 2.12877366e+03 1.96724780e+03
1.96716384e+03 3.68125000e+02] [ 0.00000000e+00 0.00000000e+00 -4.12842084e-07 -4.63742074e-05
-5.11151252e-07 -3.69098752e+08 -6.11890159e-07 -4.57175739e-05
-4.87803638e-07 -5.78995143e+07 -3.58286290e-07 -4.45870639e-05
-3.36134188e-08 -4.41039973e-05 4.87704638e-07 -4.00884332e-05
2.17830347e-06 -3.56473583e-05 4.14702730e-06 5.27812976e-06
3.05189111e-06 -4.88660257e-06 2.15925492e-06 5.58995175e-06
0.00000000e+00 0.00000000e+00 4.56478973e-05 -3.75000000e-08
-3.69098752e+08 -3.69098752e+08 -5.78995143e+07 -5.78995143e+07
2.22868458e-06 -4.14479493e-05 4.71670584e-05 9.89764658e-06
1.52082917e-05 7.67479797e-06 -2.15160622e+04 -2.15160622e+04
4.52480000e-05 -6.40000000e-08 -4.75848319e+08 -4.75848319e+08
-3.69098752e+08 -3.69098752e+08 -3.69098752e+08 -3.69098752e+08
-5.78995143e+07 -5.78995143e+07 -2.56547563e-06 -4.50404336e-05
1.39142197e-05 -4.24057803e-05 8.29779145e+10 8.29779145e+10
7.90663338e-05 1.30397855e-05 3.12003962e-05 1.12239941e-05
1.31202028e-05 9.40820276e-06 -6.48809472e+08 -6.48809472e+08
-2.15160622e+04 -2.15160622e+04]
# Calcular Deformaciones y esfuerzos en cada elemento
Esf_e = [Link](nel)
for e in range(nel):
# matriz de rigidez global para cada elemento
keg,T = Keg(theta_e[e],E,A,Lon[e])
# matriz de grados de libertad para cada elemento
nod_el = nodos[e,:] # nodos de cada elemento
Solución del Problema en Phyton
dof1 = nod_el[0]*2-2
dof2 = nod_el[0]*2-1
dof3 = nod_el[1]*2-2
dof4 = nod_el[1]*2-1
dof_el = [Link]([dof1,dof2,dof3,dof4],dtype=np.int32)
# vector de desplazamiento local por elemento
Ueg = U[dof_el] #vector de desplazamiento global por elemento
Uel = [Link]([Link](T),Ueg) #vector de desplazamiento local por elemento
# vector de deformacion local por elemento
Be = (1/Lon[e])*[Link]([1,0,-1,0]) # funcion de forma
Def_e = [Link](Be,Uel)
# Esfuezos por cada elemento
Esf_e[e] = E*Def_e # esfuerzo en cada elemento en [Pa]
print("Esfuerzo en cada elemento en Pa = ",Esf_e)
Esfuerzo en cada elemento en Pa = [ 1.65136834e+05 3.93236674e+04 4.02955626e+04 -4.96346085e+04
-5.18069391e+04 -1.29869148e+05 -2.08527223e+05 -6.76239533e+05
-7.87489533e+05 4.38054476e+05 3.57054476e+05 8.63701969e+05
-1.50000000e+04 1.84822804e+07 -1.47661799e+20 8.94069672e+04
-1.47661799e+20 -2.31633037e+19 8.94069672e+04 -2.31633037e+19
1.14539005e+06 1.39111832e+06 -3.84587310e+05 1.93360067e+07
2.56068142e+07 1.30679401e+06 2.69199303e+06 6.99124990e+06
5.89772622e+05 -8.60772473e+15 -1.21713228e+16 -1.06000000e+04
-1.90368075e+20 -4.27062758e+19 1.19209290e+05 1.49011612e+05
-1.24498496e+20 1.11758709e+04 2.31633037e+19 -1.67758223e+06
-3.83132382e+05 3.31961788e+22 3.31961788e+22 1.25685558e+06
-2.92850516e+06 3.90885043e+06 6.93361916e+05 -2.59562986e+20
-2.59554378e+20 6.89396984e+03 -2.69180458e+20 6.03866739e+19
1.49011612e+05 1.76040873e+20 3.27529114e+19 1.05386132e+06
4.69393968e+22 -4.69393968e+22 -7.26316557e+05 -7.26316557e+05
-3.67022062e+20 3.67009891e+20]
Link del phyton: [Link]