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