2012-02-18 9 views
0

こんにちは私はRunge Kuttaメソッドを使用してODEを解決しプロットするスクリプトに取り組んでいます。私はスクリプトが異なる機能を使用するようにしたいので、後でそれを拡張することができます。関数定義を書いてもうまく動作しますが、def()を使うとプロットウィンドウを開くことも、結果を出力することもありません。あなたより!Runge Kutta Not Plotを計算する関数

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'、しかし、あなたが行う場合でも、あなたの例は以下となります。FN引数をハードコーディングを避けるために(あなたの本当のコードでは、いくつかのエラー処理予期しないコマンドライン入力のために持っている必要があります)単一点を計算すると、グラフは表示されますが空白になります。 – talonmies

+0

@talonmies私はそれをプロットする方法を説明できますか? – Surfcast23

+0

'plot()'に線を描画するように要求していますが、1点しか供給しません。あなたが 'plot([p、pf]、[q、qf])'のようなことをしたなら、2点を試してみるでしょう。それでも、整数計算と 'h/6 = 0'を実行しているので' p 'と' pf'と 'q'と' qf'は 'h <6'なら等しいでしょうから、まだプロットしていません。 6未満のすべての正のhに対して。また、これが本当に4段階明示ルンゲクッタ法であると想定される場合、式が正しくないように見えます。 – talonmies

答えて

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?

さらに良いオプションがあります。

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

+0

@ Adam Bernierの説明をありがとう – Surfcast23

+0

私はあなたの方法を使ってプロットしようとしましたが、pfとqfがここで定義されていないと言います – Surfcast23

関連する問題