III. Post-Procesamiento y Resultados 📊 #
Una vez que hemos resuelto el sistema reducido \(\mathbf{K}_{\text{red}} \mathbf{u}_{\text{inc}} = \mathbf{f}_{\text{inc}}\) y hemos encontrado los desplazamientos desconocidos (\(\mathbf{u}_{\text{inc}}\)), el vector de desplazamientos global \(\mathbf{u}\) está completo (conteniendo \(\mathbf{u}_{\text{inc}}\) y \(\mathbf{u}_R\)). La etapa de post-procesamiento utiliza este vector \(\mathbf{u}\) para calcular las fuerzas que son de interés estructural: las reacciones y las fuerzas internas de cada elemento.
1. Cálculo de Reacciones de Apoyo ↩️ #
Las reacciones son las fuerzas que los soportes ejercen sobre la estructura para mantenerla en equilibrio. Estas fuerzas son incógnitas ubicadas en los Grados de Libertad (GDL) que fueron restringidos (\(\mathbf{u}_R\)), es decir, donde el desplazamiento es conocido (usualmente cero).
Desarrollo Matemático #
El vector de fuerzas global \(\mathbf{f}\) contiene tanto las cargas aplicadas en los GDL libres (\(\mathbf{f}_L\)) como las reacciones desconocidas en los GDL restringidos (\(\mathbf{f}_R\)).
Utilizamos la segunda fila del sistema de ecuaciones particionado (visto en la Sección II):
$$\mathbf{K}_{RL} \mathbf{u}_L + \mathbf{K}_{RR} \mathbf{u}_R = \mathbf{f}_R$$Donde:
- \(\mathbf{K}_{RL}\) y \(\mathbf{K}_{RR}\) son submatrices extraídas de la matriz \(\mathbf{K}\) ensamblada.
- \(\mathbf{u}_L\) es el vector de desplazamientos libres (calculados en la Sección II).
- \(\mathbf{u}_R\) es el vector de desplazamientos restringidos (conocidos, generalmente \(\mathbf{0}\)).
- \(\mathbf{f}_R\) es el vector de reacciones incógnitas (nuestro objetivo).
Dado que \(\mathbf{u}_L\) es conocido, y \(\mathbf{u}_R = \mathbf{0}\) para apoyos fijos o de rodillo no asentados, la ecuación se simplifica a:
$$\mathbf{f}_R = \mathbf{K}_{RL} \mathbf{u}_L$$Conclusión: Las reacciones son simplemente el producto de la submatriz \(\mathbf{K}_{RL}\) por los desplazamientos libres \(\mathbf{u}_L\).
2. Cálculo de Fuerzas Internas y Esfuerzos 🛡️ #
Las fuerzas internas son las tensiones (o compresiones) que cada elemento debe soportar.
Desarrollo Matemático #
El cálculo se realiza en el sistema de coordenadas local del elemento, ya que allí el estado de esfuerzo es axial puro.
- Obtener Desplazamientos Globales del Elemento (\(\mathbf{U}\)): Extraer los 4 componentes de \(\mathbf{u}\) global que corresponden a los nudos del elemento.
- Transformar a Desplazamientos Locales (\(\mathbf{u}'\)): Se utiliza la matriz de transformación \(\mathbf{T}\) (vista en la Sección I): $$\mathbf{u}' = \mathbf{T} \mathbf{U}$$
- Calcular la Deformación (\(\delta\)): Para el elemento de barra axial, la deformación total \(\delta\) es la diferencia de los desplazamientos axiales locales: $$\delta = u'_2 - u'_1$$
- Calcular la Fuerza Axial (\(P\)): Utilizando la Ley de Hooke aplicada a la barra: $$P = \frac{AE}{L} \cdot \delta$$ Un valor de \(P\) positivo indica tensión (tracción); un valor negativo indica compresión.
Cálculo de Esfuerzo (Stress) #
El esfuerzo \(\sigma\) es la fuerza por unidad de área, que es un valor crucial para el diseño:
$$\sigma = \frac{P}{A}$$3. Ejercicio Demostrativo en Python (Continuación) 💻 #
Continuaremos con el ejercicio de la armadura simple de 2 barras de la Sección II, donde ya calculamos \(\mathbf{u}_{\text{inc}} = [U_{2x}, U_{2y}]\).
[El mismo diagrama de armadura simple: Nudo 1 fijo (GDL 0, 1), Nudo 2 libre (GDL 2, 3), Nudo 3 fijo (GDL 4, 5). Cargas \(F_x, F_y\) en Nudo 2.]
Objetivos del Código:
- Reconstruir el vector \(\mathbf{u}\) global completo.
- Calcular las reacciones \(\mathbf{f}_R\) (GDL 0, 1, 4, 5).
- Calcular las fuerzas internas \(P_1\) y \(P_2\).
# --- Continuación del Ejercicio Demostrativo de la Sección II ---
# Se asume que K_global_ensamblada (6x6), u_inc, A, E, L1, L2, theta1_deg, theta2_deg ya están definidos.
# Definición de GDL (índices 0-based)
gdl_libres = [2, 3]
gdl_restringidos = [0, 1, 4, 5]
# 1. Reconstrucción del Vector de Desplazamientos Global (u)
u_global = np.zeros(6)
# Colocamos los desplazamientos incógnitos (calculados previamente) en las posiciones libres
u_global[gdl_libres] = u_inc
print("\n--- Desplazamientos Globales u ---")
print(u_global) # u_global = [0, 0, U_2x, U_2y, 0, 0]
# 2. Cálculo de Reacciones (f_R)
# Extraer submatrices necesarias: K_RL (4x2)
# K_RL: Filas restringidas, Columnas libres
K_RL = K_global_ensamblada[np.ix_(gdl_restringidos, gdl_libres)]
# El vector u_R = 0, por lo que f_R = K_RL * u_L
f_reacciones = K_RL @ u_inc
print("\n--- Reacciones de Apoyo f_R (N) ---")
print(f"GDL 0 (R_1x): {f_reacciones[0]:.2f} N")
print(f"GDL 1 (R_1y): {f_reacciones[1]:.2f} N")
print(f"GDL 4 (R_3x): {f_reacciones[2]:.2f} N")
print(f"GDL 5 (R_3y): {f_reacciones[3]:.2f} N")
# 3. Cálculo de Fuerzas Internas (P)
def calcular_fuerza_interna(u_global, A, E, L, theta_deg, gdl_elem):
"""Calcula la fuerza axial P y el esfuerzo sigma para un elemento."""
# 3.1 Obtener sub-vector de desplazamientos globales (4x1)
U_elem = u_global[gdl_elem]
# 3.2 Matriz de Transformación (T)
theta_rad = np.radians(theta_deg)
c = np.cos(theta_rad)
s = np.sin(theta_rad)
T = np.array([
[c, s, 0, 0],
[0, 0, c, s]
])
# 3.3 Transformar a desplazamientos locales u' = T @ U
u_local = T @ U_elem
# 3.4 Calcular Deformación y Fuerza Axial
delta = u_local[1] - u_local[0] # delta = u'_2 - u'_1
P = (A * E / L) * delta
sigma = P / A
return P, sigma
# Barra 1 (GDL: 0, 1, 2, 3)
P1, sigma1 = calcular_fuerza_interna(u_global, A, E, L1, theta1_deg, [0, 1, 2, 3])
# Barra 2 (GDL: 4, 5, 2, 3 - El orden de Nudo Inicial/Final debe ser consistente con la definición de theta)
# Usamos el orden [4, 5, 2, 3] que corresponde a Nudo 3 (inicial) y Nudo 2 (final)
P2, sigma2 = calcular_fuerza_interna(u_global, A, E, L2, theta2_deg, [4, 5, 2, 3])
print("\n--- Fuerzas Internas y Esfuerzos ---")
print(f"Barra 1 (P1): {P1:.2f} N \t| Esfuerzo (sigma1): {sigma1:.2e} Pa")
print(f"Barra 2 (P2): {P2:.2f} N \t| Esfuerzo (sigma2): {sigma2:.2e} Pa")
4. Ejercicios Propuestos 📝 #
- Concepto de Reacción: ¿Cuál es el significado físico de un valor de reacción \(\mathbf{f}_R\) positivo en la dirección \(Y\)?
- Partición: Si en un sistema de 8 GDL, los GDL 1, 2, 5 y 6 están restringidos, ¿cuáles son las dimensiones de la submatriz \(\mathbf{K}_{RL}\)?
- Cálculo de Reacciones: Si \(\mathbf{K}_{RL}\) es \(\begin{pmatrix} 10 & 0 \\ 0 & 20 \end{pmatrix}\) y \(\mathbf{u}_L = \begin{pmatrix} 0.003 \\ -0.001 \end{pmatrix}\) (unidades compatibles), calcula el vector de reacciones \(\mathbf{f}_R\).
- Fuerzas Internas: Si la deformación \(\delta\) de una barra es \(-0.002\) metros, ¿la barra está en tracción o compresión?
- Unidades: Si la matriz \(\mathbf{K}\) está en \(N/m\), y \(\mathbf{u}\) está en \(m\), ¿cuáles son las unidades de las fuerzas internas \(P\) y el esfuerzo \(\sigma\)?
- Programación: Verifica el equilibrio global sumando las reacciones \(R_{1x}, R_{3x}\) y comparándolas con la carga aplicada \(F_x\). (Sugerencia: \(\sum F_x = 0\))
- Programación: Utiliza los resultados del ejercicio demostrativo y calcula \(\mathbf{f}_L\) para verificar si \(\mathbf{f}_L\) es igual a las cargas aplicadas. (Debería serlo si el cálculo fue correcto).
- Concepto de Deformación: Si una barra tiene \(\theta = 0^\circ\) (horizontal), ¿cómo se simplifica la relación \(\delta = u'_2 - u'_1\) en términos de los desplazamientos globales \(U_{x}\) y \(U_{y}\)?
- Desafío de Transformación: Si una barra tiene \(\theta = 90^\circ\) (vertical), ¿cómo se relaciona la deformación \(\delta\) con los desplazamientos globales \(U_{y}\)? Escríbelo.
- Condición de Borde Especial: Si el Nudo 3 de la armadura tuviera un asentamiento impuesto \(\mathbf{u}_{3y} = -0.001 \, \text{m}\) (es decir, \(U_{3y}\) ahora es conocido pero no nulo), ¿cómo cambia el cálculo de reacciones \(\mathbf{f}_R\)? Escribe la fórmula modificada.
- Programación: Escribe una función Python
calcular_esfuerzo(P, A)que devuelva el esfuerzo \(\sigma\) y determine si es Tracción o Compresión. - Programación: Modifica el código del ejercicio demostrativo para una armadura donde la Barra 1 está a \(90^\circ\) (\(L_1 = H\)) y la Barra 2 a \(180^\circ\) (\(L_2 = L\)). Calcula \(P_1\) y \(P_2\).
- Concepto: Explica por qué el cálculo de \(\mathbf{f}_R\) solo requiere la submatriz \(\mathbf{K}_{RL}\) y no \(\mathbf{K}_{RR}\).
- Interpretación: Si \(P_1\) resulta ser \(-5000 \, N\), y \(P_2\) resulta ser \(5000 \, N\), ¿cómo deben ser las magnitudes de los esfuerzos \(\sigma_1\) y \(\sigma_2\) si ambas barras tienen el mismo \(A\)?
- Desafío de Reacción: ¿Cuál es el significado de calcular \(\mathbf{K}_{RR} \mathbf{u}_R\)? ¿A qué parte del equilibrio corresponde?
- Concepto: En el cálculo de las fuerzas internas, ¿por qué es necesario transformar los desplazamientos globales (\(\mathbf{U}\)) a locales (\(\mathbf{u}'\)) antes de calcular la deformación (\(\delta\))?
- Programación: Generaliza la función
calcular_fuerza_internapara que acepte una lista de barras (con sus propiedades) y devuelva una lista de fuerzas axiales \(P\). - Cálculo Rápido: Una barra con \(AE/L = 10 \times 10^6 \, N/m\). El Nudo 1 se mueve \(0.005 \, m\) y el Nudo 2 se mueve \(0.007 \, m\) (ambos en la dirección axial local). Calcula \(P\).
- Concepto: Si las reacciones calculadas no satisfacen \(\sum F_x = 0\) o \(\sum F_y = 0\), ¿dónde es más probable que haya ocurrido un error en el proceso matricial?
- Concepto: En el contexto de un diseño estructural, ¿qué resultado (desplazamientos \(\mathbf{u}\), reacciones \(\mathbf{f}_R\) o esfuerzos \(\sigma\)) utilizarías para determinar el tamaño mínimo de los pernos de conexión y por qué?