2016-11-22 21 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

相關問題