# Multivariate functions

Bivariate functions can also be represented in ApproxFun. For example,

f=Fun((x,y)->exp(-x^2-y^2), ChebyshevInterval()^2)

constructs a function on the rectangle [-1,1]^2. Just as in the 1D case, f.coefficients is a Vector of coefficients, and f.space is a Space that tells how to interpret the coefficients.

## TensorSpace

In the example above, the resulting space is a TensorSpace.

## AbstractProductSpace

A TensorSpace is a subtype of AbstractProductSpace. The purpose of AbstractProductSpaces beyond TensorSpace is that it is often convenient to use different bases in one-dimension depending on the order. Thus we want to be able to represent functions in the basis φ_k^j(x)ζ_j(y): for example, we could have the basis

$$$(1-x^2)^{m/2} \mathrm{P}_k^{(m,m)}(x) e^{imy}$$$

(which is related to spherical harmonics), where $\mathrm{P}_k^{(m,m)}(x)$ are Jacobi polynomials.

To handle this more general setting, an AbstractProductSpace implements ApproxFunBase.columnspace: In the (1-x^2)^(m/2) P_k^{(m,m)}(x) e^{imy} example, we would have

columnspace(myproductspace,1)  ==  JacobiWeight(0,0,Legendre()),
columnspace(myproductspace,2)  ==  JacobiWeight(0.5,0.5,Jacobi(1,1)),
columnspace(myproductspace,k)  ==  JacobiWeight((k-1)/2,(k-1)/2,Jacobi(k-1,k-1))

The basis is then interlaced as in TensorSpace.

## ProductFun

A Fun is only one possible way to represent a bivariate function. This mirrors linear algebra where a matrix can be represented in different formats depending on the usage Matrix or SparseMatrixCSC, for example.

Another format for representing bivariate functions in ApproxFun is a ProductFun: for example, the previous function could also be represented by

f=ProductFun((x,y)->exp(-x^2-y^2),ChebyshevInterval()^2)

A ProductFun also has two fields: f.coefficients and f.space, where f.space must be an AbstractProductSpace. Here, f.coefficients is a Vector{Fun{S,T}} that represents a list of functions in x, where

space(f.coefficients[k]) == columnspace(f.space, k)

## LowRankFun

LowRankFun represents a function as a sum of outer products of 1D Funs. This form tries to minimize the number of functions necessary by retaining the highest singular values of the function.