当状态不是自然存储为向量时,如何最好地使用 scipy.integrate 的 ODE 求解器?

计算科学 scipy 内存管理 数据存储
2021-12-25 21:57:53

我有一个庞大的 ODE 系统。由于各种原因,将因变量的值存储在多维数组中是很自然的。例如,这些值可能表示半离散化后 PDE 在 2D 或 3D 网格中某个点的解。

该函数scipy.integrate.odeint采用初始值的向量(即一维数组),并返回相同大小的向量。如果还需要右手边的功能f接受并返回向量。因此,必须展平状态向量才能使用scipy.integrate.odeint. 同时,内f将状态转换回多维数组、计算导数并将导数数组展平为向量可能会很方便。

这是扁平化(用于传递到f)-> unflattening(用于在内部工作f)->扁平化(用于从 中返回某些东西f)循环正确的做事方式吗?有没有其他更好的方法来设置(通过避免扁平化/非扁平化循环也可能是有效的?

2个回答

大概您正在为您的数据使用 numpy 数组。关键是在重塑它们时避免复制。为此,您要确保只生成数组的新“视图”。查看numpy.reshape 的帮助页面

scipy.integrate.odeint函数不将向量作为输入。它需要一个函数f、一个初始状态y0和一个时间点向量t(可能还有一堆其他可选参数来控制集成策略)。因此,您需要为其提供一个计算 ODE 系统右侧的函数,这将归结为展平(即循环遍历所有“身体”并构建一个向量,该向量ft是在 time 评估的 RHS t。没有办法解决这个问题。