我试图用箭头所示的力来绘制梁的偏转曲线,但是对于每个箭头我都需要ax.annotate()
。你知道吗
问题是,我的力数组(loadPositions
)可以在0和“无穷大”之间变化,似乎不是最佳的方法,只是使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
你应该回到基础上来。你知道吗
相关问题 更多 >
编程相关推荐