#root-finding #root #numerical #cubic #quartic

roots

Library of well known algorithms for numerical root finding

8 releases

Uses old Rust 2015

0.0.8 Dec 21, 2022
0.0.7 Jun 17, 2021
0.0.6 Dec 22, 2019
0.0.5 Jan 17, 2019
0.0.1 Mar 23, 2015

#13 in Math

Download history 14572/week @ 2024-07-22 15456/week @ 2024-07-29 14825/week @ 2024-08-05 15156/week @ 2024-08-12 12996/week @ 2024-08-19 14286/week @ 2024-08-26 12234/week @ 2024-09-02 11910/week @ 2024-09-09 11086/week @ 2024-09-16 14062/week @ 2024-09-23 13243/week @ 2024-09-30 15444/week @ 2024-10-07 16438/week @ 2024-10-14 15966/week @ 2024-10-21 16482/week @ 2024-10-28 17820/week @ 2024-11-04

67,658 downloads per month
Used in 66 crates (26 directly)

BSD-2-Clause

155KB
3K SLoC

Library of well known algorithms for numerical root finding.

LicenseBuild StatusCrates.io

Features

Usage

extern crate roots;
use roots::Roots;
use roots::find_roots_cubic;
use roots::find_root_brent;
use roots::find_root_secant;

// Find the root of a complex function in the area determined by a simpler polynom
fn find_solution<F>(enormous_function: F, root_area_polynom:(f64,f64,f64,f64)) -> Option<f64>
  where F: Fn(f64) -> f64
{
  // de-structure polynom coefficients
  match root_area_polynom {
    (a3,a2,a1,a0) => {
      // Find root area by solving the polynom
      match find_roots_cubic(a3,a2,a1,a0) {
        // Try to find the root by one of iterative methods
        Roots::Three(roots) => {
          // Three roots found, normal case
          find_root_brent(roots[0],roots[2],enormous_function, &mut 1e-8f64).ok()
        },
        Roots::Two(roots) => {
          // Two roots found, High precision required
          find_root_brent(roots[0],roots[1],enormous_function,&mut 1e-15f64).ok()
        },
        Roots::One(roots) => {
          // One root found, Low precision is enough
          find_root_secant(roots[0]-1f64,roots[0]+1f64,enormous_function,&mut 1e-3f64).ok()
        },
        _ => None,
      }
    },
    _ => None,
  }
}

No runtime deps