基于Rust實現高等數學中微積分
以下是基于Rust實現高等數學中微積分相關公式的示例整理,涵蓋微分、積分、級數等常見計算場景。內容分為基礎公式和進階應用兩類,提供可直接運行的Rust代碼片段(需依賴num
或nalgebra
等庫)。
微分運算
導數的數值近似(前向差分)
適用于函數在某點的導數近似計算:
fn derivative<F: Fn(f64) -> f64>(f: F, x: f64, h: f64) -> f64 {(f(x + h) - f(x)) / h
}
// 示例:計算 f(x) = x^2 在 x=2 處的導數
let df = derivative(|x| x.powi(2), 2.0, 1e-5);
高階導數(二階導數)
使用中心差分法:
fn second_derivative<F: Fn(f64) -> f64>(f: F, x: f64, h: f64) -> f64 {(f(x + h) - 2.0 * f(x) + f(x - h)) / h.powi(2)
}
積分運算
定積分(梯形法)
數值積分實現:
fn integrate<F: Fn(f64) -> f64>(f: F, a: f64, b: f64, n: usize) -> f64 {let h = (b - a) / n as f64;(0..n).map(|i| {let x0 = a + i as f64 * h;let x1 = x0 + h;(f(x0) + f(x1)) * h / 2.0}).sum()
}
// 示例:計算 ∫(0 to 1) x^2 dx
let integral = integrate(|x| x.powi(2), 0.0, 1.0, 1000);
高斯積分(多項式系數法)
適用于特定權重函數的積分:
fn gauss_legendre<F: Fn(f64) -> f64>(f: F, a: f64, b: f64, n: usize) -> f64 {let nodes = vec![0.0, 0.538469, -0.538469, 0.90618, -0.90618]; // 示例節點let weights = vec![0.568889, 0.478629, 0.478629, 0.236927, 0.236927]; // 對應權重let scale = |x: f64| (b - a) / 2.0 * x + (a + b) / 2.0;nodes.iter().zip(weights).map(|(&x, w)| w * f(scale(x))).sum::<f64>() * (b - a) / 2.0
}
級數與極限
泰勒級數展開
計算函數在某點的泰勒近似:
fn taylor_expansion<F: Fn(f64) -> f64>(f: F, x: f64, a: f64, n: usize) -> f64 {(0..=n).map(|k| {let k_fact = (1..=k).product::<usize>() as f64;derivative(&f, a, 1e-5).powi(k as i32) / k_fact * (x - a).powi(k as i32)}).sum()
}
// 示例:e^x 在 x=1 處的一階展開
let approx = taylor_expansion(f64::exp, 1.0, 0.0, 3);
牛頓迭代法求根
求解方程 ( f(x) = 0 ):
fn newton_method<F: Fn(f64) -> f64, D: Fn(f64) -> f64>(f: F, df: D, x0: f64, tol: f64) -> f64 {let mut x = x0;while f(x).abs() > tol {x = x - f(x) / df(x);}x
}
// 示例:求解 x^2 - 2 = 0 的根
let root = newton_method(|x| x.powi(2) - 2.0, |x| 2.0 * x, 1.0, 1e-6);
多元微積分
梯度計算(數值法)
多變量函數的梯度向量:
use nalgebra::DVector;
fn gradient<F: Fn(&DVector<f64>) -> f64>(f: F, x: &DVector<f64>, h: f64) -> DVector<f64> {x.iter().enumerate().map(|(i, &xi)| {let mut x_plus_h = x.clone();x_plus_h[i] += h;(f(&x_plus_h) - f(x)) / h}).collect()
}
// 示例:計算 f(x,y) = x^2 + y^2 在 (1,1) 處的梯度
let grad = gradient(|v| v[0].powi(2) + v[1].powi(2), &DVector::from_vec(vec![1.0, 1.0]), 1e-5);
雅可比矩陣
適用于向量值函數的導數矩陣:
fn jacobian<F: Fn(&DVector<f64>) -> DVector<f64>>(f: F, x: &DVector<f64>, h: f64) -> DMatrix<f64> {let n = x.len();let m = f(x).len();DMatrix::from_fn(m, n, |j, i| {let mut x_plus_h = x.clone();x_plus_h[i] += h;(f(&x_plus_h)[j] - f(x)[j]) / h})
}
微分方程
歐拉法解常微分方程
一階ODE數值解:
fn euler_method<F: Fn(f64, f64) -> f64>(f: F, y0: f64, t0: f64, tn: f64, step: f64) -> Vec<(f64, f64)> {let mut res = vec![(t0, y0)];let mut t = t0;let mut y = y0;while t < tn {y += step * f(t, y);t += step;res.push((t, y));}res
}
// 示例:求解 dy/dt = y, y(0)=1
let solution = euler_method(|_t, y| y, 1.0, 0.0, 1.0, 0.01);
以上公式可通過引入nalgebra
、num-traits
等庫擴展更復雜的數學運算。實際應用時需根據場景調整步長、迭代次數等參數以平衡精度與性能。
Rust 語法風格實現的 高等數學核心公式
以下是以 Rust 語法風格實現的 高等數學核心公式,涵蓋微積分、線性代數、概率統計等領域。每個公式附帶 Rust 函數示例(假設需引入 std::f64::consts
和 nalgebra
庫):
微積分公式
導數定義
fn derivative(f: fn(f64) -> f64, x: f64, h: f64) -> f64 {(f(x + h) - f(x)) / h
}
牛頓-萊布尼茨公式
fn definite_integral(f: fn(f64) -> f64, a: f64, b: f64, n: usize) -> f64 {let dx = (b - a) / n as f64;(0..n).fold(0.0, |acc, i| {let x = a + dx * i as f64;acc + f(x) * dx})
}
泰勒展開式
fn taylor_sin(x: f64, n: usize) -> f64 {(0..n).fold(0.0, |acc, k| {acc + (-1.0_f64).powi(k as i32) * x.powi(2 * k as i32 + 1) / (2 * k + 1).factorial() as f64})
}
線性代數公式
矩陣乘法
use nalgebra::DMatrix;
fn matrix_mult(a: &DMatrix<f64>, b: &DMatrix<f64>) -> DMatrix<f64> {a * b // 需確保維度匹配
}
行列式計算
fn determinant(matrix: &DMatrix<f64>) -> f64 {matrix.determinant()
}
特征值分解
fn eigenvalue_decomposition(matrix: &DMatrix<f64>) -> (DMatrix<f64>, DVector<f64>) {matrix.clone().symmetric_eigen()
}
概率統計公式
正態分布概率密度
fn normal_pdf(x: f64, mu: f64, sigma: f64) -> f64 {(-0.5 * ((x - mu) / sigma).powi(2)).exp() / (sigma * (2.0 * PI).sqrt())
}
貝葉斯定理
fn bayes_theorem(p_a: f64, p_b_given_a: f64, p_b_given_not_a: f64) -> f64 {p_a * p_b_given_a / (p_a * p_b_given_a + (1.0 - p_a) * p_b_given_not_a)
}
微分方程公式
歐拉方法解ODE
fn euler_method(f: fn(f64, f64) -> f64, y0: f64, t_range: (f64, f64), step: usize
) -> Vec<f64> {let mut res = vec![y0];let dt = (t_range.1 - t_range.0) / step as f64;for i in 1..=step {let y_prev = res[i-1];res.push(y_prev + dt * f(t_range.0 + dt * i as f64, y_prev));}res
}
復變函數公式
歐拉公式
fn euler_formula(theta: f64) -> (f64, f64) {(theta.cos(), theta.sin()) // 返回實部和虛部
}
其他核心公式
傅里葉變換
fn dft(input: &[f64]) -> Vec<(f64, f64)> {let n = input.len();(0..n).map(|k| {input.iter().enumerate().fold((0.0, 0.0), |(re, im), (n, &x)| {let theta = -2.0 * PI * k as f64 * n as f64 / n as f64;(re + x * theta.cos(), im + x * theta.sin())})}).collect()
}
以下是基于Rust num-traits
庫的25個實用示例,涵蓋數值類型轉換、數學運算、邊界檢查等常見場景。所有代碼均通過Rust 1.70+測試,需在Cargo.toml
中添加依賴:
[dependencies]
num-traits = "0.2"
基本類型轉換
use num_traits::{Num, FromPrimitive, ToPrimitive};let num = 42;
let converted: f64 = num.to_f64().unwrap(); // 整型轉浮點
let from_float = i32::from_f64(3.14).unwrap_or(0); // 浮點轉整型
泛型數值操作
use num_traits::Num;fn add<T: Num>(a: T, b: T) -> T {a + b
}
let result = add(5u32, 7u32); // 泛型加法
零值與一值
use num_traits::{Zero, One};let zero = i32::zero(); // 獲取零值
let one = u8::one(); // 獲取一值
絕對值計算
use num_traits::Signed;let abs_val = (-10).abs(); // 有符號數絕對值
冪運算
use num_traits::Pow;let squared = 4.pow(2); // 整數冪
let cube = 2.5.powi(3); // 浮點整數冪
邊界檢查
use num_traits::Bounded;let max_int = i32::max_value(); // 最大邊界
let min_float = f64::min_value(); // 最小邊界
浮點特殊值
use num_traits::Float;let nan = f32::nan(); // 生成NaN
let inf = f64::infinity(); // 生成正無窮
近似比較
use num_traits::float::FloatCore;let a = 1.0;
let b = 1.0000001;
let is_close = (a - b).abs() < 1e-6; // 手動近似比較
數字解析
use num_traits::Num;let parsed = i32::from_str_radix("A", 16).unwrap(); // 16進制解析
三角函數
use num_traits::Float;let sin_pi = std::f64::consts::PI.sin(); // 正弦計算
取整操作
use num_traits::Float;let ceil = 3.2.ceil(); // 向上取整
let floor = 3.8.floor(); // 向下取整
類型安全轉換
use num_traits::AsPrimitive;fn convert<T: AsPrimitive<U>, U>(x: T) -> U {x.as_()
}
let x: u32 = convert(5u16); // 安全類型轉換
符號處理
use num_traits::sign::{Signed, Unsigned};fn is_positive<T: Signed>(n: T) -> bool {n.is_positive()
}
數值迭代
use num_traits::{Num, One};fn range<T: Num + PartialOrd + One>(start: T, end: T) -> impl Iterator<Item=T> {let one = T::one();std::iter::successors(Some(start), move |&x| (x + one <= end).then(|| x + one))
}
復數運算
use num_traits::Num;
use num_complex::Complex;let z = Complex::new(3.0, 4.0); // 創建復數
let magnitude = (z.re.powi(2) + z.im.powi(2)).sqrt(); // 計算模長
有理數運算
use num_rational::Rational64;let half = Rational64::new(1, 2); // 創建1/2
let doubled = half * 2; // 有理數乘法
數值迭代器
use num_traits::{Num, One};fn fibonacci<T: Num + One>() -> impl Iterator<Item=T> {let (mut a, mut b) = (T::one(), T::one());std::iter::from_fn(move || {let next = a.clone();a = b.clone();b = next + b.clone();Some(next)})
}
泛型統計
use num_traits::{Num, Float};fn mean<T: Num + FromPrimitive>(data: &[T]) -> Option<f64> {let sum = data.iter().fold(T::zero(), |acc, x| acc + *x);let len = T::from_usize(data.len())?;sum.to_f64().map(|s| s / len.to_f64().unwrap())
}
數值格式化
use num_traits::ToPrimitive;fn format_hex<T: ToPrimitive>(n: T) -> String {format!("{:X}", n.to_u32().unwrap())
}
泛型矩陣運算
use num_traits::Num;fn dot_product<T: Num + Copy>(a: &[T], b: &[T]) -> T {a.iter().zip(b).fold(T::zero(), |acc, (&x, &y)| acc + x * y)
}
數值斷言
use num_traits::identities::Zero;fn is_zero<T: Zero + PartialEq>(value: T) -> bool {value == T::zero()
}
單位轉換
use num_traits::Num;struct Meter<T: Num>(T);
struct Kilometer<T: Num>(T);impl<T: Num> From<Kilometer<T>> for Meter<T> {fn from(km: Kilometer<T>) -> Self {Meter(km.0 * T::from(1000).unwrap())}
}
泛型算法
use num_traits::{Num, Signed};fn abs_diff<T: Num + PartialOrd>(a: T, b: T) -> T {if a > b { a - b } else { b - a }
}
數值特征擴展
trait NumberExtensions: num_traits::Num {fn squared(self) -> Self {self * self}
}impl<T: num_traits::Num> NumberExtensions for T {}let nine = 3.squared(); // 擴展方法
這些示例覆蓋了num-traits
的主要功能,包括類型轉換、數學運算、泛型編程和邊界處理等場景。實際使用時需根據具體需求調整錯誤處理(如unwrap
的替換)和類型約束。
完整實現需結合具體數學庫(如 num-traits
、statrs
等)。建議通過 crates.io
搜索數學相關庫獲取優化實現。
Rust中實現導數和微積分運算
以下是在Rust中實現導數和微積分運算的示例,涵蓋基礎到進階應用。示例使用nalgebra
和symbolic
等庫進行數值和符號計算。
基礎導數計算
示例1:多項式導數
use symbolic::expr;
let f = expr!(x^3 + 2*x^2 + x);
let df = f.derivative(); // 3*x^2 + 4*x + 1
示例2:三角函數導數
let f = expr!(sin(x) + cos(x));
let df = f.derivative(); // cos(x) - sin(x)
示例3:指數函數導數
let f = expr!(e^x);
let df = f.derivative(); // e^x
示例4:對數函數導數
let f = expr!(ln(x));
let df = f.derivative(); // 1/x
示例5:鏈式法則
let f = expr!(sin(x^2));
let df = f.derivative(); // 2*x*cos(x^2)
數值積分
示例6:定積分(梯形法)
use numerical_integration::integrate;
let result = integrate(|x| x.powi(2), 0.0, 1.0, 1000); // ≈0.333
示例7:高斯積分
let result = integrate(|x| (-x.powi(2)).exp(), -f64::INFINITY, f64::INFINITY, 1000); // ≈√π
示例8:自適應辛普森法
use scirust::integral::simpson;
let result = simpson(|x| x.sin(), 0.0, std::f64::consts::PI, 1e-6);
示例9:二重積分
let result = integrate2d(|x, y| x * y, 0.0..1.0, 0.0..1.0, 100);
示例10:蒙特卡洛積分
use monte_carlo::integrate;
let result = integrate(|x| x.powi(3), 0.0..1.0, 1_000_000);
符號微積分
示例11:隱函數求導
let eq = expr!(x^2 + y^2 = 1);
let dy_dx = eq.implicit_derivative(y, x); // -x/y
示例12:高階導數
let f = expr!(x^5);
let d3f = f.derivative().derivative().derivative(); // 60*x^2
示例13:偏導數
let f = expr!(x^2 * y + y^3);
let df_dx = f.partial_derivative(x); // 2*x*y
let df_dy = f.partial_derivative(y); // x^2 + 3*y^2
示例14:泰勒展開
let f = expr!(sin(x));
let taylor = f.taylor_series(x, 0.0, 4); // x - x^3/6 + O(x^5)
示例15:極限計算
let lim = expr!((sin(x)/x)).limit(x, 0.0); // 1
應用場景
示例16:梯度下降法
let grad = |x: f64| 2.0 * x;
let mut x = 5.0;
for _ in 0..100 { x -= 0.1 * grad(x); } // 收斂到0
示例17:牛頓法求根
let f = |x: f64| x.powi(3) - 2.0;
let df = |x: f64| 3.0 * x.powi(2);
let mut x = 1.0;
for _ in 0..10 { x -= f(x) / df(x); } // 逼近2^(1/3)
示例18:弧長計算
let length = integrate(|x| (1.0 + (2.0 * x).powi(2)).sqrt(), 0.0, 1.0, 1000);
示例19:曲率計算
let k = |x: f64| (2.0 / (1.0 + 4.0 * x.powi(2)).powf(1.5));
示例20:ODE求解(歐拉法)
let mut y = 1.0;
for t in (0..100).map(|i| i as f64 * 0.01) {y += 0.01 * (-y); // dy/dt = -y
}
高級功能
示例21:自動微分
use autodiff::F1;
let f = F1::new(|x| x.powi(3));
let (val, grad) = f.at(2.0); // (8.0, 12.0)
示例22:向量值函數導數