File size: 4,024 Bytes
1f74c6c
 
 
 
79e9742
1f74c6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79e9742
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1f74c6c
 
 
 
79e9742
 
1f74c6c
 
79e9742
 
 
 
1f74c6c
 
 
 
79e9742
 
1f74c6c
 
79e9742
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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()