我试图用箭头所示的力绘制光束的偏转图,但是对于每个箭头,我都需要ax.annotate()
。
问题是我的力数组(loadPositions
)可以在0到“无穷大”之间变化,并且看来最佳方法似乎并不是使{{1} }。
所以我的问题是:是否可以使x
循环或使箭头的数量等于我的ax.annotate
数组的长度的东西?
for
答案 0 :(得分:0)
您应该回到基础。
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()