Double_span_beam_app / double_span_beam_analysis.py
jkind's picture
Uploading files
78cf857 verified
import sympy as sp
import numpy as np
import pandas as pd
import gradio as gr
import matplotlib.pyplot as plt
def solve_beam(l1_val, l2_val, q1_val, q2_val):
# Define the variables
Mx, l1, l2, q1, q2 = sp.symbols('Mx l1 l2 q1 q2')
# Equation to solve for Mx
equation = (Mx*l1/3 + q1*l1**3/24 + Mx*l2/3 + q2*l2**3/24)
Mx_solution = sp.solve(equation, Mx)
# Define variables for reactions
VA, VB1, VB2, VC, HA = sp.symbols('VA VB1 VB2 VC HA')
# System of equations for the first span
eq1_span1 = VA + VB1 - q1*l1
eq2_span1 = VB1*l1 - q1*l1**2/2 + Mx_solution[0]
# System of equations for the second span
eq1_span2 = VB2 + VC - q2*l2
eq2_span2 = VB2*l2 - q2*l2**2/2 + Mx_solution[0]
# Solve for the reactions for the first span
reactions_span1 = sp.solve((eq1_span1, eq2_span1), (VA, VB1))
# Solve for the reactions for the second span
reactions_span2 = sp.solve((eq1_span2, eq2_span2), (VB2, VC))
# Define variables for positions on the spans
x1, x2 = sp.symbols('x1 x2')
# Bending moment and shear for the first span
M1_expr = reactions_span1[VA] * x1 - q1 * x1**2 / 2
V1_expr = reactions_span1[VA] - q1 * x1
# Bending moment and shear for the second span
M2_expr = Mx_solution[0] - q2 * x2**2 / 2 + reactions_span2[VB2] * x2
V2_expr = reactions_span2[VB2] - q2 * x2
# Substitute the provided numerical values into the expressions
M1_expr = M1_expr.subs({l1: l1_val, q1: q1_val, l2: l2_val, q2: q2_val})
V1_expr = V1_expr.subs({l1: l1_val, q1: q1_val, l2: l2_val, q2: q2_val})
M2_expr = M2_expr.subs({l1: l1_val, q1: q1_val, l2: l2_val, q2: q2_val})
V2_expr = V2_expr.subs({l1: l1_val, q1: q1_val, l2: l2_val, q2: q2_val})
Mx_value = Mx_solution[0].subs({l1: l1_val, q1: q1_val, l2: l2_val, q2: q2_val})
# Generate numerical values for x1 and x2
x1_vals = np.arange(0, l1_val, 0.1)
x2_vals = np.arange(0, l2_val, 0.1)
# Evaluate M1 and V1 at each x1
M1_vals = [float(M1_expr.subs(x1, val)) for val in x1_vals]
V1_vals = [float(V1_expr.subs(x1, val)) for val in x1_vals]
# Evaluate M2 and V2 at each x2
M2_vals = [float(M2_expr.subs(x2, val)) for val in x2_vals]
V2_vals = [float(V2_expr.subs(x2, val)) for val in x2_vals]
# Create dataframes for beam1 and beam2
beam1 = pd.DataFrame({'x': x1_vals, 'M': M1_vals, 'V': V1_vals})
beam2 = pd.DataFrame({'x': x2_vals + l1_val, 'M': M2_vals, 'V': V2_vals})
# Concatenate beam1 and beam2 into one dataframe
beam = pd.concat([beam1, beam2], ignore_index=True)
return beam
def plot_beam(beam_df):
fig, axs = plt.subplots(2, 1, figsize=(8, 8))
# Plot bending moment
axs[0].plot(beam_df['x'], beam_df['M'], label='Bending Moment (M)')
axs[0].invert_yaxis()
axs[0].set_title('Bending Moment Diagram')
axs[0].set_xlabel('Position along the beam (x)')
axs[0].set_ylabel('Bending Moment (M)')
axs[0].legend()
# Plot shear force
axs[1].plot(beam_df['x'], beam_df['V'], label='Shear Force (V)')
axs[1].invert_yaxis()
axs[1].set_title('Shear Force Diagram')
axs[1].set_xlabel('Position along the beam (x)')
axs[1].set_ylabel('Shear Force (V)')
axs[1].legend()
plt.tight_layout()
return fig
def main(l1, l2, q1, q2):
beam_df = solve_beam(l1, l2, q1, q2)
csv_file = 'beam_analysis.csv'
beam_df.to_csv(csv_file, index=False)
fig = plot_beam(beam_df)
return beam_df, csv_file, fig
inputs = [
gr.components.Number(label="Length of span 1 (l(m)))"),
gr.components.Number(label="Length of span 2 (l2(m))"),
gr.components.Number(label="Load on span 1 (q1(kN/m))"),
gr.components.Number(label="Load on span 2 (q2(kN/m))")
]
outputs = [
gr.components.Dataframe(label="Beam Analysis Data"),
gr.components.File(label="Download CSV"),
gr.components.Plot(label="Bending Moment and Shear Force Diagrams")
]
gr.Interface(fn=main, inputs=inputs, outputs=outputs, title="Beam Analysis Tool").launch()