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