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
实现Send
和Sync
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库的更多功能,包括:
- 从不同来源创建高精度数字
- 幂运算和平方根计算
- 比较操作
- 格式化输出
- 科学计数法表示
- 超高精度计算(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);
}
性能提示
- 对于大型矩阵运算,考虑使用
Matrix::zeros()
预分配内存而不是动态增长 - 统计函数通常有可变的版本(如
mean_mut
)可以避免内存分配 - 随机数生成器可以重用以提高性能
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库的多种功能,包括:
- 基本数学运算
- 统计分析
- 线性代数操作
- 随机数生成
- 数值积分
- 线性回归
- 优化问题
每个部分都有清晰的注释说明,可以直接运行测试。