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 数学
5,388 次每月下载
用于 4 crates
78KB
2K SLoC
ODE-solvers
Rust 中求解常微分方程(ODE)的数值方法。
安装
要在一个项目中开始使用该 crate,必须在项目的 Cargo.toml 文件中添加以下依赖项
[dependencies]
ode_solvers = "0.4.0"
然后,在主文件中添加
use ode_solvers::*;
类型别名定义
该 crate 实现的数值积分方法支持多维系统。为了定义系统的维度,声明状态向量的类型别名。例如
type State = Vector3<f64>;
系统的状态表示基于在 nalgebra crate 中定义的 SVector
type State = SVector<f64, 9>;
或者,也可以使用来自 nalgebra crate 的 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::*;
然后,使用相应结构体的 new
或 from_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