在解决ODE系统时使用scipy.integrate.ode的自适应时间步

时间:2016-09-30 12:58:30

标签: python python-3.x scipy ode

我必须阅读Nebula's CDateTime以及该问题的已接受解决方案,甚至在我的Python解释器中通过复制和粘贴复制结果。

我的问题是,当我尝试将解决方案代码调整到我自己的代码时,我只能得到扁平线。

我的代码如下:

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()

它产生的情节: Using adaptive step sizes with scipy.integrate.ode

1 个答案:

答案 0 :(得分:1)

在第

   y_solutions.append(y) 

您认为您正在附加当前矢量。实际发生的是您将对象引用附加到y。由于积分器显然在积分循环期间重用了向量y,因此您总是附加相同的对象引用。因此,最后,列表的每个位置都由指向y的最后一个状态的向量的相同引用填充。

长话短说:替换为

    y_solutions.append(y.copy()) 

一切都很好。