Skip to content

Commit 3a1724d

Browse files
authored
Properly handle flipped limits in trapezoidal_integral (#645)
1 parent f850766 commit 3a1724d

File tree

1 file changed

+20
-39
lines changed

1 file changed

+20
-39
lines changed

src/math/trapezoidal_integration.rs

+20-39
Original file line numberDiff line numberDiff line change
@@ -4,58 +4,39 @@ where
44
{
55
let delta = (b - a) / precision as f64;
66

7-
let integral: f64 = (0..precision)
7+
(0..precision)
88
.map(|trapezoid| {
99
let left_side = a + (delta * trapezoid as f64);
1010
let right_side = left_side + delta;
1111

1212
0.5 * (f(left_side) + f(right_side)) * delta
1313
})
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()
2815
}
2916

3017
#[cfg(test)]
3118
mod tests {
3219
use super::*;
3320

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+
}
5332
}
5433

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),
6041
}
6142
}

0 commit comments

Comments
 (0)