Scientific Computing
Lecturer:  Prof. Dr. Mario Botsch 
Assistants:  Astrid Bunge, Martin Komaritzan 
Lecture:  Tue, 1416, Room T2205 
Exercise:  Wed, 1214, Room GZI Wed, 1416, Room GZI 
eKVV:  392022 
Credits:  5 points 
Content
Many interesting projects in natural sciences and engineering require the computation of numerical solutions to certain mathematical problems, such as solving systems of equations or minimizing some cost function. This course introduces the most frequently used numerical methods in a compact manner, based on intuitive and interesting examples from computer graphics and physicsbased dynamic simulations.
We will not focus on the theoretical derivation of the presented techniques. Instead, our goal is to effciently and robustly solve numerical problems in practical applications, which requires these three steps:
 Given an engineering problem, formulate it as a mathematical problem, for instance as a system of equations or an optimization problem.
 Given a mathematical problem, analyze its properties to understand which numerical methods can be employed for its solution.
 Given a numerical method, know which opensource implementation can be used and/or how to implement it yourself as an efficient and robust algorithm.
The numerical methods to be discussed include solving dense and sparse linear systems, least squares approximations, and partial differential equations. We will also discuss efficient C++ programming and shared memory parallelization.
To facilitate a better understanding we will implement most of the techniques that we discuss in the lecture in the programming assignments. Our exercises therefore consist of several miniprojects, which you can work on alone or in groups. Our tutors have weekly consulting hours, where students can get help if they have trouble with the implementation. At the end of each miniproject, students will present their results in the exercise course.
Prerequisites
 Basic knowledge of linear algebra and analysis is required. You should have passed your Mathe 1+2 courses.
 The programming exercises will be done in C++. We’ll do a C++ crash course at the beginning.
Literature
 Botsch, Sieger, Scientific Computing Course Notes (version September 2019)
 Trefethen, Bau, Numerical Linear Algebra, SIAM, 1997
 Demmel, Applied Numerical Linear Algebra, SIAM, 1997
 Press, Teukolsky, Vettering, Flannery, Numerical Recipes in C++: The Art of Scientific Computing, Cambridge University Press, 2002
 Chapman, Jost, van der Pas, Using OpenMP: Portable Shared Memory Parallel Programming, MIT Press, 2007.
 Meyers, Effective C++, AddisonWesley Professional, 2005.
 Hager, Wellein, Introduction to High Performance Computing for Scientists and Engineers, CRC Press, 2010.
 Davis, Direct Methods for Sparse Linear Systems, SIAM, 2006.
Schedule
Week  Lecture (Wednesday)  Exercise (Wednesday) 

Introduction (HTML, PDF)  no exercise  
Linear Systems, LU Factorization  C++ Crash Course  
Least Squares, Cholesky Factorization  Curve Interpolation and Approximation 

QR Factorization  
SVD, Numerical Stability  
Heat Equation, Time Integration  
Laplace Equation, Gradient Descent  Diffusion  
Conjugate Gradients, Sparse Matrices  
Efficient C++ (HTML, PDF)  Laplace Equation  
Parallel Computing, OpenMP (HTML, PDF)  
Wave Equation, Band Cholesky  Parallelization  
Sparse Cholesky Factorization  
GPU Computing (HTML, PDF)  Wave Equation  
Automatic Differentiation (PDF)  
Conclusion (HTML, PDF) 