Consider the problem of computing --- and, for example, plotting --- the eigenvalues of the matrix
If we wrote a Fortran program that accepted a numerical value for b and
then computed the eigenvalues of A by using, for example, some
standard library package for computing eigenvalues, we would consider
this a numerical approach. In Maple, we could use
to numerically compute the eigenvalues of a numeric matrix A.
If instead we first found an `explicit formula' (whatever that means) for the eigenvalues, in terms of the parameter b, and then wrote a program to evaluate those eigenvalues using the formula, then we would consider this a symbolic approach.
The distinguishing feature between `numerics' and `symbolics' thus seems to be that numerical methods evaluate objects to numbers as soon as possible, while symbolic methods do so as late as possible (this was articulated by J. Rice at ISSAC '92). Deeper thought shows that the distinction is really artificial (a numeral is, after all, a symbol itself), and that there is a whole spectrum of methods available, depending on when quantities are evaluated.
Let us return to the matrix A. We can use Maple to compute explicit expressions for the eigenvalues by finding the characteristic polynomial and then finding its roots, as we were all taught to do in our first linear algebra class.
> with(linalg): Warning: new definition for norm Warning: new definition for trace > A := matrix([[ 0, 1], [1, 2*b]]);
> p := charpoly(A,lambda);
> answer := solve(p,lambda);
On the numerical end of the spectrum we can write (for example) a Matlab program to evaluate the eigenvalues given a numerical value of b:
function lambda = eiga(b) A = [ 0 1 1 2*b]; lambda = eig(A);We can use either the Maple output or the Matlab program for subsequent analysis or plotting. For example, we can plot the eigenvalues for e.g. using either representation.
Which approach is `better'? Surprisingly, neither is totally dominant. The symbolic approach really isn't explicit --- it involves taking a square root, an infinite algebraic operation, which we are really just `used to' --- we have come to accept finding square roots as `basic operations'. However, the computer implementation of `square root' is really quite complicated. ( Geometrically, of course, the idea is simple and even has a finite straightedge-and-compass construction --- hence, perhaps, our ingrained sense of `explicitness' can be rationalized).
But in Matlab, taking eigenvalues is a basic operation! Hence, in some sense, the Matlab program is also `explicit'! One just has to `get used to the idea'. So there is no clear philosophical superiority of one approach over the other.
Are there practical superiorities? Yes. The explicit formula is on the one hand more efficient than the numerical method, and on the other hand less stable than the numerical method (for large values of b).
The last point is not as well-known as it deserves to be. We illustrate it by noting that the product of the two eigenvalues is identically -1, for all values of b. When we plot , (where each piece is calculated as displayed), for large b we get the plot in Figure 2.
Figure 2: Numerical instability of the quadratic formula.
We clearly see that something goes wrong for b between and --- in fact, the explicit formula is giving incorrect answers when evaluated (the rounding error made when calculating is revealed by catastrophic cancellation of the leading digits --- see  for details).
I emphasize that this shows symbolic expressions themselves can be unstable to evaluate --- and when this happens we don't care how fast they evaluate because they give the wrong answer.
In contrast, the Matlab program can be shown to be stable in the backward error sense: eig(A) will compute the exact eigenvalues of a matrix very near to A. Further, one can show that the eigenvalues of A are insensitive to small changes in A --- in numerical analysis parlance, the eigenvalues of A are well-conditioned .
Remark. Numerical experiments show that Matlab will in fact produce exact eigenvalues of a matrix of the form
where is less than the machine epsilon and is usually small relative to b if b > 1 and small absolutely if b < 1. This is an example of an experimental `structured backward error result'. Structured backward error analysis is currently a topic of much research interest. See  for an introduction.
Can we, by judicious use of the art of scientific computing, create a program with the efficiency of the symbolic expression with the stability of the numerical eigenvalue calculation? The answer is yes, but the cost is the replacement of the explicit expressions for the eigenvalues with a `computation sequence' --- i.e. a small, `straight-line' program! Assuming that b is real, the following (well-known) computation sequence does the trick:
No catastrophic cancellation occurs here to reveal the rounding errors made. This computation sequence (in words, `compute the root with the largest magnitude first, since that can be done accurately in floating-point arithmetic, and then use that one to compute the small root') is efficient and stable. It is, if you like, a hybrid symbolic/numeric `recipe'.
But what about insight? Remember Hamming's famous motto, `The Purpose of Computing is Insight, not Numbers'! Which formulas give the most insight? Well, each contributes something. The quadratic formula has a symmetry that the computation sequence lacks, the computation sequence allows easier computation of the asymptotics of as , and the eigenvalue formulation retains important information on the sensitivity of the problem to changes in the data. Depending on the problem context, any one of the three formulations could give the required insight. Of course, a good analyst would be aware of all three (and perhaps more) and switch between representations as appropriate.
Final Remarks on this Example. Many ideas are discussed in this book using elementary examples. I will rarely even bother to say `the generalization of these ideas to larger examples is obvious'. In this case perhaps the generalizations do need emphasis.
The problem of finding eigenvalues of symmetric or unsymmetric n by n matrices is well studied. The naive approach, the first learned in a linear algebra course and hence the first thing one tries to use in practice, is to first find the characteristic polynomial and then to try to find its roots. If n is less than 5, then there are explicit formulas in terms of radicals, analogous to the quadratic formula (see the excellent book  for simple derivations, and see the exercises). These formulas suffer from instability, just as the quadratic formula does . For n=5, there is an `explicit' formula in terms of elliptic functions  --- which can also be unstable. There are no formulas in terms of radicals for , and hence numerical methods must be used.
It has been known for more than thirty years that this naive approach of finding eigenvalues by first finding the characteristic polynomial is inherently unstable, and very bad in a practical sense (see the excellent expository essay by Wilkinson in ). Just because we can compute the characteristic polynomial doesn't mean that we should do so as a step to find the roots. Sadly, people still use this method (see e.g.  as an example of an otherwise adequate, even good, text that advocates this method). Perversely, part of the attraction of symbolic systems is the thought that this horrid approach can be used in practice, with very high precision used to find the roots of the characteristic polynomial to sufficient accuracy --- that is, one tries to `buy more accuracy by paying for more precision'. This fixes the problem, all right, but the cost can be horrendous. See the exercises.
Find its eigenvalues by hand. Check your results with Maple.
A convenient way of entering this matrix in Maple is to use the following short procedure:
A := n -> linalg[toeplitz]([seq(a^k,k=0..n-1)]);See
?toeplitzfor a discussion of what these commands do individually. Here,
seqconstructs the sequence of elements , and this is enclosed in list brackets (square brackets) since
toeplitzexpects a list as input, from which it constructs the Toeplitz matrix given by that list of elements. Issuing the command
A3 := A(3);will reproduce the matrix of question 1, and assign it to the variable
A3for later manipulation. Similarly
A(5)generates the 5-by-5 version of this matrix, etc.
factor, find the eigenvalues of . Is Maple's answer an `explicit' formula or is it really a computation sequence? See
?labelfor a discussion of how you can control the intermediate quantities %1, %2, etc.
?realrootfor usage) to isolate all ten real roots of the characteristic polynomial of , to an accuracy of . (The roots are guaranteed to be all real because the matrix is symmetric). Try to use fsolve or some other numerical rootfinder to get the same results. Compare with direct computation of the eigenvalues using
evalf(Eigenvals(A10)). Repeat for .