MikaelSlevinsky / SincFun.jl

Sinc numerical methods in Julia
Other
3 stars 0 forks source link

SincFun.jl

Build Status

This package is a work in progress with the goal of implementing fast algorithms relating to cardinal Sinc expansions of functions and solutions to equations such as ODEs and integral equations, among others. Requires current master of SpecialFunctions.jl for sinint and cosint.

The basic usage of the package is like so:

Pkg.clone("https://github.com/MikaelSlevinsky/SincFun.jl.git")
using SincFun

We use the sincfun constructor on a function, potentially with the domain and precision specified as well. Without specification, the domain is [-1,1] with double precision.

f = x-> sin(x);
sf = sincfun(f)
sfc = cumsum(sf)
g = x-> cos(-1)-cos(x);
sg = sincfun(g)
norm(sfc-sg)
f = x-> x*exp(x)*cospi(5x)/(1+x^2);
sf = sincfun(f)
roots(sf)
norm(sf[roots(sf)])

The constructor also allows other domains and precisions and can also incorporate singularities.

f = x-> exp(x);g = x-> f(x)./(1.-x.^2).^(4//5).*log(1.+x);

sf = sincfun(f,Finite(-1.0,1.0,-0.8,-0.8,1.0,0.0));
x = linspace(-0.999,0.999,101);
println(norm(g.(x)-sf[x])," ",sum(sf)," ",length(sf))

sf = sincfun(f,Finite(big(-1.0),big(1.0),BigFloat("-0.8"),BigFloat("-0.8"),big(1.0),big(0.0)));
x = linspace(BigFloat("-0.999"),BigFloat("0.999"),101);
println(norm(g.(x)-sf[x])," ",sum(sf)," ",length(sf))

There is also preliminary support for the Hilbert transform:

sf = sincfun(x->x/(x^2+1)^2,Infinite1());
sg = sincfun(x->(1-x^2)/2/(x^2+1)^2,Infinite1());
sh=hilbert(sf);
x = linspace(-5.0,5.0,1001);
println(norm(sg[x]-sh[x]))