0% encontró este documento útil (0 votos)
66 vistas12 páginas

Análisis de Armaduras con Python

El documento presenta la solución de un problema de análisis estructural mediante el método de los elementos finitos en Python. Se enumeran los nodos y elementos de la estructura, se define la matriz de rigidez de cada elemento y la matriz de rigidez global del sistema mediante ensamblaje. Finalmente, se genera la matriz de incidencia nodal que relaciona los nodos de cada elemento con los del sistema completo.

Cargado por

Leonardo
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
66 vistas12 páginas

Análisis de Armaduras con Python

El documento presenta la solución de un problema de análisis estructural mediante el método de los elementos finitos en Python. Se enumeran los nodos y elementos de la estructura, se define la matriz de rigidez de cada elemento y la matriz de rigidez global del sistema mediante ensamblaje. Finalmente, se genera la matriz de incidencia nodal que relaciona los nodos de cada elemento con los del sistema completo.

Cargado por

Leonardo
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

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]

También podría gustarte