Contenido bajo licencia Creative Commons BY 4.0 y código bajo licencia MIT. © Juan Gómez y Nicolás Guarín-Zapata 2020. Este material es parte del curso Modelación Computacional en el programa de Ingeniería Civil de la Universidad EAFIT.
En este Notebook se introduce de manera intuitiva el concepto de rigidez mediante el problema simple de un resorte sometido a una carga constante. Posteriormente, la idea se extiende al caso de un sólido (o medio continuo). Luego, se sume que el el sólido está conformado por pedazos triangulares, cada uno de ellos definido por 3 "partículas", conectadas por "resortes". Esta idealización permite representar el sólido como un sistema de partículas conectadas por resortes. Una vez el problema se reduce a un sistema de masas-resortes se hace evidente que la solución de ambos sistemas usa el mismo tipo de algoritmo. En la parte final del Notebook se implementa un programa general para resolver sistemas representados en términos de relaciones fuerza-desplazamiento.
Al completar este notebook usted debería estar en la capacidad de:
Entender el concepto generalizado de rigidez tanto en sistemas continuos como discretos.
Usar razonamientos mecánicos para resolver problemas de equilibrio (estático) conformados por partículas conectadas por resortes.
Reconocer la equivalencia entre el problema de un sólido sometido a cargas externas y el de un sistema de masas-resortes.
Entender los pasos para resolver problemas de sistemas masa-resorte o su equivalente.
El presente notebook esta diseñado para ser usado bajo una metodología de aprendizaje activo y mediante un esquema de clase invertida. El NB está conformado por una parte teórica y una parte computacional. Para poder alcanzar de manera satisfactoria los objetivos de aprendizaje es necesario que antes de la clase presencial el estudiante lea con detalle los contenidos teóricos del NB.
Considere los 2 modelos mostrados en la siguiente figura. El primero corresponde a un resorte de constante k el cual tras ser sometido a la acción de una fuerza externa F experimenta un cambio en su longitud igual a δ. El mismo problema se ilustra en el modelo abstracto de un sólido representado por la "papa" y en el cual la línea continua describe la forma de la "papa" antes de aplicar la fuerza externa F, mientras que la línea punteada describe la forma de la "papa" tras aplicar la fuerza. Los apoyos esquemáticos (de triángulo y rodillo) que se muestran en la figura indican que la "papa" no se podrá desplazar como un cuerpo rígido.
En el resorte se satisface la relación
F=kδy en la cual el coeficiente de rigidez k representa la fuerza necesaria para producir un desplazamiento unitario δ=1.0.
En el caso de la "papa", el problema es mas complejo ya que existen muchas direcciones posibles y puntos en los cuales aplicar las fuerzas y en los cuales medir los desplazamientos. ¿Cómo podemos cuantificar la rigidez para este caso, entonces?
Sea δi el desplazamiento en un punto cualquiera medido en una dirección i y sea Fj la fuerza aplicada en la dirección j también en un punto arbitrario de la "papa". En este caso siguiendo la idea del resorte es posible escribir:
Fj=kδi.Comparando esta relación con la correspondiente al problema del resorte se puede concluir que el coeficiente k representa la fuerza necesaria a lo largo de la dirección j para producir un desplazamiento unitario en la dirección i.
Nótese que si se cambia la dirección en la que se aplica la fuerza y la dirección en la que se mide el desplazamiento es esperable que el coeficiente de rigidez también cambie. Por lo tanto un modelo mas general sería:
Fj=kjiδi.y en el cual los subíndices ij dan cuenta de que el coeficiente de rigidez kij representa la fuerza necesaria a lo largo de la dirección j para producir un desplazamiento unitario en la dirección i.
El modelo propuesto para el caso del sólido es físicamente correcto pero operativamente existen infinitas direcciones posibles i y j y surge entonces la pregunta: ¿cómo cuantificar la rigidez para el caso de la "papa"?
Consideremos algunas posibles soluciones:
Solución discreta: Aproximar el sólido mediante un sistema finito de partículas conectadas por resortes.
Solución del continuo: Estudiar el comportamiento de un elemento diferencial generando un sistema de ecuaciones diferenciales (en las variables ui, ϵij y σij).
Solución numérica: Combinar 1 y 2 para hacer una aproximación discreta del continuo (métodos por elementos finitos). La comparación entre las soluciones 1 y 2 se describe en la siguiente tabla:
Discutir con sus compañeros de grupo las posibles ventajas y desventajas de las soluciones 1 a la 3.
Planteamiento del continuo | Planteamiento discreto |
---|---|
Número infinito de elementos diferenciales. | Número finito de partículas conectadas por resortes. |
Desplazamientos, deformaciones y tensiones. | Desplazamientos y fuerzas. |
La figura muestra nuevamente el problema esquemático de la "papa". Esta ha sido dividida en un numero finito de triángulos conectados en las esquinas. Cada triángulo esta definido por 3 puntos correspondientes a sus vértices. Denominemos un triangulo típico como Ωe. Asuma que cada vértice del triángulo típico Ωe se comporta como una partícula y que esta puede experimentar desplazamientos (y fuerzas) en la dirección horizontal y vertical. Asuma además que para el triángulo típico las 3 partículas que lo definen están conectadas por resortes.
¿Cuántos coeficientes del tipo kij existen para cada triángulo?
Se tiene entonces que para un triangulo típico Ωe es posible relacionar las 6 fuerzas con los 6 desplazamientos mediante una ecuación general como:
Fj=kjiδiy en la cual el término kji representa 36 coeficientes de rigidez. Si se considera que el índice j puede tomar 6 valores correspondientes a 6 fuerzas y que el índice i puede tomar 6 valores correspondientes a 6 desplazamientos entonces se puede reconocer que se tiene un sistema de 6 ecuaciones el cual podemos escribir matricialmente como:
{F}=[K]{u}.De manera similar, es posible anticipar que es posible escribir una relación que considere todos los puntos del dominio. Por ejemplo, si se tienen N puntos en total habrán 2N fuerzas y 2N desplazamientos. Escribamos la relación entre fuerzas y desplazamientos para todo el sólido (representado por N puntos) como:
FGj=kGjiδi.En esta relación hemos usado el superíndice G para enfatizar que las fuerzas, desplazamientos y coeficientes de rigidez corresponden a toda el sólido y no a un elemento típico. En forma matricial se tiene:
{FG}=[KG]{UG}.¿Cuántos coeficientes del tipo kij existen para todo el sólido si este esta representado por N puntos?
El superínidce G también indica que las ecuaciones son válidas para todo el sistema global representado por todos los triángulos en los que ha sido dividido el sólido.
Si el sólido se divide en M triángulos unidos a través de un total de N vértices, ¿cuántos desplazamientos del tipo δi hay en el sistema?
Si el sólido se divide en M triángulos unidos a través de un total de N vértices, ¿cuántas fuerzas del tipo FGj hay en el sistema?
De acuerdo con la discusión anterior, tanto el equilibrio de un triángulo típico Ωe como el de un resorte pueden formularse mediante una relación fuerza-desplazamiento de la forma:
{F}=[K]{u}.En el caso del resorte es sencillo determinar la matriz de rigidez [K].
En el caso del sólido el problema es un poco más elaborado y por el momento nos conformaremos con suponer que esta matriz se encuentra disponible. En cualquier caso, sea que se trata de un sistema de partículas conectadas por resortes, o un sólido representado por triángulos, el problema se resuelve ensamblando la matriz de rigidez global [KG] y resolviendo el sistema de ecuaciones:
{FG}=[KG]{UG}.En la siguiente sección se discute con más detalle el problema usando un sistema de partículas unidas por resortes y se implementa su solución en el computador.
La siguiente actividad permite entender desde un punto de vista físico el proceso de solución del problema de varias partículas interactuando a través de un sistema de resortes como el que se muestra en la figura.
El sistema de varias partículas se encuentra conectado por resortes con coeficiente de rigidez k. El sistema se encuentra sometido a diferentes fuerzas externas (representadas en múltiplos de P). Por efectos de visualización las partículas se representan como carritos rectangulares.
Se requiere:
Enumerar las partículas y resortes del sistema. (Asumir el empotramiento como una partícula).
Escribir las ecuaciones de equilibrio para cada una de las 4 partículas.
Usando las relaciones fuerza-desplazamiento de los diferentes resortes re-escribir las ecuaciones del numeral 4.
En la solución del problema anterior se usaron planteamientos mecánicos para formular las ecuaciones de equlibrio del sistema de partículas. Consideremos ahora su solución de una manera sistemática de tal forma que el problema se pueda codificar en un programa general de análisis estructural.
Considere el siguiente sistema de 3 partículas, las cuales están conectadas por resortes i e i+1 con coeficientes de rigidez Ki y Ki+1. De manera similar, las partículas tienen asignados los nombres j−1, j y j+1 y sus respectivos desplazamientos se denotan por uj−1, uj y uj+1.
Escribamos las ecuaciones de equilibrio para los resortes i e i+1 en términos de los desplazamientos uj−1, uj y uj+1 como:
{fi1fi2}=[ki11ki12ki21ki22]{uj−1uj},y
{fi+11fi+12}=[ki+111ki+112ki+121ki+122]{ujuj+1}.Note que hemos usado notación fila-columna en los índices para los coeficientes de rigidez para simplificar su implementación en el computador.
Asumiendo que la partícula j se encuentra sometida a una carga externa P, se tiene, de su diagrama de cuerpo libre, que:
ki21uj−1+(ki22+ki+111)uj+ki+112uj+1=Pj.Procediendo de manera similar para las partículas j−1 y j+1 y considerando la contribución de los resortes Ki y Ki+1 obtenemos el siguiente bloque del sistema completo de ecuaciones:
[ki11ki120ki21ki22+ki+111ki+1120ki+121ki+122].Al considerar el sistema completo de partículas y resortes se obtiene un sistema de ecuaciones lineales de la forma general:
[KG]{UG}={FG}.En este sistema cada ecuación representa el equilibrio de una partícula.
La construcción de las matrices globales que describen el equilibrio de cada masa (o partícula) en el sistema puede programarse en el computador mediante un algoritmo que considere el aporte (en términos de fuerzas) de cada elemento (o resorte).
En Mecánica Computacional, a este proceso se le denomina como Ensamblaje de las ecuaciones globales. La operación de ensamblaje puede realizarse después de identificar la conexión entre los (desplazamientos o) grados de libertad globales y los (desplazamientos o) grados de libertad locales mediante una matriz que almacena en cada fila los identificadores de los grados de libertad globales asociados a cada elemento.
Por ejemplo, en el sistema de 3-partículas los resortes i y i+1 tienen como desplazamientos de sus extremos los denotados como uj−1 y uj y uj y uj+1. Dichos índices contienen toda la información necesaria para realizar el ensamblaje. La matriz que almacena los indices globales para todos los elementos en el modelo es la matriz DME
dada por:
Nótese que en esta matriz los datos de la primera fila mostrada son j−1 y j, los cuales corresponden a los identificadores de los grados de libertad asociados con el resorte i. De la misma manera los datos de la segunda fila mostrada son j y j+1 los cuales corresponden a los identificadores de los grados de libertad asociados con el resorte i+1.
Una vez se tiene disponible la matriz DME
, el proceso de ensamblaje se realiza como se describe a continuación:
y
Kj,j←Kj,j+ki+111Kj,j+1←Kj,j+1+ki+112Kj+1,j←Kj+1,j+ki+121Kj+1,j+1←Kj+1,j+1+ki+122Note la conexión entre los índices locales, correspondientes a 1 y 2, y las posiciones en la matriz global, correspondientes a j−1, j y j+1.
De las secciones anteriores se concluye que el problema de equilibrio se resuelve tras ensamblar la contribución de cada resorte (o triángulo) en una matriz de rigidez global. En esta sección discutimos su solución en el computador. Para definir el modelo usaremos archivos de texto en los cuales indicaremos al programa las partículas que lo conforman, los resortes del sistema y su conexión con las partículas, la localización de las cargas externas y las propiedades de los resortes.
Inicialmente se describen las rutinas o funciones que conforman el programa y en la parte final estas son llamadas desde el programa principal.
El programa principal ejecuta los siguientes pasos:
Lee el modelo.
Calcula la matriz DME
.
Ensambla el sistema global de ecuaciones.
Resuelve el sistema para determinar los desplazamientos globales UG.
(Los archivos de texto con los datos de entrada para las partículas, elementos, coeficientes de rigidez y cargas de este problema están almacenados en la carpeta files
de este repositorio).
import numpy as np
La rutina readin()
lee los archivos de entrada que se encuentran en la carpeta files
del respositorio y que deben ser almacenados localmente bajo esta misma estructura.
def readin():
nodes = np.loadtxt('files/sprnodes.txt', ndmin=2)
mats = np.loadtxt('files/sprmater.txt', ndmin=2)
elements = np.loadtxt('files/spreles.txt' , ndmin=2, dtype=np.int)
loads = np.loadtxt('files/sprloads.txt', ndmin=2)
return nodes, mats, elements, loads
En el archivo de noos, en el cual se almacena la información de cada partícula, hay un código con valor −1 o 0 indicando si la partícula se encuentra restringida (como en el empotramiento) o libre. Con esa información la rutina eqcounter()
asigna identificadores de grados de libertad o números de ecuaciones a cada una de las partículas declaradas como libres.
def eqcounter(nodes):
nn = nodes.shape[0]
IBC = np.zeros((nn, 1), dtype=np.integer)
neq = 0
for cont in range(nn):
IBC[cont] = int(nodes[cont, 2])
if IBC[cont] == 0:
IBC[cont] = neq
neq = neq + 1
return neq, IBC
El numero de ecuación asignado a cada partícula es usado ahora para formar la matriz DME
. Cada fila de esta matriz contiene los identificadores de los desplazamientos de los extremos del resorte.
def DME(nodes, elements):
nels = elements.shape[0]
DME_mat = np.zeros((nels, 2), dtype=np.integer)
neq, IBC = eqcounter(nodes)
ndof = 2
nnodes = 2
for ele in range(nels):
for node in range(nnodes):
pos = elements[ele, node + 3]
DME_mat[ele, node] = IBC[pos]
return DME_mat, IBC, neq
Usando la matriz DME
es posible ensamblar la matriz global de coeficientes de rigidez en términos de ecuaciones como:
def assembly(elements, mats, nodes, neq, DME_mat):
IELCON = np.zeros([2], dtype=np.integer)
KG = np.zeros((neq, neq))
nels = elements.shape[0]
nnodes = 2
ndof = 2
for el in range(nels):
elcoor = np.zeros((nnodes))
im = np.int(elements[el, 2])
par = mats[im]
for j in range(nnodes):
IELCON[j] = elements[el, j+3]
elcoor[j] = nodes[IELCON[j], 1]
kloc = uelspring(par[0])
dme = DME_mat[el, :ndof]
for row in range(ndof):
glob_row = dme[row]
if glob_row != -1:
for col in range(ndof):
glob_col = dme[col]
if glob_col != -1:
KG[glob_row, glob_col] = KG[glob_row, glob_col] +\
kloc[row, col]
return KG
La función uelspring
calcula la matriz de rigidez de un resorte típico, mientras que la función loadassem
ensambla el vector de cargas externas aplicadas sobre las partículas.
def uelspring(kcof):
"""
Esta rutina calcula la matriz de rigidez para
un elemento tipo resorte conformado por 2 nodos.
Parámetros
----------
kcof : float
Coeficiente de rigidez del resorte (>0).
Retorna
-------
kloc : ndarray
Matriz de coeficientes de rigidez local para
el elemento tipo resorte (2, 2).
"""
kloc = np.array([
[kcof, -kcof],
[-kcof, kcof]])
return kloc
def loadasem(loads, IBC, neq, nl):
"""
Ensambla el vector de cargas o de valores conocidos
en el sistema global de ecuaciones.
Parámetros
----------
loads : ndarray
Arreglo con las cargas impuestas a las partículas.
IBC : ndarray (int)
Arreglo que almacena el identificador de grado de libertad
a cada partícula.
neq : int
Numero de ecuaciones en el sistema.
nl : int
Numero de cargas en el sistema.
Retorna
-------
rhs_glob : ndarray
Arreglo con las cargas impuestas a las partículas,
rhs se refiere a lado derecho (del inglés right-hand-side).
"""
rhs_glob = np.zeros((neq))
for cont in range(nl):
il = int(loads[cont, 0])
ilx = IBC[il]
if ilx != -1:
rhs_glob[ilx] = loads[cont, 1]
return rhs_glob
nodes, mats, elements, loads = readin()
DME, IBC, neq = DME(nodes, elements)
KG = assembly(elements, mats, nodes, neq, DME)
RHSG = loadasem(loads, IBC, neq, 3)
UG = np.linalg.solve(KG, RHSG)
print(UG)
[0.002 0.0025 0.0045]
Usando los desplazamientos encontrados en la solución del sistema determine las fuerzas resultantes en cada resorte e indique que elementos están a compresión y que elementos están a tensión.
Usando las fuerzas encontradas en el paso anterior verifique el equilibrio del sistema.
Libere el punto correspondiente al empotramiento y calcule nuevamente la solución. Discuta sus resultados.
Resuelva nuevamente el sistema haciendo la rigidez del resorte mas a la derecha igual a 5k. Discuta como varían las fuerzas internas en comparación con las del sistema original.
Coeficiente de rigidez: Fuerza experimentada por un resorte empotrado en su extremo y sometido en su extremo opuesto a un desplazamiento unitario.
Matriz de rigidez: Matriz cuyos elementos son coeficientes de rigidez relacionando las fuerzas y los desplazamientos de un sistema de partículas.
Sistema discreto: Sistema mecánico cuyas ecuaciones de equilibrio son representables de manera directa mediante relaciones fuerza-desplazamiento por medio de una matriz de rigidez.
Sistema continuo: Sistema mecánico cuyas ecuaciones de equilibrio corresponden a ecuaciones diferenciales parciales que se satisfacen sobre el dominio del sistema.
Ensamblaje: Operación mediante la cual se considera el aporte de un sistema de resortes a la rigidez de todo el sistema.
La siguiente celda cambia el formato del Notebook.
from IPython.core.display import HTML
def css_styling():
styles = open('./nb_style.css', 'r').read()
return HTML(styles)
css_styling()