@def title = "Overview"
This course will build up your skills in software development and teach you the relevant best practices from the perspective of scientific computing. By the end, you will be better able to write robust and reliable numerical codes.
Upon successful completion of the course, students will be able to
- Implement advanced numerical methods for the solution of real-world problems.
- Select, assess, modify and adapt numerical algorithms, guided by an awareness of their mathematical foundations.
- Apply appropriate computational techniques to solve ODE problems.
- Apply appropriate computational techniques to solve PDE problems.
- Create production-standard code, based on sound software engineering principles.
To achieve the intended learning outcomes, we focus on a few specific aims. It seems natural to break the aims down into two categories: scientific, and software engineering. While they are specified separately, the idea is that they are intrinsically linked — the scientific aims are to be achieved while simultaneously achieving the software aims.
- Implement various ODE integration methods, for example
- Euler's method, and
- Runge-Kutta.
- Implement ODE boundary value problem (BVP) solvers based on different
numerical methods, namely
- single shooting1
- finite differences.
- Implement PDE integration methods such as
- Euler's method with finite differences
- The method of lines
- Implement pseudo-arclength continuation, combining the methods above to solve a range of parameter dependent ODE/PDE problems.
- Use version control software, specifically Git, appropriately within the software engineering workflow.
- Use industry best practices during software development, namely
- use appropriate abstraction techniques, e.g., separation of concerns2,
- use an appropriate testing framework,
- use code reviewing practices, and, where possible,
- use appropriate software development management techniques such as Waterfall or Agile3.
- Use code profiling and benchmarking to:
- optimise code and understand its limitations
- inform the choice of numerical solver
Each week we will provide
- one hour (approximately) of pre-recorded material,
- exercise sheets to be completed during the week,
- a compulsory two-hour lab session with live demonstrations, group exercises, and Q&A, and
- an optional drop-in session to work on the exercises with teaching assistants available to help.
Group exercises will include activities such as pair coding — come ready to participate. All material will be released one week in advance of the appropriate Monday lab session.
- Introduction to Python
- Version control with Git
- Matplotlib and NumPy Python packages
- Numerical shooting for general ODE boundary value problems
- Numerical shooting for periodic ODE boundary value problems
- Pseudo-arclength continuation
- More on version control with Git
- Unit tests
- Reading week: no timetabled sessions
- The finite difference method
- Application to linear and nonlinear ODE boundary value prolems
- Explicit and implicit methods for diffusion equations
- Sparse linear algebra
- Code profiling and benchmarking
- Coursework support (Week 23)
- Advanced topics TBD
Footnotes
-
Multiple shooting is a good extension that you might want to consider; it is relatively easy to implement (once single shooting is implemented) and is much more stable than single shooting. ↩
-
There are many abstraction techniques in software engineering; see this Wikipedia page. ↩
-
It isn't really possible to use Agile or similar techniques within this course because of the relative simplicity of the tasks. Also note this commentary on different management techniques — I suspect it's quite accurate! ↩