2016-09-30 98 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