2016-01-08 427 views
1

我想寫一個代碼,將繪製一個球從高度h下降的模擬,並使用運動方程y = y_0 我的代碼是這樣的:隨着時間的推移隨着時間的推移球的位置下降的情節

從matplotlib.pylab進口展,xlabel,ylabel,散佈,情節 從numpy的進口空

def drop(): 

    """ 
    This function calculates and creates arrays for the velocity at eac time interval as well as the position and plots it. Assuming no drag. 
    """ 
    #Define the constants in the problem 
    h_0 = 10 
    g = -9.8 #gravitational constant N 
    dt = 0.1 #timestep 

    #Now need to create arrays to hold the positins, time, and velocities 
    vel = empty(1000,float) 
    time = empty(1000,float) 
    y = empty(1000,float) 

    time[0] = 0 
    vel[0] = 0 
    y[0] = h_0 

    #code for the kinematic equations for the calculation of time, velocity and position 
    for i in range of (1000-1): 
     time[i+1] = time[i] + dt 
     vel[i+1] = vel[i] + (g * dt) 
     y[i+1] = time[i] + (vel[i+1] * dt) 

     if y[i] > 0: 
     #ensures that the graph will not keep going when the ball hits the ground 
      break 


    plot(time,y, '.') 
    xlabel("Time(s)") 
    ylabel("Position") 
    show() 

但是我的圖形繪製三個點之一的圖時的每個角落它應該看起來像一條曲線,我的圖形每次都會改變,因爲不是ne的變量正在變化

回答

1

好吧,讓我們看看語法錯誤。 for i in range of (1000-1)實際上是for i in range(1000-1),但我認爲這是你的錯誤,因爲你可以讓代碼運行。

現在,你的運動方程是錯誤的。

y[i+1] = time[i] + (vel[i+1] * dt) 

# should be 
y[i+1] = y[i] + (vel[i] * dt) 

您退出模擬的條件也有缺陷。

if y[i] > 0: 

# you have to stop when the height becomes until negative 
if y[i+1] < 0: 

自己的錯誤,到目前爲止意味着一個迭代後,你會退出循環,其有效地不會改變您的y陣列。最後的問題在這裏開始。 numpy.empty()在不初始化值的情況下創建一個數組。這意味着原始值將會是當前存儲在內存中的任何值。如果在打破循環後打印y,您可能會注意到大多數值爲0,而有些值非常小但不接近0,例如, 3.18377034e-308。由於它們是陣列中最高的值,因此它們會將您的情節縮放到其範圍。但是由於它們是任意值,每次運行代碼時,它都會產生不同的數字。

你有兩個選擇來解決這個問題。可以使用numpy.zeros(),也可以只繪製第一個y[:i]值,這是您打破地面的循環中的點。


由於我們對您的問題方程的解析解,你可以不設循環和vectorise使用數組的一切。我們可以求解關於t(二次方程)的位移方程,以確定什麼時候我們會到達地面。然後我們初始化時間數組並用它來計算位移(速度是可選的)。

import numpy as np 
import matplotlib.pyplot as plt 

def time_to_hit_ground(y0, v0, a): 
    discriminant = np.sqrt(v0**2 - 2*a*y0) 
    t1 = (-v0 - discriminant)/a 
    t2 = (-v0 + discriminant)/a 
    if t1 >=0: 
     return t1 
    return t2 

def drop(y0, v0=0.0, dt=0.1, g=-9.8): 
    if y0 < 0: 
     print('Object is underground.') 
     return 
    # if you also allow the user to change `dt` and `g` from the arguments, 
    # you want to check they have the correct sign. 

    t_ground = time_to_hit_ground(y0, v0, g) 

    t = np.arange(0, t_ground+dt, dt) 
    v = v0 + g * t 
    y = y0 + v0 * t + g * t**2/2. 

    plt.plot(t, y, '.') 
    plt.axvline(t_ground, color='g') 
    plt.axhline(0, color='g') 
    plt.xlabel('Time (s)') 
    plt.ylabel('Height (m)') 
    plt.show() 
相關問題