## 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 gridjulia> v = exp.(p);  # values at the default gridjulia> f = Fun(S,ApproxFun.transform(S,v));julia> f(1.1)3.0041660239464347julia> 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 gridjulia> v = exp.(p);  # values at the non-default gridjulia> V = Array{Float64}(undef,n,n);  # Create a Vandermonde matrix by evaluating the basis at the gridjulia> for k = 1:n
V[:,k] = Fun(S,[zeros(k-1);1]).(p)
endjulia> f = Fun(S,V\v);julia> f(1.1)3.004166023941551julia> 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 gridjulia> v = exp.(p);  # values at the non-default gridjulia> V = Array{Float64}(undef,n,m);  # Create a Vandermonde matrix by evaluating the basis at the gridjulia> for k = 1:m
V[:,k] = Fun(S,[zeros(k-1);1]).(p)
endjulia> f = Fun(S,V\v);julia> f(1.1)3.004166023946434julia> 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 gridjulia> V = Array{Float64}(undef,n,m);  # Create a Vandermonde matrix by evaluating the basis at the gridjulia> for k = 1:m
V[:,k] = Fun(S,[zeros(k-1);1]).(x,y)
endjulia> f = Fun(S,V\v);julia> f(0.1,0.2)1.1029700559194882julia> exp(0.1*cos(0.2))1.1029701284210731