Rational functions outperform polynomials for approximating functions with (near-)singularities. The absolute value function is a typical example, for which polynomials converge only algebraically $O(1/n)$ whereas rationals root-exponentially $O(\exp(-\pi\sqrt{n}))$.

A closely related function is the square root. When we work on the interval $[a,1]$ for $0<a<1$, $\sqrt{x}$ is analytic on the interval, so both polynomials and rational functions would converge exponentially. Indeed for $a$ close to $1$ we don't see much difference. We compute the best polynomial and rational approximants using minimax.

a = 0.8;
x = chebfun('x',[a 1]); f = sqrt(x);
ns = 2:2:8;
perrs = []; rerrs = [];
for n = ns
[p,perr] = minimax(f,n);
perrs = [perrs perr];
[p,q,r,rerr] = minimax(f,n/2,n/2);
rerrs = [rerrs rerr];
end

semilogy(ns,perrs,'b*-'), hold on
text(ns(end)+.25,perrs(end),['poly a=',num2str(a)],'color','b')
semilogy(ns,rerrs,'r*-'), grid on
text(ns(end)+.25,rerrs(end),['rat a=',num2str(a)],'color','r')
xlim([0 ns(end)+2]), title(['sqrt(x) on [a,1], a = ',num2str(a)])
xlabel DOF

As we shrink $a$, the difference in convergence gets pronounced. While the convergence is still exponential in all cases, polynomials struggle more as $a\rightarrow 0$ as the singularity gets closer to the domain. Let's vary the value of $a$. We first take $a=0.1$:

a = 0.1; x = chebfun('x',[a 1]); f = sqrt(x);
perrs = []; rerrs = [];
for n = ns
[p,perr] = minimax(f,n);
perrs = [perrs perr];
[p,q,r,rerr] = minimax(f,n/2,n/2);
rerrs = [rerrs rerr];
end

hold off, semilogy(ns,perrs,'b*-'), hold on
text(ns(end)+.25,perrs(end),['poly a=',num2str(a)],'color','b')
semilogy(ns,rerrs,'r*-'), grid on
text(ns(end)+.25,rerrs(end),['rat a=',num2str(a)],'color','r')
xlim([0 ns(end)+2]), title(['sqrt(x) on [a,1], a = ',num2str(a)]), xlabel DOF

Now $a=10^{-3}$:

a = 1e-3;
f = chebfun(@(x)sqrt(x),[a,1]);
ns = 2:2:20;
perrs = []; rerrs = [];
for n = ns
[p,perr] = minimax(f,n);
perrs = [perrs perr];
[p,q,r,rerr] = minimax(f,n/2,n/2,'silent');
rerrs = [rerrs rerr];
end

hold off, semilogy(ns,perrs,'b*-'), hold on
text(ns(end)+.5,perrs(end),['poly a=',num2str(a)],'color','b')
semilogy(ns,rerrs,'r*-'), grid on
text(ns(end)+.5,rerrs(end),['rat a=',num2str(a)],'color','r')
xlim([0 ns(end)+7]), title(['sqrt(x) on [a,1], a = ',num2str(a)]), xlabel DOF

Finally, $a=10^{-5}$:

a = 1e-5;
f = chebfun(@(x)sqrt(x),[a,1],'splitting','on');
ns = 2:2:20;
perrs = []; rerrs = [];
for n = ns
[p,perr] = minimax(f,n);
perrs = [perrs perr];
[p,q,r,rerr] = minimax(f,n/2,n/2,'silent');
rerrs = [rerrs rerr];
end

hold off, semilogy(ns,perrs,'b*-'), hold on
text(ns(end)+.5,perrs(end),['poly a=',num2str(a)],'color','b')
semilogy(ns,rerrs,'r*-'), grid on
text(ns(end)+.5,rerrs(end),['rat a=',num2str(a)],'color','r')
xlim([0 ns(end)+7]), title(['sqrt(x) on [a,1], a = ',num2str(a)]), xlabel DOF
Warning: minimax algorithm did not converge after 14 iterations to the tolerance
0.0001.


We see that the difference is widening: both errors increase as $a\rightarrow 0$, but polynomials suffer much more.

We now superimpose the plot with $a=0$, taking the whole interval $[0,1]$. We recover the algebraic (poly) and root-exponential (rat) convergence as opposed to exponential (admittedly rational-minimax struggles a bit here: please note that this is a very hard problem!).

a = 0;
f = chebfun(@(x)sqrt(x),[a,1],'splitting','on');
ns = 2:2:20;
perrs = []; rerrs = [];
for n = ns
[p,perr] = minimax(f,n);
perrs = [perrs perr];
[p,q,r,rerr] = minimax(f,n/2,n/2,'silent');
rerrs = [rerrs rerr];
end

semilogy(ns,perrs,'bo--')
text(ns(end)+.5,perrs(end)*1.3,['poly a=',num2str(a)],'color','b')
semilogy(ns,rerrs,'ro--'), grid on
text(ns(end)+.5,rerrs(end),['rat a=',num2str(a)],'color','r')
xlim([0 ns(end)+7]), title(['sqrt(x) on [a,1], a = ',num2str(a)]), xlabel DOF
Warning: minimax algorithm did not converge after 13 iterations to the tolerance
0.0001.
Warning: minimax algorithm did not converge after 14 iterations to the tolerance
0.0001.


Let's now do the same experiment with the pth root, with $p=5$. The situation qualitatively the same (regardless of $p$).

hold off
as = [1e-5 0];
ns = 2:2:20;
pstyle = {'b*-','bo--'}; rstyle = {'r*-','ro--'};
it = 0;
for a = as
it = it+1; perrs = []; rerrs = [];
f = chebfun(@(x)x.^(1/5),[a,1],'splitting','on');
for n = ns
[p,perr] = minimax(f,n);
perrs = [perrs perr];
end

for n = ns
[p,q,r,rerr] = minimax(f,n/2,n/2,'silent');
rerrs = [rerrs rerr];
end

semilogy(ns,perrs,pstyle{it}), hold on
text(ns(end)+.2,perrs(end),['poly a=',num2str(a)],'color','b')
semilogy(ns,rerrs,rstyle{it}), grid on
text(ns(end)+.2,rerrs(end),['rat a=',num2str(a)],'color','r')
xlim([0 ns(end)+7]), xlabel DOF
title(['fifth root of x on [a,1], a = 0 and 1e-5'])
end
Warning: minimax algorithm did not converge after 13 iterations to the tolerance
0.0001.
Warning: minimax algorithm did not converge after 13 iterations to the tolerance
0.0001.
Warning: minimax algorithm did not converge after 14 iterations to the tolerance
0.0001.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  5.394767e-18.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  5.394767e-18.
Warning: minimax algorithm did not converge after 14 iterations to the tolerance
0.0001.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  8.957728e-18.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  8.957728e-18.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  7.928782e-20.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  7.928782e-20.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  2.395916e-21.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  2.395916e-21.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  1.380810e-21.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  1.380810e-21.
Warning: minimax algorithm did not converge after 15 iterations to the tolerance
0.0001.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.768615e-18.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.768615e-18.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.824766e-20.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.824766e-20.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.340280e-22.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.340280e-22.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.392021e-24.
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  4.392021e-24.
Warning: minimax algorithm did not converge after 15 iterations to the tolerance
0.0001.