我试图用箭头所示的力绘制梁的偏转图,但对于每个箭头,我都需要ax.annotate()
.
问题是,我的力量(阵列loadPositions
)可以介于0和“无穷大”有所不同,它dooesn't看起来像最佳方法就是让x
数ax.annotate
。
所以我的问题是:是否可以制作一个for
循环或可以使箭头数量等于loadPosition
数组长度的东西?
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('classic')
fig = plt.figure()
E = 200*10**9
I = 0.0001
beamLength = 5
loadPositions = np.array([1,5,2,4,2.5,3.5])
loadForces = np.array([-800000,300000,200000,-528584,255040,-256356])
beamSupport = 'cantilever'
n = 1000
nrOfEval = np.linspace(0, beamLength,n)
deflection = np.ones([len(nrOfEval),len(loadPositions)])
if beamSupport == 'both':
for i in range(len(nrOfEval)):
for j in range(len(loadPositions)):
if nrOfEval[i] < loadPositions[j]:
deflection[i,j] = loadForces[j]*(beamLength-loadPositions[j])*nrOfEval[i]/(6*E*I*beamLength)*(beamLength**2-nrOfEval[i]**2-(beamLength-loadPositions[j])**2)
if nrOfEval[i] >= loadPositions[j]:
deflection[i,j] = loadForces[j]*loadPositions[j]*(beamLength-nrOfEval[i])/(6*E*I*beamLength)*(beamLength**2-(beamLength-nrOfEval[i])**2-loadPositions[j]**2)
elif beamSupport == 'cantilever':
for i in range(len(nrOfEval)):
for j in range(len(loadPositions)):
if nrOfEval[i] < loadPositions[j]:
deflection[i,j] = loadForces[j]*nrOfEval[i]**2/(6*E*I)*(3*loadPositions[j]-nrOfEval[i])
if nrOfEval[i] >= loadPositions[j]:
deflection[i,j] = loadForces[j]*loadPositions[j]**2/(6*E*I)*(3*nrOfEval[i]-loadPositions[j])
else:
deflection = 'wrong support input'
deflection = np.sum(deflection,axis=1)
maxDeflectionIndex = np.abs(deflection).argmax()
print ("The maximum is at position::", maxDeflectionIndex)
maxDeflectionValue = deflection[maxDeflectionIndex]
print(maxDeflectionValue)
scaleForces = max(abs(loadForces))
fig, ax = plt.subplots()
ax.plot(nrOfEval,deflection)
plt.xlabel('Length[m]')
plt.ylabel('Deflection[mm]')
ax.axis('equal')
print('her')
ax.annotate('Maximum deflection', xy=(maxDeflectionIndex/n*beamLength, maxDeflectionValue), xytext=(maxDeflectionIndex/n*beamLength-0.7, 1),
arrowprops=dict(arrowstyle="->",
connectionstyle="angle3,angleA=0,angleB=-90"));
ax.annotate('F1', xy=(loadPositions[0], deflection[int(round(n/beamLength*loadPositions[0]))-1]), xytext=(loadPositions[0], loadForces[0]/scaleForces+deflection[int(round(n/beamLength*loadPositions[0]))-1]),
arrowprops=dict(facecolor='black', shrink=0))
ax.annotate('F2', xy=(loadPositions[1], deflection[int(round(n/beamLength*loadPositions[1]))-1]), xytext=(loadPositions[1], loadForces[1]/scaleForces+deflection[int(round(n/beamLength*loadPositions[1]))-1]),
arrowprops=dict(facecolor='black', shrink=0))
ax.annotate('F3', xy=(loadPositions[2], deflection[int(round(n/beamLength*loadPositions[2]))-1]), xytext=(loadPositions[2], loadForces[2]/scaleForces+deflection[int(round(n/beamLength*loadPositions[2]))-1]),
arrowprops=dict(facecolor='black', shrink=0))
ax.annotate('F4', xy=(loadPositions[3], deflection[int(round(n/beamLength*loadPositions[3]))-1]), xytext=(loadPositions[3], loadForces[3]/scaleForces+deflection[int(round(n/beamLength*loadPositions[3]))-1]),
arrowprops=dict(facecolor='black', shrink=0))
ax.annotate('F5', xy=(loadPositions[4], deflection[int(round(n/beamLength*loadPositions[4]))-1]), xytext=(loadPositions[4], loadForces[4]/scaleForces+deflection[int(round(n/beamLength*loadPositions[4]))-1]),
arrowprops=dict(facecolor='black', shrink=0))
ax.annotate('F6', xy=(loadPositions[5], deflection[int(round(n/beamLength*loadPositions[5]))-1]), xytext=(loadPositions[5], loadForces[5]/scaleForces+deflection[int(round(n/beamLength*loadPositions[5]))-1]),
arrowprops=dict(facecolor='black', shrink=0))
plt.show
你应该回归基础。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('classic')
fig = plt.figure()
E = 200*10**9
I = 0.0001
beamLength = 5
loadPositions = np.array([1,5,2,4,2.5,3.5])
loadForces = np.array([-800000,300000,200000,-528584,255040,-256356])
beamSupport = 'cantilever'
n = 1000
nrOfEval = np.linspace(0, beamLength,n)
deflection = np.ones([len(nrOfEval),len(loadPositions)])
if beamSupport == 'both':
for i in range(len(nrOfEval)):
for j in range(len(loadPositions)):
if nrOfEval[i] < loadPositions[j]:
deflection[i,j] = loadForces[j]*(beamLength-loadPositions[j])*nrOfEval[i]/(6*E*I*beamLength)*(beamLength**2-nrOfEval[i]**2-(beamLength-loadPositions[j])**2)
if nrOfEval[i] >= loadPositions[j]:
deflection[i,j] = loadForces[j]*loadPositions[j]*(beamLength-nrOfEval[i])/(6*E*I*beamLength)*(beamLength**2-(beamLength-nrOfEval[i])**2-loadPositions[j]**2)
elif beamSupport == 'cantilever':
for i in range(len(nrOfEval)):
for j in range(len(loadPositions)):
if nrOfEval[i] < loadPositions[j]:
deflection[i,j] = loadForces[j]*nrOfEval[i]**2/(6*E*I)*(3*loadPositions[j]-nrOfEval[i])
if nrOfEval[i] >= loadPositions[j]:
deflection[i,j] = loadForces[j]*loadPositions[j]**2/(6*E*I)*(3*nrOfEval[i]-loadPositions[j])
else:
deflection = 'wrong support input'
deflection = np.sum(deflection,axis=1)
maxDeflectionIndex = np.abs(deflection).argmax()
print ("The maximum is at position::", maxDeflectionIndex)
maxDeflectionValue = deflection[maxDeflectionIndex]
print(maxDeflectionValue)
scaleForces = max(abs(loadForces))
fig, ax = plt.subplots()
ax.plot(nrOfEval,deflection)
plt.xlabel('Length[m]')
plt.ylabel('Deflection[mm]')
ax.axis('equal')
print('her')
ax.annotate('Maximum deflection', xy=(maxDeflectionIndex/n*beamLength, maxDeflectionValue), xytext=(maxDeflectionIndex/n*beamLength-0.7, 1),
arrowprops=dict(arrowstyle="->",
connectionstyle="angle3,angleA=0,angleB=-90"));
for i in range(len(loadPositions)):
f_string = 'F' + str(i+1)
print(f_string)
ax.annotate(f_string, xy=(loadPositions[i], deflection[int(round(n/beamLength*loadPositions[i]))-1]), xytext=(loadPositions[i], loadForces[i]/scaleForces+deflection[int(round(n/beamLength*loadPositions[i]))-1]),
arrowprops=dict(facecolor='black', shrink=0))
plt.show()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句