的(简要)文档scipy.integrate.ode
说两种方法(dopri5
和dop853
)具有步长控制和密集输出。查看示例和代码本身,我只能看到一种从集成器获取输出的非常简单的方法。即,看起来您只是将积分器向前推进某个固定的 dt,获取当时的函数值,然后重复。
我的问题有相当多变的时间尺度,所以我想在需要评估的任何时间步骤获取值以达到所需的容差。也就是说,在早期,事情正在缓慢变化,因此输出时间步长可能很大。但随着事情变得有趣,输出时间步长必须更小。我实际上并不想要等间隔的密集输出,我只想要自适应函数使用的时间步长。
编辑:密集输出
一个相关的概念(几乎相反)是“密集输出”,其中所采取的步数与步进器一样大,但函数的值被插值(通常精度与步进器的精度相当)到任何你要。fortran 底层scipy.integrate.ode
显然能够做到这一点,但ode
没有接口。 odeint
另一方面,它基于不同的代码,并且显然会进行密集输出。(您可以在每次调用右侧时输出以查看何时发生,并查看它与输出时间无关。)
所以我仍然可以利用适应性,只要我可以提前决定我想要的输出时间步长。不幸的是,对于我最喜欢的系统,我什至不知道作为时间函数的大致时间尺度是什么,直到我运行集成。因此,我必须将采取积分器步骤的想法与密集输出的概念结合起来。
编辑2:再次密集输出
显然,scipy 1.0.0 通过一个新接口引入了对密集输出的支持。特别是,他们建议远离scipy.integrate.odeint
和接近scipy.integrate.solve_ivp
作为关键字的dense_output
。如果设置为True
,则返回的对象具有一个属性sol
,您可以使用时间数组调用该属性,然后返回这些时间的集成函数值。这仍然不能解决这个问题的问题,但在许多情况下它很有用。