integrate 0.1.3

Small, lightweight Rust library for performing numerical integration.
Documentation
# Integrate

[![Integrate crate](https://img.shields.io/crates/v/integrate.svg)](https://crates.io/crates/integrate)
[![Integrate documentation](https://img.shields.io/docsrs/integrate/latest)](https://docs.rs/integrate)
![minimum rustc 1.63](https://img.shields.io/badge/rustc-1.63+-red.svg)
[![build status](https://github.com/mtantaoui/Integrate/actions/workflows/main.yml/badge.svg)](https://github.com/mtantaoui/Integrate/actions)

Integrate is a small, lightweight Rust library for performing numerical integration of real-valued functions. It is designed to integrate functions, providing a simple and efficient way to approximate definite integrals using various numerical methods.

Numerical integration is concerned with developing algorithms to
approximate the integral of a function $f(x)$. The most commonly used algorithms
are Newton-Cotes formulas, Romberg's method, Gaussian quadrature, and to
lesser extents Hermite's formulas and certain adaptive techniques.

## Features

Integrate supports a variety of numerical integration techniques:

- Newton-Cotes methods:

  - Rectangle Rule.
  - Trapezoidal Rule.
  - Simpson's Rule.
  - Newton's 3/8 Rule.

- Gauss quadrature methods:

  - Gauss-Legendre.
  - Gauss-Laguerre.
  - Gauss-Hermite.
  - Gauss-Chebyshev First Kind.
  - Gauss-Chebyshev Second Kind.

- Adaptive Methods:

  - Adaptive Simpson's method

- Romberg’s method.

## Caveats

All of the numerical integration techniques listed above assume that
the integrand is continuous on the interval of integration. The error
estimates generally require that the integrands are differentiable of
whatever order is required so that the formula for the error estimate
makes sense. Below is a check list which one should verify before using
any of the numerical algorithms.

### Integrand check list

- Are there any singularities of the integrand in the interval of integration?

  - If there are, then can they be removed?

  - A function which has jump discontinuities can be integrated by splitting
    the interval of integration into subintervals on which the function is continuous,
    and then numerically integrate over each subinterval and add the results.

  - Using integration by parts certain types of singular integrals can be
    expressed as the sum of a function and a non-singular integral.

  - In other cases, an approximation of the integral in a small neighborhood of
    the singularity can be obtained by hand and the interval of integration can be
    split into three intervals in which numerical integration can be used on
    two of them.

- Does the function oscillate over the region of integration? If it does,
  then make sure that the step size is chosen to be smaller than the wave length
  of the function. The interval of integration can also be split into subintervals
  in which each subinterval is half a wave length and the algorithm is applied
  to each subinterval.

### Installation

To use the `Integrate` crate in your Rust project, add the following line to your `Cargo.toml`:

```toml
[dependencies]
integrate = "0.1.0"
```

### Contribution

Feel free to submit issues or pull requests for bug fixes, new features, or other improvements. Contributions are welcome!

### License

This project is licensed under the MIT License – see the LICENSE file for details. Opening a pull request is assumed to signal agreement with these licensing terms.