import matplotlib
if not hasattr(matplotlib.RcParams, "_get"):
matplotlib.RcParams._get = dict.get
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
EI, x = sym.symbols('EI, x',real=True)
Av, Bv = 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 = -Bv * sym.SingularityFunction(x,L,-1) - 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(w.subs(x,L),0)
eq3 = sym.Eq(M.subs(x,0),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,Bv])
V_sol = V.subs(sol)
V_subs = V_sol.subs([(L,5),(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,5),(a,2),(EI,5000)])
M_numpy = sym.lambdify([L,a,EI,x],M_sol.rewrite(sym.Piecewise))
Av_sol = sol[Av].rewrite(sym.Piecewise)
Av_numpy = sym.lambdify([L,a,EI],Av_sol)
Bv_sol = sol[Bv].rewrite(sym.Piecewise)
Bv_numpy = sym.lambdify([L,a,EI],Bv_sol)
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')
%matplotlib inline
display(sym.simplify(V_subs.rewrite(sym.Piecewise)))
x_plot = np.linspace(0,5.00001,1000)
plt.figure()
plt.plot([0,5],[0,0],color='black',linewidth=2)
plt.plot(x_plot,V_numpy(L=5,a=2,EI=5000,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)
vervormingV(3.5,-0.2,0.3,1)
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')
fig = plt.gcf()
fig.canvas.toolbar_visible = False
plt.show()
\[\begin{split}\displaystyle \begin{cases} 0 & \text{for}\: x > 5 \\- \frac{2}{5} & \text{for}\: x > 2 \\\frac{3}{5} & \text{for}\: x > 0 \\0 & \text{otherwise} \end{cases}\end{split}\]
Find influence line V#
%matplotlib inline
C1, C2, C3, C4 = sym.symbols('C1, C2, C3, C4')
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(w.subs(x,L),0)
eq3 = sym.Eq(M.subs(x,0),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,Bv])
w_sol = w.subs(sol)
w_subs = w_sol.subs([(L,5),(a,2),(EI,5000)])
#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,5,1000)
plt.plot([0,5],[0,0],color='black',linewidth=2)
plt.plot(x_plot,V_inf_numpy(L=5,a=2,EI=5000,x=x_plot),color="blue")
plt.xlabel('$x_F$')
plt.ylabel('Influence factor shear force')
axs = plt.gca()
hulp0 = V_inf_numpy(L=5,a=2,EI=5000,x=2-0.001)
hulp1 = V_inf_numpy(L=5,a=2,EI=5000,x=2+0.001)
axs = plt.gca()
axs.annotate(text='', xy=(2,hulp0), xytext=(2,hulp1), arrowprops=dict(arrowstyle='<|-|>', linewidth=3))
axs.annotate('1',xy = [2+0.05,(hulp0+hulp1)/2],va='center',ha='left')
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')
fig = plt.gcf()
fig.canvas.toolbar_visible = False
plt.show()
Comparison V-line and influence line for shear force at \(x = ...\)#
%matplotlib widget
from matplotlib.patches import Polygon
fig = plt.figure(figsize=(12, 6))
fig.canvas.toolbar_visible = False
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.00001,a-0.00001,a+0.00001,b-0.00001,b+0.00001,5,5+0.00001]))
axs0.plot([0,a-0.05],[0,0],color='black',linewidth=2)
axs0.plot([a+0.05,5],[0,0],color='black',linewidth=2)
L_i = 0
y = np.array([[-1/6+L_i,1/4], [L_i,0], [1/6+L_i,1/4]])
p = Polygon(y, facecolor = '#00CC99',edgecolor='black')
axs0.plot([-0.25+L_i,0.25+L_i],[0.25,0.25],color='black')
axs0.add_patch(p)
L_i = 5
y = np.array([[-1/6+L_i,1/4], [L_i,0], [1/6+L_i,1/4]])
p = Polygon(y, facecolor = '#00CC99',edgecolor='black')
axs0.plot([-0.25+L_i,0.25+L_i],[0.25,0.25],color='black')
axs0.plot([-0.25+L_i,0.25+L_i],[0.3,0.3],color='black')
axs0.add_patch(p)
axs0.plot([a-0.05,a-0.05],[0.2,-0.2],color='black')
axs0.plot([a+0.05,a+0.05],[0.2,-0.2],color='black')
if V_numpy(5,b,5000,a)>0:
axs0.annotate(text='', xy=(a+0.05,+0.2), xytext=(a+0.05,+0.2+V_numpy(5,b,5000,a)*1), arrowprops=dict(arrowstyle='simple'))
axs0.annotate(text='', xy=(a-0.05,-0.2), xytext=(a-0.05,-0.2-V_numpy(5,b,5000,a)*1), arrowprops=dict(arrowstyle='simple'))
else:
axs0.annotate(text='', xy=(a+0.05,-0.2), xytext=(a+0.05,-0.2+V_numpy(5,b,5000,a)*1), arrowprops=dict(arrowstyle='simple'))
axs0.annotate(text='', xy=(a-0.05,+0.2), xytext=(a-0.05,+0.2-V_numpy(5,b,5000,a)*1), arrowprops=dict(arrowstyle='simple'))
axs0.annotate('%.2f kN' % V_inf_numpy(5,a,5000,b),xy = [a,1],ha='center')
#axs0.annotate(text='', xy=(a-M_numpy(5,b,5000,a)/3,-M_numpy(5,b,5000,a)/3), xytext=(a-M_numpy(5,b,5000,a)/3,M_numpy(5,b,5000,a)/3), 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(text='', xy=(b,0), xytext=(b,-1), arrowprops=dict(arrowstyle='simple'))
axs0.annotate('1 kN',xy = [b+0.1,-1],ha='left',va='top')
axs0.set_ylim([-1,1])
axs0.set_aspect('equal')
axs0.invert_yaxis()
axs0.axis('off')
axs1.plot([0,5],[0,0],color='black',linewidth=2)
axs1.grid()
axs1.axis('equal')
axs1.plot(x,V_numpy(5,b,5000,x),color='blue')
axs1.plot(a,V_numpy(5,b,5000,a),marker='o')
axs1.annotate('%.2f kN' % V_numpy(5,b,5000,a),xy = [a,V_numpy(5,b,5000,a)+0.2])
#axs1.annotate(text='', xy=(b,0), xytext=(b,-0.3), arrowprops=dict(arrowstyle='simple'))
axs1.invert_yaxis()
plt.sca(axs1)
vervormingV(b/2,V_numpy(5,b,5000,x)[1]/2,V_numpy(5,b,5000,x)[1]/2,0)
vervormingV(b+(5-b)/2,V_numpy(5,b,5000,x)[-2]/2,V_numpy(5,b,5000,x)[-2]/2,1)
title0 = 'Shear force distribution for force at $x_F = '+str(b)+'$, showing shear force at $x_V = '+str(a)+'$'
axs1.set_title(title0)
axs2.plot([0,5],[0,0],color='black',linewidth=2)
axs2.grid()
axs2.axis('equal')
axs2.plot(x,V_inf_numpy(5,a,5000,x),color='blue')
axs2.plot(b,V_inf_numpy(5,a,5000,b),marker='o')
hulp0 = V_inf_numpy(L=5,a=a,EI=5000,x=a-0.001)
hulp1 = V_inf_numpy(L=5,a=a,EI=5000,x=a+0.001)
axs2.annotate(text='', xy=(a,hulp0), xytext=(a,hulp1), arrowprops=dict(arrowstyle='<|-|>', linewidth=3,shrinkA=0,shrinkB=0))
axs2.annotate('1',xy = [a+0.05,(hulp0+hulp1)/2],va='center',ha='left')
axs2.annotate('%.2f kN' % V_inf_numpy(5,a,5000,b),xy = [b,V_inf_numpy(5,a,5000,b)+0.2])
axs2.invert_yaxis()
title1 = 'Influence line for shear force at $x_V = '+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=5, 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=5, value=2, step=0.1, description="Location force x_F = ... (m)",readout_format='.1f',style= {'description_width': '200px'},layout = {'width': '450px'}) );