2017-04-02 5 views
0

で1つのデータセットのための2つのプロットを取得しています。例をNumpy配列のメソッドとして書き直しましたが、それをプロットすると、同じ数字に2つのプロットがありますが、それを修正する方法がわかりません。また、Matplotlibでプロットするために私の2次元配列を1次元配列に変換するより良い方法があります。私はマーク・ニューマンの本計算物理学から<em>オイラー法</em>題し例8.1を通じて働いているのpython

ニューマンの例:

from math import sin 
from numpy import arange 
from pylab import plot,xlabel,ylabel,show 

def f(x,t): 
    return -x**3 + sin(t) 

a = 0.0   # Start of the interval 
b = 10.0   # End of the interval 
N = 1000   # Number of steps 
h = (b-a)/N  # Size of a single step 
x = 0.0   # Initial condition 

tpoints = arange(a,b,h) 
xpoints = [] 
for t in tpoints: 
    xpoints.append(x) 
    x += h*f(x,t) 

plot(tpoints,xpoints) 
xlabel("t") 
ylabel("x(t)") 
show() 

マイ修正:

from pylab import plot,show,xlabel,ylabel 
from numpy import linspace,exp,sin,zeros,vstack,column_stack 


def f(x,t): 
    return (-x**(3) + sin(t)) 

def Euler(f,x0,a,b): 
    N=1000  
    h = (b-a)/N 
    t = linspace(a,b,N) 
    x = zeros(N,float) 
    y = x0 
    for i in range(N): 
     x[i] = y 
     y += h*f(x[i],t[i]) 

    return column_stack((t,x)) #vstack((t,x)).T 


plot(Euler(f,0.0,0.0,10.0)) 
xlabel("t") 
ylabel("x(t)") 
show() 
+1

私はあなたの最初の問題は何とかプロットスペースをクリアする必要があると思います。私は十分Pyplotを知らないが、matplotlibの中で() ' – Henry

+0

@Henryはちょうどそれを助けながら試してみました' plt.clfあり、メインリニアプロットはまだ1つのデータセットとプロットを二つのグラフ取るように思われるいくつかの理由で現れますそれから。 – FireFistAce

+0

ああ、ごめんなさい。 pyplotの経験はありません!あなたが '' plt'としてmatplotlib.pyplot import'edどうかは別の問題で助けをした私はプロット – Henry

答えて

1

あなたは2つの行を取得する理由はtなどxt

に対してプロット代わり xの、そのインデックスに対してプロットされていることです

2つの配列を積み重ねる理由がわかりません。 2つのプロットの問題も解決します。

以下が正常に動作します。

import numpy as np 
import matplotlib.pyplot as plt 
f = lambda x,t: -x**3 + np.sin(t) 

def Euler(f,x0,a,b): 
    N=1000  
    h = (b-a)/N 
    t = np.linspace(a,b,N) 
    x = np.zeros(N,float) 
    y = x0 
    for i in range(N): 
     x[i] = y 
     y += h*f(x[i],t[i]) 

    return t,x 

t,x = Euler(f,0.0,0.0,10.0) 
plt.plot(t,x) 
plt.xlabel("t") 
plt.ylabel("x(t)") 
plt.show() 
関連する問題