Influence line shear force#
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, Bv',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 V-line#
def vervormingV(locationx,locationy,scale,flip=0,rotation=0):
axs = plt.gca()
vx = [-0.5,0,0,0.5]
if flip==0:
vy = [0.25,0.25,-0.25,-0.25]
elif flip==1:
vy = [-0.25,-0.25,0.25,0.25]
vxr= np.add(np.multiply(np.cos(rotation/180*np.pi),vx),np.multiply(np.sin(rotation/180*np.pi),vy))
vyr= np.add(np.multiply(np.sin(rotation/180*np.pi),vx),-np.multiply(np.cos(rotation/180*np.pi),vy))
vxscaled = np.add(locationx,np.multiply(scale,vxr))
vyscaled = np.add(locationy,np.multiply(scale,vyr))
axs.plot(vxscaled,vyscaled,color='black',linewidth=1)
axs.axis('equal')
display(sym.simplify(V_subs.rewrite(sym.Piecewise)))
plt.figure()
x_plot = np.linspace(0,5.00001,1000)
x_plot = np.linspace(-0.0001,6,1000)
plt.plot([0,6],[0,0],color='black',linewidth=2)
plt.plot(x_plot,V_numpy(L=6,a=2,EI=1500,x=x_plot),color="blue")
plt.xlabel('$x$')
plt.ylabel('Shear force')
axs = plt.gca()
axs.grid()
axs.invert_yaxis()
title0 = 'Shear force distribution for force at $x_F = 2 $'
vervormingV(1,0.3,0.3,0)
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 > 2 \\-\infty & \text{for}\: x = 0 \\1 & \text{for}\: x > 0 \\0 & \text{otherwise} \end{cases}\end{split}\]
Find influence line V#
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
w = -sym.integrate(phi,x)+C4 + sym.SingularityFunction(x,a,0)
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,6),(a,2),(EI,1500)])
#display(sym.simplify(w_subs.rewrite(sym.Piecewise)))
V_inf_numpy = sym.lambdify([L,a,EI,x],w_sol.rewrite(sym.Piecewise))
plt.figure()
x_plot = np.linspace(0,6,1000)
plt.plot([0,6],[0,0],color='black',linewidth=2)
plt.plot(x_plot,V_inf_numpy(L=6,a=2,EI=1500,x=x_plot),color="blue")
plt.xlabel('$x_F$')
plt.ylabel('Influence factor shear force')
axs = plt.gca()
axs.grid()
axs.invert_yaxis()
title0 = 'Influence line for shear force at $x_V = 2$'
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()
Comparison V-line and influence line for shear force at \(x = ...\)#
fig, axs = plt.subplots(2, 1, figsize=(7, 6))
x = np.linspace(0,5.0001,200)
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,V_numpy(6,b,1500,x),color='blue')
axs[0].plot(a,V_numpy(6,b,1500,a),marker='o')
axs[0].annotate('%.2f kN' % V_numpy(6,b,1500,a),xy = [a,V_numpy(6,b,1500,a)+0.2])
axs[0].annotate(text='', xy=(b,0), xytext=(b,-0.3), arrowprops=dict(arrowstyle='simple'))
axs[0].invert_yaxis()
plt.sca(axs[0])
vervormingV(b/2,V_numpy(6,b,1500,x)[1]/2,V_numpy(6,b,1500,x)[1]/2,0)
title0 = 'Shear force distribution for force at $x_F = '+str(b)+'$, showing shear force at $x_V = '+str(a)+'$'
axs[0].set_title(title0)
axs[1].plot([0,6],[0,0],color='black',linewidth=2)
axs[1].grid()
axs[1].axis('equal')
axs[1].plot(x,V_inf_numpy(6,a,1500,x),color='blue')
axs[1].plot(b,V_inf_numpy(6,a,1500,b),marker='o')
axs[1].annotate('%.2f kN' % V_inf_numpy(6,a,1500,b),xy = [b,V_inf_numpy(6,a,1500,b)+0.2])
axs[1].invert_yaxis()
title1 = 'Influence line for shear force at $x_V = '+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 shear force x_V = ... (m)",readout_format='.1f',style= {'description_width': '200px'},layout = {'width': '450px'}),
b = widgets.FloatSlider(min=0, max=6, value=2, step=0.1, description="Location force x_F = ... (m)",readout_format='.1f',style= {'description_width': '200px'},layout = {'width': '450px'}) );