Cleve Moler is the author of the first MATLAB, one of the founders of MathWorks, and is currently Chief Mathematician at the company. He is the author of two books about MATLAB that are available online. He writes here about MATLAB, scientific computing and interesting mathematics.
Before I wrote this blog I tried to make a distinction between the mathematical terms "roots" and "zeros". As far as I was concerned, equations had "roots" while functions had "zeros". The roots of the equation $x^3 = 2x + 5$ were the zeros of the polynomial $x^3 - 2x - 5$. But now I've decided to stop trying to make that distinction.
The MATLAB function roots finds all of the roots of a polynomial. No equation or interval or starting approximation is involved. But roots applies only to polynomials. The MATLAB function fzero finds only one zero of a function, not an equation, near a specified starting value or, better yet, in a specified interval. To find many zeros you have to call fzero repeatedly with carefully chosen starting values. So MATLAB does not make the rigorous distinction between roots and zeros that I used to desire.
Chebfun has a very powerful and versatile function named roots. A chebfun is a highly accurate polynomial approximation to a smooth function, so the roots of a chebfun, which are the roots of a polynomial, are usually excellent approximations to the zeros of the underlying function. And Chebfun's roots will find all of them in the interval of definition, not just one.
So, Chebfun has helped convince me to stop trying to distinguish between "roots" and "zeros".
Companion and colleague matrices.
When I was writing the first MATLAB years ago I was focused on matrix computation and was concerned about code size and memory space, so when I added roots for polynomials I simply formed the companion matrix and found its eigenvalues. That was a novel approach for polynomial root finding at the time, but it has proved effective and is still used by the MATLAB roots function today.
Chebfun continues that approach by employing colleague matrices for the Chebfun roots function. I had never heard of colleague matrices until the Oxford workshop a few weeks ago. The eigenvalues of the colleague matrix associated with a Chebyshev polynomial provide the roots of that polynomial in the same way that the eigenvalues of the companion matrix associated with a monic polynomial provide its roots.
Bessel function example
Let's pursue an example involving a fractional order Bessel function. Because of the fractional order, this function has a mild singularity at the origin, so we should turn on Chebfun's splitting option.
SPLITTING CHEBFUN splitting option
SPLITTING ON allows the Chebfun constructor to split the interval by a
process of automatic subdivision and edge detection. This option is
recommended when working with functions with singularities.
nu = 4/3
a = 25
J = chebfun(@(x) besselj(nu,x),[0 a]);
lengthJ = length(J)
Here are all of our example function's zeros in the interval.
r = roots(J)
Without Chebfun, that would have required apriori knowledge about the number and approximate location of the zeros in the interval and then a for loop around calls to fzero.
Chebfun frequently invokes roots where it might not be obvious. For example, finding the absolute value of a function involves finding its zeros.
Let's find the zeros of the first derivative so we can plot circles at the local maxima. The derivative is computed by differentiating the Chebyshev polynomial, not by symbolic differentiation of the Bessel function.
z = roots(diff(J))