1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#[allow(unused_imports)] use structure::polynomial::*; use structure::vector::*; use std::convert::Into; use std::f64::consts::PI; pub fn lagrange_polynomial(node_x: Vector, node_y: Vector) -> Polynomial { assert_eq!(node_x.len(), node_y.len()); let l = node_x.len(); let mut result = Polynomial::new(vec![0f64; l]); for i in 0..l { let fixed_val = node_x[i]; let prod = node_y[i]; let mut id = poly(vec![1f64]); for j in 0..l { if j == i { continue; } else { let target_val = node_x[j]; let denom = fixed_val - target_val; id = id * (poly(vec![1f64, -target_val]) / denom); } } result = result + (id * prod); } result } pub fn chebyshev_nodes<T>(num: usize, start: T, end: T) -> Vector where T: Into<f64> + Copy, { let mut v = vec![0f64; num]; let a = start.into(); let b = end.into(); for i in 0..num { v[i] = (a + b) / 2. + 0.5 * (b - a) * ((2 * i + 1) as f64 * PI / (2 * num) as f64).cos(); } return v; }