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

使用numpy matplotlib python进行弹丸运动简单模拟,python,numpy,matplotlib,Python,Numpy,Matplotlib,我试图以不同的角度绘制一个投射物通过时间的图形。角度范围从25到60,每个初始角度在图形上应有自己的线。“弹丸在空中的总时间”的公式是t的公式。我不确定这个总时间是如何起作用的,因为我应该用不同的初始角度绘制不同时间的射弹。我想我需要x,x1,x2,x3,x4,x5和y的等价物来绘制所有六个不同角度的图形。但我不知道该如何处理所花的时间 import numpy as np import matplotlib.pylab as plot #initialize variables #ve

我试图以不同的角度绘制一个投射物通过时间的图形。角度范围从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()
首先,g是正的!修正后,让我们看一些方程式:

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

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

还有一件事:角度不能只写为
60、45等
,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
将numpy导入为np
将matplotlib.pylab导入为绘图
导入数学为m
#初始化变量
#速度,重力
v=30
g=9.8
#将θ25增加到60,然后求出t,x,y
#将x和y定义为数组
θ=np.arange(m.pi/6,m.pi/3,m.pi/36)
t=np.linspace(0,5,num=100)#将时间设置为“连续”参数。
对于θ中的i:#计算每个角度的轨迹
x1=[]
y1=[]
对于k in t:
x=((v*k)*np.cos(i))#获取每个时间点的位置
y=((v*k)*np.sin(i))-((0.5*g)*(k**2))
x1.附加(x)
y1.附加(y)
p=[i代表i,j在枚举(y1)中,如果j<0]#不要掉到地板上
对于排序中的i(p,reverse=True):
德尔x1[i]
del y1[i]
绘图。绘图(x1,y1)#绘制每个角度
plot.show()#并在一个图形上显示
首先,g是正的!修正后,让我们看一些方程式:

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

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

还有一件事:角度不能只写为
60、45等
,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
将numpy导入为np
将matplotlib.pylab导入为绘图
导入数学为m
#初始化变量
#速度,重力
v=30
g=9.8
#将θ25增加到60,然后求出t,x,y
#将x和y定义为数组
θ=np.arange(m.pi/6,m.pi/3,m.pi/36)
t=np.linspace(0,5,num=100)#将时间设置为“连续”参数。
对于θ中的i:#计算每个角度的轨迹
x1=[]
y1=[]
对于k in t:
x=((v*k)*np.cos(i))#获取每个时间点的位置
y=((v*k)*np.sin(i))-((0.5*g)*(k**2))
x1.附加(x)
y1.附加(y)
p=[i代表i,j在枚举(y1)中,如果j<0]#不要掉到地板上
对于排序中的i(p,reverse=True):
德尔x1[i]
del y1[i]
绘图。绘图(x1,y1)#绘制每个角度
plot.show()#并在一个图形上显示

你犯了很多错误

首先,错误较少,但是
matplotlib.pylab
被认为是用来同时访问
matplotlib.pyplot
numpy
(为了获得更像matlab的体验),我认为更建议在脚本中使用
matplotlib.pyplot作为plt
(另请参见)

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

第三,当前代码将
t1
设置为每个角度都有一个时间点。这不是您所需要的:您需要计算每个角度的最大时间
t
(您在
t
中所做的),然后为每个角度创建一个从
0
t
的时间向量以进行绘图

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

y(t) = v_{0y}*t - g/2*t^2
这假设
g
为正,这在代码中也是错误的。除非你把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,:]
[:,None]
分别将1d numpy
数组
转换为二维行和列向量。通过将行向量和列向量相乘,阵列广播确保生成的矩阵以我们想要的方式运行(即,
timemat
的每一列从
0
到相应的
tmax
分100步进行)

结果:


你犯了很多错误

首先,错误较少,但是
matplotlib.pylab
被认为是用来访问
matplotlib.pyplot
numpy