Skip to main content

在 Cython 和 Numba 中实现的 Runge-Kutta ODE 积分器。

项目描述

赛瑞克

Python 版本 3.7-3.10 代码覆盖率 Windows 测试 macOS 测试 Ubuntu 测试

CyRK 版本 0.0.1 Alpha

在 Cython 和 Numba 中实现的 Runge-Kutta ODE 积分器

CyRK 提供快速 ODE 集成,同时仍允许使用 Python 编写微分方程。

CyRK 的 numba(njit-safe)实现比 scipy 的 solve_ivp 函数快 13-25 倍。cython 的实现速度提高了大约 20 倍。cython 函数在很大程度上也是预编译的,这避免了 numba 版本中发现的大部分初始性能损失。

CyRK 性能

安装

建议您使用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部分)。

  • 我们鼓励用户使用GitHub 问题报告错误或功能请求。
  • 如果您想贡献,但不知道从哪里开始,请查看 GitHub 上的 第一个问题标签。
  • 欢迎用户提交拉取请求,并在最终代码完成之前随时创建它们,以便尽早给出反馈和建议。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

CyRK-0.1.1.tar.gz (177.6 kB 查看哈希

已上传 source

内置发行版

CyRK-0.1.1-cp310-cp310-win_amd64.whl (114.4 kB 查看哈希

已上传 cp310

CyRK-0.1.1-cp310-cp310-macosx_10_15_x86_64.whl (138.9 kB 查看哈希

已上传 cp310

CyRK-0.1.1-cp39-cp39-win_amd64.whl (115.5 kB 查看哈希

已上传 cp39

CyRK-0.1.1-cp39-cp39-macosx_10_15_x86_64.whl (140.1 kB 查看哈希

已上传 cp39

CyRK-0.1.1-cp38-cp38-win_amd64.whl (115.3 kB 查看哈希

已上传 cp38

CyRK-0.1.1-cp38-cp38-macosx_10_15_x86_64.whl (136.1 kB 查看哈希

已上传 cp38

CyRK-0.1.1-cp37-cp37m-win_amd64.whl (111.8 kB 查看哈希

已上传 cp37

CyRK-0.1.1-cp37-cp37m-macosx_10_15_x86_64.whl (136.1 kB 查看哈希

已上传 cp37