@MitoY
2016-05-07T10:48:01.000000Z
字数 1877
阅读 813
作者:敬雷
2.19题
代码在这里。
空气阻力为:
为:
注意:以上所有公式中的 , 均表示球的速度而非风相对于球的速度,并且假定空气静止。
程序的伪代码为:
def update(dt):pos += vel * dtvel += (F_drag / m + F_M / m + gravity) * dtdt = 1 #sfor i in range(1000):update(dt) # +1s
其中pos和vel等用numpy中的array表示,好处是各种矢量运算很方便。
取棒球出射速度为;自转角速度应该与出射方向垂直,取为;出射位置。对分别为0,2000,4000 作计算得到轨迹,作出轨迹图和在坐标面的投影如下:

可以看出,球偏转得相当厉害。
如果取自转角速度为,其他条件不变,那么得到轨迹图如下:

可以看出,球没有往侧面偏转,而是飞得更高或更矮了。
使用vpython可视化炮弹发射或者棒球运动
并没有录制动态图的条件,那就放代码好了。
示例代码如下:(其中Cannon就是本文开头所放的那个代码)
import Cannonimport visual as vpimport mathground = vp.box(pos = (0,0,0), size = (60, 140, 1), color = (.2,.3,.2))init_vel = [0,40,30]omega = 2000 / 60.0 * 2 * math.pisaki = Cannon.Cannon(init_vel, Cannon.force, pos = (0, -70, 0), spin = [0, -omega*3/5, omega*4/5])saki_ball = vp.sphere(pos = saki.get_pos(), radius = 0.5, color = vp.color.cyan)saki_ball.trail = vp.curve(color=saki_ball.color)vscale = 0.115varr = vp.arrow(pos=saki_ball.pos, axis=vscale * saki.get_vel(), color=vp.color.yellow)delta_t = 0.01t = 0while t < 20:vp.rate(100) # This specifies that the while loop will not be executed more than 100 times per secondsaki.update(delta_t)if saki.get_pos()[2] < 0: breaksaki_ball.pos = saki.get_pos()t += delta_tvarr.axis = vscale * saki.get_vel()varr.pos = saki_ball.possaki_ball.trail.append(po: saki_ball.pos)
效果如下:

嘛,勉勉强强。
.
..
.
..
.
..