子地块x次数取决于数组的长度

2024-10-01 02:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用箭头所示的力来绘制梁的偏转曲线,但是对于每个箭头我都需要ax.annotate()。你知道吗

问题是,我的力数组(loadPositions)可以在0和“无穷大”之间变化,似乎不是最佳的方法,只是使xax.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

Tags: nppltaxintxyannotateroundxytext
1条回答
网友
1楼 · 发布于 2024-10-01 02:40:08

你应该回到基础上来。你知道吗

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()

相关问题 更多 >