在 Cython 和 Numba 中实现的 Runge-Kutta ODE 积分器。
项目描述
赛瑞克
在 Cython 和 Numba 中实现的 Runge-Kutta ODE 积分器
CyRK 提供快速 ODE 集成,同时仍允许使用 Python 编写微分方程。
CyRK 的 numba(njit-safe)实现比 scipy 的 solve_ivp 函数快 13-25 倍。cython 的实现速度提高了大约 20 倍。cython 函数在很大程度上也是预编译的,这避免了 numba 版本中发现的大部分初始性能损失。
安装
建议您使用Anaconda环境。
要安装,只需打开一个终端(如果使用 Windows,则在管理员模式下)并调用:
pip install CyRK
这将创建到 CyRK 目录的动态(可编辑)链接,以便可以更轻松地安装未来的更新。
在安装期间,CyRK 将尝试安装 Cython 和 Numpy 以编译 cython 代码(除非通过预编译轮进行安装)。文件编译完成后,将卸载 cython 并安装 CyRK 的运行时依赖项(请参阅 setup.py 获取最新列表)。
安装故障排除
目前没有报告安装问题。如果您遇到一个,请报告它。我们将在此处进行修复和/或添加解决方法信息。
开发和测试依赖
如果您打算使用 CyRK 的代码库,您将需要安装以下依赖项以运行 CyRK 的测试套件。
conda install pytest scipy matplotlib jupyter
conda installpip install如果您愿意,可以替换为。
使用 CyRK
CyRK 的 API 类似于 SciPy 的 solve_ivp 函数。可以在 python 中定义一个微分方程,例如:
import numpy as np
from numba import njit
# For even more speed up you can use numba's njit to compile the diffeq
@njit
def diffeq(t, y):
dy = list()
dy[0] = (1. - 0.01 * y[1]) * y[0]
dy[1] = (0.02 * y[0] - 1.) * y[1]
return dy
initial_conds = np.asarray((20., 20.), dtype=np.complex128)
time_span = (0., 50.)
rtol = 1.0e-7
atol = 1.0e-8
然后可以通过调用 CyRK 使用 numba 函数求解 ODE nbrk_ode:
from CyRK import nbrk_ode
time_domain, y_results, success, message = \
nbrk_ode(diffeq, time_span, initial_conds, rk_method=1, rtol=rtol, atol=atol)
要调用积分器的 cython 版本,您需要稍微编辑微分方程,使其不返回导数。相反,输出作为输入参数(np.ndarray)传递给函数。
@njit
def diffeq(t, y, dy):
dy[0] = (1. - 0.01 * y[1]) * y[0]
dy[1] = (0.02 * y[0] - 1.) * y[1]
然后,您可以以与 numba 版本类似的方式调用 ODE 求解器。
from CyRK import cyrk_ode
time_domain, y_results, success, message = \
cyrk_ode(diffeq, time_span, initial_conds, rk_method=1, rtol=rtol, atol=atol)
可选输入
ODE 求解器的 numba 和 cython 版本都具有以下可选输入:
rtol:相对容差(默认为 1.0e-6)。atol:绝对容差(默认为 1.0e-8)。max_step:最大步长(默认为+infinity)。first_step:初始步长(默认为 0)。- 如果为 0,则求解器将尝试确定一个理想值。
args: 传递给diffeq.t_eval:两个求解器都使用基于每一步最近错误的自适应时间步进协议。这导致最终的可变大小的非均匀时域。如果用户想要特定时间步长的结果,那么他们可以在所需的步长上提供一个 np.ndarray 数组t_eval。然后求解器将对结果进行插值以适合该数组。rk_method:Runge-Kutta 方法(默认为 1;所有这些方法都基于 SciPy 实现):0- “RK23” 3(2) 阶的显式 Runge-Kutta 方法。1- “RK45” 5(4) 阶的显式龙格-库塔法。2- “DOP853” 8 阶显式龙格-库塔法。
限制和已知问题
- 问题 1:绝对公差只能作为单个值传递(所有 y 都相同)。
- 问题 3:目前 cython 版本仅允许复数值 y 值。
- 问题 5:numba 求解器在大时间跨度(高集成时间)上比纯 python scipy 求解器更差。
引用 CyRK
很高兴看到 CyRK 用于其他软件或科学研究。我们要求您引用 CyRK 的 GitHub网站,以便更多用户了解此软件包。
除了引用 CyRK 之外,请考虑引用 SciPy 及其对您工作中使用的特定 Runge-Kutta 模型的参考。CyRK 在很大程度上是对 SciPy 功能的改编。在此处查找更多详细信息。
为 CyRK 做贡献
CyRK 是开源的,并在知识共享署名-相同方式共享 4.0 国际许可下分发。欢迎您分叉此存储库并进行任何带有归属的编辑回这个项目(请参阅该
Citing CyRK部分)。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。