2016-09-30 45 views
0

我不得不剛剛閱讀Using adaptive step sizes with scipy.integrate.ode以及該問題的接受解決方案,甚至通過在Python解釋器中複製粘貼來複制結果。在解決ODE系統時使用scipy.integrate.ode的自適應時間步驟

我的問題是,當我嘗試將解決方案代碼調整到自己的代碼時,我只得到扁平線條。

我的代碼如下:

from scipy.integrate import ode 
from matplotlib.pyplot import plot, show 

initials = [1,1,1,1,1] 
integration_range = (0, 100) 

f = lambda t,y: [1.0*y[0]*y[1], -1.0*y[0]*y[1], 1.0*y[2]*y[3] - 1.0*y[2], -1.0*y[2]*y[3], 1.0*y[2], ] 

y_solutions = [] 
t_solutions = [] 
def solution_getter(t,y): 
    t_solutions.append(t) 
    y_solutions.append(y) 


backend = "dopri5" 
ode_solver = ode(f).set_integrator(backend) 
ode_solver.set_solout(solution_getter) 
ode_solver.set_initial_value(y=initials, t=0) 

ode_solver.integrate(integration_range[1]) 

plot(t_solutions,y_solutions) 
show() 

,情節它產生: enter image description here

回答

1

在行

y_solutions.append(y) 

你認爲你是附加電流矢量。發生什麼事情是您將對象引用追加到y。由於積分器顯然在積分循環期間重複使用矢量y,因此總是附加相同的對象參考。因此,最後,列表中的每個位置由指向y的最後狀態的向量的相同參考填充。

長話短說:替換

y_solutions.append(y.copy()) 

,一切都很好。

+0

非常感謝!參考資料仍然有時會讓我困惑......順便說一句,你是如何找到這個解決方案的? – Ezbob

+1

通過調試。 q'n'd解決方案是在solution_getter內部和plot之前添加打印語句,以查看實際數據是什麼。 – LutzL