2017-10-19 6 views
3

私はPythonを初めて使用しましたが、C++とMATLABの経験があります。 私は現在、dy/dtとdx/dtを含む非線形システムの位相空間内の軌跡をプロットするプログラムを作成しています。しかし、より複雑な関数形式の場合、私はオーバーフローエラーを受け取りました。この問題を回避する方法はありますか?前もって感謝します!位相空間内の軌跡 - オーバーフローエラー:(34、 '結果が大きすぎます')

これらは私のコードです:

fig = plt.figure(figsize=(18,6)) 
dt = 0.01 
def trajectories(): 
    #initial conditions 
    x = y = 0.1 
    xresult = [x] 
    yresult = [y] 
    for t in xrange(10000): 
     # functional form: dx/dt = y, dy/dt = -r(x**2-1)*y-x 
     nextx = x + (r*x-y+x*y**2) * dt 
     nexty = y + (x + r*y + y**3) * dt 
     x, y = nextx, nexty 
     xresult.append(x) 
     yresult.append(y) 
    plt.plot(xresult, yresult) 
    plt.axis('image') 
    plt.axis([-3, 3, -3, 3]) 
    plt.title('r = ' + str(r)) 


rs = [-1, -0.1, 0, .1, 1] 
for i in range(len(rs)): 
    fig.add_subplot(1, len(rs), i + 1) 
    r = rs[i] 
    trajectories() 
plt.show() 

EDIT: this is the full traceback 
Traceback (most recent call last): 
    File "/Users/Griffin/Atom/NumInt.py", line 33, in <module> 
    trajectories() 
    File "/Users/Griffin/Atom/NumInt.py", line 18, in trajectories 
    nextx = x + (r*x-y+x*y**2) * dt 
OverflowError: (34, 'Result too large') 
+0

フルトレースバック – roganjosh

+0

を投稿してくださいだけで、完全なトレースバックを追加しました。ありがとう! – griffinleow

+0

あなたの郵便番号は私のためにうまく動作します。あなたのデータの小数精度を考えています....あなたのdtは0.01に固定されていますか?低い値の場合はどうなりますか? – eduardosufan

答えて

2

あなたの即時のエラーは、統合のために使用されているオイラーアルゴリズムは、使用しているステップサイズで不安定になるという事実に関係しています。究極の問題は、実際にオイラーアルゴリズムを使用していることです。以下のコードは、統合を処理するためにscipy.integrate.odeintを使用し、可変ステップサイズを実行できるため、より良い仕事をします。統合のいくつかはまだ完全ではありませんが、少なくともいくつかの結果が得られます。

import numpy 
import scipy.integrate 
import matplotlib.pyplot as plt 

def derivatives(states, t, r): 
    x, y = states 
    return [r*x - y + x*y**2, 
      x + r*y + y**3] 

def trajectories(r): 
    initial_conditions = [0.1, 0.1] 
    times = numpy.linspace(0, 100, 1000) 
    result = scipy.integrate.odeint(derivatives, initial_conditions, times, args=(r,)) 
    xresult, yresult = result.T 

    plt.plot(xresult, yresult) 
    plt.axis('image') 
    plt.axis([-3, 3, -3, 3]) 
    plt.title('r = ' + str(r)) 

fig = plt.figure(figsize=(18,6)) 

rs = [-1, -0.1, 0, .1, 1] 

for i, r in enumerate(rs, 1): # Avoid for i in range(len(rs)) 
    fig.add_subplot(1, len(rs), i) 
    trajectories(r) 
plt.show() 

結果:

result of simulation

関連する問題