13  Friction

13.1 Introduction to Friction

Figure 13.1: The friction box

The box with the mass \(m\) kg is exposed to an external force \(P\) according to the left figure. Doing a free body diagram and applying Newton’s third law reveals a force \(F\) acting opposite to \(P\) along the contact surface. The magnitude of this friction force depends on the type of surface and the normal force \(N\). The relation between the normal force and friction force can be modelled using the Coulombs law:

\[ \boxed{ F \leq \mu_s N } \]

where \(\mu_s\) is known as the static coefficient of friction. Coulomb developed a friction theory in the 1700 s for dry friction. This model assumes a linear relationship between \(F\) and \(N\) and even if we can empirically show that this does not generally hold for an arbitrarily large \(N\), Coulombs law is taken to be “good enough” for most situations, but should be used with care.

Figure 13.2: Relation between the external force \(P\) and friction force \(F_f\).

As the force \(P\) exceeds the largest possible frictional force \(F_{\max }\) the box will start to slide and get an acceleration, thus the model transitions to what is known as kinetic friction and the opposing force is given by \(F_k=\mu_k N\), where \(\mu_k\) is the kinetic coefficient of friction. This is where statics ends and dynamics continues.

The coefficients of friction can be calculated from empirical observations using measurements of forces, positions or angles.

⚠ Note

Any list containing the coefficient will be approximate, good accuracy is application dependent and must be measured.

Here is a list for (a rough) reference

Material \(\mu_s\) \(\mu_k\)
Steel on steel \(0.1-0.3\) \(0.03-0.3\)
Steel on wood \(0.5-0.7\) \(0.2-0.5\)
Leather on metal \(0.3-0.6\) \(0.2-0.3\)
Break pad on cast iron 0.4 0.3
Hemp rope on steel 0.3 0.2
Teflon on Teflon 0.05 0.05
Rubber on metal \(0.4-0.5\) \(0.3-0.4\)
Rubber on asphalt \(0.7-1.0\) \(0.5-0.8\)
Rubber on ice 0.1 0.05
⚠ Note

Note that Coulombs law is a very simple model in the world of tribology. Many applications need more sophisticated models of friction.

⚠ Note

For any problem involving rough surfaces where frictional forces need to be taken into account one needs to determine if the bodies are at rest or sliding. In general there are several types of states in contact points on a body. If we have a friction coefficient \(\mu_s\) and have the situation

\(F<\mu_s N\) then static equilibrium is possible since the surfaces can generate the needed friction force that is required for static friction.

\(F=\mu_s N\) then static equilibrium is still possible. This is a limit, often we write \(F_{\max }=\mu_s N\), to show that this is the maximum friction force, this limit is also known as fully established friction.

\(F>\mu_s N\) then static equilibrium is impossible. The surfaces cannot produce the frictional force that is required to keep static equilibrium. The body begins to slide, accelerates and we get dynamic equilibrium \(F=\mu_k N\), at this point the problem is transitioned into a dynamic problem and we have \(\Sigma F=m a\).

The basic rule for analysis with friction is that the frictional force-vector \(\mathbb F\) is set to be in the direction that opposes potential movement.

Essentially there two types of problem statements

  1. All external forces except friction forces are known and we need to determine if the friction force can balance the external forces. This means that we need to check if \(F \leq \mu_s N\) in the contact surface, otherwise we have sliding and the problem is a dynamic problem with \(F=\mu_k N\).

  2. Some external forces are unknown and we want to know how much more we can load the body until sliding occurs. This means that we add \(F_i=\mu_s N_i\) to all rough contact points and include these friction equations in the equilibrium equations. Solving for the unknown forces to answer the problem statement.

We show some typical examples involving friction.

13.2 Example 1: A box on a slope

Determine the maximum angle \(\theta\) for which the box with mass \(m\) will not slide down the slope. The coefficient of static friction between the surfaces is \(\mu_s\).

13.2.1 Solution

FBD

Since we’re using a CAS, we can establish a normal coordinate system using the tangential direction \(t\) and the normal direction \(n\) to the slope. Once these directions are established we can easily express the force vectors in these directions and pose the equations of equilibrium.

We have equilibrium equations and an additional friction equation \(F_{\max }=\mu_s N\). Then we just solve for as many variables as we have equations.

The direction vector in the tangential direction is given by

\[ \mathbb e_t = [\cos \theta, \sin \theta, 0]^\mathsf T \]

The normal direction can be expressed as

\[ \mathbb e_n = [\cos \theta + 90^\circ, \sin \theta + 90^\circ, 0]^\mathsf T \]

13.2.2 Verification of directions

Let’s verify these directions using SymPy!

import sympy as sp
from sympy import cos, sin, pi
theta = sp.symbols('theta', real=True)

ee_t = sp.Matrix([cos(theta), sin(theta), 0])

ee_t

\(\displaystyle \left[\begin{matrix}\cos{\left(\theta \right)}\\\sin{\left(\theta \right)}\\0\end{matrix}\right]\)

ee_n = sp.Matrix([cos(theta + 90*pi/180), sin(theta + 90*pi/180), 0])
ee_n

\(\displaystyle \left[\begin{matrix}- \sin{\left(\theta \right)}\\\cos{\left(\theta \right)}\\0\end{matrix}\right]\)

Verifying means evaluating the direction at some trivial angle, for example \(\theta=0^\circ\).

ee_t.subs(theta, 0)

\(\displaystyle \left[\begin{matrix}1\\0\\0\end{matrix}\right]\)

ee_n.subs(theta, 0)

\(\displaystyle \left[\begin{matrix}0\\1\\0\end{matrix}\right]\)

As expected, the directions are correct!

13.2.3 Equilibrium equations

Using the direction we have the following forces

\[ \mathbb F_f = F_f \mathbb e_t, \quad \mathbb F_N = N \mathbb e_n, \quad \mathbb F_G = mg [0, -1, 0]^\mathsf T \]

This static equilibrium states:

\[ \sum \mathbb F = \mathbb 0 \Rightarrow \mathbb F_f + \mathbb F_N + \mathbb F_G = \mathbb 0 \]

m, g, F_f, N, mu = sp.symbols('m, g, F_f, N, mu', real=True)

FF_f = F_f * ee_t
FF_G = m * g * sp.Matrix([0, -1, 0])
FF_N = N * ee_n
$$ \sum \mathbb F = \left[\begin{matrix}F_{f} \cos{\left(\theta \right)}\\F_{f} \sin{\left(\theta \right)}\\0\end{matrix}\right] + \left[\begin{matrix}- N \sin{\left(\theta \right)}\\N \cos{\left(\theta \right)}\\0\end{matrix}\right] + \left[\begin{matrix}0\\- g m\\0\end{matrix}\right] $$

Thus the equilibrium equations are

ekv1 = sp.Eq(FF_f + FF_N + FF_G, sp.Matrix([0, 0, 0]))
$$ \left[\begin{matrix}F_{f} \cos{\left(\theta \right)} - N \sin{\left(\theta \right)}\\F_{f} \sin{\left(\theta \right)} + N \cos{\left(\theta \right)} - g m\\0\end{matrix}\right] = \left[\begin{matrix}0\\0\\0\end{matrix}\right] $$

Additionally we have the friction equation

ekv2 = sp.Eq(F_f, mu*N)
$$ F_{f} = N \mu $$

All together we have three equations and three unknowns. We can solve for the unknowns using SymPy.

sol = sp.solve([ekv1, ekv2], [F_f, N, mu], dict=True)[0]
$$ \begin{align*} F_f = g m \sin{\left(\theta \right)} \\ N = g m \cos{\left(\theta \right)} \\ \mu = \tan{\left(\theta \right)} \end{align*} $$

Here we have that \(\theta = \tan^{-1}(\mu_s)\), also known as the angle of friction.

⚠ Note

A note for SymPy solve function. There are a number of ways solve returns solutions. For unique solutions we expect a list of one element containing a dict. Sometimes we just get the dict. One needs to check the output and use correct syntax to extract the solution.

In the above case we get a list with one element, which is a dict. First we need to index into the list and grab index 0 then we have the dict.

Note also that we explicitly use dict=True to get a dict as output. This should be the default behaviour of SymPy. But not always. In this case for unknown reasons, if omitted, we would get a list of solutions instead and not a dict.

For more information on the solve function, see the SymPy documentation.

13.3 Example 2: Sliding boxes

Two masses are rigged according to the figure. In what interval does \(m_2\) need to be in to prevent sliding of \(m_1\). Let \(\mu_s=0.3\) and \(\theta=20^{\circ}\).

13.3.1 Solution - Reformulation of the problem

We need to ensure that we understand the problem. This is imperitive to solve any engineering problem correctly. If in doubt, ask the problem owner for a clarification.

Let’s break down the above problem statement:

We \(m_2\) need to find the interval of \(m_2\) such that \(m_1\) does not slide. This means that we need to find the maximum and minimum values of \(m_2\) such that \(m_1\) is in static equilibrium. In other words:

Find

\[ m_{2, \min} < m_2 < m_{2, \max} \]

such that \(m_1\) is in static equilibrium.

This gives rise to two cases: depending on if the box is just about to start gliding up or down. These cases result in two FBDs where the direction of the friction force is opposing the direction of movement.

13.3.2 Case 1: \(m_1\) is just about to start sliding down, i.e., finding \(m_{2\min}\)

An assumption we make is that the force \(T\) is transmitted through the pulley without any losses. This means that the tension in the rope is constant. We can also assume that the mass of the rope is negligible. This means that the tension in the rope is constant and equal to \(m_2 g\).

Kinematics

We need to establish the directions \(t\) and \(n\). Starting with the tangential direction \(t\) we have

\[ \mathbb e_t = [\cos \theta, \sin \theta, 0]^\mathsf T \] The normal direction is given by \[ \mathbb e_n = [\cos \theta + 90^\circ, \sin \theta + 90^\circ, 0]^\mathsf T \]

For a verification of the directions, see Section 13.2.2.

Using the direction we have the following forces

\[ \mathbb F_f = F_f \mathbb e_t, \quad \mathbb F_N = N \mathbb e_n, \quad \mathbb F_G = mg [0, -1, 0]^\mathsf T, \quad \mathbb F_T = T \mathbb e_t \]

Equilibrium equations:

\[ \sum \mathbb F = \mathbb 0 \Rightarrow \mathbb F_f + \mathbb F_N + \mathbb F_G + \mathbb F_T = \mathbb 0 \]

Friction relation:

\[ F_f = \mu_s N \]

import sympy as sp
from sympy import cos, sin, pi

m_1, m_2, g, F_f, N, mu, theta = sp.symbols(
    'm_1, m_2, g, F_f, N, mu, theta', real=True)

ee_t = sp.Matrix([cos(theta), sin(theta), 0])
ee_n = sp.Matrix([cos(theta + 90*pi/180), sin(theta + 90*pi/180), 0])


FF_f = F_f * ee_t
FF_G = m_1 * g * sp.Matrix([0, -1, 0])
FF_N = N * ee_n

T = m_2 * g
FF_T = T * ee_t

ekv1 = sp.Eq(FF_f + FF_N + FF_G + FF_T, sp.Matrix([0, 0, 0]))
ekv2 = sp.Eq(F_f, mu*N)

sol = sp.solve([ekv1, ekv2], [F_f, N, m_2], dict=True)[0]
$$ \begin{align*} F_f = \frac{g m_{1} \mu \cos{\left(\theta \right)}}{\sin^{2}{\left(\theta \right)} + \cos^{2}{\left(\theta \right)}} \\[2.5ex] N = \frac{g m_{1} \cos{\left(\theta \right)}}{\sin^{2}{\left(\theta \right)} + \cos^{2}{\left(\theta \right)}} \\[2.5ex] m_2 = - \frac{m_{1} \mu \cos{\left(\theta \right)}}{\sin^{2}{\left(\theta \right)} + \cos^{2}{\left(\theta \right)}} + \frac{m_{1} \sin{\left(\theta \right)}}{\sin^{2}{\left(\theta \right)} + \cos^{2}{\left(\theta \right)}} \end{align*} $$
⚠ Note

SymPy solve will not simplify the equations fully. We need to do this manually using trigsimp()

$$ \begin{align*} F_f = g m_{1} \mu \cos{\left(\theta \right)} \\[2.5ex] N = g m_{1} \cos{\left(\theta \right)} \\[2.5ex] m_2 = m_{1} \left(- \mu \cos{\left(\theta \right)} + \sin{\left(\theta \right)}\right) \end{align*} $$

Now we evaluate the expression for \(m_2\) using \(\theta = 20^\circ\) and \(\mu=0.3\).

m_2_min = sol[m_2].subs({theta:20*pi/180, mu:0.3}).evalf(4)
m_2_min

\(\displaystyle 0.06012 m_{1}\)

This is the smallest \(m_2\) needed for the box not to slide down.

Code
import matplotlib.pyplot as plt  
import numpy as np
from numpy import pi

m_2_min_fcn = sp.lambdify(theta, sol[m_2].trigsimp().subs({mu:0.3, m_1:1}))

plt.style.use('dark_background')
fig = plt.figure(figsize=(8.00, 6.00))
ax = fig.add_subplot()
ax.set(xlabel='Angle θ [°]', ylabel='max mass $m_2/m_1$ [kg]')
plt.grid(True, which='both', color='w', linestyle='-', alpha=0.1)
plt.minorticks_on()

thetas = np.linspace(0, 90*pi/180 , 100)
ax.plot(thetas*180/pi, m_2_min_fcn(thetas) );
ax.plot([0, 90], [0, 0] );
Figure 13.3
theta_0 = sp.solve(m_2_min, theta)[0]*180/sp.pi
theta_0.evalf()

\(\displaystyle 16.6992442339936\)

Feasibility analysis: At close to \(90^{\circ}\) the frictional force is so small that we get \(m_1=m_2\). At zero degrees the model does not work since we would get negative masses. Case 1 does not exists below slopes of ca \(17^{\circ}\), i.e., the box cannot slide downwards if the slope is less than \(17^{\circ}\).

13.3.3 Case 2: \(m_1\) is just about to start sliding up, i.e., finding \(m_{2\max}\)

In this case we have the following forces, with the friction force being reversed

\[ \mathbb F_f = - F_f \mathbb e_t, \quad \mathbb F_N = N \mathbb e_n, \quad \mathbb F_G = mg [0, -1, 0]^\mathsf T, \quad \mathbb F_T = T \mathbb e_t \]

import sympy as sp
from sympy import cos, sin, pi

m_1, m_2, g, F_f, N, mu, theta = sp.symbols(
    'm_1, m_2, g, F_f, N, mu, theta', real=True)

ee_t = sp.Matrix([cos(theta), sin(theta), 0])
ee_n = sp.Matrix([cos(theta + 90*pi/180), sin(theta + 90*pi/180), 0])


FF_f = - F_f * ee_t
FF_G = m_1 * g * sp.Matrix([0, -1, 0])
FF_N = N * ee_n

T = m_2 * g
FF_T = T * ee_t

ekv1 = sp.Eq(FF_f + FF_N + FF_G + FF_T, sp.Matrix([0, 0, 0]))
ekv2 = sp.Eq(F_f, mu*N)

sol = sp.solve([ekv1, ekv2], [F_f, N, m_2], dict=True)[0]
$$ \begin{align*} F_f = g m_{1} \mu \cos{\left(\theta \right)} \\[2.5ex] N = g m_{1} \cos{\left(\theta \right)} \\[2.5ex] m_2 = m_{1} \left(\mu \cos{\left(\theta \right)} + \sin{\left(\theta \right)}\right) \end{align*} $$

Thus the maximum mass \(m_2\) before the box starts gliding upwards is given by:

m_2_max = sol[m_2].subs({theta:20*pi/180, mu:0.3}).evalf(4)
m_2_max

\(\displaystyle 0.6239 m_{1}\)

Code
import matplotlib.pyplot as plt  
import numpy as np
from numpy import pi

m_2_max_fcn = sp.lambdify(theta, sol[m_2].trigsimp().subs({mu:0.3, m_1:1}))

plt.style.use('dark_background')
fig = plt.figure(figsize=(8.00, 6.00))
ax = fig.add_subplot()
ax.set(xlabel='Angle θ [°]', ylabel='max mass $m_2/m_1$ [kg]')
plt.grid(True, which='both', color='w', linestyle='-', alpha=0.1)
plt.minorticks_on()

thetas = np.linspace(0, 90*pi/180 , 100)
ax.plot(thetas*180/pi, m_2_max_fcn(thetas) );
Figure 13.4

13.3.4 Conclusion

The interval is given by

$$ m_{1} \left(\sin{\left(\theta \right)} - 0.3 \cos{\left(\theta \right)}\right) < m_2 < 0.6239 m_{1} $$

13.4 Example 3 - Ladder

Determine the least possible \(\mu_s(\theta)\) at \(A\) such that the homogenous rod with a mass of \(m\) does not slide. There is no friction at \(O\). Disregard the radius of the roller at O. Draw a graph of \(\mu_s(\theta)\) for valid angles.

13.4.1 Solution

FBD

We start by defining the kinematics, the position of \(A\) needs to be defined as a function of that angle \(\theta\). Using trigonometry we recognize the triangle and have

\[ \dfrac{b}{L/2} = \dfrac{\sin \theta}{\cos \theta} = \tan \theta \Rightarrow b(\theta) = L/2 \tan \theta \]

Thus we have

\[ \mathbb r_{OA} = [-b(\theta), -L/2, 0]^\mathsf T \]

Furthermore the tangential direction is given by

\[ \mathbb e_t = [\cos 90^\circ-\theta, \sin 90^\circ -\theta, 0]^\mathsf T \]

or we can take the shortcut:

\[ \mathbb e_{t} = - \dfrac{\mathbb r_{OA}}{|\mathbb r_{OA}|} \]

Code
import sympy as sp
from sympy import cos, sin, tan, pi
theta, L  = sp.symbols('theta, L', real=True)

ee_t = sp.Matrix([cos(90*sp.pi/180 - theta), sin(90*sp.pi/180 - theta), 0])
ee_t

\(\displaystyle \left[\begin{matrix}\sin{\left(\theta \right)}\\\cos{\left(\theta \right)}\\0\end{matrix}\right]\)

Code
b = L/2*tan(theta)
rr_OA = sp.Matrix([-b, -L/2, 0])
rr_OA

\(\displaystyle \left[\begin{matrix}- \frac{L \tan{\left(\theta \right)}}{2}\\- \frac{L}{2}\\0\end{matrix}\right]\)

Code
ee_t_2 = -rr_OA.normalized()
# Verify
#ee_t_2.subs({L:1, theta:0}) 
ee_t_2

\(\displaystyle \left[\begin{matrix}\frac{L \tan{\left(\theta \right)}}{2 \sqrt{\frac{L^{2} \tan^{2}{\left(\theta \right)}}{4} + \frac{L^{2}}{4}}}\\\frac{L}{2 \sqrt{\frac{L^{2} \tan^{2}{\left(\theta \right)}}{4} + \frac{L^{2}}{4}}}\\0\end{matrix}\right]\)

This vector can be rotated using the cross product to get the normal direction

\[ \mathbb e_n = \mathbb e_z \times \mathbb e_t \]

Code
ee_z = sp.Matrix([0, 0, 1])
ee_n = ee_z.cross(ee_t_2)
ee_n
# ee_n.subs({L:1, theta:0}) # Verify

\(\displaystyle \left[\begin{matrix}- \frac{L}{2 \sqrt{\frac{L^{2} \tan^{2}{\left(\theta \right)}}{4} + \frac{L^{2}}{4}}}\\\frac{L \tan{\left(\theta \right)}}{2 \sqrt{\frac{L^{2} \tan^{2}{\left(\theta \right)}}{4} + \frac{L^{2}}{4}}}\\0\end{matrix}\right]\)

Alternatively, we can create the normal direction using trigonometry by rotating the x-axis:

\[ \mathbb e_n = \begin{bmatrix} \cos(-90^\circ-\theta-90^\circ) \\ \sin(-90^\circ-\theta-90^\circ) \\ 0 \end{bmatrix} \]

Code
ee_n = sp.Matrix([cos(-pi/2-theta-pi/2), sin(-pi/2-theta-pi/2), 0])
# ee_n.subs({L:1, theta:0}) # Verify

The position of the center of mass is given by

\[ \mathbb r_{OG} = \mathbb r_{OA} + L/2 \mathbb e_t \]

Code
rr_OG = rr_OA + L/2*ee_t

Equilibrium

We have the following forces

\[ \mathbb F_A = [F_f, N_A, 0]^\mathsf T, \quad \mathbb F_G = [0, -mg, 0]^\mathsf T, \quad \mathbb F_O = N_O \mathbb e_n \]

The moment around the origin is given by

\[ \mathbb M_O = \mathbb r_{OA} \times \mathbb F_A + \mathbb r_{OG} \times \mathbb F_G \]

Equilibrium equations:

\[ \sum \mathbb F = \mathbb 0 \\[2.5ex] \sum \mathbb M_O = \mathbb 0 \]

F_f, N_O, N_A, m, g, mu  = sp.symbols('F_f, N_O, N_A, m, g, mu', real=True)
FF_A = sp.Matrix([F_f, N_A, 0])
FF_G = m*g*sp.Matrix([0, -1, 0])
FF_O = N_O*ee_n

ekvF = sp.Eq(FF_A + FF_O + FF_G, sp.Matrix([0, 0, 0]))
ekvFric = sp.Eq(F_f, mu*N_A)
ekvM = sp.Eq( rr_OA.cross(FF_A) + rr_OG.cross(FF_G), sp.Matrix([0, 0, 0]))
$$ \begin{align*} \left[\begin{matrix}F_{f} - N_{O} \cos{\left(\theta \right)}\\N_{A} + N_{O} \sin{\left(\theta \right)} - g m\\0\end{matrix}\right] = \left[\begin{matrix}0\\0\\0\end{matrix}\right] \\[2.5ex] F_{f} = N_{A} \mu \\[2.5ex] \left[\begin{matrix}0\\0\\\frac{F_{f} L}{2} - \frac{L N_{A} \tan{\left(\theta \right)}}{2} - g m \left(\frac{L \sin{\left(\theta \right)}}{2} - \frac{L \tan{\left(\theta \right)}}{2}\right)\end{matrix}\right] = \left[\begin{matrix}0\\0\\0\end{matrix}\right] \end{align*} $$
sol = sp.solve([ekvF, ekvFric, ekvM], [F_f, N_O, N_A, mu], dict=True)[0]
$$ \begin{align*} F_f = g m \sin{\left(\theta \right)} \cos^{2}{\left(\theta \right)} \\[2.5ex] N_A = g m \left(- \sin^{2}{\left(\theta \right)} \cos{\left(\theta \right)} + 1\right) \\[2.5ex] N_O = \frac{g m \sin{\left(2 \theta \right)}}{2} \\[2.5ex] \mu = - \frac{\sin{\left(\theta \right)} \cos^{2}{\left(\theta \right)}}{\sin^{2}{\left(\theta \right)} \cos{\left(\theta \right)} - 1} \end{align*} $$
import matplotlib.pyplot as plt  
import numpy as np
from numpy import pi

mu_fcn = sp.lambdify(theta, sol[mu].trigsimp() )

thetas = np.linspace(0, 90*pi/180 , 100)

plt.style.use('dark_background')
fig = plt.figure(figsize=(8.00, 6.00))
ax = fig.add_subplot()
ax.set(xlabel='Angle θ [°]', ylabel='Friction coefficient μ')
plt.grid(True, which='both', color='w', linestyle='-', alpha=0.1)
plt.minorticks_on()


ax.plot(thetas*180/pi, mu_fcn(thetas) );
Figure 13.5
import matplotlib.pyplot as plt  
import numpy as np
from numpy import pi

L_theta = rr_OA.norm().subs({L:1})
L_theta
L_theta_fcn = sp.lambdify(theta, L_theta.trigsimp() )
thetas = np.linspace(0, 90*pi/180 , 100)

plt.style.use('dark_background')
fig = plt.figure(figsize=(8.00, 6.00))
ax = fig.add_subplot()
ax.set(xlabel='Angle θ [°]', ylabel='Length $L(\\theta)$ [m/m]')
plt.grid(True, which='both', color='w', linestyle='-', alpha=0.1)
ax.set_ylim(0, 1.5)
plt.minorticks_on()
ax.set_title('Length of the ladder')
ax.plot(thetas*180/pi, L_theta_fcn(thetas) );
ax.plot([0,90], [1,1]);

As seen from the ladder length graph, we cannot go beyond \(60^\circ\). This can also be verified usinga sketch in CAD

13.5 Example 4 - Flexible belts (Capstan equation)

Ropes and belts which are wrapped around cylinders are a very common application for static friction in mechanics. We shall look closer at the problem.

Free body diagram

Infinitesimal belt element
Figure 13.6: Flexible belt free body diagram

A rope is wrapped some angle \(\beta \in[0, \infty]\) radians around a cylinder. We cut a small piece \(d \theta\) at an arbitrary angle \(\theta \in[0, \infty]\) and create a FBD according to the figure. We are interested in the maximum force and examine the limit just before sliding. The force equilibrium is divided into a tangential \((t)\) and radial \((n)\) direction

\[ t: T \cos \left(\frac{d \theta}{2}\right)+\mu dN-(T+dT) \cos \left(\frac{d \theta}{2}\right)=0 \]

\[ n: dN-(T+dT) \sin \left(\frac{d \theta}{2}\right)-T \sin \left(\frac{d \theta}{2}\right)=0 \]

Since we are dealing with very small angles, we can utilize the small angle approximation, i.e., \(d \theta \ll 1\).

\[ d \theta \ll 1\left\{\begin{array}{l} \cos (d \theta) \stackrel{\lim \stackrel{d \theta \rightarrow 0}{=}}{ } \quad 1 \\ \operatorname{sind}(d \theta) \stackrel{l i m}{=} d \theta \end{array}\right. \]

Thus our expression simplifies to

\[\begin{gathered} t: T+\mu dN-(T+dT)=0 \\ n: dN-(T+dT) \frac{d \theta}{2}-T \frac{d \theta}{2}=0 \end{gathered}\]

Since both dT and \(d \theta\) are very small, their product is even smaller and can be neglected, i.e., \(dTd \theta \ll dT, d \theta\)

Thus we end up with

\[ \left\{\begin{array}{l} \mu dN=dT \\ dN=T d \theta \end{array}\right. \]

Eliminating \(dN\) and moving things around we can formulate a simple ordinary differential equation

\[ \frac{dT_2}{d \theta}=\mu T_2 \]

with the boundary condition \(T_2(0)=T_1\)

For which we can easily get the solution using SymPy symbolic differential equation solver dsolve:

import sympy as sp
from sympy import diff

theta, mu, T1 = sp.symbols('theta, mu, T1', real=True)

# Here we define the function T2
T2 = sp.Function('T2')
T2(theta)

\(\displaystyle T_{2}{\left(\theta \right)}\)

# Define the Differential Equation
DE = sp.Eq(diff(T2(theta), theta), mu * T2(theta))
DE

\(\displaystyle \frac{d}{d \theta} T_{2}{\left(\theta \right)} = \mu T_{2}{\left(\theta \right)}\)

# Define the boundary condition at theta = 0
BC = {T2(0): T1} 
BC
{T2(0): T1}
sol = sp.dsolve(DE, ics=BC)
$$ \boxed{ T_{2}{\left(\theta \right)} = T_{1} e^{\mu \theta} } $$

For more info on SymPy dsolve, see the documentation.

As an alternative solution, we can collect \(T\) and \(\theta\) on each side: \(\frac{\mathrm{dT}}{T}=\mu d \theta\), and integrate:

\[ \int_{T_1}^{T_1} \frac{1}{T} \mathrm{dT}=\int_0^\theta \mu d \theta \]

\[ \ln \frac{T_2}{T_1}=\mu \theta \Rightarrow \]

\[ \boxed{ T_{2}{\left(\theta \right)} = T_{1} e^{\mu \theta} } \qquad(13.1)\]

13.5.1 Example

Ok, so with, e.g., \(\mu_s=0.25\) (hamp against steel according to some table) and wrapped five times we get

from sympy import exp, pi
mu = 0.25
T2 = T1 * exp(mu*5*2*pi)
T2.evalf(6)

\(\displaystyle 2575.97 T_{1}\)

We see that the force \(T_2\) needs to be over 2500 times larger than \(T_1\) to be in balance. The Capstan equation (Equation 13.1) is extremely useful in many applications, e.g., belt breaking, winches, cranes, gearboxes, etc.

For a cool application see this video by Aaed Musa:

13.6 Example 5 - Clutch

13.7 Example 6 - Screw