2012-02-18 83 views
0

嗨我正在研究一個腳本,將解決和繪製使用龍格庫塔方法ODE。我希望腳本使用不同的功能,以便稍後可以對其進行擴展。如果我將它與函數定義一起編寫,它可以正常工作,但使用def()它不會打開繪圖窗口或打印結果。比你!函數計算龍格庫塔不繪圖

from numpy import * 
import matplotlib.pyplot as plt 

#H=p^2/2-cosq 
#p=dp=-dH/dq 
#q=dq=dH/dp 

t = 0 
h = 0.5 
pfa = []      #Create arrays that will hold pf,qf values 
qfa = [] 

while t < 10: 
    q = 1*t 
    p = -sin(q*t) 

    p1 = p 
    q1 = q 
    p2 = p + h/2*q1 
    q2 = q + h/2*p1 
    p3 = p+ h/2*q2 
    q3 = q+ h/2*p2 
    p4 = p+ h/2*q3 
    q4 = q+ h/2*p4 
    pf = (p +(h/6.0)*(p1+2*p2+3*p3+p4)) 
    qf = (q +(h/6.0)*(q1+2*q2+3*q3+q4)) 

    pfa.append(pf)     #append arrays 
    qfa.append(qf) 
    t += h       #increase time step       

print("test") 
plt.plot(pfa,qfa) 
print("test1") 
plt.show() 
print("tes2t") 
+0

你是不是叫'rk',但即使你做什麼,你只例如將計算單個點,圖形將顯示,但是爲空。 – talonmies 2012-02-18 23:48:16

+0

@talonmies你能解釋我怎樣才能把它繪製出來? – Surfcast23 2012-02-19 23:27:50

+0

你正在要求'plot()'畫一條線,但只提供一個點。如果你做了'plot([p,pf],[q,qf])',它會嘗試繪製兩點。即使如此,它仍然不會繪圖,因爲如果'h <6',因爲你正在進行整數計算並且'h/6 = 0',所以'p'和'pf'和'q'和'qf'將會相等。對於所有正數h小於6.另外,如果這確實應該是一個4階段顯式龍格庫塔方法,那麼看起來你的公式不正確。 – talonmies 2012-02-20 06:23:19

回答

1

如果你有一個函數聲明,你就需要在某一時刻調用它,如:

def rk(p,q,h): 
    pass # your code here 

if __name__ == '__main__': 
    rk(1,2,1) 

if __name__ == '__main__'塊內的函數調用將確保函數只被稱爲當您直接運行腳本時,而不是從其他腳本導入時。 (更多關於這裏,以防萬一你感興趣:What does if __name__ == "__main__": do?

這裏是一個更好的選擇;避免硬編碼FN ARGS(你真正的代碼應該有一些錯誤處理意外的命令行輸入):

def rk(p,q,h): 
    pass # your code here 

if __name__ == '__main__': 
    import argparse 
    the_parser = argparse.ArgumentParser() 
    the_parser.add_argument('integers', type=int, nargs=3) 
    args = the_parser.parse_args() 
    p,q,h = args.integers 
    rk(p,q,h) 
+0

謝謝@DSM的編輯。我只是在修理;你打敗了我。 – bernie 2012-02-18 23:18:53

+0

@ Adam Bernier感謝您的澄清 – Surfcast23 2012-02-19 01:10:46

+0

我試圖用你的方法來得到它的陰謀,但它是說pf和qf沒有在這裏定義是我做的 – Surfcast23 2012-02-19 01:27:12