Home

Awesome

Trapz.jl

A simple Julia package to perform trapezoidal integration over common Julia arrays. the package is registered on Julia Registry, so it can be added as follows

import Pkg
Pkg.pkg"add Trapz"

Main Usage Example:

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)
result: 28.00030

Example Usage of @trapz macro:

using Trapz
using Printf
Base.show(io::IO, f::Float64) = @printf(io, "%1.5f", f)
function test(λ)
    R=@trapz 0:0.0001:π x (sin(λ*x)/2, cos(λ*x)/2, cos(λ*x)^2/π)
    print("λ = ",λ," result of integrals: ",R)
end

test(0.5)
λ = 0.50000 result of integrals: (0.99995, 1.00000, 0.50000)
test(1.0)
λ = 1.00000 result of integrals: (1.00000, 0.00005, 0.49997)
test(2.0)
λ = 2.00000 result of integrals: (0.00000, -0.00005, 0.49997)

Benchmarks

using BenchmarkTools
@btime trapz($(vx,vy,vz),$M);
3.131 ms (4 allocations: 157.30 KiB)
@btime trapz($(:,vy, vz),$M);
3.084 ms (3 allocations: 157.20 KiB)
@btime trapz($(:,vy,:),$M);
4.090 ms (2 allocations: 234.45 KiB)

Benchmarks & example for @trapz macro

in this example we are calculating 3 multidimensional integrals simultaneously, in other words we are calculating a multidimensional (3D) integral of a vector function

using BenchmarkTools
vx=range(0,1,length=100)
vy=range(0,2,length=200)
vz=range(0,3,length=300)

function integr(vx,vy,vz)
    @trapz vx x @trapz vy y @trapz vz z (x*x+y*y+z*z, x*y*z, cos(x*y)+cos(x*z)+cos(y*z))
end

@btime integr($vx,$vy,$vz)
129.633 ms (0 allocations: 0 bytes)
(28.00030, 4.50000, 9.93814)

Comparison to Numpy

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")
Trapz.jl is ~ 7.34493 times faster than numpy's trapz