|
4 | 4 | {
|
5 | 5 | let delta = (b - a) / precision as f64;
|
6 | 6 |
|
7 |
| - let integral: f64 = (0..precision) |
| 7 | + (0..precision) |
8 | 8 | .map(|trapezoid| {
|
9 | 9 | let left_side = a + (delta * trapezoid as f64);
|
10 | 10 | let right_side = left_side + delta;
|
11 | 11 |
|
12 | 12 | 0.5 * (f(left_side) + f(right_side)) * delta
|
13 | 13 | })
|
14 |
| - .sum(); |
15 |
| - |
16 |
| - if a > b { |
17 |
| - -integral |
18 |
| - } else { |
19 |
| - integral |
20 |
| - } |
21 |
| -} |
22 |
| - |
23 |
| -#[allow(dead_code)] |
24 |
| -fn main() { |
25 |
| - let f = |x: f64| x.powi(3); |
26 |
| - let result = trapezoidal_integral(0.0, 1.0, f, 1000); |
27 |
| - println!("{}", result); |
| 14 | + .sum() |
28 | 15 | }
|
29 | 16 |
|
30 | 17 | #[cfg(test)]
|
31 | 18 | mod tests {
|
32 | 19 | use super::*;
|
33 | 20 |
|
34 |
| - #[test] |
35 |
| - fn test_integral() { |
36 |
| - let f = |x: f64| x.powi(2); |
37 |
| - let result = trapezoidal_integral(0.0, 1.0, f, 1000); |
38 |
| - assert!((result - 1.0 / 3.0).abs() < 0.0001); |
39 |
| - } |
40 |
| - |
41 |
| - #[test] |
42 |
| - fn test_precision() { |
43 |
| - let f = |x: f64| x.powi(2); |
44 |
| - let result = trapezoidal_integral(0.0, 1.0, f, 10000); |
45 |
| - assert!((result - 1.0 / 3.0).abs() < 0.00001); |
46 |
| - } |
47 |
| - |
48 |
| - #[test] |
49 |
| - fn test_negative() { |
50 |
| - let f = |x: f64| x.powi(2); |
51 |
| - let result = trapezoidal_integral(-1.0, 1.0, f, 10000); |
52 |
| - assert!((result - 2.0 / 3.0).abs() < 0.00001); |
| 21 | + macro_rules! test_trapezoidal_integral { |
| 22 | + ($($name:ident: $inputs:expr,)*) => { |
| 23 | + $( |
| 24 | + #[test] |
| 25 | + fn $name() { |
| 26 | + let (a, b, f, prec, expected, eps) = $inputs; |
| 27 | + let actual = trapezoidal_integral(a, b, f, prec); |
| 28 | + assert!((actual - expected).abs() < eps); |
| 29 | + } |
| 30 | + )* |
| 31 | + } |
53 | 32 | }
|
54 | 33 |
|
55 |
| - #[test] |
56 |
| - fn test_negative_precision() { |
57 |
| - let f = |x: f64| x.powi(2); |
58 |
| - let result = trapezoidal_integral(-1.0, 1.0, f, 100000); |
59 |
| - assert!((result - 2.0 / 3.0).abs() < 0.000001); |
| 34 | + test_trapezoidal_integral! { |
| 35 | + basic_0: (0.0, 1.0, |x: f64| x.powi(2), 1000, 1.0/3.0, 0.0001), |
| 36 | + basic_0_higher_prec: (0.0, 1.0, |x: f64| x.powi(2), 10000, 1.0/3.0, 0.00001), |
| 37 | + basic_1: (-1.0, 1.0, |x: f64| x.powi(2), 10000, 2.0/3.0, 0.00001), |
| 38 | + basic_1_higher_prec: (-1.0, 1.0, |x: f64| x.powi(2), 100000, 2.0/3.0, 0.000001), |
| 39 | + flipped_limits: (1.0, 0.0, |x: f64| x.powi(2), 10000, -1.0/3.0, 0.00001), |
| 40 | + empty_range: (0.5, 0.5, |x: f64| x.powi(2), 100, 0.0, 0.0000001), |
60 | 41 | }
|
61 | 42 | }
|
0 commit comments