BeamDesign / app.py
jkind's picture
Updated app.py with new features/plots
79e9742
Raw History Blame Contribute Delete
4.02 kB
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 (l1)"),
gr.components.Number(label="Length of span 2 (l2)"),
gr.components.Number(label="Load on span 1 (q1)"),
gr.components.Number(label="Load on span 2 (q2)")
]
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()