2016-07-16 20 views
0

私はRunge-Kutta methodの4次を使って1次微分方程式をシミュレートしようとしていますが、それをプロットする際に問題があります。matplotlibを使ってPythonでプロットする?

#simulation of ode using 4th order rk method dy/dx=-2y+1.3e^-x,y(0)=5,h=0.01 from sympy import* 
import math 
import numpy as np 
import matplotlib.pyplot as plt 
h=0.01; 
ti=0; 
x=0; 
n=0; 
y=5; 
def f(x,y): 
    return 1.3*math.exp(-x)-2*y 


while x < 10: 

    k1=f(x,5); 
    k2=f(x+h/2,y+(h/2)* k1); 
    k3=f(x+h/2,y+(h/2)* k2); 
    k4=f(x+h,y+h*k3); 
    y=y+h/6*(k1+2*(k2+k3)+k4); 
    x=x+h; 
    plt.plot(x,y); 

は、私は問題が原因のx、yの値たびにループの実行を更新するのであることを知っているが、誰かが(x、y)の全ての値をプロットする方法を説明できますか?

+0

リスト(またはプロットによって2つのリスト)に(x、y)値を集めようとします。次に、データリストを1回プロットします。 – mhoff

+0

私は@MichaelHoffを試してみましょう – Boris

+0

たとえば、[このチュートリアル](https://bespokeblog.wordpress.com/2011/07/07/basic-data-plotting-with-matplotlib-part-2-lines-points-formatting) /)は、 'matplotlib.plot'と一緒にデータポイントを使用する方法を示しています。 – mhoff

答えて

2

コメントで示唆したように、あなたはxy値を格納するために2つのリストを作成し、whileループの後、それをプロットすることができますが:

import math 
import numpy as np 
import matplotlib.pyplot as plt 
h=0.01; 
ti=0; 
x=0; 
n=0; 
y=5; 
def f(x,y): 
    return 1.3*math.exp(-x)-2*y 

xs = [x]  # <<< 
ys = [y]  # <<< 
while x < 10: 

    k1=f(x,5); 
    k2=f(x+h/2,y+(h/2)* k1); 
    k3=f(x+h/2,y+(h/2)* k2); 
    k4=f(x+h,y+h*k3); 
    y=y+h/6*(k1+2*(k2+k3)+k4); 
    x=x+h; 
    xs.append(x) # <<< 
    ys.append(y) # <<< 

plt.plot(xs,ys); 

enter image description here

+0

これは軽微なコメントですが、初期条件をx/y値に追加することもできます。 – pathoren

+0

@pathoren OPの点数を考慮して、別の点を追加するのに大きな違いはありませんが、良いキャッチ! – Psidom

+0

私はコードを実行してプロットがありません – Boris

0

間違った結果を得るための別のソースは、最初の行でありますRK4ループ内に存在する。代わりに

k1=f(x,5); 

使用

k1=f(x,y); 

yの値が初期値で一定に滞在していませんので、。

関連する問題