# \[ANN\] Trapz 2.0 - Fast integration routines for discrete domains

**URL:** <https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446>\
**Category:** Package Announcements\
**Created:** [March 24, 2020, 1:36pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446 "2020-03-24T13:36:45Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![francesco.alemanno](https://avatars.discourse-cdn.com/v4/letter/f/e8c25b/32.png) [@francesco.alemanno](https://discourse.julialang.org/u/francesco.alemanno)\
**Post date:** [March 24, 2020, 1:36pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446/1 "2020-03-24T13:36:45Z")

</div>

Hi everyone, this package is not exactly new, but i never announced it, and recently i had the time&need to make it even faster and flexible

> **[GitHub - francescoalemanno/Trapz.jl: Julia package to easily calculate multidimensional...](https://github.com/francescoalemanno/Trapz.jl)**
>
> Julia package to easily calculate multidimensional integrals on discrete domains, brings MATLAB&Numpy trapz function to Julia

a copy of readme.md:

# Trapz.jl

A simple Julia package to perform trapezoidal integration over common Julia arrays.

[![Docs](https://img.shields.io/badge/docs-latest-blue.svg)](https://pkg.julialang.org/docs/Trapz)  
[![Build Status](https://travis-ci.com/francescoalemanno/Trapz.jl.svg?branch=master)](https://travis-ci.com/francescoalemanno/Trapz.jl)  
[![codecov](https://codecov.io/gh/francescoalemanno/Trapz.jl/branch/master/graph/badge.svg)](https://codecov.io/gh/francescoalemanno/Trapz.jl)

the package is now registered on Julia Registry, so it can be added as follows

```julia

import Pkg
Pkg.pkg"add Trapz"

```

## Example Usage:

```julia
using Trapz

vx=range(0,1,length=100)
vy=range(0,2,length=200)
vz=range(0,3,length=300)
M=[x^2+y^2+z^2 for x=vx,y=vy,z=vz]
I=trapz((vx,vy,vz),M)
print("result: ",I)

```

```julia-auto
result: 28.000303707970264

```

# Benchmarks

```julia
using BenchmarkTools
@btime trapz($(vx,vy,vz),$M);

```

```julia-auto
2.793 ms (4 allocations: 157.30 KiB)

```

```julia
@btime trapz($(:,vy, vz),$M);

```

```julia-auto
3.046 ms (3 allocations: 157.20 KiB)

```

```julia
@btime trapz($(:,vy,:),$M);

```

```julia-auto
4.022 ms (2 allocations: 234.45 KiB)

```

# Comparison to Numpy

```julia
using PyCall
np=pyimport("numpy")

timenumpy = @belapsed np.trapz(np.trapz(np.trapz($M,$vz),$vy),$vx)
timejulia = @belapsed trapz($(vx,vy,vz),$M)

how_faster=timenumpy/timejulia

print("Trapz.jl is ~ ",how_faster," times faster than numpy's trapz")

```

```julia-auto
Trapz.jl is ~ 7.2802292929009 times faster than numpy's trapz

```

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [March 24, 2020, 4:29pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446/2 "2020-03-24T16:29:23Z")

</div>

How fast is this relative to quadgk?

---

<div class="post-metadata">

**Author:** ![francesco.alemanno](https://avatars.discourse-cdn.com/v4/letter/f/e8c25b/32.png) [@francesco.alemanno](https://discourse.julialang.org/u/francesco.alemanno)\
**Post date:** [March 24, 2020, 4:58pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446/3 "2020-03-24T16:58:01Z")

</div>

They have entirely different usecase, QuadGK needs a function, this operates on arrays. comparing their speed does not make much sense. in any case, quadgk can be pretty heavy on resources if you are not careful.

---

<div class="post-metadata">

**Author:** ![lstagner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lstagner/32/448_2.png) [@lstagner](https://discourse.julialang.org/u/lstagner)\
**Post date:** [March 24, 2020, 8:20pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446/4 "2020-03-24T20:20:58Z")

</div>

Nice! I like the new multidimensional integration syntax.

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [March 24, 2020, 8:25pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446/5 "2020-03-24T20:25:46Z")

</div>

> [@Oscar\_Smith](#):
>
> How fast is this relative to quadgk?

If it is used appropriately, Gaussian quadrature can require exponentially fewer integrand evaluations than the trapezoidal rule as the required accuracy increases, assuming smooth functions. `quadgk` (and, in multiple dimensions, the HCubature package) are also adaptive (they put more function evaluations where the function is more oscillatory etc.).

As @francesco.alemanno says, the main utility of the trapezoidal rule is for cases where you _cannot_ evaluate your function at arbitrary points in the domain, and only have a predetermined grid of points to work with.

---

<div class="post-metadata">

**Author:** ![francesco.alemanno](https://avatars.discourse-cdn.com/v4/letter/f/e8c25b/32.png) [@francesco.alemanno](https://discourse.julialang.org/u/francesco.alemanno)\
**Post date:** [March 24, 2020, 8:50pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446/6 "2020-03-24T20:50:22Z")

</div>

Your PR to Trapz is to be thanked, i made some enhancements (like avoiding PermutedDimsArray) but it is almost like you designed it, thank you again @lstagner 🙂

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [March 24, 2020, 9:06pm UTC](https://discourse.julialang.org/t/ann-trapz-2-0-fast-integration-routines-for-discrete-domains/36446/7 "2020-03-24T21:06:30Z")

</div>

> [@stevengj](#):
>
> assuming smooth functions.

My experience is that for non-smooth/spiky functions the advantage is also enormous. Some functions seem more or less impossible to integrate accurately on a regular grid.
