1. Numerical integration over the disk

In studying cubature formulas, we needed to compute the integrals of products of Chebyshev polynomials $T_j(x) T_k(y)$ over the unit disk, like this one:

T8 = chebpoly(8); T16 = chebpoly(16);
s = linspace(-1,1,160); [xx,yy] = meshgrid(s,s);
ff = T8(xx).*T16(yy);
ff(xx.^2+yy.^2>1) = NaN;
contour(s,s,ff), axis equal off
hold on, plot(chebfun('exp(1i*x)',[0 2*pi]),'k'), hold off

If $j$ or $k$ is odd, the integral is zero, but even if they are both even, to our surprise, we found that the integrals are still usually zero! In fact, a nonzero result only shows up if $j$ and $k$ differ by 0 or 2. Thus the function plotted above, for example, has integral exactly zero over the disk. This is not obvious.

Speaking in general, suppose we want to integrate a smooth function $f(r,t)$ numerically over the unit disk, where $r$ is radius and $t$ is angle. One could use Diskfun, but here, we use standard Chebfun. Let's assume that $f$ is defined by a function that accepts a scalar $r$ and a vector $t$, like this one:

f = @(r,t) 1 + 0*t;

Here is a numerical confirmation that the integral of $1$ is $\pi$:

format long
fr = @(r) r*sum(chebfun(@(t) f(r,t),[0,2*pi],'trig'));
I = sum(chebfun(@(r) fr(r),[0 1]))
Iexact = pi
I =
   3.141592653589793
Iexact =
   3.141592653589793

For the function $f(r,t) = r^2$, the integral is $\pi/2$:

f = @(r,t) r^2 + 0*t;
fr = @(r) r*sum(chebfun(@(t) f(r,t),[0,2*pi],'trig'));
I = sum(chebfun(@(r) fr(r),[0 1]))
Iexact = pi/2
I =
   1.570796326794897
Iexact =
   1.570796326794897

For the function $f(r,t) = r^2 \cos^2(t)$, the integral is $\pi/2$:

f = @(r,t) r^2*cos(t).^2;
fr = @(r) r*sum(chebfun(@(t) f(r,t),[0,2*pi],'trig'));
I = sum(chebfun(@(r) fr(r),[0 1]))
Iexact = pi/4
I =
   0.785398163397448
Iexact =
   0.785398163397448

2. Numerical integration of products of Chebyshev polynomials

What about those products of Chebyshev polynomials? Here is a matrix showing the numerically computed integrals for $k = 0,2,4,6,8,10$. As claimed above, the matrix is tridiagonal.

tic
I = zeros(6);
format short
for j = 0:2:10
  Tj = chebpoly(j);
  for k = 0:2:j
    Tk = chebpoly(k);
    f = @(r,t) Tk(r*cos(t)).*Tj(r*sin(t));
    fr = @(r) r*sum(chebfun(@(t) f(r,t),[0,2*pi],'trig'));
    I(1+j/2,1+k/2) = sum(chebfun(@(r) fr(r),[0 1]));
  end
end
I = I + tril(I,-1)'
time_elapsed_in_seconds = toc
I =
    3.1416   -1.5708   -0.0000    0.0000   -0.0000    0.0000
   -1.5708    0.5236    0.2618    0.0000   -0.0000   -0.0000
   -0.0000    0.2618   -0.1047   -0.1571    0.0000   -0.0000
    0.0000    0.0000   -0.1571    0.0449    0.1122    0.0000
   -0.0000   -0.0000    0.0000    0.1122   -0.0249   -0.0873
    0.0000   -0.0000   -0.0000    0.0000   -0.0873    0.0159
time_elapsed_in_seconds =
    3.7174

3. Analytic expressions for the integrals

Let $I_{jk}$ denote the integral of $T_j(x) T_k(y)$ over the unit disk. The following explicit formulas derived by the first author (details not reported here) give the integrals:

$$ I_{00} = \pi, $$

$$ I_{02} = I_{20} = -{\pi\over 2}, $$

$$ I_{kk} = {\pi (-1)^{k/2} \over 2 - 2k^2} \quad \hbox{($k$ even, $k\ge 2$)}, $$

$$ I_{k,k+2} = I_{k+2,k} = {\pi (-1)^{1+k/2} \over 4k + 4} \quad \hbox{($k$ even, $k\ge 2$)}, $$

In all other cases $I_{jk} = 0$.

Using these formulas, we can reproduce the matrix above as follows:

I = zeros(6);
I(1,1) = pi;
I(2,1) = -pi/2;
for k = 2:2:10
  I(1+k/2,1+k/2) = pi*(-1)^(k/2)/(2-2*k^2);
end
for k = 2:2:8
  I(2+k/2,1+k/2) = -pi*(-1)^(k/2)/(4*k+4);
end
I = I + tril(I,-1)'
I =
    3.1416   -1.5708         0         0         0         0
   -1.5708    0.5236    0.2618         0         0         0
         0    0.2618   -0.1047   -0.1571         0         0
         0         0   -0.1571    0.0449    0.1122         0
         0         0         0    0.1122   -0.0249   -0.0873
         0         0         0         0   -0.0873    0.0159

4. Application to integration of general functions

The results of the last section imply that there is an immediate way to compute the integral of a chebfun2 over a disk: just take the appropriate linear combination of its bivariate Chebyshev coefficients. After this example was initially written, we developed this idea into a Chebfun2 sumdisk command. See the example "Sumdisk for integration over a disk".