Not long ago I wrote an article [1] about how to teach numerical computation to a general audience: those individuals who would use numerical computation in their respective fields, but are not necessarily specialists in numerical analysis. In the article, I argued that application users should know the theory of the numerical methods they are studying, as well as the results of current research in numerical computation. A textbook for such a course would typically contain a collection of numerical schemes, and possibly their programming realizations. However if there is little analysis as to why the formulas worked the way they did, the student is left with little direction on how to choose or develop the correct numerical scheme for his or her own use.
This relatively thin volume does an exceptional job of exposing readers to the field, with an unusual and successful approach that covers both ordinary differential equations (ODEs) and partial differential equations (PDEs). It is comprehensive in covering not only the methods, but also the analysis. It is theoretical yet accessible. Theory is supported and heuristically explained, with ample examples. It is enlightening in its comparison and contrast of various finite difference methods. It is practical, with extensive coverage on how the algebraic systems, as a result of numerical discretization, are solved with concrete MATLAB codes. It is self contained, with an extensive set of appendices that include commonly used norms for measuring errors, polynomial interpolation, and orthogonal polynomials often used as construction “blocks” for numerical schemes, as well as a brief introduction to eigenvalues, matrix powers and exponentials, and PDEs.
Part 1 focuses on boundary value problems. After a brief introduction to finite difference approximation in chapter 1, chapter 2 uses a heat equation as a backdrop as it introduces the fundamentals of numerical discretization, local and global errors, stability, consistency, and convergence. There are well-done sections in the chapter on approximating nonlinear equations, singular perturbation, and higher-order methods with extrapolation and deferred corrections. Other areas touched upon include Green’s function, the Neumann boundary condition, and spectral methods. Chapter 3 discusses some typical schemes for solving elliptic equations, which normally result in (large) systems of equations that often require iterative solution methods. Chapter 4 follows logically and is devoted to iterative methods for sparse linear systems, with coverage ranging from well-known Jacobi and Gauss-Seidel iterations, the conjugate gradient method, and less-known iterative methods for nonsymmetric positive definite matrices to multigrid methods.
Initial value problems are the subject of Part 2. The traditional topics are covered in chapter 5, such as Lipschitz continuity, Runge-Kutta methods, and linear multistep methods. As the stability of difference schemes for initial value problems constitutes a major part of the subject, chapters 6 and 7 give readers a concise, yet precise and easily understood presentation of what different stabilities mean, how critical each is, the computation of the region of stability, and the impact of stability on choosing a step-size for difference schemes. Stiff systems are addressed in chapter 8, which introduces more stability concepts, and the best-known class of numerical schemes suitable for stiff systems: backward differentiation formulas (BDF). Chapters 9 and 10, on parabolic and hyperbolic equations, present classical results, covering Von Neumann stability analysis and the Courant-Friedrichs-Lewy condition, as well as upwind and Lax-Wendroff methods. Finally, there is a short chapter on mixed equations.
Given its target audience, this book presents relevant analysis of the difference methods discussed; this is a major strength of the book when compared to other texts in the field. What makes the book appealing is that the analysis is typically supported by a variety of numerical examples rather than by proofs. Thus, anyone who has knowledge of linear algebra and a moderate mastery of what is taught in a standard calculus sequence should be able to read this book with ease, even on a self-study basis. The author also provides pointers in many sections to additional references, should a reader desire further exploration. This book is not without shortcomings. In my opinion, a major limitation is the lack of exposure of a variety of more recent construction techniques for finite difference methods. These techniques often involve the three indicators of a difference scheme: consistency, stability, and computational complexity. Thus, the new methods are constructed at the cost of compromises in one of the areas in order to improve in another. Nonetheless, there is exceptional value in this book.