使用 if 语句跳过 for 循环

时间:2021-02-17 15:31:08

标签: python numpy

我设法为以下问题编写了以下代码:

<块引用>

弹丸的水平和垂直位移由下式给出:

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 语句不会中断循环并因此从绘图和保存文件中排除那些负值?如何跳过保存和绘制负值?

2 个答案:

答案 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()

The Plot