回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在编写一个程序,用不同的参数来计算一颗子弹以20度角射出的距离,不管有没有阻力。出于某种原因,我的程序立即计算出子弹的y值低于零,我想这可能是我使用的物理方程有问题。我没有最扎实的物理学背景,所以在尽我最大的努力找出我哪里出错后,我想我会寻求帮助。在下面的图表中,我试图显示与不同时间步相关的不同距离。你知道吗</p>
<pre><code> import math
import matplotlib.pyplot as plt
rho = 1.2754
Af = math.pi*(16*0.0254)**2/4
g = -9.8 #m/s^2
V = 250.0 #m/s
#equation of motion
def update(r,V,a,dt):
return r+V*dt +.5*a*dt*dt, V + a*dt
#drag force from velocity vector return x and y
def drag(Vx,Vy):
Vmag = math.sqrt(Vx**2+Vy**2)
Ff = .5*Cd*rho*Af*Vmag**2
return -Ff * Vx/Vmag, -Ff *Vy/Vmag
def getTrajectory(dt, th):
#initialize problem [time,x,y,Vx,Vy]
state = [[0.0,0.0,0.0, V*math.cos(th), V*math.sin(th)]]
while state[-1][2] >= 0 : # while y > 0
time = state[-1][0] + dt
Fd = drag(state[-1][3],state[-1][4]) # Vx,Vy
ax = Fd[0]/m # new x acceleration
ay = (Fd[1]/m) +g # new y acceleration
nextX, nextVx = update(state[-1][1], state[-1][3],ax,dt) #x,Vx,acceleration x, dt
nextY, nextVy = update(state[-1][2], state[-1][4],ay,dt) #y,Vy, acceleration y, dt
state.append([time,nextX,nextY,nextVx,nextVy])
# linear interpolation
dtf = -state[-1][2]*(state[-2][0]-state[-1][0])/(state[-2][2]-state[-1][2])
xf,vxf = update(state[-1][1],state[-1][3], ax, dtf)
print(xf,vxf)
yf,vyf = update(state[-1][2],state[-1][4], ay, dtf)
print(yf,vyf)
state[-1] = [time+dtf,xf,yf,vxf,vyf]
return state
delt = 0.01 #timestep
th = 20.0 * math.pi/180.0 #changing to radians
m = 2400 #kg
Cd = 1.0
tsteps = [0.001,0.01,0.1,1.0,3.0] # trying different timesteps to find the optimal one
xdistance = [getTrajectory(tstep,th)[-1][1] for tstep in tsteps]
plt.plot(tsteps,xdistance)
plt.show()
</code></pre>
<p>一个timestep之后包含time、x、y、Vx和Vy的所有值的状态变量的打印产生:
[[0.0, 0.0, 0.0, 234.9231551964771, 85.50503583141717]
,[0.0,0.0,-9.540979117872439e-18234.9231551964771,85.50503583141717]]
第一个数组是初始条件,Vx和Vy被分解成20度角的向量。第二个数组应该让子弹以正的x和y飞走,但是由于某些原因,y值被计算为-9.54e-18,这就放弃了getTrajectory方法,因为它只应该在y>;0时继续</p>
<p>为了简化我的问题,我认为具体研究一下我的update函数可能会有所帮助。你知道吗</p>
<pre><code> def update(initial,V,a,dt): #current x or y, Velocity in the x or y direction, acceleration in x or y, timestep
return initial+V*dt +.5*a*dt*dt, V + a*dt
</code></pre>
<p>这个函数应该根据传递的内容返回一个更新的x,Vx或更新的y,Vy。我想这可能是物理方程的问题所在,但我不完全确定。你知道吗</p>