【发布时间】:2020-01-02 12:56:42
【问题描述】:
我正在尝试使用scipy.integrate.ode 或scipy.integrate.odeint 为一大组(超过一千个)初始条件求解 ODE 系统,但是执行循环非常慢,scipy 似乎没有提供输入二维数组的选项(由一组指定初始条件的一维数组堆叠),scipy.integrate.solve_ivp 的vectorized 选项似乎并不意味着它接受初始条件的二维数组(https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html)。
我读过一个线程问一个类似的问题(Vectorized SciPy ode solver),其中一个答案建议使用scipy.integrate.odeint,但是它似乎也不接受多维数组,所以它根本不明白如何实现这个.有没有加快进程的解决方案?除了矢量化之外,我也想过使用并行计算技术,但我对此并不熟悉,而且我认为它并没有像矢量化那样真正加速程序吗?
【问题讨论】:
-
为什么二维初始条件会有所改进? ode 函数是否尽可能快?这是您对评估速度的最大控制权。
-
对于大规模生产来说,scipy 代码不是最理想的。使用绑定到日晷或DifferentialEquations.jl(有一些重叠)来访问最新的和经过测试的实现。对 ODE 函数使用 JIT 或直接编译语言。请注意,并行解决方案可能会影响单个解决方案的准确性,尤其是。如果解集合访问了状态空间的不同部分。
-
您不需要二维数组函数:您可以使用一维数组输入来制定 ODE 函数,然后在函数代码的第一行对其进行整形。正如 hpaulj 所说,您可以通过使用 ode 函数来提高速度。您可以尝试的其他事情是:减少收敛标准或使用显式积分器,如
RK23或RK45以最小步长,通过雅可比 -
“并行计算”位见stackoverflow.com/questions/4682429/parfor-for-python(假设不涉及跨线程通信)。
-
不如可以接受多个初始值的单个函数调用方便,但可以选择多处理:stackoverflow.com/questions/34291639/…
标签: python arrays numpy scipy ode