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!

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 widget
EI, x = sym.symbols('EI, x',real=True)
Av, Am = sym.symbols('Av, Am',real=True)
a, L= sym.symbols('a, L ',positive=True,real=True)
C1, C2, C3, C4 = sym.symbols('C1, C2, C3, C4')
q = -Am * sym.SingularityFunction(x,0,-2) - Av * sym.SingularityFunction(x,0,-1) + 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(w.subs(x,0),0)
eq2 = sym.Eq(phi.subs(x,0),0)
eq3 = sym.Eq(M.subs(x,-1),0)
eq4 = sym.Eq(M.subs(x,L),0)
eq5 = sym.Eq(V.subs(x,-1),0)
eq6 = sym.Eq(V.subs(x,L+1),0)
sol = sym.solve([eq1,eq2,eq3,eq4,eq5,eq6],[C1,C2,C3,C4,Av,Am])
V_sol = V.subs(sol)
V_subs = V_sol.subs([(L,6),(a,2),(EI,5000)])
V_numpy = sym.lambdify([L,a,EI,x],V_sol.rewrite(sym.Piecewise))
M_sol = M.subs(sol)
M_subs = M_sol.subs([(L,6),(a,2),(EI,5000)])
M_numpy = sym.lambdify([L,a,EI,x],M_sol.rewrite(sym.Piecewise))
Find M-line#
display(sym.simplify(M_subs.rewrite(sym.Piecewise)))
M_numpy = sym.lambdify([L,a,EI,x],M_sol.rewrite(sym.Piecewise))
x_plot = np.linspace(0,5,1000)
plt.figure()
plt.plot([0,6],[0,0],color='black',linewidth=2)
plt.plot(x_plot,M_numpy(L=6,a=2,EI=1500,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 $'
axs.set_title(title0)
axs.axis('equal')
vervormingsteken = Arc(xy = [0.5,M_numpy(L=6,a=2,EI=1500,x=0.01)*1/3],width = 0.5, height = 0.5,theta1=180,theta2=0)
axs.add_patch(vervormingsteken)
plt.show()
\[\begin{split}\displaystyle \begin{cases} 0 & \text{for}\: x > 2 \\x - 2 & \text{for}\: x > 0 \\0 & \text{otherwise} \end{cases}\end{split}\]
Finding influence line for M#
q = -Am * sym.SingularityFunction(x,0,-2) - Av * sym.SingularityFunction(x,0,-1)
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
eq1 = sym.Eq(w.subs(x,0),0)
eq2 = sym.Eq(phi.subs(x,0),0)
eq3 = sym.Eq(M.subs(x,-1),0)
eq4 = sym.Eq(M.subs(x,L),0)
eq5 = sym.Eq(V.subs(x,-1),0)
eq6 = sym.Eq(V.subs(x,L+1),0)
sol = sym.solve([eq1,eq2,eq3,eq4,eq5,eq6],[C1,C2,C3,C4,Av,Am])
w_sol = w.subs(sol)
w_subs = w_sol.subs([(L,5),(a,2),(EI,5000)])
#display(sym.simplify(w_subs.rewrite(sym.Piecewise)))
M_inf_numpy = sym.lambdify([L,a,EI,x],w_sol.rewrite(sym.Piecewise))
plt.figure()
x_plot = np.linspace(0,5,1000)
plt.plot([0,5],[0,0],color='black',linewidth=2)
plt.plot(x_plot,M_inf_numpy(L=6,a=2,EI=1500,x=x_plot),color="blue")
plt.xlabel('$x_F$')
plt.ylabel('Influence factor moment')
axs = plt.gca()
hulp0 = M_inf_numpy(L=6,a=2,EI=1500,x=2)
hulp1 = M_inf_numpy(L=6,a=2,EI=1500,x=2) + (M_inf_numpy(L=6,a=2,EI=1500,x=2) - M_inf_numpy(L=6,a=2,EI=1500,x=2-0.1))/0.1*0.5
plt.plot([2, 2 + 0.5],[hulp0, hulp1],color="black")
hulp2 = M_inf_numpy(L=6,a=2,EI=1500,x=2) + (M_inf_numpy(L=6,a=2,EI=1500,x=2) - M_inf_numpy(L=6,a=2,EI=1500,x=2-0.1))/0.1*0.25
hulp3 = M_inf_numpy(L=6,a=2,EI=1500,x=2+0.25)
axs = plt.gca()
axs.annotate(text='', xy=(2+0.25,hulp2), xytext=(2+0.25,hulp3), arrowprops=dict(arrowstyle='simple',connectionstyle='arc3,rad=-0.5'))
axs.annotate('1 rad',xy = [2+0.5,(hulp2+hulp3)/2],va='center',ha='left')
axs.grid()
axs.invert_yaxis()
title0 = 'Influence line for moment at $x_M = 2$'
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()
Comparison M-line and influence line for moment at \(x = ...\)#
from matplotlib.patches import Circle
fig = plt.figure(figsize=(12, 6))
gs = fig.add_gridspec(2,2)
axs0 = fig.add_subplot(gs[:, 1])
axs1 = fig.add_subplot(gs[0, 0])
axs2 = fig.add_subplot(gs[1, 0])
def func(a,b):
axs0.clear()
axs1.clear() # Clear the existing plot
axs2.clear()
x = np.sort(np.array([0,0.000001,a,b,6]))
axs0.plot([0,6],[0,0],color='black',linewidth=2)
axs0.plot([0,0],[-0.5,0.5],color='black')
for i in np.linspace(0.1,1.5,11):
axs0.plot([-0.5+max(i-1,0),-0.5+min(i,0.5)],[-0.5+min(i,1),-0.5+max(0,i-0.5)],linewidth=1,color='black')
s = Circle([a,0],radius=0.05,facecolor='white',edgecolor='black',zorder=2)
axs0.add_patch(s)
axs0.annotate(text='', xy=(a+M_numpy(6,b,1500,a)/6,-M_numpy(6,b,1500,a)/6), xytext=(a+M_numpy(6,b,1500,a)/6,M_numpy(6,b,1500,a)/6), arrowprops=dict(arrowstyle='simple',connectionstyle='arc3,rad=-0.7'))
axs0.annotate(text='', xy=(a-M_numpy(6,b,1500,a)/6,-M_numpy(6,b,1500,a)/6), xytext=(a-M_numpy(6,b,1500,a)/6,M_numpy(6,b,1500,a)/6), arrowprops=dict(arrowstyle='simple',connectionstyle='arc3,rad=0.7'))
axs0.annotate('%.2f kNm' % M_inf_numpy(5,a,5000,b),xy = [a,0.5],ha='center')
axs0.annotate('1 kN',xy = [b+0.1,-1],ha='left',va='top')
axs0.annotate(text='', xy=(b,0), xytext=(b,-1), arrowprops=dict(arrowstyle='simple'))
axs0.set_ylim([-1,1])
axs0.set_aspect('equal')
axs0.invert_yaxis()
axs0.axis('off')
axs1.plot([0,6],[0,0],color='black',linewidth=2)
axs1.grid()
#axs1.axis('equal')
axs1.plot(x,M_numpy(6,b,1500,x),color='blue')
axs1.plot(a,M_numpy(6,b,1500,a),marker='o')
axs1.annotate('%.2f kNm' % M_numpy(6,b,1500,a),xy = [a,M_numpy(6,b,1500,a)+0.2])
#axs1.annotate(text='', xy=(b,0), xytext=(b,-0.4), arrowprops=dict(arrowstyle='simple'))
#vervormingsteken = Arc(xy = [b,-M_numpy(6,b,1500,b)*1/3],width = M_numpy(6,b,1500,b)/3, height = M_numpy(6,b,1500,b)/3,theta1=180,theta2=0)
#axs1.add_patch(vervormingsteken);
#axs1.set_ylim([-6,0])
axs1.invert_yaxis()
title0 = 'Moment distribution for force at $x_F = '+str(b)+'$, showing moment at $x_M = '+str(a)+'$'
axs1.set_title(title0)
axs2.plot([0,6],[0,0],color='black',linewidth=2)
axs2.grid()
axs2.plot(x,M_inf_numpy(6,a,1500,x),color='blue')
axs2.plot(b,M_inf_numpy(6,a,1500,b),marker='o')
axs2.annotate('%.2f kNm' % M_inf_numpy(6,a,1500,b),xy = [b,M_inf_numpy(6,a,1600,b)+0.2])
axs2.invert_yaxis()
#axs2.set_xlim([0,6])
hulp0 = M_inf_numpy(L=6,a=a,EI=1500,x=a)
hulp1 = M_inf_numpy(L=6,a=a,EI=1500,x=a) + (M_inf_numpy(L=6,a=a,EI=1500,x=a) - M_inf_numpy(L=6,a=a,EI=1500,x=a-0.1))/0.1*0.5
plt.plot([a, a + 0.5],[hulp0, hulp1],color="black")
hulp2 = M_inf_numpy(L=6,a=a,EI=1500,x=a) + (M_inf_numpy(L=6,a=a,EI=1500,x=a) - M_inf_numpy(L=6,a=a,EI=1500,x=a-0.1))/0.1*0.25
hulp3 = M_inf_numpy(L=6,a=a,EI=1500,x=a+0.25)
axs = plt.gca()
axs.annotate(text='', xy=(a+0.25,hulp2), xytext=(a+0.25,hulp3), arrowprops=dict(arrowstyle='simple',connectionstyle='arc3,rad=-0.5'))
axs.annotate('1 rad',xy = [a+0.5,(hulp2+hulp3)/2],va='center',ha='left')
title1 = 'Influence line for moment at $x_M = '+str(a)+'$'
axs2.set_title(title1)
axs1.spines['right'].set_color('none')
axs1.spines['top'].set_color('none')
axs1.spines['bottom'].set_position('zero')
axs1.spines['left'].set_position('zero')
axs2.spines['right'].set_color('none')
axs2.spines['top'].set_color('none')
axs2.spines['bottom'].set_position('zero')
axs2.spines['left'].set_position('zero')
plt.draw()
interact(func, a = widgets.FloatSlider(min=0, max=6, 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=6, value=2, step=0.1, description="Location unit load x_F = ... (m)",readout_format='.1f',style= {'description_width': '180px'},layout = {'width': '400px'}) );