Frequently Asked Questions

Frequently Asked Questions

Approximating functions

How do I interpolate a function at a specified grid?

In the case where the grid is specified by points(space,n), you can apply the default transform to data:

julia> S = Chebyshev(1..2);

julia> p = points(S,20); # the default grid

julia> v = exp.(p);      # values at the default grid

julia> f = Fun(S,ApproxFun.transform(S,v));

julia> f(1.1)
3.0041660239464347

julia> exp(1.1)
3.0041660239464334

ApproxFun has no inbuilt support for interpolating functions at other sets of points, but this can be accomplished manually by evaluating the basis at the set of points and using \:

julia> S = Chebyshev(1..2);

julia> n = 50;

julia> p = range(1,stop=2,length=n);   # a non-default grid

julia> v = exp.(p);           # values at the non-default grid

julia> V = Array{Float64}(undef,n,n); # Create a Vandermonde matrix by evaluating the basis at the grid

julia> for k = 1:n
           V[:,k] = Fun(S,[zeros(k-1);1]).(p)
       end

julia> f = Fun(S,V\v);

julia> f(1.1)
3.0041660228311926

julia> exp(1.1)
3.0041660239464334

Note that an evenly spaced grid suffers from instability for large n. The easiest way around this is to use least squares with more points than coefficients, instead of interpolation:

julia> S = Chebyshev(1..2);

julia> n = 100; m = 50;

julia> p = range(1,stop=2,length=n);   # a non-default grid

julia> v = exp.(p);           # values at the non-default grid

julia> V = Array{Float64}(undef,n,m); # Create a Vandermonde matrix by evaluating the basis at the grid

julia> for k = 1:m
           V[:,k] = Fun(S,[zeros(k-1);1]).(p)
       end

julia> f = Fun(S,V\v);

julia> f(1.1)
3.004166023946434

julia> exp(1.1)
3.0041660239464334

We can use this same approach for multivariate functions:

julia> S = Chebyshev(0..1)^2;

julia> n = 1000; m = 50;

julia> Random.seed!(0); x = rand(n); y = rand(n);

julia> v = exp.(x .* cos(y));  # values at the non-default grid

julia> V = Array{Float64}(undef,n,m); # Create a Vandermonde matrix by evaluating the basis at the grid

julia> for k = 1:m
          V[:,k] = Fun(S,[zeros(k-1);1]).(x,y)
       end


julia> f = Fun(S,V\v);

julia> f(0.1,0.2)
1.1029700685084018

julia> exp(0.1*cos(0.2))
1.1029701284210731