#科学计算 #求根 #积分 #积分 #数值

bacon-sci

Rust中的科学计算

34个版本

0.16.1 2024年3月2日
0.15.0 2024年2月24日
0.14.0 2023年9月2日
0.13.1 2021年11月21日
0.8.2 2020年12月30日

#43 in 科学


用于 eorst

MIT 许可协议

585KB
13K SLoC

Rust中的科学计算

功能

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

功能的说明可以在这里找到。

初值问题

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

use bacon_sci::ivp::{RK45, RungeKuttaSolver};
use nalgebra::SVector;

fn deriv(_t: f64, y: &[f64], _params: &mut ()) -> Result<SVector<f64, 1>, String> {
    Ok(SVector::<f64, 1>::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::SVector;

fn cubic(x: &[f64]) -> SVector<f64, 1> {
    SVector::<f64, 1>::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 实现了Lagrange插值、Hermite插值和三次样条插值。

科学常数

bacon_sci::constants 中定义了几个科学常数。数据来自NIST。2018 CODATA完整列表可作为哈希表提供。

特殊函数和多项式

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

数值微分和求积

bacon_sci::differentiate 允许数值计算一阶和二阶导数。 bacon_sci::integrate 实现了双曲正割-辛普森求积法、自适应辛普森规则、龙贝格积分以及几种自适应高斯积分方案。

依赖关系

~3.5MB
~77K SLoC