使用numpy matplotlib python的弹丸运动简单模拟

时间:2015-12-11 21:13:28

标签: python numpy matplotlib

我试图以各种角度绘制射弹的时间。角度范围从25到60,每个初始角度应在图表上有自己的线条。 "弹丸在空中的总时间"是t的公式。我不确定这个总时间是如何发挥作用的,因为我应该用各种初始角度在不同时间绘制抛射物。我想我需要x,x1,x2,x3,x4,x5和y等价物,以便绘制所有六个不同角度的图形。但我对如何处理花费的时间感到困惑。

import numpy as np 
import matplotlib.pylab as plot 

#initialize variables 
#velocity, gravity
v = 30 
g = -9.8 
#increment theta 25 to 60 then find  t, x, y
#define x and y as arrays 
theta = np.arange(25,65,5)   

t = ((2 * v) * np.sin(theta)) / g #the total time projectile remains in the #air
t1 = np.array(t) #why are some negative 



x = ((v * t1) * np.cos(theta))
y = ((v * t1) * np.sin(theta)) - ((0.5 * g) * (t ** 2))

plot.plot(x,y)
plot.show()

2 个答案:

答案 0 :(得分:3)

首先 g 是积极的!修好之后,让我们看一些方程式:

你已经知道了,但是让我们花点时间讨论一下。为了获得粒子的轨迹,你需要知道什么?

初始速度和角度,对吧?问题是:在初始速度为v=somethingtheta=something的情况下,在一段时间后找到粒子的位置。 初始很重要!那是我们开始实验的时候。所以时间是连续参数!你不需要飞行时间。

还有一件事: Angles 不能只写成60, 45, etc,python需要其他东西才能工作,所以你需要用数字来写它们,(0, 90)=(0,pi / 2)。

让我们看看代码:

import numpy as np
import matplotlib.pylab as plot
import math as m
#initialize variables
#velocity, gravity
v = 30
g = 9.8
#increment theta 25 to 60 then find  t, x, y
#define x and y as arrays

theta = np.arange(m.pi/6, m.pi/3, m.pi/36)

t = np.linspace(0, 5, num=100) # Set time as 'continous' parameter.

for i in theta: # Calculate trajectory for every angle
    x1 = []
    y1 = []
    for k in t:
        x = ((v*k)*np.cos(i)) # get positions at every point in time
        y = ((v*k)*np.sin(i))-((0.5*g)*(k**2))
        x1.append(x)
        y1.append(y)
    p = [i for i, j in enumerate(y1) if j < 0] # Don't fall through the floor                          
    for i in sorted(p, reverse = True):
        del x1[i]
        del y1[i]

    plot.plot(x1, y1) # Plot for every angle

plot.show() # And show on one graphic

enter image description here

答案 1 :(得分:2)

你犯了很多错误。

首先,这不是一个错误,但matplotlib.pylab据说可以用来同时访问matplotlib.pyplotnumpy(对于更像matlab的体验),我认为它是更多建议在脚本中使用matplotlib.pyplot as plt(另请参阅this Q&A)。

其次,您的角度以度为单位,但默认情况下数学函数为弧度。在将角度传递给三角函数之前,必须将角度转换为弧度。

第三,您当前的代码集t1为每个角度设置一个时间点。这不是您所需要的:您需要计算每个角度的最大时间t(您在t中执行的操作),然后为每个角度创建{{1}的时间向量} 0 用于绘图!

最后,您需要在t的两个术语中使用相同的绘图时间向量,因为这是您的力学问题的解决方案:

y

这假定y(t) = v_{0y}*t - g/2*t^2 为正,这在您的代码中也是错误的。除非你将g轴设置为向下指向,但是单词&#34; projectile&#34;让我觉得情况并非如此。

所以这就是我要做的事情:

y

我利用了import numpy as np import matplotlib.pyplot as plt #initialize variables #velocity, gravity v = 30 g = 9.81 #improved g to standard precision, set it to positive #increment theta 25 to 60 then find t, x, y #define x and y as arrays theta = np.arange(25,65,5)[None,:]/180.0*np.pi #convert to radians, watch out for modulo division plt.figure() tmax = ((2 * v) * np.sin(theta)) / g timemat = tmax*np.linspace(0,1,100)[:,None] #create time vectors for each angle x = ((v * timemat) * np.cos(theta)) y = ((v * timemat) * np.sin(theta)) - ((0.5 * g) * (timemat ** 2)) plt.plot(x,y) #plot each dataset: columns of x and columns of y plt.ylim([0,35]) plot.show() 将绘制两个矩阵输入相对于彼此的列的事实,因此不需要在角度上进行循环。我还使用plt.plot[None,:]将1d numpy [:,None]分别转换为2d行和列向量。通过乘以行向量和列向量,阵列广播可确保生成的矩阵按照我们想要的方式运行(即array的每列从timemat转到100中的相应0步骤)

结果:

plot