Spaces:
Sleeping
Sleeping
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() |