2016-11-22 68 views
0

所以我试图做一个模拟自由落体的代码,除了代码从'1'而不是'0'开始之外,它几乎全部完成了。我的代码是:Python:列表的第一项不是从0开始

def simulateFreeFall(mass,deltaT,simulationTime): 
    acceleration = 9.81 
    velocity = 0 
    length = 0 
    velocity1 = 0 
    length1 = 0 
    times = [] 
    l = [] 
    v = [] 
    a = [] 
    x = 0 
    timeStep = simulationTime/deltaT 
    while x < timeStep: 
     elapsedTime = deltaT * x 
     Dvelocity = acceleration * deltaT 
     velocity1 = Dvelocity + velocity 
     velocity = velocity1 
     v.append(velocity1) 
     a.append(acceleration) 
     Dlength = velocity1 * deltaT 
     length1 = Dlength + length 
     length = length1 
     l.append(length1) 
     times.append(elapsedTime) 
     x += 1 
    plt.plot(times, l, 'rs') 
    plt.title("Free Fall - No Friction") 
    plt.xlabel("Time") 
    plt.ylabel("Fall Length") 
    plt.grid(True) 
    plt.show() 
    print(l[0]) 

simulateFreeFall(70,0.01,60) 

当我运行的代码列表中的“L”的第一长度是0.000981,而不是0我不知道我做错了什么它在技术上有什么应该是开始0.01秒后。

+0

从代码中可以清楚地看到x从0开始,所以问题的标题看起来不准确。你能得到你的问题标题以匹配你所问的问题吗?也许像“为什么这个循环的第一项不是0?”这并不理想,但它更好。此外,这并不能解决你的问题,但为什么你将length1和elapsedTime转换为浮点数?他们不是已经漂浮了吗? –

回答

3

您可以使用一些打印来调试。沿着流程使用print可以看到发生了什么。

没什么好惊讶的发生,l[0]是:

l[0] = length1 = Dlength + length = velocity1 * deltaT + lenght = 
= (Dvelocity + velocity) * deltaT + lenght 

和关键的是,

Dvelocity = acceleration * deltaT 

这是非零

+0

不太确定如何解决它,同时保持所有未来的计算相同,将重新排列功能修复方程式中的位置? – Langfao

+1

问题是你的速度计算是错误的。 'velocity = acceleration * elapsed_time'在第一次迭代中为0。 – elelias

2

velocity1是不是在第一循环0,所以length1不是0

1

原因是你calculat e速度超出加速度,并且您的时间步长在第一步中不为0,因此第一个长度既不是

+0

如果我重新排列它,以便速度公式在长度公式之后能够修复它? – Langfao

+0

是的,这将工作正常:-) – zodiac

相关问题