Solving Beam Bending Problems using Singularity Functions

To make this document easier to read, we are going to enable pretty printing.

>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>> init_printing(use_unicode=True, wrap_line=False)

Beam

A Beam is a structural element that is capable of withstanding load primarily by resisting against bending. Beams are characterized by their second moment of area, their length and their elastic modulus.

In Sympy, we can construct a 2D beam objects with the following properties :

  • Length

  • Elastic Modulus

  • Second Moment of Area

  • Variable : A symbol that can be used as a variable along the length. By default, this is set to Symbol(x).

  • Boundary Conditions
    • bc_slope : Boundary conditions for slope.
    • bc_deflection : Boundary conditions for deflection.
  • Load Distribution

We have following methods under the beam class:

  • apply_load
  • solve_for_reaction_loads
  • shear_force
  • bending_moment
  • slope
  • deflection

Examples

Let us solve some beam bending problems using this module :

Example 1

A beam of length 9 meters is having a fixed support at the start. A distributed constant load of 8 kN/m is applied downward from the starting point till 5 meters away from the start. A clockwise moment of 50 kN-m is applied at 5 meters away from the start of the beam. A downward point load of 12 kN is applied at the end.

Note

Since a user is free to choose its own sign convention we are considering the upward forces and clockwise bending moment being positive.

>>> from sympy.physics.continuum_mechanics.beam import Beam
>>> from sympy import symbols
>>> E, I = symbols('E, I')
>>> R1, M1 = symbols('R1, M1')
>>> b = Beam(9, E, I)
>>> b.apply_load(R1, 0, -1)
>>> b.apply_load(M1, 0, -2)
>>> b.apply_load(-8, 0, 0, end=5)
>>> b.apply_load(50, 5, -2)
>>> b.apply_load(-12, 9, -1)
>>> b.bc_slope.append((0, 0))
>>> b.bc_deflection.append((0, 0))
>>> b.solve_for_reaction_loads(R1, M1)
>>> b.reaction_loads
    {M₁: -258, R₁: 52}
>>> b.load
             -2         -1        0             -2            0             -1
    - 258⋅<x>   + 52⋅<x>   - 8⋅<x>  + 50⋅<x - 5>   + 8⋅<x - 5>  - 12⋅<x - 9>
>>> b.shear_force()
             -1         0        1             -1            1             0
    - 258⋅<x>   + 52⋅<x>  - 8⋅<x>  + 50⋅<x - 5>   + 8⋅<x - 5>  - 12⋅<x - 9>
>>> b.bending_moment()
             0         1        2             0            2             1
    - 258⋅<x>  + 52⋅<x>  - 4⋅<x>  + 50⋅<x - 5>  + 4⋅<x - 5>  - 12⋅<x - 9>
>>> b.slope()
                                3                          3
             1         2   4⋅<x>              1   4⋅<x - 5>             2
    - 258⋅<x>  + 26⋅<x>  - ────── + 50⋅<x - 5>  + ────────── - 6⋅<x - 9>
                             3                        3
    ─────────────────────────────────────────────────────────────────────
                                     E⋅I
>>> b.deflection()
                       3      4                        4
             2   26⋅<x>    <x>              2   <x - 5>             3
    - 129⋅<x>  + ─────── - ──── + 25⋅<x - 5>  + ──────── - 2⋅<x - 9>
                    3       3                      3
    ─────────────────────────────────────────────────────────────────
                                   E⋅I

Example 2

There is a beam of length 30 meters. A moment of magnitude 120 Nm is applied in the clockwise direction at the end of the beam. A pointload of magnitude 8 N is applied from the top of the beam at the starting point. There are two simple supports below the beam. One at the end and another one at a distance of 10 meters from the start. The deflection is restricted at both the supports.

Note

Using the sign convention of upward forces and clockwise moment being positive.

>>> from sympy.physics.continuum_mechanics.beam import Beam
>>> from sympy import symbols
>>> E, I = symbols('E, I')
>>> R1, R2 = symbols('R1, R2')
>>> b = Beam(30, E, I)
>>> b.apply_load(-8, 0, -1)
>>> b.apply_load(R1, 10, -1)
>>> b.apply_load(R2, 30, -1)
>>> b.apply_load(120, 30, -2)
>>> b.bc_deflection.append((10, 0))
>>> b.bc_deflection.append((30, 0))
>>> b.solve_for_reaction_loads(R1, R2)
>>> b.reaction_loads
    {R₁: 6, R₂: 2}
>>> b.load
           -1             -1               -2             -1
    - 8⋅<x>   + 6⋅<x - 10>   + 120⋅<x - 30>   + 2⋅<x - 30>
>>> b.shear_force()
           0             0               -1             0
    - 8⋅<x>  + 6⋅<x - 10>  + 120⋅<x - 30>   + 2⋅<x - 30>
>>> b.bending_moment()
           1             1               0             1
    - 8⋅<x>  + 6⋅<x - 10>  + 120⋅<x - 30>  + 2⋅<x - 30>
>>> b.slope()
           2             2               1           2   4000
    - 4⋅<x>  + 3⋅<x - 10>  + 120⋅<x - 30>  + <x - 30>  + ────
                                                          3
    ─────────────────────────────────────────────────────────
                               E⋅I
>>> b.deflection()
                  3                                      3
    4000⋅x   4⋅<x>            3              2   <x - 30>
    ────── - ────── + <x - 10>  + 60⋅<x - 30>  + ───────── - 12000
      3        3                                     3
    ──────────────────────────────────────────────────────────────
                                 E⋅I

Example 3

A beam of length 6 meters is having a roller support at the start and a hinged support at the end. A clockwise moment of 1.5 kN-m is applied at the mid of the beam. A constant distributed load of 3 kN/m and a ramp load of 1 kN/m is applied from the mid til the end of the beam.

Note

Using the sign convention of upward forces and clockwise moment being positive.

>>> from sympy.physics.continuum_mechanics.beam import Beam
>>> from sympy import symbols
>>> E, I = symbols('E, I')
>>> R1, R2 = symbols('R1, R2')
>>> b = Beam(6, E, I)
>>> b.apply_load(R1, 0, -1)
>>> b.apply_load(1.5, 3, -2)
>>> b.apply_load(-3, 3, 0)
>>> b.apply_load(-1, 3, 1)
>>> b.apply_load(R2, 6, -1)
>>> b.bc_deflection.append((0, 0))
>>> b.bc_deflection.append((6, 0))
>>> b.solve_for_reaction_loads(R1, R2)
>>> b.reaction_loads
    {R₁: 2.75, R₂: 10.75}
>>> b.load
            -1              -2            0          1                -1
    2.75⋅<x>   + 1.5⋅<x - 3>   - 3⋅<x - 3>  - <x - 3>  + 10.75⋅<x - 6>
>>> b.shear_force()
                                                    2
            0              -1            1   <x - 3>                 0
    2.75⋅<x>  + 1.5⋅<x - 3>   - 3⋅<x - 3>  - ──────── + 10.75⋅<x - 6>
                                                2
>>> b.bending_moment()
                                        2          3
            1              0   3⋅<x - 3>    <x - 3>                 1
    2.75⋅<x>  + 1.5⋅<x - 3>  - ────────── - ──────── + 10.75⋅<x - 6>
                                   2           6
>>> b.slope()
                                       3          4
             2              1   <x - 3>    <x - 3>                 2
    1.375⋅<x>  + 1.5⋅<x - 3>  - ──────── - ──────── + 5.375⋅<x - 6>  - 15.6
                                   2          24
    ───────────────────────────────────────────────────────────────────────
                                      E⋅I
>>> b.deflection()
                                                              4          5
                                   3               2   <x - 3>    <x - 3>                            3
    -15.6⋅x + 0.458333333333333⋅<x>  + 0.75⋅<x - 3>  - ──────── - ──────── + 1.79166666666667⋅<x - 6>
                                                          8         120
    ──────────────────────────────────────────────────────────────────────────────────────────────────
                                                   E⋅I