两列火车和一只鸟

时间:2018-09-29 15:18:10

标签: python

我必须为经典的物理问题创建代码。链接到问题的解释:http://mathforum.org/dr.math/faq/faq.fly.trains.html 但是在我的代码中,用户输入了火车的速度,火车与火车之间的距离以及鸟的速度,它需要输出鸟与火车和鸟的位置每行驶0.01秒所经过的总距离。以下是我的代码,我需要一些帮助来改进它。

t=0
v1= input ("Insert the trains' speed= ")
d= input ("Insert the distance between the trains= ")
va= input ("Insert the bird's speed= ")

v1= float(v1)
d=float(d)
va=float(va)

s1=0
s2=d

while s1<=s2:
 s1= v1*t
 s2=d-v1*t
 sa=va*t
 t1=d/(2*v1)
 da=t1*va
 tx1= ("Position of train 1= %sm")
 tx2= ("Position of train 2= %sm")
 tx3= ("Bird's position= %sm")
 print(tx1 % s1)
 print(tx2 % s2)
 print(tx3 % sa)
  t=t+0.01


if s1==s2:
 print ("The bird died")
 txt4=("Total distance traveled by the bird= %sm")
 print (txt4 % da)

2 个答案:

答案 0 :(得分:0)

通常,在浮点数之间进行比较时,您要避免测试精确相等性。

例如,在这里,您可能希望s1==s2在比较True时返回2.001010191012393 == 2.001010191012394

在这种情况下,您可以使用if s1>=s2代替if s1==s2来解决此问题。

您还可以像这样在else中使用while

x, y = 1, 5
while x<y:
    x = x + 1
    print x
else:
    print "done"

更一般而言(即,当比较不是单面时),您可以使用类似abs(s2-s1)<epsilon的表达式,其中epsilon是一个适当的小数。在您的情况下,这有点困难,因为epsilon是模拟中参数的函数,可能比机器精度大得多,但与您的时间步长(0.01有关, )。因此,单方面的不平等现象越来越好。

答案 1 :(得分:0)

最后那只鸟死了。它是怎么死的。主要修改是if abs(s1-s2) < 1e-8:,以使您的代码正常工作。问题是,当s1s2相等时,条件if s1==s2:不起作用,因为它正在比较14.999999915.0000000之类的数字它们虽然相等,但以略有不同的浮点表示。一个简单的解决方案是检查这两个数字之间的绝对差是否小于某个很小的数字,例如1e-8

当小鸟死于循环之外时,我还在您的代码中添加了break。如果您不想这样做,请将其删除。我还删除了打印所需的不必要行,从而缩短了代码。

while s1<=s2:
    s1 = v1*t
    s2 = d-v1*t
    sa = va*t
    t1 = d/(2*v1)
    da = t1*va
    print("Position of train 1 = %s m"%s1)
    print("Position of train 2 = %s m"%s2)
    print("Bird's position = %s m"%sa)
    t=t+0.01

    if abs(s1-s2) < 1e-8:
        print ("The bird died")
        print("Total distance traveled by the bird= %s m" %da)
        break 

输出

Insert the trains' speed= 30
Insert the distance between the trains= 30
Insert the bird's speed= 20

Position of train 1 = 0.0 m
Position of train 2 = 30.0 m
Bird's position = 0.0 m
.
.
.
Bird's position = 10.000000000000004 m
The bird died
Total distance traveled by the bird= 10.0 m