求解 ODE 系统时使用 scipy.integrate.ode 的自适应时间步长
Using adaptive time step for scipy.integrate.ode when solving ODE systems
我必须阅读 Using adaptive step sizes with scipy.integrate.ode 和该问题的公认解决方案,甚至在我的 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()
它产生的情节:
行中
y_solutions.append(y)
您认为您是在附加当前矢量。实际发生的是您将对象引用附加到 y
。由于显然集成器在集成循环期间重复使用向量 y
,因此您总是附加相同的对象引用。因此,最后,列表的每个位置都由指向 y
.
最后状态的向量的相同引用填充
长话短说:替换为
y_solutions.append(y.copy())
一切都很好。
我必须阅读 Using adaptive step sizes with scipy.integrate.ode 和该问题的公认解决方案,甚至在我的 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()
它产生的情节:
行中
y_solutions.append(y)
您认为您是在附加当前矢量。实际发生的是您将对象引用附加到 y
。由于显然集成器在集成循环期间重复使用向量 y
,因此您总是附加相同的对象引用。因此,最后,列表的每个位置都由指向 y
.
长话短说:替换为
y_solutions.append(y.copy())
一切都很好。