Finite element methods (FEMs) are a well-established approach to approximating solutions of (partial) differential equations and now play a major role in the numerical analysis of partial differential equations (PDEs); and numerical algorithms based on FEMs are widely utilized for scientific computing in the physical sciences and engineering. *Introduction to Numerical Methods for Variational Problems* by Langtangen and Mardal provides a hands-on introduction to the theory and practice of finite element methods for the numerical solution of differential equations.

In this text, the authors slowly build up the concept of a variational formulation for an approximation problem and walk the reader through many detailed examples. Fully developed Python programs are used on three different levels in order to guide the reader through the practical implementation of the theory for application in scientific computing. Specifically, throughout the book the authors employ

SymPy for programs that work out explicit examples "by hand'', then these examples are followed up by implementations that utilize numerical algorithms with the

Python scientific stack, and finally the

FEniCS library is utilized to illustrate how many of the steps in the finite element method can be automated by more sophisticated software. The authors of the text have made this book and all of the associated code freely available through a

GitHub repository. This wonderful book has minimal mathematical prerequisites and well-prepares the reader for a more advanced study of either the theory or applications of finite element methods. In particular, this book provides a nice entry path into the field of modern scientific computing with differential equations.

The key steps in solving a problem by means of the finite element method is to first reformulate a PDE problem as an equivalent variational problem, then to expand the solution (or approximate solution) of the variational problem as a linear combination of some well-chosen set of basis functions, and finally to solve for the unknown coefficients in the basis function expansion. A principal goal of *Introduction to Numerical Methods for Variational Problems* is to guide the reader to a thorough understanding of this process of finding a variational formulation, expanding in terms of basis functions, and solving for the unknown coefficients. Here the book succeeds admirably.

Among the varying approaches to the numerical analysis of PDEs, the finite-element method (FEM) approach is widely appreciated for its power and beauty. Part of the appeal of FEMs is that they are supported upon an elegant mathematical foundation that closely parallels the linear functional analytic, or sometimes Hilbert space approach to the mathematical theory of (weak) solutions of PDEs. Furthermore, recent software developments such as the open source

FEniCS project have dramatically increased the practical utility of finite-element methods (FEMs). The reader is not taken too far into the mathematical foundations of FEMs (only a background in calculus and linear algebra is required to understand the book) although this is hinted at in many places in the book. On the other hand, the text does prepare one reasonably well to begin working with the FEniCS software. Thus,

*Introduction to Numerical Methods for Variational Problems* is well-suited for undergraduate or beginning graduate students in applied mathematics, physics, or engineering that want to begin to learn about the numerical analysis of or scientific computing with PDEs. While there are other excellent books on using the FEniCS library for scientific computing,

*Automated Solution of Differential Equations by the Finite Element Method* by Logg et al. and

*Introduction to Automated Modeling with FEniCS* by Scott to name two prominent ones,

*Introduction to Numerical Methods for Variational Problems* is sure to be more accessible to beginners.

In *Introduction to Numerical Methods for Variational Problems*, the authors introduce variational problems in the context of function approximation, first using global basis functions (Chapter 2) and then local basis function defined on discrete subsets of the function domain (Chapter 3). I like this approach because it simultaneously highlights key concepts and the main steps in developing a finite element algorithm in a simple setting. Furthermore, it provides an approach to approximation theory, e.g. polynomial interpolation, that is different from what one typically sees in a first course in numerical analysis, and also suggests the relationship between finite element methods and approximation theory. An additional consequence is that a student doesn't really need to have taken numerical analysis in order to be prepared to study *Introduction to Numerical Methods for Variational Problems*.

Beginning in Chapter 4, the authors take up the study of numerical approximation of solutions to differential equations. The treatment is easy-going, yet detailed, and hands-on. A number of excellent examples are given and as previously mentioned all of the Python code is available. Multi-dimensional problems, time-dependent problems, and nonlinear problems are all given at least some treatment so that a reader of this book is well-prepared to apply the theory, algorithms, and code from this book to some nontrivial problems of personal interest if so desired.

The finite element literature is vast and growing with new and different directions appearing regularly. For those interested to gain entry into this exciting area of applied mathematics, whether it be for the sake of applications or for the mathematical theory,

*Introduction to Numerical Methods for Variational Problems* seems to me like a very good place to start.

Jason M. Graham is an Associate Professor in the Department of Mathematics at the University of Scranton. He received a PhD in Applied Mathematical and Computational Sciences at the University of Iowa. Jason’s professional interests are in applied mathematics and mathematical biology.