import matplotlib
if not hasattr(matplotlib.RcParams, "_get"):
matplotlib.RcParams._get = dict.get
Extension elements statically determinate 1#
Click –> Live Code on the top right corner of this screen to investigate some plasticity!
import micropip
await micropip.install("ipympl")
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np
import sympy as sym
import ipywidgets as widgets
#from IPython.display import display
%matplotlib widget
wM = sym.symbols('wM',real=True,positive=True)
deltawAM = sym.symbols('deltawAM',real=True)
E = sym.nsimplify(200e9)
A1 = sym.nsimplify(10e-6)
fy = sym.nsimplify(500e6)
L = 6
bm = 2
kA = E * A1 / 6
kB = E * A1 / 10
wAz = wM-deltawAM/3*(6-bm)
wBz = wM+deltawAM/3*bm
wBx = sym.cos(deltawAM/(L/(bm/6)))*6
FA = sym.Piecewise((kA * wAz,kA * wAz <= fy*A1), (fy*A1, True))
FB = sym.Piecewise((kB * wBz,kB * wBz <= fy*A1), (fy*A1, True))
F = sym.symbols('F',real=True,positive=True)
eq1 = sym.Eq(FA + FB - F,0)
eq2 = sym.Eq(F * (6-bm) - FB * 6,0)
F_sol = sym.solve(eq1,F)[0]
deltawAM_sol = sym.solve(eq2.subs(F,F_sol),deltawAM)
w_lim = float(deltawAM_sol[0].args[0][1].rhs)
deltawAM_sol = sym.Piecewise((deltawAM_sol[0].args[0][0], deltawAM_sol[0].args[0][1]), (deltawAM_sol[1].args[0][0], deltawAM_sol[1].args[0][1]))
eps = sym.symbols('eps',real=True,positive=True)
sigmaA = FA.subs(deltawAM,deltawAM_sol)/A1
epsA = wAz.subs(deltawAM,deltawAM_sol)/6
sigmaB = FB.subs(deltawAM,deltawAM_sol)/A1
epsB = wBz.subs(deltawAM,deltawAM_sol)/10
wAz_nump = sym.lambdify(wM,wAz.subs(deltawAM,deltawAM_sol))
wBz_nump = sym.lambdify(wM,wBz.subs(deltawAM,deltawAM_sol))
wBx_nump = sym.lambdify(wM,wBx.subs(deltawAM,deltawAM_sol))
sigmaA_nump = sym.lambdify(wM,sigmaA)
sigmaB_nump = sym.lambdify(wM,sigmaB)
epsA_nump = sym.lambdify(wM,epsA)
epsB_nump = sym.lambdify(wM,epsB)
F_nump = sym.lambdify(wM,F_sol.subs(deltawAM,deltawAM_sol))
fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(1,3,1)
ax1.set_aspect('equal')
ax2 = fig.add_subplot(2,3,2)
ax3 = fig.add_subplot(2,3,3)
ax4 = fig.add_subplot(2,3,6)
ax2.spines['right'].set_color('none')
ax2.spines['top'].set_color('none')
ax3.spines['right'].set_color('none')
ax3.spines['top'].set_color('none')
ax4.spines['right'].set_color('none')
ax4.spines['top'].set_color('none')
fig.tight_layout()
wM_list = np.array([0,w_lim,0.2])
scale = 30
def update_plot(w):
wM_num = w
ax1.clear() # Clear the existing plot
ax2.clear()
ax3.clear()
ax4.clear()
ax1.set_xlim([-1,7])
ax1.set_ylim([-7,11])
ax1.plot([0,0],[-wAz_nump(wM_num)*scale,6])
# Get the color of the previous plot
color1 = ax1.get_lines()[-1].get_color()
ax1.plot([wBx_nump(wM_num),wBx_nump(wM_num)],[-wBz_nump(wM_num)*scale,10])
if wM_num < w_lim:
ax1.plot([wBx_nump(wM_num),wBx_nump(wM_num)],[-wBz_nump(wM_num)*scale,10])
else:
ax1.plot([wBx_nump(wM_num),wBx_nump(wM_num)],[-wBz_nump(wM_num)*scale,10],linewidth=3)
color2 = ax1.get_lines()[-1].get_color()
ax1.plot([0,wBx_nump(wM_num)],[-wAz_nump(wM_num)*scale,-wBz_nump(wM_num)*scale],color='black')
ax1.annotate('', xy=(wBx_nump(wM_num)*((6-bm)/6), -w*scale), xytext=(wBx_nump(wM_num)*((6-bm)/6), 0) , arrowprops=dict(arrowstyle='fancy'))
ax1.axis('off')
y1 = np.array([[0-1/3,6+1/2], [0+0,6+0], [0+1/3,6+1/2]])
p1 = Polygon(y1, facecolor = '#00CC99',edgecolor='black')
ax1.add_patch(p1)
ax1.plot([0-1/2,0+1/2],[6+1/2,6+1/2],color='black')
y2 = np.array([[wBx_nump(wM_num)-1/3,10+1/2], [wBx_nump(wM_num)+0,10+0], [wBx_nump(wM_num)+1/3,10+1/2]])
p2 = Polygon(y2, facecolor = '#00CC99',edgecolor='black')
ax1.add_patch(p2)
ax1.plot([wBx_nump(wM_num)-1/2,wBx_nump(wM_num)+1/2],[10+1/2,10+1/2],color='black')
ax1.plot([wBx_nump(wM_num)-1/2,wBx_nump(wM_num)+1/2],[10+1/2+1/4,10+1/2+1/4],color='black')
ax3.plot(epsB_nump(wM_list),sigmaB_nump(wM_list)/1e6,color=color2)
ax3.plot(epsB_nump(wM_num),sigmaB_nump(wM_num)/1e6,'o',color=color2)
ax3.set_ylabel('$\sigma$ [MPa]')
ax3.set_xlabel('$\epsilon$ [MPa]')
ax3.set_xlim([-0.001,max(epsB_nump(0.1)+0.001,epsB_nump(wM_num)+0.001)])
ax2.plot(epsA_nump(wM_list),sigmaA_nump(wM_list)/1e6,color=color1)
ax2.plot(epsA_nump(wM_num),sigmaA_nump(wM_num)/1e6,'o',color=color1)
ax2.set_ylabel('$\sigma$ [MPa]')
ax2.set_xlabel('$\epsilon$ [MPa]')
ax4.plot(wM_list,F_nump(wM_list),color='black')
ax4.plot(wM_num,F_nump(wM_num),'o',color='black')
ax4.set_ylabel('$F$ [N]')
ax4.set_xlabel('$w$ [m]')
ax4.set_xlim([0-0.002,max(0.1+0.002,wM_num+0.002)])
ax2.set_yticklabels([])
ax2.set_xticklabels([])
ax3.set_yticklabels([])
ax3.set_xticklabels([])
ax4.set_yticklabels([])
ax4.set_xticklabels([])
plt.draw()
w_slider = widgets.FloatSlider(value=0, min=0, max=0.2, step=0.0001, description='w:')
widgets.interact(update_plot, w = w_slider);