Influence line displacement#
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')
Find displacement \(w\)#
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+1),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)])
w_numpy = sym.lambdify([L,a,EI,x],w_sol.rewrite(sym.Piecewise))
phi_sol = phi.subs(sol)
phi_subs = phi_sol.subs([(L,6),(a,2),(EI,1500)])
phi_numpy = sym.lambdify([L,a,EI,x],phi_sol.rewrite(sym.Piecewise))
display(sym.simplify(w_subs.rewrite(sym.Piecewise)))
x_plot = np.linspace(0,6,100)
plt.plot([0,6],[0,0],color='black',linewidth=2)
plt.plot(x_plot,w_numpy(L=6,a=2,EI=1500,x=x_plot),color="blue")
plt.xlabel('$x$')
plt.ylabel('displacement')
axs = plt.gca()
axs.grid()
axs.invert_yaxis()
title0 = 'Displacement for force at $x_F = 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()
\[\begin{split}\displaystyle \begin{cases} \frac{x}{750} - \frac{1}{1125} & \text{for}\: x > 2 \\\frac{x^{2} \cdot \left(6 - x\right)}{9000} & \text{for}\: x > 0 \\0 & \text{otherwise} \end{cases}\end{split}\]
Find influence line \(w\)#
display(sym.simplify(w_subs.rewrite(sym.Piecewise)))
plt.figure()
x_plot = np.linspace(0,6,100)
plt.plot([0,6],[0,0],color='black',linewidth=2)
plt.plot(x_plot,w_numpy(L=6,a=6,EI=1500,x=x_plot),color="blue")
plt.xlabel('$x_F$')
plt.ylabel('Influence factor displacement')
axs = plt.gca()
axs.grid()
axs.invert_yaxis()
title0 = 'Influence line for displacement at $x_w = 6 $'
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} \frac{x}{750} - \frac{1}{1125} & \text{for}\: x > 2 \\\frac{x^{2} \cdot \left(6 - x\right)}{9000} & \text{for}\: x > 0 \\0 & \text{otherwise} \end{cases}\end{split}\]
Comparison displacement and influence line for displacement at \(x = ...\)#
x = np.linspace(0,6,100)
fig, axs = plt.subplots(2, 1, figsize=(7, 6))
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].plot(x,w_numpy(6,b,1500,x),color='blue')
axs[0].plot(a,w_numpy(6,b,1500,a),marker='o')
axs[0].annotate('%.2f mm' % np.round(w_numpy(6,b,1500,a)*1000,2),xy = [a,w_numpy(6,b,1500,a)-0.00005])
axs[0].annotate(text='', xy=(b,0), xytext=(b,-0.01), arrowprops=dict(arrowstyle='simple'))
axs[0].set_ylim([-0.009,0.05])
axs[0].invert_yaxis()
title0 = 'Displacement for force at at $x_F = '+str(b)+'$, showing displacement at $x_w = '+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,w_numpy(6,a,1500,x),color='blue')
axs[1].plot(b,w_numpy(6,a,1500,b),marker='o')
axs[1].annotate('%.2f mm' % np.round(w_numpy(6,a,1500,b)*1000,2),xy = [b,w_numpy(6,a,1500,b)-0.00005])
axs[1].set_ylim([-0.009,0.05])
axs[1].invert_yaxis()
title1 = 'Influence line for displacement at $x_w = '+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 displacement x_w = ... (m)",readout_format='.1f',style= {'description_width': '250px'},layout = {'width': '500px'}),
b = widgets.FloatSlider(min=0, max=6, value=2, step=0.1, description="Location force x_F = ... (m)",readout_format='.1f',style= {'description_width': '250px'},layout = {'width': '500px'}) );