math_audio_test_functions/functions/
levy.rs1use ndarray::Array1;
4
5pub fn levy(x: &Array1<f64>) -> f64 {
9 use std::f64::consts::PI;
10
11 let w: Vec<f64> = x.iter().map(|&xi| 1.0 + (xi - 1.0) / 4.0).collect();
12
13 let first_term = (PI * w[0]).sin().powi(2);
14
15 let middle_sum: f64 = w
16 .iter()
17 .take(w.len() - 1)
18 .map(|&wi| (wi - 1.0).powi(2) * (1.0 + 10.0 * (PI * wi + 1.0).sin().powi(2)))
19 .sum();
20
21 let last_term = {
22 let wn = w[w.len() - 1];
23 (wn - 1.0).powi(2) * (1.0 + (2.0 * PI * wn).sin().powi(2))
24 };
25
26 first_term + middle_sum + last_term
27}