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
#[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;
}