12.1 What is a chebfun2?
Chebfun2 is the part of Chebfun that deals with functions of two variables defined on a rectangle $[a,b]\times[c,d]$. Just like Chebfun in 1D, it is an extremely convenient tool for all kinds of computations including algebraic manipulation, optimization, integration, and rootfinding. It also extends to vector-valued functions of two variables, so that one can perform vector calculus.
For example, here is a test function that has been part of MATLAB for many years. MATLAB represents the "peaks" function by a $49\times 49$ matrix:
peaks
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... - 1/3*exp(-(x+1).^2 - y.^2)
The same function is available as a chebfun2 in the Chebfun2 gallery:
f = cheb.gallery2('peaks'); plot(f), axis tight, title('Chebfun2 Peaks')
In Chebfun we can do all sorts of things with functions to a high accuracy, such as evaluate them
f(0.5,0.5)
ans = 0.375375578848315
or compute their maxima,
max2(f)
ans = 8.106213589442337
A chebfun2, with a lower-case "c", is a MATLAB object, the 2D analogue of a chebfun. The syntax for chebfun2 objects is similar to the syntax for matrices in MATLAB, and Chebfun2 objects have many MATLAB commands overloaded. For instance, trace(A)
returns the sum of the diagonal entries of a matrix $A$ and trace(f)
returns the integral of $f(x,x)$ when $f$ is a chebfun2.
Chebfun2 builds on Chebfun's univariate representations and algorithms. Algorithmic details are given in [Townsend & Trefethen 2013b] and mathematical underpinnings in [Townsend & Trefethen 2014]. For more information, see Section 12.8.
12.2 What is a chebfun2v?
Chebfun2 can represent scalar-valued functions, such as $\exp(x+y)$, and vector-valued functions, such as $[\exp(x+y);\cos(x-y)]$. A vector-valued function is called a chebfun2v, and chebfun2v objects are useful for computations of vector calculus. For information about chebfun2v objects and vector calculus, see Chapters 15 and 16 of this guide.
12.3 Constructing chebfun2 objects
A chebfun2 can be constructed by supplying the Chebfun2 constructor with a bivariate function handle or string. The default rectangular domain is $[-1,1]\times [-1,1]$. (An example showing how to specify a different domain is given in section 6.) For example, here we construct and plot a chebfun2 representing $\cos(2\pi xy)$ on $[-1,1]\times[-1,1]$.
f = chebfun2(@(x,y) cos(2*pi*x.*y));
We could equally well have constructed chebfun2 objects for the variables $x$ and $y$ first and then computed $f$ from these:
x = chebfun2(@(x,y) x); y = chebfun2(@(x,y) y); f = cos(2*pi*x.*y);
There's also a shortcut cheb.xy
to constructing these objects x
and y
, so we could also have executed
cheb.xy f = cos(2*pi*x.*y);
Here is a plot of $f$:
plot(f), zlim([-2 2])
Along with plot
, there are also commands contour
and surf
for displaying a chebfun2. Here is a contour plot of $f$:
contour(f), axis square
One way to find the rank of the approximant used to represent $f$, discussed in Section 8.8, is like this:
length(f)
ans = 11
Alternatively, more information can be given by displaying the chebfun2 object:
f
f = chebfun2 object domain rank corner values [ -1, 1] x [ -1, 1] 11 [ 1 1 1 1] vertical scale = 1
The corner values are the values of the chebfun2 at $(-1,-1)$, $(-1,1)$, $(1,-1)$, and $(1,1)$, in that order. The vertical scale is used by operations to aim for close to machine precision relative to that number.
12.4 Basic operations
Once we have a chebfun2, we can compute quantities such as its definite double integral:
sum2(f)
ans = 0.902823333580281
This matches well the exact answer obtained by calculus, which is $(2/\pi)\hbox{Si}(2\pi)$:
exact = 0.9028233335802806267957003779
exact = 0.902823333580281
We can also evaluate a chebfun2 at a point $(x,y)$, or along a line. When evaluating along a line a chebfun is returned because the answer is a function of one variable.
Evaluation at a point:
x = 2*rand - 1; y = 2*rand - 1; f(x,y)
ans = -0.997677434419261
Evaluation along the line $y = \pi/6$:
f(:,pi/6)
ans = chebfun row (1 smooth piece) interval length endpoint values [ -1, 1] 23 -0.99 -0.99 vertical scale = 1
There are plenty of other questions that may be of interest. For instance, what are the zero contours of $f(x,y) - .95$?
r = roots(f-.95); plot(r), axis([-1 1 -1 1]) axis square, title('Zero contours of f-.95')
What is the partial derivative $\partial f/\partial y$?
fy = diff(f,1,1); plot(fy)
The syntax for the diff
command can cause confusion because we are following the matrix syntax in MATLAB. Chebfun2 also offers the more easily remembered diffx(f,k)
and diffy(f,k)
, which differentiate $f(x,y)$ $k$ times with respect to the first and second variable, respectively.
What is the mean value of $f$ on $[-1,1]\times[-1,1]$?
mean2(f)
ans = 0.225705833395070
12.5 Chebfun2 methods
There are over 100 methods that can be applied to chebfun2 objects. For a complete list type:
methods chebfun2
Methods for class chebfun2: abs horzcat quiver3 biharm imag rank biharmonic integral rdivide cdr integral2 real chebcoeffs2 isPeriodicTech restrict chebfun2 isempty roots chebpolyplot isequal roots0 chebpolyplot2 isreal rootsFeb19 chebpolyval2 iszero rootsclean chol jacobian rootsfine coeffs2 lap rootsnew complex laplacian sample compose ldivide sampleTest conj length simplify constructor log sin contour lu singleSignTest contourf max sinh cos max2 size cosh mean sph2cart ctranspose mean2 sphere cumprod median sqrt cumsum mesh squeeze cumsum2 min std dblquad min2 std2 diag minandmax2 subsref diff minandmax2est sum diffx minus sum2 diffy mldivide sumdisk discriminant mrdivide surf disp mtimes surface display norm surfacearea domainCheck normalizePivots svd domainarea normalizeRowsAndCols tan eig pivotplot tand ellipsoid pivots tanh end plot times exp plotcoeffs trace explain plotcoeffs2 transpose feval plus uminus fevalm pol2cart uplus flipdim poldec vertcat fliplr potential volt flipud power vscale fred prod waterfall get qr grad quad2d gradient quiver Static methods: chebpts2 paduaVals2coeffs coeffs2vals poisson outerProduct vals2coeffs
Most of these commands have been overloaded from MATLAB. More information about a Chebfun2 command can be found with help
:
help chebfun2/max2
MAX2 Global maximum of a CHEBFUN2. Y = MAX2(F) returns the global maximum of F over its domain. [Y, X] = MAX2(F) returns the global maximum in Y and its location X. This command may be faster if the OPTIMIZATION TOOLBOX is installed. See also MIN2, MINANDMAX2.
12.6 Composition of chebfun2 objects
New chebfun2 objects can be constructed from existing ones by composing them with operations such as +
, -
, .*
, and .^
. For example,
x = chebfun2(@(x,y) x, [-4 4 -2 2]); y = chebfun2(@(x,y) y, [-4 4 -2 2]); f = 1./( 2 + cos(.25 + x.^2.*y + y.^2) ); contour(f), axis equal
12.7 Analytic functions
An analytic function $f(z)$ can be thought of as a complex-valued function of two real variables, $f(x,y) = f(x+iy)$. If the Chebfun2 constructor is given an anonymous function with one argument, it assumes that argument is a complex variable. For instance,
f = chebfun2(@(z) sin(z)); f(1+1i), sin(1+1i)
ans = 1.298457581415977 + 0.634963914784736i ans = 1.298457581415977 + 0.634963914784736i
These functions can be visualised by using a technique known as phase portrait plots. Given a complex number $z = re^{i\theta}$, the phase $e^{i\theta}$ can be represented by a colour. We follow Wegert's colour recommendations [Wegert 2012], using red for a phase $i$, then yellow, green, blue, and violet as the phase moves clockwise around the unit circle. For example,
f = chebfun2(@(z) sin(z)-sinh(z),2*pi*[-1 1 -1 1]); plot(f)
Many properties of analytic functions can be visualised by these types of plots, such as the location of zeros and their multiplicities. Can you work out the multiplicity of the root at $z=0$ from this plot? For another example, try cheb.gallery2('airycomplex')
.
Since Chebfun2 only represents smooth functions, a trick is required to draw pictures like these for functions with poles [Trefethen 2013]. For functions with branch points or essential singularities, it is currently not possible in Chebfun2 to draw phase plots.
12.8 Chebfun2 low rank approximations
Chebfun2 exploits the observation that many functions of two variables can be well approximated by low rank approximants. A rank $1$ function, also known as separable, is of the form $u(y)v(x)$, and a rank $k$ function is one that can be written as the sum of $k$ rank $1$ functions. Smooth functions tend to be well approximated by functions of low rank. Chebfun2 determines low rank function approximations automatically by means of an algorithm that can be viewed as an iterative application of Gaussian elimination with complete pivoting [Townsend & Trefethen 2013]. The underlying function representations are related to work by Carvajal, Chapman and Geddes [Carvajal, Chapman, & Geddes 2008] and others including Bebendorf [Bebendorf 2008], Hackbusch, Khoromskij, Oseledets, and Tyrtyshnikov. For further aspects of low-rank representations see [Trefethen 2017] and [Beckermann and Townsend 2019].
Here is an example adapted from [Townsend & Trefethen 2013] and cheb.gallery2('smokering')
. The function $$ f(x,y) = \exp( -40(x^2-xy+2y^2 - 1/2)^2) $$ has the shape of an elliptical ring in the unit square, and Chebfun2 represents it by an approximation of reasonably high rank:
ff = @(x,y) exp(-40*(x.^2 - x.*y + 2*y.^2 - 1/2).^2); f = chebfun2(ff); levels = 0.1:0.1:0.9; contour(f,levels), axis([-1 1 -1 1]), axis square title(['rank ' int2str(length(f))],'fontsize',12)
To illustrate the nature of low-rank approximations, rather than letting Chebfun2 determine the rank adaptively, we can force it to take ranks $1,2,\dots ,9$. Here are the results, plotted with black level curves at heights $0.2,0.4,0.6,0.8$:
levels = 0.2:0.2:0.8; clf for k = 1:9 axes('position',[.03+.33*mod(k-1,3) .67-.3*floor((k-1)/3) .28 .28]) contour(chebfun2(ff,k),levels,'k') xlim([-1 1]), axis equal, axis off end
For this function, "plotting accuracy" is achieved approximately at rank 16; the remaining terms are then required to get from 2-3 digits to 15.
12.9 References
[Bebendorf 2008] M. Bebendorf, Hierarchical Matrices: A Means to Efficiently Solve Elliptic Boundary Value Problems, Springer, 2008.
[Beckermann & Townsend 2019] "Bounds on the singular values of matrices with displacement structure", SIAM Rev. 61 (2019), 319--344.
[Carvajal, Chapman, & Geddes 2008] O. A. Carvajal, F. W. Chapman and K. O. Geddes, "Hybrid symbolic-numeric integration in multiple dimensions via tensor-product series", Proceedings of ISSAC'05, M. Kauers, ed., ACM Press, 2005, 84-91.
[Townsend & Trefethen 2013] A. Townsend and L. N. Trefethen, "Gaussian elimination as an iterative algorithm", SIAM News, March 2013.
[Townsend & Trefethen 2013b] A. Townsend and L. N. Trefethen, "An extension of Chebfun to two dimensions", SIAM Journal on Scientific Computing, 35 (2013), C495-C518.
[Townsend & Trefethen 2014] A. Townsend and L. N. Trefethen, "Continuous analogues of matrix factorizations", Proceedings of the Royal Society A 471 (2014) 20140585.
[Trefethen 2013] L. N. Trefethen, "Phase Portraits for functions with poles", http://www.chebfun.org/examples/complex/PortraitsWithPoles.html.
[Trefethen 2017] L. N. Trefethen, "Cubature, approximation, and isotropy in the hypercube", SIAM Rev. 59 (2017), 469--491.
[Wegert 2012] E. Wegert, Visual Complex Functions: An Introduction with Phase Portraits, Birkhauser/Springer, 2012.