function AverageDegreeReduction2D
2D subdivision
Generally, Chebfun2 approximates globally smooth functions $f(x,y)$ by global low rank polynomial interpolants. However, in the bivariate rootfinding algorithm to solve
$$ f(x,y) = g(x,y) = 0, $$
we use piecewise smooth interpolants if the polynomial degrees are larger than $16$ in the $x$ or $y$variable (of $f$ or $g$). In bivariate rootfinder the resultant based method recursively subdivides the rectangular domain and the functions $f(x,y)$ and $g(x,y)$ are approximated by piecewise smooth bivariate polynomial interpolants with each piece of degree at most $16$. Subdivision is useful for reducing the complexity of the bivariate rootfinding algorithm. The reduction in the complexity is determined by a parameter $\tau$ that measures the average degree reduction. Essentially subdivision means that much higher degree problems can be solved (see [1,2]).
The average degree reduction parameter
The parameter $\tau$ measures the average reduction in polynomial degrees of $f(x,y)$. That is, if a polynomial of degree $n$ (in the $x$ and $y$variable) is required to approximate $f(x,y)$ on $[1,1]\times[1,1]$ then the average degree required to approximate $f$ on $[1,r]\times[1,s]$ (and the other subdomains) is $\tau n$, where $r$ and $s$ are two small arbitrary constants. Throughout this Example we take symmetric functions, i.e., $f(x,y) = f(y,x)$ since then the degree reduction is identical in the $x$ and $y$ direction, which considerably simplifies the discussion. The average degree reduction parameter was introduced in [1].
Rank one functions
A function $f(x,y)$ is of rank $1$ if it can can be written as a product of univariate functions, i.e., $f(x,y) = h(x)k(y)$. Since in this example we are considering only symmetric functions we have $f(x,y) = h(x)h(y)$. For rank $1$ functions the average degree reduction parameter is typically about $1/2$ because under subdivision the degree reduction is directly determined by the degree reduction in $h(x)$. The average degree reduction parameter for univariate functions is discussed in [2]. For example,
M = 2000; f = @(x,y) sin(M*x).*sin(M*y); compute_tau(f, 2) % Expected to be approximately 1/2
Tau = 0.33178
The parameter $\tau$ in this case is equal to $1/2$ because the number of oscillations of $f(x,y)$ in a rectangular domain $[a,b]\times[c,d]$ is directly proportional to $(ba)(dc)$. Moreover, the number of oscillations determines the number of points required to resolve the function. Therefore, each subdivision (in the $x$ or $y$ direction) halves the numerical degree of the polynomial interpolant and $\tau \approx 1/2$.
Here is a diagram that shows the numerical degrees after each level of subdivision:
subdivisionDiagram(f)
In general, if $h(x)$ is a univariate function with average degree reduction parameter $\tau$ then the rank $1$ function $f(x,y) = h(x)h(y)$ has the same average degree reduction parameter.
Toeplitz functions
A function $f(x,y)$ on $[1,1]\times[1,1]$ is defined as Toeplitz if there is a univariate function $h(t)$ on $[2,2]$ such that $f(x,y) = h(xy)$. Functions in this class are typically of rank at least two and the average degree reduction parameter cannot be understood from the univariate setting.
M = 20; f = @(x,y) sin(M*(xy)); compute_tau(f, 2) % Expected to be approximately 1/sqrt(2) = 0.707
Tau = 1.30609
The average $\tau$ parameter can be explained since all the oscillations of $f$ occur along diagonals, i.e., $y=x$ (rather than in the coordinate directions). Two subdivisions, one in the $x$ and one in the $y$ direction are required to halve the length of the diagonal lines and hence, $\tau^2 \approx 1/2$ and $\tau = 1/\sqrt{2}$.
Here is a diagram that shows the numerical degrees after each level of subdivision:
clf, subdivisionDiagram(f)
It can be seen that the numerical degree reduces by a factor of approximately $1/\sqrt{2}$ on each subdivision:
[m,n]=length(chebfun2(f)); max(m,n)./2.^(0:.5:1.5)
ans = Columns 1 through 3 65.000000000000000 45.961940777125584 32.500000000000000 Column 4 22.980970388562795
Symmetric Cauchy function
The symmetric Cauchy function is given by $f(x,y) = 1/(x+y)$ defined on $[a,b]\times[a,b]$, where $0<a<b$. This is a 2D generalisation of functions of the form $1/(x+c)$, which has been used to investigate the parameter $\tau$ in the univariate case [2]. The numerical degree of $f(x,y)$ can be determined by using Eliott's method for all $0<a<b$.
However, this is an example where the average degree reduction depends on the subdivision level. Initially subdivision is very helpful, but as more levels are taken subdivision helps less. For example,
a = 1; b = 100; f = @(x,y) 1./((ba)/2*((x+1)+(y+1))+2*a); %f = 1/(x+y) on [a,b]x[a,b] clf, subdivisionDiagram(f)
Using Elliott's method we have an exact formula for the numerical degree of $f$, for example, the numerical degree in the bottomleft subdomain should be the following:
j=1; for b = [100 50 25 17.5] a = 1; r = b/a; B = (r+3)/(r1); m(j) = ceil(log(4/(r1)*eps^(1)/sqrt(B^21))/log(B+sqrt(B^21))); j=j+1; end m.'
ans = 121 86 62 52
Conclusion
Subdivision is an important technique for rootfinding to reduce the complexity of a rootfinding algorithm. Subdivision is most effective when the average degree reduction parameter is small (such as for rank one functions). Typically, we observe the $\tau$ parameter is approximately $1/\sqrt{2} = 0.707$ for bivariate functions.
function compute_tau(f, N) % COMPUTE_TAU estimate the average degree reduction parameter g = chebfun2(f); tol = 1e14; X = chebcoeffs2(g); L = find(max(abs(rot90(X,2))) < tol,1,'last'); x = linspace(1,1,2.^N+1); tot = 0; %[xx,yy] = meshgrid(x); for j = 1:length(x)1 for k = 1:length(x)1 g = chebfun2(f, [x(j:j+1) x(k:k+1)]); X = chebcoeffs2(g); len = find(max(abs(rot90(X,2))) < tol,1,'last'); tot = tot + len; end end avg = tot./(length(x)1).^2; tau = (avg/L).^(1./N); fprintf('Tau = %1.5f',tau); end
function subdivisionDiagram(f) % SUBDIVISIONDIAGRAM draw a diagram to show subdivision and polynomial % degrees. LW = 'linewidth'; lw = 1; FS = 'fontsize'; tol = 1e14; set(gcf, 'position', [0 0 600 480]), hold on for levels = 0:3 fs = round(142.5*levels); subplot(2,2,levels+1) x = linspace(1,1,2.^levels+1); if levels > 0 plot([1,1],[x;x].','k',LW,lw), plot([x;x].',[1,1],'k',LW,lw), axis equal end plot([1 1 1 1 1],[1 1 1 1 1],'k',LW,lw), axis equal for j = 1:length(x)1 for k = 1:length(x)1 g = chebfun2(f, [x(j:j+1) x(k:k+1)]); X = chebcoeffs2(g); len = find(max(abs(rot90(X,2))) < tol,1,'last'); text(mean(x(j:j+1)).1,mean(x(k:k+1)),sprintf('%u',len),FS,fs) end end axis(1.05*[1,1,1,1]), axis off end end
end
References

Y. Nakatsukasa, V. Noferini, and A. Townsend, Computing the common zeros of two bivariate functions via Bezout resultants, Numerische Mathematik, to appear.

A. Townsend, 1D Subdivision and the average degree reduction, Chebfun Example, May 2013.

A. Townsend and L. N. Trefethen, An extension of Chebfun to two dimensions, SIAM Journal on Scientific Computing, 35 (2013), C495C518.