r be a float, or an array with
    the same shape as `y`, but of length one along `axis`.

Returns
-------
res : ndarray
    The result of cumulative integration of `y` along `axis`.
    If `initial` is None, the shape is such that the axis of integration
    has one less value than `y`. If `initial` is given, the shape is equal
    to that of `y`.

See Also
--------
numpy.cumsum
cumulative_trapezoid : cumulative integration using the composite 
    trapezoidal rule
simpson : integrator for sampled data using the Composite Simpson's Rule

Notes
-----

.. versionadded:: 1.12.0

The composite Simpson's 1/3 method can be used to approximate the definite 
integral of a sampled input function :math:`y(x)` [1]_. The method assumes 
a quadratic relationship over the interval containing any three consecutive
sampled points.

Consider three consecutive points: 
:math:`(x_1, y_1), (x_2, y_2), (x_3, y_3)`.

Assuming a quadratic relationship over the three points, the integral over
the subinterval between :math:`x_1` and :math:`x_2` is given by formula
(8) of [2]_:

.. math::
    \int_{x_1}^{x_2} y(x) dx\ &= \frac{x_2-x_1}{6}\left[\
    \left\{3-\frac{x_2-x_1}{x_3-x_1}\right\} y_1 + \
    \left\{3 + \frac{(x_2-x_1)^2}{(x_3-x_2)(x_3-x_1)} + \
    \frac{x_2-x_1}{x_3-x_1}\right\} y_2\\
    - \frac{(x_2-x_1)^2}{(x_3-x_2)(x_3-x_1)} y_3\right]

The integral between :math:`x_2` and :math:`x_3` is given by swapping
appearances of :math:`x_1` and :math:`x_3`. The integral is estimated
separately for each subinterval and then cumulatively summed to obtain
the final result.

For samples that are equally spaced, the result is exact if the function
is a polynomial of order three or less [1]_ and the number of subintervals
is even. Otherwise, the integral is exact for polynomials of order two or
less. 

References
----------
.. [1] Wikipedia page: https://en.wikipedia.org/wiki/Simpson's_rule
.. [2] Cartwright, Kenneth V. Simpson's Rule Cumulative Integration with
        MS Excel and Irregularly-spaced Data. Journal of Mathematical
        Sciences and Mathematics Education. 12 (2): 1-9

Examples
--------
>>> from scipy import integrate
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(-2, 2, num=20)
>>> y = x**2
>>> y_int = integrate.cumulative_simpson(y, x=x, initial=0)
>>> fig, ax = plt.subplots()
>>> ax.plot(x, y_int, 'ro', x, x**3/3 - (x[0])**3/3, 'b-')
>>> ax.grid()
>>> plt.show()

The output of `cumulative_simpson` is similar to that of iteratively
calling `simpson` with successively higher upper limits of integration, but
not identical.

>>> def cumulative_simpson_reference(y, x):
...     return np.asarray([integrate.simpson(y[:i], x=x[:i])
...                        for i in range(2, len(y) + 1)])
>>>
>>> rng = np.random.default_rng(354673834679465)
>>> x, y = rng.random(size=(2, 10))
>>> x.sort()
>>>
>>> res = integrate.cumulative_simpson(y, x=x)
>>> ref = cumulative_simpson_reference(y, x)
>>> equal = np.abs(res - ref) < 1e-15
>>> equal  # not equal when `simpson` has even number of subintervals
array([False,  True, False,  True, False,  True, False,  True,  True])

This is expected: because `cumulative_simpson` has access to more
information than `simpson`, it can typically produce more accurate
estimates of the underlying integral over subintervals.

r