Rust科学计算库scientific的使用,scientific提供高性能数学运算和统计分析功能

Rust科学计算库scientific的使用,scientific提供高性能数学运算和统计分析功能

scientific是一个Rust库,提供任意精度的科学计算功能。

常量

使用Scientific!宏创建常量数字:

use scientific::Scientific;
let n1 = Scientific!(1e100);
let n2 = Scientific!(1e80);
assert_eq!(&n1 + &n2, Scientific!(1.00000000000000000001e100));
// f64只有约15.9位的精度,这里已经达到21位

完整示例

下面是一个完整的示例,展示如何使用scientific库进行高精度数学运算:

use scientific::{Scientific, Precision, Rounding};

fn main() {
    // 创建高精度数字
    let num1 = Scientific!(3.14159265358979323846);
    let num2 = Scientific!(2.71828182845904523536);
    
    // 基本运算
    let sum = &num1 + &num2;
    let product = &num1 * &num2;
    
    println!("π + e = {}", sum);
    println!("π × e = {}", product);
    
    // 设置精度并进行除法运算
    let precision = Precision::Digits(30); // 30位精度
    let division = num1.div(&num2, precision);
    println!("π / e = {}", division);
    
    // 四舍五入
    let rounded = division.round(Precision::Digits(10), Rounding::RoundHalfUp);
    println!("四舍五入到10位: {}", rounded);
    
    // 大数运算
    let big_num = Scientific!(1e1000);
    let small_num = Scientific!(1e-1000);
    let result = &big_num + &small_num;
    println!("1e1000 + 1e-1000 = {}", result);
}

特性

  • 任意精度计算
  • 支持基本数学运算(加、减、乘、除)
  • 支持舍入和截断操作
  • 提供多种精度控制选项
  • 支持从字符串、整数和浮点数转换

精度控制

scientific库允许精确控制计算精度:

use scientific::{Precision, Scientific};

let num = Scientific!(1.23456789);
let truncated = num.truncate(Precision::Decimals(3)); // 保留3位小数
println!("截断后: {}", truncated); // 输出: 1.234

功能特性

  • serde: 支持序列化和反序列化
  • macro: 默认启用,重新导出Scientific!
  • std: 启用标准库支持
  • arc: 使用Arc代替Rc,使Scientific实现SendSync
  • debug: 开发时启用额外检查

scientific库特别适合需要高精度计算的科学计算和统计分析场景。

完整示例demo

下面是一个更完整的示例,展示scientific库的更多功能:

use scientific::{Scientific, Precision, Rounding};
use std::str::FromStr;

fn main() {
    // 从字符串创建高精度数字
    let num_str = "123.45678901234567890";
    let num_from_str = Scientific::from_str(num_str).unwrap();
    println!("从字符串创建的数字: {}", num_from_str);
    
    // 从整数创建
    let num_from_int = Scientific::from(1234567890);
    println!("从整数创建的数字: {}", num_from_int);
    
    // 高精度计算
    let a = Scientific!(2.0);
    let b = Scientific!(3.0);
    let c = a.pow(&b);
    println!("2的3次方: {}", c);
    
    // 平方根计算
    let sqrt_num = Scientific!(2.0).sqrt(Precision::Digits(50));
    println!("2的平方根(50位精度): {}", sqrt_num);
    
    // 比较运算
    let x = Scientific!(1.234);
    let y = Scientific!(1.23400000000000000001);
    println!("比较结果: {}", x == y); // 输出 false
    
    // 格式化输出
    let big_num = Scientific!(12345678901234567890.123456789);
    println!("格式化输出: {:.5}", big_num); // 保留5位小数
    
    // 科学计数法
    let sci_num = Scientific!(6.02214076e23);
    println!("阿伏伽德罗常数: {}", sci_num);
    
    // 精度控制示例
    let pi = Scientific!(3.14159265358979323846);
    let e = Scientific!(2.71828182845904523536);
    let ratio = pi.div(&e, Precision::Digits(100));
    println!("π/e (100位精度): {}", ratio);
}

这个示例展示了scientific库的更多功能,包括:

  1. 从不同来源创建高精度数字
  2. 幂运算和平方根计算
  3. 比较操作
  4. 格式化输出
  5. 科学计数法表示
  6. 超高精度计算(100位精度)

要使用scientific库,需要在Cargo.toml中添加依赖:

[dependencies]
scientific = "0.3"

1 回复

Rust科学计算库scientific使用指南

scientific是Rust中一个专注于高性能数学运算和统计分析的科学计算库。它提供了丰富的数学函数、统计方法和线性代数操作,适合需要高效数值计算的场景。

主要特性

  • 基本数学运算(三角函数、指数、对数等)
  • 统计分析功能(均值、方差、回归等)
  • 线性代数运算(矩阵、向量操作)
  • 随机数生成
  • 数值积分和微分
  • 优化算法

安装

Cargo.toml中添加依赖:

[dependencies]
scientific = "0.4"

基本使用示例

1. 基本数学运算

use scientific::math::*;

fn main() {
    // 计算平方根
    let x = 16.0;
    println!("sqrt({}) = {}", x, sqrt(x));
    
    // 计算指数
    println!("e^3 = {}", exp(3.0));
    
    // 计算对数
    println!("ln(10) = {}", ln(10.0));
    println!("log10(100) = {}", log10(100.0));
}

2. 统计分析

use scientific::statistics::*;

fn main() {
    let data = vec![1.0, 2.0, 3.0, 4.0, 5.0];
    
    // 计算均值
    println!("Mean: {}", mean(&data));
    
    // 计算方差
    println!("Variance: {}", variance(&data));
    
    // 计算标准差
    println!("Standard deviation: {}", standard_deviation(&data));
    
    // 计算中位数
    println!("Median: {}", median(&data));
}

3. 线性代数

use scientific::linalg::*;

fn main() {
    // 创建矩阵
    let a = Matrix::from_vec(2, 2, vec![1.0, 2.0, 3.0, 4.0]);
    let b = Matrix::from_vec(2, 2, vec![5.0, 6.0, 7.0, 8.0]);
    
    // 矩阵加法
    let c = &a + &b;
    println!("Matrix addition:\n{}", c);
    
    // 矩阵乘法
    let d = &a * &b;
    println!("Matrix multiplication:\n{}", d);
    
    // 矩阵转置
    let at = a.transpose();
    println!("Transpose:\n{}", at);
}

4. 随机数生成

use scientific::random::*;

fn main() {
    // 创建随机数生成器
    let mut rng = DefaultRng::new();
    
    // 生成均匀分布随机数
    println!("Uniform [0,1): {}", rng.uniform());
    
    // 生成正态分布随机数
    println!("Normal (μ=0, σ=1): {}", rng.normal(0.0, 1.0));
    
    // 生成随机整数
    println!("Integer [1,10]: {}", rng.integer(1, 10));
}

5. 数值积分

use scientific::integrate::*;
use scientific::math::*;

fn main() {
    // 定义要积分的函数
    let f = |x: f64| x * x;
    
    // 使用梯形法则积分
    let integral = trapezoidal(f, 0.0, 1.0, 1000);
    println!("∫x²dx from 0 to 1 ≈ {}", integral);
    
    // 使用辛普森法则积分
    let integral = simpson(f, 0.0, 1.0, 1000);
    println!("∫x²dx from 0 to 1 ≈ {}", integral);
}

高级功能

线性回归

use scientific::statistics::regression::*;

fn main() {
    // 样本数据
    let x = vec![1.0, 2.0, 3.0, 4.0, 5.0];
    let y = vec![1.0, 3.0, 2.0, 3.0, 5.0];
    
    // 执行线性回归
    let model = LinearRegression::fit(&x, &y).unwrap();
    
    // 输出结果
    println!("Slope: {}", model.slope());
    println!("Intercept: {}", model.intercept());
    println!("R-squared: {}", model.r_squared());
    
    // 预测新值
    println!("Prediction for x=6: {}", model.predict(6.0));
}

优化问题

use scientific::optimize::*;

fn main() {
    // 定义要最小化的函数
    let f = |x: f64| (x - 3.0).powi(2);
    
    // 使用梯度下降法寻找最小值
    let result = gradient_descent(f, 0.0, 0.01, 1000);
    
    println!("Minimum at x = {}", result);
}

性能提示

  1. 对于大型矩阵运算,考虑使用Matrix::zeros()预分配内存而不是动态增长
  2. 统计函数通常有可变的版本(如mean_mut)可以避免内存分配
  3. 随机数生成器可以重用以提高性能

scientific库提供了Rust中进行科学计算的高性能工具集,适合需要数值计算、数据分析和统计建模的应用场景。

完整示例代码

下面是一个综合使用scientific库的完整示例,展示了多个功能的联合使用:

use scientific::{
    math::*,
    statistics::*,
    linalg::*,
    random::*,
    integrate::*,
    statistics::regression::*,
    optimize::*
};

fn main() {
    // 1. 基本数学运算
    println!("=== 基本数学运算 ===");
    let x = 9.0;
    println!("sqrt({}) = {}", x, sqrt(x));
    println!("sin(PI/2) = {}", sin(PI / 2.0));
    
    // 2. 统计分析
    println!("\n=== 统计分析 ===");
    let data = vec![1.2, 2.3, 3.4, 4.5, 5.6];
    println!("Mean: {}", mean(&data));
    println!("Standard deviation: {}", standard_deviation(&data));
    
    // 3. 线性代数
    println!("\n=== 线性代数 ===");
    let m1 = Matrix::from_vec(2, 2, vec![1.0, 2.0, 3.0, 4.0]);
    let m2 = Matrix::identity(2);
    println!("Matrix multiplication:\n{}", &m1 * &m2);
    
    // 4. 随机数生成
    println!("\n=== 随机数生成 ===");
    let mut rng = DefaultRng::new();
    println!("Random float: {}", rng.uniform());
    println!("Random int: {}", rng.integer(1, 100));
    
    // 5. 数值积分
    println!("\n=== 数值积分 ===");
    let integral = simpson(|x| x.sin(), 0.0, PI, 1000);
    println!("∫sin(x)dx from 0 to PI ≈ {}", integral);
    
    // 6. 线性回归
    println!("\n=== 线性回归 ===");
    let x_data = vec![1.0, 2.0, 3.0, 4.0, 5.0];
    let y_data = vec![1.1, 1.9, 3.2, 4.1, 5.0];
    let model = LinearRegression::fit(&x_data, &y_data).unwrap();
    println!("Prediction for x=6: {}", model.predict(6.0));
    
    // 7. 优化问题
    println!("\n=== 优化问题 ===");
    let min = gradient_descent(|x| (x - 2.5).powi(2), 0.0, 0.01, 1000);
    println!("Found minimum at x = {}", min);
}

这个完整示例展示了如何在一个程序中综合使用scientific库的多种功能,包括:

  1. 基本数学运算
  2. 统计分析
  3. 线性代数操作
  4. 随机数生成
  5. 数值积分
  6. 线性回归
  7. 优化问题

每个部分都有清晰的注释说明,可以直接运行测试。

回到顶部