我设法为以下问题编写了以下代码:
<块引用>弹丸的水平和垂直位移由下式给出:
x = v_0 \, t \cos(\theta)
y = v_0 \, t \sin(\theta) - \frac{1}{2}gt^2
考虑时间间隔为 t \in [0, 60] seconds
。编写 Python 代码来绘制水平和垂直位移(意思是 y
作为 x
) 的函数,初始速度为 40 m/sec
同一图形上的角度(30、45、60 和 75 度)。然后保存
文本文件中的数据。
我的代码是:
import numpy as np
import matplotlib.pyplot as plt
v = 40
g = 9.8
def x(theta):
return ((v*t)*np.cos(theta*np.pi/180))
def y(theta):
return ((v*t)*np.sin(theta*np.pi/180))-((0.5*g)*(t**2))
t = np.linspace(0, 60,600)
table = t
for theta in range(30, 90, 15):
X = x(theta)
Y = y(theta)
if np.all(Y < 0):
break
plt.plot(X, Y, label=theta)
table=np.column_stack((table,X, Y))
np.savetxt("projectile_1.txt", table, fmt='%.3e', delimiter=" ")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Range as a Function of Angle")
plt.legend()
plt.show()
我确实知道问题出在 Y
的负值(地板下方的垂直位移)。为什么我的 if 语句不会中断循环并因此从绘图和保存文件中排除那些负值?如何跳过保存和绘制负值?
答案 0 :(得分:0)
您可以将所有负值设置为无。请注意,如果您想从文本输出中删除所有“nan”,您可以简单地将它们替换为 fileinput。请注意,如果您打算稍后使用它,这确实会改变数据的形状。
import numpy as np
import matplotlib.pyplot as plt
import fileinput
v = 40
g = 9.8
def x(theta):
return ((v*t)*np.cos(theta*np.pi/180))
def y(theta):
return ((v*t)*np.sin(theta*np.pi/180))-((0.5*g)*(t**2))
t = np.linspace(0, 60,600)
table = t
for theta in range(30, 90, 15):
X = x(theta)
Y = y(theta)
X[X < 0] = None
Y[Y < 0] = None
plt.plot(X, Y, label=theta)
table=np.column_stack((table,X, Y))
np.savetxt("projectile_1.txt", table, fmt='%.3e', delimiter=" ")
with fileinput.FileInput("projectile_1.txt", inplace=True, backup='.bak') as file:
for line in file:
print(line.replace('nan', ''), end='')
plt.xlabel("x")
plt.ylabel("y")
plt.title("Range as a Function of Angle")
plt.legend()
plt.show()
答案 1 :(得分:0)
我已经计算出射弹击中地面的总时间;因此,完全避免负值:
import numpy as np
import matplotlib.pyplot as plt
v = 40 #initial velocity
g = 9.8 #acceleration due to Earth's gravity
#Defining the Horizontal and Vertical Displacements
def x(theta):
return ((v*t)*np.cos(theta*np.pi/180))
def y(theta):
return ((v*t)*np.sin(theta*np.pi/180))-((0.5*g)*(t**2))
columns = [] #an empty List to be used for saving the Data
for theta in range(30, 90, 15):
t_total = 2 * v * np.sin(theta*np.pi/180)/g #Time to hit the ground
t = np.linspace(0, t_total,600)
X = x(theta)
Y = y(theta)
plt.plot(X, Y, label=theta)
columns += [t,X,Y]
T = np.column_stack(columns)
np.savetxt("Data.txt", T, fmt='%.3e', delimiter=" ")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Range as a Function of Angle")
plt.legend()
plt.show()