#微分方程 #ode #方程 #求解器 #数值方法

ode_solvers

Rust 中求解常微分方程(ODE)的数值方法

13 个版本

0.4.0 2024 年 1 月 14 日
0.3.7 2022 年 8 月 31 日
0.3.6 2022 年 1 月 31 日
0.3.5 2021 年 12 月 19 日
0.1.2 2018 年 10 月 20 日

#107 in 数学

Download history 1318/week @ 2024-04-07 1351/week @ 2024-04-14 1660/week @ 2024-04-21 1657/week @ 2024-04-28 1015/week @ 2024-05-05 851/week @ 2024-05-12 1725/week @ 2024-05-19 1687/week @ 2024-05-26 1368/week @ 2024-06-02 1598/week @ 2024-06-09 1223/week @ 2024-06-16 1653/week @ 2024-06-23 846/week @ 2024-06-30 1560/week @ 2024-07-07 1541/week @ 2024-07-14 1380/week @ 2024-07-21

5,388 次每月下载
用于 4 crates

BSD-3-Clause

78KB
2K SLoC

ODE-solvers

Crates.io Docs Crates.io

主页 文档

Rust 中求解常微分方程(ODE)的数值方法。

安装

要在一个项目中开始使用该 crate,必须在项目的 Cargo.toml 文件中添加以下依赖项

[dependencies]
ode_solvers = "0.4.0"

然后,在主文件中添加

use ode_solvers::*;

类型别名定义

该 crate 实现的数值积分方法支持多维系统。为了定义系统的维度,声明状态向量的类型别名。例如

type State = Vector3<f64>;

系统的状态表示基于在 nalgebra crate 中定义的 SVector 结构。为了方便起见,ode-solvers 重新导出六个类型以处理 1 到 6 维的系统:Vector1,..., Vector6。对于更高维度的系统,用户应导入 nalgebra crate 并定义一个 SVector,其中 SVector 的第二个类型参数是维度。例如,对于 9 维系统,将会有

type State = SVector<f64, 9>;

或者,也可以使用来自 nalgebra crate 的 DVector 结构作为状态表示。当使用 DVector 时,DVector 中的行数定义了系统的维度。

type State = DVector<f64>;

系统定义

一阶常微分方程组必须在 system 方法中定义 System<T, V> 特性。通常,此特性是为包含模型某些参数的结构定义的。System<T, V> 特性的签名是

pub trait System<T, V> {
    fn system(&self, x: T, y: &V, dy: &mut V);
    fn solout(&self, _x: T, _y: &V, _dy: &V) -> bool {
        false
    }
}

其中 system 必须包含 ODEs:第二个参数是自变量(通常是时间),第三个参数是一个包含依赖变量(s)的向量,第四个参数包含 y 对 x 的导数。每次成功积分步骤后调用方法 solout,并且每当它评估为真时停止积分。该方法的实现是可选的。请参阅示例以获取实现细节。

方法选择

当前版本的 crate 实现了以下显式 Runge-Kutta 方法

方法 名称 阶数 误差估计阶数 稠密输出阶数
Runge-Kutta 4 Rk4 4 不适用 不适用
Dormand-Prince Dopri5 5 4 4
Dormand-Prince Dop853 8 (5, 3) 7

这些方法定义在模块 rk4、dopri5 和 dop853 中。第一步是将所需的模块引入作用域

use ode_solvers::dopri5::*;

然后,使用相应结构体的 newfrom_param 方法创建一个结构。有关输入参数的描述,请参阅 API 文档

let mut stepper = Dopri5::new(system, x0, x_end, dx, y0, rtol, atol);

使用以下方法对系统进行积分

let res = stepper.integrate();

并通过以下方法检索结果

let x_out = stepper.x_out();
let y_out = stepper.y_out();

有关更多详细信息,请参阅 主页

依赖关系

约 3.5MB
约 74K SLoC