### 13.1 `sum`

and `sum2`

We have already seen the `sum2`

command, which returns the definite double integral of a chebfun2 over its domain of definition. The `sum`

command is a little different, integrating with respect to one variable at a time following the MATLAB analogy. For instance, the following commands integrate $\sin(10xy)$ with respect to $y$:

f = chebfun2(@(x,y) sin(10*x.*y),[0 pi/4 0 3]); sum(f)

ans = chebfun row (1 smooth piece) interval length endpoint values [ 0, 0.79] 38 -5.3e-16 0.13 vertical scale = 2.1

A chebfun is returned because the result depends on $x$ and hence is a function of one variable. Similarly, we can integrate over the $x$ variable and plot the result.

sum(f,2), plot(sum(f,2))

ans = chebfun column (1 smooth piece) interval length endpoint values [ 0, 3] 37 -1.7e-16 0.033 vertical scale = 0.56

A closer look reveals that `sum(f)`

returns a row chebfun while `sum(f,2)`

returns a column chebfun. This distinction is a reminder that `sum(f)`

is a function of $x$ while `sum(f,2)`

is a function of $y$. If we integrate over $y$ and then $x$, the result is the double integral of $f$.

sum2(f) sum(sum(f))

ans = 0.377914013520379 ans = 0.377914013520379

It is interesting to compare the execution times involved for computing the double integral by different commands. Chebfun2 does very well for smooth functions, with times comparable to those of the MATLAB `integral2`

command.

F = @(x,y) exp(-(x.^2 + y.^2 + cos(4*x.*y))); tol = 3e-14; tic, I = integral2(F,-1,1,-1,1,'AbsTol',tol,'RelTol',tol); t = toc; fprintf(' INTEGRAL2: I = %17.15f time = %6.4f secs\n',I,t) tic, I = sum(sum(chebfun2(F))); t = toc; fprintf('CHEBFUN2/SUMSUM: I = %17.15f time = %6.4f secs\n',I,t) tic, I = sum2(chebfun2(F)); t = toc; fprintf(' CHEBFUN2/SUM2: I = %17.15f time = %6.4f secs\n',I,t)

INTEGRAL2: I = 1.399888131932670 time = 0.0409 secs CHEBFUN2/SUMSUM: I = 1.399888131932671 time = 0.1133 secs CHEBFUN2/SUM2: I = 1.399888131932671 time = 0.0673 secs

Chebfun2 is not designed specifically for numerical quadrature (or more properly, "cubature"), and careful comparisons with existing software have not been carried out. Low rank function approximations have been previously used for numerical quadrature by Carvajal, Chapman, and Geddes [Carvajal, Chapman & Geddes 2005]. A cubature package CHEBINT based on Chebyshev approximations has been produced by Poppe and Cools [Poppe & Cools 2013].

### 13.2 `norm`

, `mean`

, and `mean2`

The $L^2$-norm of a function $f(x,y)$ can be computed as the square root of the double integral of $f^2$. In Chebfun2 the command `norm(f)`

, without any additional arguments, computes this quantity. For example,

f = chebfun2('exp(-(x.^2 + y.^2 +4*x.*y))'); norm(f), sqrt(sum2(f.^2))

ans = 2.819481057146936 ans = 2.819481057146935

Here is another example. This time we compute the norms of $f(x,y)$, $\cos(f(x,y))$, and $f(x,y)^5$.

f = chebfun2(@(x,y) exp(-1./( sin(x.*y) + x ).^2)); norm(f), norm( cos(f) ), norm( f.^5 )

ans = 0.462652919760561 ans = 1.950850368197069 ans = 0.060896016071932

The command `mean2`

scales the result of `sum2`

to return the mean value of $f$ over the rectangle of definition. For example, here is the average value of a 2D Runge function.

runge = chebfun2( @(x,y) 1./( .01 + x.^2 + y.^2 )) ; plot(runge) mean2(runge)

ans = 3.796119578934829

The command `mean`

computes the average along one variable. The output is a function of one variable represented by a chebfun, so we can plot it.

plot(mean(runge)) title('Mean value of 2D Runge function wrt y')

If we average over $y$ and then $x$, we obtain the mean value over the whole domain, matching the earlier result.

mean(mean(runge))

ans = 3.796119578934828

### 13.3 `cumsum`

and `cumsum2`

The command `cumsum2`

computes the double indefinite integral, which is a function of two variables, and returns a chebfun2. On the other hand, `cumsum(f)`

computes the indefinite integral with respect to just one variable, also returning a chebfun2. The indefinite integral with respect to $y$ and then $x$ is the same as the double indefinite integral, as we can check numerically.

f = chebfun2(@(x,y) sin(3*((x+1).^2+(y+1).^2))); contour(cumsum2(f)), axis equal title('Contours of cumsum2(f)'), axis([-1 1 -1 1]) norm( cumsum(cumsum(f),2) - cumsum2(f) )

ans = 0

### 13.4 Complex encoding

As is well known, a pair of real scalar functions $f$ and $g$ can be encoded as a complex function $f+ig$. This trick can be useful for simplifying many operations, though at the same time it may be confusing. For instance, instead of representing the unit circle by two real-valued functions, we can represent it by one complex-valued function:

d = [0 2*pi]; c1 = chebfun(@(t) cos(t),d); % first real-valued function c2 = chebfun(@(t) sin(t),d); % second real-valued function c = chebfun(@(t) cos(t)+1i*sin(t),d); % one complex function

Here are two ways to make a plot of a circle.

subplot(1,2,1), plot(c1,c2) axis equal, title('Two real-valued functions') subplot(1,2,2), plot(c) axis equal, title('One complex-valued function')

This complex encoding trick is exploited in a number of places in Chebfun2. Specifically, it's used to encode the path of integration for a line integral (see next section), to represent zero contours of a chebfun2 (Chapter 14), and to represent trajectories in vector fields (Chapter 15).

We hope users become comfortable with complex encodings, though they are not required for the majority of Chebfun2 functionality.

### 13.5 Integration along curves

Chebfun2 can compute the integral of $f(x,y)$ along a curve $(x(t),y(t))$. It uses the complex encoding trick and encodes the curve $(x(t),y(t))$ as a complex valued chebfun $x(t) + iy(t)$.

For example, here is the curve in the unit square defined by $\exp(10 it)$, $t\in[0,1]$.

clf C = chebfun(@(t) t*exp(10i*t),[0 1]); plot(C,'k'), axis([-1 1 -1 1]), axis square

Here is a plot of the function $f(x,y) = \cos(10xy^2) + \exp(-x^2)$ on the square, with the values of $f(x,y)$ on the curve $C$ shown in black:

f = chebfun2(@(x,y) cos(10*x.*y.^2) + exp(-x.^2)); plot(f), hold on plot3(real(C),imag(C),f(C),'k')

The object $|f(C)|$ is just a real-valued function defined on $[0,1]$, whose integral we can readily compute:

sum(f(C))

ans = 1.613596461872283

This number can be interpreted as the integral of $f(x,y)$ along the curve $C$.

### 13.6 `diff`

, `diffx`

, `diffy`

In MATLAB the `diff`

command calculates finite differences of a matrix along its columns (by default) or rows. For a chebfun2 the same syntax represents partial differentiation $\partial f/\partial y$ (by default) or $\partial f/\partial x$.

As pointed out in the last chapter, however, this can be rather confusing. Accordingly Chebfun2 offers the alternatives `diffx`

and `diffy`

with more obvious meaning. Here we use `diffx`

and `diffy`

to check that the Cauchy-Riemann equations hold for an analytic function.

f = chebfun2(@(x,y) sin(x+1i*y)); % a holomorphic function u = real(f); v = imag(f); % real and imaginary parts norm(diffy(v) - diffx(u)) norm(diffx(v) + diffy(u)) % Do the Cauchy-Riemann eqs hold?

ans = 1.064722046493669e-14 ans = 0

### 13.7 Integration in three variables

Chebfun2 also works pretty well for integration in three variables. The idea is to integrate over two of the variables using Chebfun2 and the remaining variable using Chebfun. We have selected a tolerance of $10^{-6}$ for this example because the default tolerance in the MATLAB `integral3`

command is also $10^{-6}$.

r = @(x,y,z) sqrt(x.^2 + y.^2 + z.^2); t = @(x,y,z) acos(z./r(x,y,z)); p = @(x,y,z) atan(y./x); f = @(x,y,z) sin(5*(t(x,y,z) - r(x,y,z))) .* sin(p(x,y,z)).^2; I = @(z) sum2(chebfun2(@(x,y) f(x,y,z),[-2 2 .5 2.5])); tic, I = sum(chebfun(@(z) I(z),[1 2],'vectorize')); t = toc; fprintf(' Chebfun2: I = %16.14f time = %5.3f secs\n',I,t) tic, I = integral3(f,-2,2,.5,2.5,1,2,'abstol',3e-14,'reltol',3e-14); t = toc; fprintf(' MATLAB integral3: I = %16.14f time = %5.3f secs\n',I,t)

Chebfun2: I = -0.48056569408898 time = 0.897 secs MATLAB integral3: I = -0.48056569408898 time = 1.835 secs

We can also do the integral with Chebfun3 -- see Chapter 18:

tic, f3 = chebfun3(f,[-2 2 .5 2.5 1 2]); I = sum3(f3); t = toc; fprintf(' Chebfun3: I = %16.14f time = %5.3f secs\n',I,t)

Chebfun3: I = -0.48056569408898 time = 0.237 secs

### 13.8 References

[Carvajal, Chapman & Geddes 2005] 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, pp. 84--91.

[Poppe & Cools 2013] K. Poppe and R. Cools, "CHEBINT: a MATLAB/Octave toolbox for fast multivariate integration and interpolation based on Chebyshev approximations over hypercubes," ACM Trans. Math. Softw., 40 (2013), 2.