diff --git a/src/misc.rs b/src/misc.rs index 3c62b5b..eae6bd2 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -253,8 +253,14 @@ pub fn newtons_method( ) -> Option { let mut x1: f64 = *start_x; let mut x2: f64; + let mut derivative: f64; loop { - x2 = x1 - (f(x1) / f_1(x1)); + derivative = f_1(x1); + if !derivative.is_finite() { + return None; + } + + x2 = x1 - (f(x1) / derivative); if !x2.is_finite() | !range.contains(&x2) { return None; } diff --git a/tests/misc.rs b/tests/misc.rs index a237002..7275117 100644 --- a/tests/misc.rs +++ b/tests/misc.rs @@ -201,4 +201,22 @@ fn newtons_method() { &f64::EPSILON, ); assert_eq!(data, None); + + let data = newtons_method( + &|_: f64| f64::INFINITY, + &|x: f64| x.sin(), + &0.0, + &(-10.0..10.0), + &f64::EPSILON, + ); + assert_eq!(data, None); + + let data = newtons_method( + &|x: f64| x.sin(), + &|_: f64| f64::INFINITY, + &0.0, + &(-10.0..10.0), + &f64::EPSILON, + ); + assert_eq!(data, None); }