我试图以各种角度绘制射弹的时间。角度范围从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()
答案 0 :(得分:3)
首先 g 是积极的!修好之后,让我们看一些方程式:
你已经知道了,但是让我们花点时间讨论一下。为了获得粒子的轨迹,你需要知道什么?
初始速度和角度,对吧?问题是:在初始速度为v=something
和theta=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
答案 1 :(得分:2)
你犯了很多错误。
首先,这不是一个错误,但matplotlib.pylab
据说可以用来同时访问matplotlib.pyplot
和numpy
(对于更像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
步骤)
结果: