1 个不稳定版本

0.11.0 2021 年 8 月 26 日

#481科学


用于 soco

MIT 许可证

575KB
13K SLoC

Rust 中的科学计算

功能

  • 初值问题求解
  • 根查找算法
  • 多项式
  • 多项式插值
  • 科学常数
  • 特殊函数/多项式
  • 数值积分
  • 数值微分

功能的解释可以在 这里 找到。

初值问题

实现了两种自适应 Runge-Kutta 方法,两种 Adams 预测-校正器,以及两种自适应逆向微分公式。所有求解器的接口都是相同的。以下代码示例使用 Runge-Kutta-Fehlberg 方法求解 y' = y。

use bacon_sci::ivp::{RK45, RungeKuttaSolver};
use nalgebra::{VectorN, U1};

fn deriv(_t: f64, y: &[f64], _params: &mut ()) -> Result<VectorN<f64, U1>, String> {
    Ok(VectorN::<f64, U1>::from_column_slice(y))
}

fn solve() -> Result<(), String> {
    let solver = RK45::new()
                    .with_dt_min(0.01)?
                    .with_dt_max(0.1)?
                    .with_tolerance(1e-4)?
                    .with_initial_conditions(&[1.0])?
                    .with_start(0.0)?
                    .with_end(10.0)?
                    .build();
    let _solution = solver.solve_ivp(deriv, &mut ())?;
    Ok(())
}

在 bacon_sci::ivp 中还有一个 solve_ivp 函数,它尝试第五阶预测-校正器,然后是 Runge-Kutta-Fehlberg 方法,然后是 BDF6。

根查找算法

bacon_sci::roots 实现了二分法、牛顿法、割线法、多项式牛顿法和 Müller 多项式法。

以下代码示例使用初始猜测 0.1 和 -0.1 查找 x^3 的根。

use bacon_sci::roots::secant;
use nalgebra::{VectorN, U1};

fn cubic(x: &[f64]) -> VectorN<f64, U1> {
    VectorN::<f64, U1>::from_iterator(x.iter.map(|x| x.powi(3)))
}

fn solve() -> f64 {
    secant((&[-0.1], &[0.1]), cubic, 0.001, 1000).unwrap()
}

多项式和多项式插值

bacon_sci::polynomial 实现了一个多项式结构体。 bacon_sci::interp 实现了拉格朗日插值、赫尔米特插值和三次样条插值。

科学常数

在 bacon_sci::constants 中定义了几个科学常数。数据来自 NIST。2018 CODATA 完整列表作为 hashmap 可用。

特殊函数和多项式

目前,bacon_sci::special 允许您获取勒让德多项式、赫尔米特多项式、拉格朗日多项式和切比雪夫多项式。

数值微分和求积

bacon_sci::differentiate 允许对一阶和二阶导数进行数值评估。 bacon_sci::integrate 实现了Tanh-Sinh求积法、自适应辛普森法则、Romberg积分以及几种自适应高斯积分方案。

依赖项

约3.5MB
约74K SLoC