2016-01-23 64 views
1

我正在寫一個腳本,用小的直接強制繪製阻尼擺的分岔圖。循環和分叉圖

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import odeint 
epsi = 0.01 
# Declare the model 
f_dir = np.arange(0,1.3,0.01) 
A_s = np.zeros(len(f_dir)) 

i = 0 
for f in f_dir: 
def myModel(y, t): 

    dy0 = y[1] 
    dy1 = -epsi*y[1]-np.sin(y[0]) - f*np.cos((1.01)*t)*np.cos(y[0]) 
    return [dy0, dy1] 
    time = np.arange(0.0, 2000,0.01) 
    yinit = np.array([np.pi/2, 0]) 
    y = odeint(myModel, yinit, time) 

    A_s.insert(i,np.abs(np.max(y[-600:-1,0])- np.min(y[-600:-1,0]))) 

i += 1 


plt.plot(f_dir,A_s,'*') 
plt.xlabel(r'$f_s$') 
plt.ylabel(r'$A_s$') 
plt.hold 
plt.show() 

的問題是,我沒有將任何物品插入A_s,我不知道爲什麼,因爲變量i在循環的每一步提高。

回答

3

有點難以遵循你的代碼,但這可能更接近你想要的。即使f是一個可變參數,您只需要定義一次模型即可:您可以將這些參數傳遞給args元組中的odeint,然後將它們交給模型函數。

另請注意,NumPy數組沒有insert方法。

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import odeint 
epsi = 0.01 
# Declare the model 
f_dir = np.arange(0,1.3,0.01) 
A_s = np.zeros(len(f_dir)) 

def myModel(y, t, f): 
    dy0 = y[1] 
    dy1 = -epsi*y[1]-np.sin(y[0]) - f*np.cos((1.01)*t)*np.cos(y[0]) 
    return [dy0, dy1] 

i = 0 
for f in f_dir: 
    time = np.arange(0.0, 2000,0.01) 
    yinit = np.array([np.pi/2, 0]) 
    y = odeint(myModel, yinit, time, args=(f,)) 
    A_s[i] = np.abs(np.max(y[-600:-1,0])- np.min(y[-600:-1,0])) 
    i += 1 


plt.plot(f_dir,A_s,'*') 
plt.xlabel(r'$f_s$') 
plt.ylabel(r'$A_s$') 
plt.hold 
plt.show() 
+0

好吧,我明白你所做的,現在它工作正常!非常感謝! – amcalvo

0

您定義的基於myModel功能,但它實際上沒有任何地方被稱爲 - 它只是在函數內部引用。

+0

'myModel'函數對象被傳遞給'odeint',它調用它。 – xnx

+0

在你提供的解決方案中,這是真的,但在發佈的問題中,odeint也不會被調用(因爲它發生在myModel內部),除非我真的錯過了這裏的東西 –

+0

這是一個好點 - 我錯過了。 – xnx