import matplotlib
if not hasattr(matplotlib.RcParams, "_get"):
    matplotlib.RcParams._get = dict.get

Moments#

Click –> Live Code on the top right corner of this screen to investigate some influence lines!

figuur 1

import micropip
await micropip.install("ipympl")
import numpy as np
import sympy as sym
import matplotlib.pylab as plt
from ipywidgets import widgets, interact
from matplotlib.patches import Arc,StepPatch

%matplotlib inline
EI, x = sym.symbols('EI, x',real=True)
Bv, Cv, Cm = sym.symbols('Bv, Cv, Cm',real=True)
a, b, L1, L2 = sym.symbols('a, b, L1, L2',positive=True,real=True)
C1, C2, C3, C4 = sym.symbols('C1, C2, C3, C4')
q = - Bv * sym.SingularityFunction(x,0,-1) - Cv * sym.SingularityFunction(x,L1,-1) + Cm * sym.SingularityFunction(x,L1,-2) + 1 * sym.SingularityFunction(x,a,-1)
V = -sym.integrate(q,x)+C1
M = sym.integrate(V,x)+C2
kappa = M / EI
phi = sym.integrate(kappa,x)+C3
w = sym.integrate(phi,x)+C4
eq1 = sym.Eq(V.subs(x,-1),0)
eq2 = sym.Eq(M.subs(x,-1),0)
eq3 = sym.Eq(w.subs(x,0),0)
eq4 = sym.Eq(w.subs(x,L1),0)
eq5 = sym.Eq(phi.subs(x,L1),0)
eq6 = sym.Eq(M.subs(x,L1+1),0)
eq7 = sym.Eq(V.subs(x,L1+1),0)
sol = sym.solve([eq1,eq2,eq3,eq4,eq5,eq6,eq7],[C1,C2,C3,C4,Bv, Cv, Cm])
Bv_sol = sol[Bv].rewrite(sym.Piecewise)
Bv_numpy = sym.lambdify([L1,a,EI],Bv_sol)
Cv_sol = sol[Cv].rewrite(sym.Piecewise)
Cv_numpy = sym.lambdify([L1,a,EI],Cv_sol)
Cm_sol = sol[Cm].rewrite(sym.Piecewise)
Cm_numpy = sym.lambdify([L1,a,EI],Cm_sol)
V_sol = V.subs(sol)
V_subs = V_sol.subs([(L1,10),(a,2.5),(EI,5000)])
V_numpy = sym.lambdify([L1,a,EI,x],V_sol.rewrite(sym.Piecewise))
M_sol = M.subs(sol)
M_subs = M_sol.subs([(L1,10),(a,2.5),(EI,5000)])
M_numpy = sym.lambdify([L1,a,EI,x],M_sol.rewrite(sym.Piecewise))

Find M-line#

display(sym.simplify(M_subs.rewrite(sym.Piecewise)))
plt.figure()
x_plot = np.linspace(0,10,1000)
plt.plot([0,10],[0,0],color='black',linewidth=2)
plt.plot(x_plot,M_numpy(L1=10,a=2.5,EI=5000,x=x_plot),color="blue")
plt.xlabel('$x$')
plt.ylabel('Moment')
axs = plt.gca()
axs.grid()
axs.invert_yaxis()
title0 = 'Moment distribution for force at $x_F =  2.5 $'
axs.set_title(title0);
axs.spines['right'].set_color('none')
axs.spines['top'].set_color('none')
axs.spines['bottom'].set_position('zero')
axs.spines['left'].set_position('zero')
plt.show()
\[\begin{split}\displaystyle \begin{cases} 0 & \text{for}\: x > 10 \\2.5 - 0.3671875 x & \text{for}\: x > 2.5 \\0.6328125 x & \text{for}\: x > 0 \\0 & \text{otherwise} \end{cases}\end{split}\]
../../_images/458548d500573f9e5a1c69cb7a02eeeb739fb946dad565f38085b3ebd645038e.png

Finding influence line for M#

q = 0
V = -sym.integrate(q,x)+C1
M = sym.integrate(V,x)+C2
kappa = M / EI
phi = sym.integrate(kappa,x)+C3 - sym.SingularityFunction(x,a,0)
w = sym.integrate(phi,x)+C4
eq2 = sym.Eq(M.subs(x,0),0)
eq3 = sym.Eq(w.subs(x,0),0)
eq4 = sym.Eq(w.subs(x,L1),0)
eq5 = sym.Eq(phi.subs(x,L1),0)
sol = sym.solve([eq2,eq3,eq4,eq5],[C1,C2,C3,C4])
w_sol = w.subs(sol)
w_subs = w_sol.subs([(L1,10),(a,sym.nsimplify(5/2)),(EI,5000)])
display(sym.simplify(w_subs.rewrite(sym.Piecewise)))
M_inf_numpy = sym.lambdify([L1,a,EI,x],w_sol.rewrite(sym.Piecewise))


plt.figure()
x_plot = np.linspace(0,10,1000)
plt.plot([0,10],[0,0],color='black',linewidth=2)
plt.plot(x_plot,M_inf_numpy(L1=10,a=2.5,EI=5000,x=x_plot),color="blue")
plt.xlabel('$x_F$')
plt.ylabel('Influence factor moment')

hulp0 = M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5)
hulp1 = M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5) + (M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5) - M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5-0.1))/0.1*0.5
plt.plot([2.5, 2.5 + 0.5],[hulp0, hulp1],color="black")
hulp2 = M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5) + (M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5) - M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5-0.1))/0.1*0.25
hulp3 = M_inf_numpy(L1=10,a=2.5,EI=5000,x=2.5+0.25)
axs = plt.gca()
axs.annotate(text='', xy=(2.5+0.25,hulp2), xytext=(2.5+0.25,hulp3), arrowprops=dict(arrowstyle='simple',connectionstyle='arc3,rad=-0.5'))
axs.annotate('1 rad',xy = [2.5+0.5,hulp0],va='center',ha='left')
axs.grid()
axs.invert_yaxis()
title0 = 'Influence line for moment at $x_M = 2.5$'
axs.spines['right'].set_color('none')
axs.spines['top'].set_color('none')
axs.spines['bottom'].set_position('zero')
axs.spines['left'].set_position('zero')
axs.set_title(title0);
plt.show()
\[\begin{split}\displaystyle \begin{cases} \frac{x^{3} - 300 x + 2000}{800} & \text{for}\: x > \frac{5}{2} \\\frac{x \left(x^{2} + 500\right)}{800} & \text{otherwise} \end{cases}\end{split}\]
../../_images/aa14af0746f92a431eb850a09c8b0d63efd4a12e9029c337d500f40761a806f9.png

Comparison M-line and influence line for moment at \(x = ...\)#

%matplotlib widget
fig, axs = plt.subplots(2, 1, figsize=(7, 6))
fig.canvas.toolbar_visible = False
x = np.linspace(0,10,100)
def func(a,b):
    axs[0].clear()  # Clear the existing plot
    axs[1].clear()
    axs[0].plot([0,10],[0,0],color='black',linewidth=2)
    axs[0].grid()
    axs[0].axis('equal')
    axs[0].plot(x,M_numpy(10,b,5000,x),color='blue')
    axs[0].plot(a,M_numpy(10,b,5000,a),marker='o')
    axs[0].annotate('%.2f kNm' % M_numpy(10,b,5000,a),xy = [a,M_numpy(10,b,5000,a)+0.5])
    axs[0].invert_yaxis()
    title0 = 'Moment distribution for force at $x_F = '+str(b)+'$, showing moment at $x_M = '+str(a)+'$'
    axs[0].set_title(title0)
    axs[1].plot([0,10],[0,0],color='black',linewidth=2)
    axs[1].grid()
    axs[1].axis('equal')
    axs[1].plot(x,M_inf_numpy(10,a,5000,x),color='blue')
    axs[1].plot(b,M_inf_numpy(10,a,5000,b),marker='o')
    hulp0 = M_inf_numpy(L1=10,a=a,EI=5000,x=a)
    hulp1 = M_inf_numpy(L1=10,a=a,EI=5000,x=a) + (M_inf_numpy(L1=10,a=a,EI=5000,x=a) - M_inf_numpy(L1=10,a=a,EI=5000,x=a-0.1))/0.1*0.75
    plt.plot([a, a + 0.75],[hulp0, hulp1],color="black")
    hulp2 = M_inf_numpy(L1=10,a=a,EI=5000,x=a) + (M_inf_numpy(L1=10,a=a,EI=5000,x=a) - M_inf_numpy(L1=10,a=a,EI=5000,x=a-0.1))/0.1*0.5
    hulp3 = M_inf_numpy(L1=10,a=a,EI=5000,x=a+0.5)
    axs[1].annotate(text='', xy=(a+0.5,hulp2), xytext=(a+0.5,hulp3), arrowprops=dict(arrowstyle='simple',connectionstyle='arc3,rad=-0.5'))
    axs[1].annotate('1 rad',xy = [a+0.75,hulp0],va='center',ha='left')

    axs[1].annotate('%.2f kNm' % M_inf_numpy(10,a,5000,b),xy = [b,M_inf_numpy(10,a,5000,b)+0.5])
    axs[1].invert_yaxis()
    title1 = 'Influence line for moment at $x_M = '+str(a)+'$'
    axs[1].set_title(title1)

    axs[0].spines['right'].set_color('none')
    axs[0].spines['top'].set_color('none')
    axs[0].spines['bottom'].set_position('zero')
    axs[0].spines['left'].set_position('zero')
    axs[1].spines['right'].set_color('none')
    axs[1].spines['top'].set_color('none')
    axs[1].spines['bottom'].set_position('zero')
    axs[1].spines['left'].set_position('zero')
    plt.draw()  

    
interact(func, a = widgets.FloatSlider(min=0, max=10, value=2, step=0.1, description="Location moment x_M = ... (m)",readout_format='.1f',style= {'description_width': '180px'},layout = {'width': '400px'}),
         b = widgets.FloatSlider(min=0, max=10, value=2, step=0.1, description="Location unit load x_F = ... (m)",readout_format='.1f',style= {'description_width': '180px'},layout = {'width': '400px'}) );