Influence line 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=5,a=2,EI=5000,x=x_plot),color="blue")
plt.xlabel('$x_F$')
plt.ylabel('Influence factor moment')
axs = plt.gca()
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 = ...\)#
fig, axs = plt.subplots(2, 1, figsize=(7, 6))
x = np.linspace(0,6,100)
def func(a,b):
axs[0].clear() # Clear the existing plot
axs[1].clear()
axs[0].plot([0,6],[0,0],color='black',linewidth=2)
axs[0].grid()
#axs[0].axis('equal')
axs[0].plot(x,M_numpy(6,b,1500,x),color='blue')
axs[0].plot(a,M_numpy(6,b,1500,a),marker='o')
axs[0].annotate('%.2f kNm' % M_numpy(6,b,1500,a),xy = [a,M_numpy(6,b,1500,a)+0.2])
axs[0].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)
#axs[0].add_patch(vervormingsteken);
#axs[0].set_ylim([-6,0])
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,6],[0,0],color='black',linewidth=2)
axs[1].grid()
axs[1].plot(x,M_inf_numpy(6,a,1500,x),color='blue')
axs[1].plot(b,M_inf_numpy(6,a,1500,b),marker='o')
axs[1].annotate('%.2f kNm' % M_inf_numpy(6,a,1500,b),xy = [b,M_inf_numpy(6,a,1600,b)+0.2])
axs[1].invert_yaxis()
#axs[1].set_xlim([0,6])
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=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'}) );