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() |