Python实现平抛运动模拟时小球仅垂直向上运动的修改咨询
平抛运动模拟代码错误修复方案
核心问题及修改点
- 初始参数赋值颠倒
原代码中v是速度数组、x是位置数组,你错误地将初始高度赋值给了速度的y分量,水平初速度赋值给了位置的x分量,正确的初始赋值应该是:
初始位置x=0、y=H,初始速度x=v0x、y=0,对应代码修改为:
# 修正后初始赋值 x[0] = np.array([0. , H]) v[0] = np.array([v0x , 0.])
- 重力方向设置错误
y轴向上为正方向时,重力加速度方向向下,受力y分量应为负值,修改为:
f[:] = np.array([0., -m * g])
- x轴显示范围过小
根据模拟时长和水平初速度调整x轴范围,模拟100秒的话x轴最大设为1000即可适配水平位移:
ax.set(xlim=(0,1000), ylim=(0,600), xlabel="position, metres", ylabel="height, metres", title="falling apple")
- (可选优化)增加触地停止逻辑,避免小球落到地面以下后继续运动,模拟循环可以修改为:
for n in range(N): v[n+1] = v[n] + ((f[n]/m) * dt) x[n+1] = x[n] + (v[n+1] * dt) # 触地后位置、速度都置为0,停止运动 if x[n+1, 1] <= 0: x[n+1, 1] = 0 v[n+1] = np.array([0,0])
修正后完整代码
import numpy as np import matplotlib.pyplot as plot from IPython.display import HTML from matplotlib import animation #setup fig with axis fig, ax = plot.subplots(figsize=(8,8)) #set axis limits 调整x轴范围适配水平位移 ax.set(xlim=(0,1000), ylim=(0,600), xlabel="position, metres", ylabel="height, metres", title="falling apple") #initial params T = 100. m = 3 g = 9.81 v0x = 10 H = 553. #setting calc interval dt = 0.1 N = int(T/dt) #arrays v = np.zeros((N+1 , 2)) x = np.zeros((N+1 , 2)) f = np.zeros((N+1 , 2)) #修正初始赋值:x是位置[x,y],v是速度[vx, vy] x[0] = np.array([0. , H]) v[0] = np.array([v0x , 0.]) # 修正重力方向:y轴向上为正,重力向下所以为负 f[:] = np.array([0., -m * g]) #running the dynamics sim 增加触地停止逻辑 for n in range(N): v[n+1] = v[n] + ((f[n]/m) * dt) x[n+1] = x[n] + (v[n+1] * dt) if x[n+1, 1] <= 0: x[n+1, 1] = 0 v[n+1] = np.array([0,0]) #scatter plot scat_plt = ax.scatter(x[0,0], x[0,1], marker='o', c='#1f77b4', s=200) ## animating def animate(i): scat_plt.set_offsets(x[i]) ani = animation.FuncAnimation(fig, func=animate, frames=N) ani.save('ball.html', writer=animation.HTMLWriter(fps= 1//dt)) plot.close() ani.save('ball.mp4', fps= 1//dt) HTML('ball.html')
内容的提问来源于stack exchange,提问作者Aakif Rehman
相关产品推荐
相关产品推荐

