我想使用integrate.ode module. 在我的情况下有点不同的是,我只想整合到某个位置,由粒子的最大允许 x 坐标确定:x_max。
我遇到的主要问题是粒子可能首先移动得非常慢,然后再加快速度。因此,我不想在该区域的小时间步长上浪费精力。该算法应该能够进行调整,以便在粒子速度变高时使用更小的时间步长。
最后,如果我在“相空间”中绘制粒子轨迹,我应该有一条平滑的线。
为此,我在下面有一些粗略的伪代码:
backend = "dopri5"
x_max = 1
solver = ode(f)
solver.set_integrator(backend)
solver.set_initial_value(y0, t0)
t, y = [t0], [y0]
k = 1.2
while solver.successful() and solver.y[0] < x_max
solver.integrate(solver.t+dt)
t.append(solver.t)
y.append(solver.y)
v_current = numpy.linalg.norm(y[-1])
v_previous = numpy.linalg.norm(y[-2])
if numpy.abs( v_current-v_previous ) > k * v_previous:
dt = 0.8*dt
del y[-1]
else:
dt = dt*1.2
问题是这个算法可能不是那么健壮,因为选择值k, 1.2, 0.8有些随意,可能会导致算法出现一些稳定性问题。
编辑:我还希望能够在轨迹上绘制时间间隔相等的点,以指示粒子的速度如何变化。
任何人都可以提出更好的方法吗?