10  Equilibrium Examples

10.1 Equilibrium: Example 1

10.1.1 Problem formulation

The beam is supported at A with rotational joints and a wire at B. The beam has a mass of \(m=475\) kg. There is also a force acting on the hook as shown in the figure.

Figure of the problem.

10.1.2 Do the following:

  • Create a free body diagram of the beam shown in the figure, with all applied forces and reaction forces.
  • Define the force vectors, select a point to define moments around, and define the moments.
  • Calculate the reaction forces at A and the magnitude of the force in the wire connected at B.
  • Create a plot:
    • draw the origin, the beam, all points of interest with both markers and text.
    • plot the force vectors
  • Let the connection of the wire vary along the length of the beam between A and B and plot the magnitude of the wire force and reaction forces for all wire positions.

10.1.3 Solution steps

We start by selecting a point for our moments to be calculated around. In this case we select the center of the leftmost end of the beam and call that point O.

Then we create the necessary vectors between different points and how they relate to each other. We also name the points according the the figure below.

We can then define our force vectors and formulate our equations of equilibrium.

10.1.4 Paperwork

Free body diagram with names of all points and vectors.

Equilibrium equations.

10.1.5 Define the force vectors

Constants

### Input
g = 9.81 # [m/s^2]
m = 475 # [kg]

We model the placement of B with a symbolic parameter \(r_{OBx}\) and then procede to create the vectors from O to the points of interest according to the figure.

\[ \mathbb{r}_{OB} = \begin{bmatrix} r_{OBx}\\ 0.25\\ 0 \end{bmatrix} \]

The y-coordinate of D can be calculated with

\[ r_{ODy} = 5\tan 25^\circ \]

Code
r_OBx = sp.symbols("r_OBx", real=True, positive=True)

rr_OA = sp.Matrix([0.12, 0, 0])
rr_OG = sp.Matrix([2.5, 0, 0])
rr_OC = sp.Matrix([3.5, -0.25, 0])
rr_OB = sp.Matrix([r_OBx, 0.25, 0])

r_ODy = np.tan(25*np.pi/180)*5
rr_OD = sp.Matrix([0, r_ODy, 0])

The direciton for the wire and thus the wire force, \(\mathbb{F}_B\), can be calculated in the following way: \[ \mathbb{r}_{BD} = \mathbb{r}_{OD} - \mathbb{r}_{OB} \]

and

\[ \mathbb{e}_{BD} = \frac{\mathbb{r}_{BD}}{||\mathbb{r}_{BD}||} \]

Code
# Direction of the wire force
rr_BD = rr_OD - rr_OB
ee_BD = rr_BD.normalized()

When it comes to the forces, we define the force vectors using the definitions from the free body diagram created earlier. We create symbolic variables for the unknown scalar values \(R_{Ax}\), \(R_{Ay}\), and \(F_B\).

### Define the force vectors

R_Ax, R_Ay, F_B = sp.symbols("R_Ax, R_Ay, F_B", real=True)

RR_A = sp.Matrix([R_Ax, R_Ay, 0])
WW = m*g*sp.Matrix([0, -1, 0])
FF_C = sp.Matrix([0, -10000, 0])
FF_B = F_B * ee_BD

We then establish the equations of equilibrium in the following way:

\[ \Sigma \mathbb{F}=\mathbb{0} : \mathbb{R}_A + \mathbb{W} + \mathbb{F}_C + \mathbb{F}_B = \mathbb{0} \]

\[ \Sigma \mathbb{M}=\mathbb{0}: (\mathbb{r}_{OA} \times \mathbb{R}_A) + (\mathbb{r}_{OG} \times \mathbb{W}) + (\mathbb{r}_{OC} \times \mathbb{F}_C) + (\mathbb{r}_{OB} \times \mathbb{F}_B) = \mathbb{0} \]

Code
### Establish the equations of equlibrium and solve the system

sumF = sp.Eq(RR_A+WW+FF_C+FF_B,sp.Matrix([0,0,0]))
sumM = sp.Eq(rr_OA.cross(RR_A)+rr_OG.cross(WW)+rr_OC.cross(FF_C)+rr_OB.cross(FF_B),sp.Matrix([0,0,0]))

sol = sp.solve([sumF,sumM], [R_Ax, R_Ay, F_B])
$$ F_{B} = \frac{5.611275625 \cdot 10^{17} \sqrt{0.230797548423172 r_{OBx}^{2} + 1}}{14001293545187.0 r_{OBx} - 1500000000000.0} $$
$$ R_{Ax} = \frac{1.07829400013791 \cdot 10^{21} r_{OBx}}{5.6005174180748 \cdot 10^{16} r_{OBx} - 6.0 \cdot 10^{15}} $$
$$ R_{Ay} = \frac{8.21021852196221 \cdot 10^{17} r_{OBx}}{56005174180748.0 r_{OBx} - 6000000000000.0} - \frac{2.33246875 \cdot 10^{18}}{56005174180748.0 r_{OBx} - 6000000000000.0} $$

10.2 Plot the forces, points and bases

Finally, we plot the reaction forces as functions of \(r_{OBx}\).

Show the code
### Plotting the reaction forces

# Create a plot and make settings
plt.style.use('seaborn-v0_8-whitegrid')
fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot()
ax.set(xlim=[0, 5], ylim=[-20000, 75000], xlabel='Placement of B [m]', ylabel='Force [N]')
ax.set_title("Reaction forces as a function to the wire placement")
plt.grid(True, which='both', color='k', linestyle='-', alpha=0.1)
plt.minorticks_on()

# Create the numerical data and functions
r_OBx_np = np.linspace(0,5,100)
F_B_f = sp.lambdify([r_OBx], sol[F_B], 'numpy')
R_Ax_f = sp.lambdify([r_OBx], sol[R_Ax], 'numpy')
R_Ay_f = sp.lambdify([r_OBx], sol[R_Ay], 'numpy')

# Creating each plot
ax.plot(r_OBx_np, F_B_f(r_OBx_np), linestyle='-', color='black', label="$F_{B}$")
ax.plot(r_OBx_np, R_Ax_f(r_OBx_np), linestyle='-', color='blue', label="$R_{Ax}$")
ax.plot(r_OBx_np, R_Ay_f(r_OBx_np), linestyle='-', color='red', label="$R_{Ay}$")


ax.legend()

Figure of the reaction forces as a function of the wire placement.

It is interesting to note what happens to the reaction forces when the placement is close to the point A. When the \(\mathbb{F}_B\) vector intercects A the reaction forces are infinite. Also \(\mathbb{F}_B\) is negative when \(\mathbb{F}_B\) intercects between O and A. That is of course not physical behaviour of a wire.

And we can also plot the geometry and force vectors in order to judge if the directions are reasonable given the calculated values for \(r_{OBx}=5\).

Show the code
### Plotting the vectors and points

# Create a plot and make settings
#plt.style.use('seaborn-v0_8-whitegrid')
fig2 = plt.figure(figsize=(6, 6))
ax2 = fig2.add_subplot()
ax2.set(xlim=[-1, 6], ylim=[-2, 5], xlabel='X [m]', ylabel='Y [m]')
ax2.set_title("Visualization of the beam and forces")
plt.grid(True, which='both', color='k', linestyle='-', alpha=0.1)
plt.minorticks_on()

rr_OB_np = rr_OB.subs(r_OBx, 5).evalf()
rr_OD_np = rr_OD.evalf()

# Plotting the beam
ax2.plot([0,0,5,5,0], [-0.25,0.25,0.25,-0.25,-0.25], linestyle='-', color='black')
ax2.plot(*zip(rr_OB.subs(r_OBx, 5)[:-1],rr_OD[:-1]), linestyle='--', color='black', zorder=0)


# Plotting the points and labels
rr_O = np.array([0, 0, 0])
offset = 0.05

ax2.plot(*zip(rr_O), 'ok', ms=5)
ax2.text(rr_O[0]-5*offset,rr_O[1]+offset,"O")

ax2.plot(*rr_OA[:-1], 'ok', ms=5)
ax2.text(rr_OA[0]+offset, rr_OA[1]+offset,"A")

ax2.plot(*rr_OB_np[:-1], 'ok', ms=5)
ax2.text(rr_OB_np[0]+offset, rr_OB_np[1]+offset,"B")

ax2.plot(*rr_OG[:-1], 'ok', ms=5)
ax2.text(rr_OG[0]+offset, rr_OG[1]+offset,"G")

ax2.plot(*rr_OC[:-1], 'ok', ms=5)
ax2.text(rr_OC[0]+offset, rr_OC[1]+offset,"C")

ax2.plot(*rr_OD[:-1], 'ok', ms=5)
ax2.text(rr_OD[0]+offset, rr_OD[1]+offset,"D")


# Create vectors with numeric values
rr_OA_np = np.array(rr_OA).astype(np.float64)
rr_OC_np = np.array(rr_OC).astype(np.float64)
rr_OG_np = np.array(rr_OG).astype(np.float64)
WW_np = np.array(WW).astype(np.float64)
FF_C_np = np.array(FF_C).astype(np.float64)
FF_B_np = np.array(FF_B.subs({r_OBx:5,F_B:F_B_f(5)})).astype(np.float64)
RR_A_np = np.array(RR_A.subs({R_Ax:R_Ax_f(5), R_Ay:R_Ay_f(5)})).astype(np.float64)

# Plotting the force vectors
ax2.quiver(*rr_OC_np[:-1], *FF_C_np[:-1], color='orange', scale=100000, label="$\\mathbb{F}_C$")
ax2.quiver(*rr_OB_np[:-1], *FF_B_np[:-1], color='red', scale=100000, label="$\\mathbb{F}_B$")
ax2.quiver(*rr_OA_np[:-1], *RR_A_np[:-1], color='red', scale=100000, label="$\\mathbb{R}_A$")
ax2.quiver(*rr_OG_np[:-1], *WW_np[:-1], color='blue', scale=50000, label="$\\mathbb{W}$")


ax2.legend()

Figure of the beam with the points and force vectors.